"make dist" bug with "EXTRA_DIST += dirname" and built-in rule for "dirname.c"
"R. Diez" <[email protected]> Mon, 25 Nov 2024 21:38:25 +0100
| Newsgroups | gmane.comp.sysutils.automake.general |
|---|---|
| Message-ID | <[email protected]> |
Hi all:
I have hit an interesting bug in Automake. It has taken me a few hours of learning and experimentation to track it down.
The OpenOCD project uses the Autotools and everything seems fine: bootstrap, ./configure, "make install", etc. work fine. Only make "make dist" fails:
$ make dist
make dist-bzip2 dist-gzip dist-zip am__post_remove_distdir='@:'
make[1]: Entering directory '/home/rdiez/rdiez/LocalSoftware/OpenOCD/openocd-dev-obj'
make distdir-am
make[2]: Entering directory '/home/rdiez/rdiez/LocalSoftware/OpenOCD/openocd-dev-obj'
gcc -g -O2 /home/rdiez/rdiez/LocalSoftware/OpenOCD/openocd-dev-src/src/jtag/drivers/angie.c -o src/jtag/drivers/angie
/home/rdiez/rdiez/LocalSoftware/OpenOCD/openocd-dev-src/src/jtag/drivers/angie.c:19:10: fatal error: helper/system.h: No such file or directory
19 | #include "helper/system.h"
| ^~~~~~~~~~~~~~~~~
compilation terminated.
make[2]: *** [<builtin>: src/jtag/drivers/angie] Error 1
make[2]: Leaving directory '/home/rdiez/rdiez/LocalSoftware/OpenOCD/openocd-dev-obj'
make[1]: *** [Makefile:5076: distdir] Error 2
make[1]: Leaving directory '/home/rdiez/rdiez/LocalSoftware/OpenOCD/openocd-dev-obj'
make: *** [Makefile:5183: dist] Error 2
The problem is here:
https://sourceforge.net/p/openocd/code/ci/master/tree/src/jtag/drivers/Makefile.am
In this line:
EXTRA_DIST += $(ULINK_FIRMWARE) \
$(ANGIE_FILES) \
$(ANGIE_FILES) refers to source subdirectory "src/jtag/drivers/angie/", but next to it there is a source file called "src/jtag/drivers/angie.c". GNU Make tries then to use a built-in rule to make executable "angie" from source "angie.c", using the wrong compilers flags etc., and that fails.
The Automake documentation actually discourages adding whole directories in EXTRA_DIST. I'll try to get that improved in OpenOCD. But the documentation cites other reasons and does not prohibit this practice.
If I change the definition of ANGIE_FILES:
from: ANGIE_FILES = %D%/angie
to : ANGIE_FILES = %D%/angie/
then it works fine.
If that is really the solution, it should probably be documented (or did I miss it?). This is the spot in the documentation:
"You can also mention a directory in EXTRA_DIST; in this case the entire directory will be recursively copied into the distribution."
Now, I thought that Automake 1.17 had actually disabled such GNU Make built-in rules:
GNU Make's default pattern rules are disabled, for speed and debugging.
(.SUFFIXES was already cleared.) (bug#64743)
But Automake 1.16.5 also emits a similar clear .SUFFIXES rules, and GNU Make stills seems to use a built-in rule for that file/directory.
I wonder why GNU Make is then trying a built-in rule, or where such a rule is coming from, or perhaps disabling default rules is not working well or is not active during "make dist".
Best regards,
rdiez