URL: <http://savannah.gnu.org/bugs/?42910>
Summary: chained implicit rule can fail to make a prerequisite Project: make Submitted by: srivasta Submitted on: Mon 04 Aug 2014 04:25:37 PM CDT Severity: 3 - Normal Item Group: Bug Status: None Privacy: Public Assigned to: None Open/Closed: Open Discussion Lock: Any Component Version: 3.81 Operating System: POSIX-Based Fixed Release: None Triage Status: None _______________________________________________________ Details: Gi, This was reported by a Debian user. Please retain a CC to 756123-forwar...@bugs.debian.org so that the Debian BTS has a record of this issue. Please note that I have been unable top reproduce this with 4.0.X versiosn of make, so this issue may have been resolved. It would help if we knew what the fix wwas, and any information that helps us backport it to Debian stable would be appreciated. have a Makefile where make appears to decide to use the 2nd of a pair of chained implicit rules to construct a file, despite having earlier rejected this same pair of rules when deciding whether to build the necessasry intermediate file. As a result, make can run the rules for the 2nd implicit rule despite the fact that one of its prerequisites has not been built. The ommands for the 2nd rule then fail. To reproduce: Firstly, preparation: $ git clone git://git.chiark.greenend.org.uk/~ianmdlvl/adns.git [ usual output from git clone ] $ cd adns $ git checkout make-bug.2014-07-26 [ warning about git about detached HEAD ] $ ./configure $ make [ build should complete successfully ] $ cd regress Now repeat the following steps until you lose the race like this: $ touch ../src/addrfam.c $ make -j2 gcc -g -O2 -Wall -Wmissing-prototypes -Wwrite-strings -Wstrict-prototypes -Wcast-qual -Wpointer-arith -Wno-pointer-sign -I../src -I. -I./../src -DADNS_REGRESS_TEST -I. -c -g -o addrfam_d.o ../src/addrfam.c gcc adnstest_c.o hrecord.o hcommon.o types_d.o event_d.o query_d.o reply_d.o general_d.o setup_d.o transmit_d.o parse_d.o poll_d.o check_d.o addrfam_d.o -o adnstest_record gcc: error: adnstest_c.o: No such file or directory make: *** [adnstest_record] Error 1 $ (If you win the race it rebuilds adnstest_c.o again.) Detailed consideration of the manual node `Implicit Rule Search' suggests that the Makefile is correct by virtue of para.6: while the intermediate file adnstest_c.o does not exist, and is not mentioned as a target or explicit prerequisite, it can be made. So make is correct to try to use this rule. But of course it ought to construct the file first. The bug occurs only with nontrivial -j options. I have reproduced it with -j4 and (as here) -j2. I have also, once, seen it do this: regress$ touch ../src/addrfam.c; make -j adnstest_record gcc -g -O2 -Wall -Wmissing-prototypes -Wwrite-strings -Wstrict-prototypes -Wcast-qual -Wpointer-arith -Wno-pointer-sign -I../src -I. -I./../src -DADNS_REGRESS_TEST -I. -c -g -o addrfam_d.o ../src/addrfam.c regress$ _______________________________________________________ Reply to this item at: <http://savannah.gnu.org/bugs/?42910> _______________________________________________ Message sent via/by Savannah http://savannah.gnu.org/ _______________________________________________ Bug-make mailing list Bug-make@gnu.org https://lists.gnu.org/mailman/listinfo/bug-make