"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