Add a New Comment (Rich Markup)
Comment Type & Canned Response: None No canned response available
This test is the same as the one submitted earlier, but unlinks the included makefiles.
diff --git a/tests/scripts/features/include b/tests/scripts/features/include index 0c63c06..4401622 100644 --- a/tests/scripts/features/include +++ b/tests/scripts/features/include @@ -260,4 +260,15 @@ inc1:; @%s $@ && echo FOO := bar > $@ rmfiles('inc1'); }
+# Stop when cannot include a makefile. +# https://savannah.gnu.org/bugs/?56301. +unlink('inc_a.mk'); +unlink('inc_b.mk'); +run_make_test(q! +all:; @echo hello +include inc_a.mk +-include inc_b.mk +%_a.mk %_b.mk:; @false +!, '', "#MAKE#: Failed to remake makefile 'inc_a.mk'.", 512); + 1;
These patches are against the current master (0c326a66c9eb3a3b5e4ab7892578b016b0590b1f).
Here is a test. diff --git a/tests/scripts/features/include b/tests/scripts/features/include index 0c63c06..2281ee4 100644 --- a/tests/scripts/features/include +++ b/tests/scripts/features/include @@ -260,4 +260,13 @@ inc1:; @%s $@ && echo FOO := bar > $@ rmfiles('inc1'); }
+# Stop when cannot include a makefile. +# https://savannah.gnu.org/bugs/?56301. +run_make_test(q! +all:; @echo hello +include inc_a.mk +-include inc_b.mk +%_a.mk %_b.mk:; @false +!, '', "#MAKE#: Failed to remake makefile 'inc_a.mk'.", 512); + 1;
Here is a fix.
diff --git a/src/main.c b/src/main.c index bcba2d1..5c1a7da 100644 --- a/src/main.c +++ b/src/main.c @@ -2305,6 +2305,8 @@ main (int argc, char **argv, char **envp) any_remade |= (mtime != NONEXISTENT_MTIME && mtime != makefile_mtimes[i]); makefile_status = MAKE_FAILURE; + if (!keep_going_flag) + any_failed = 1; } } else
I see a problem when a pattern rule with multiple targets are responsible for creating included files, some of which are mandatory, and the others are optional.
I attached two test cases.
Both of them include two files, inc_a.mk and inc_b.mk
The difference between the two is:
For Makefile1, inc_a.mk is optional, inc_b.mk is mandatory. For Makefile2, inc_a.mk is mandatory, inc_b.mk is optional.
inc_a.mk and inc_b.mk are supposed to be simultaneously created by a pattern rule (but it always fails).
The behavior is completely different between Makefile1 and Makefile2.
$ make -f Makefile1 Makefile1:1: starting target in question: inc_b.mk false Makefile1:8: inc_b.mk: No such file or directory make: *** [Makefile1;12: inc_b.mk] Error 1
Make was terminated immediately when it failed to create inc_b.mk
$ make -f Makefile2 Makefile2:1: starting target in question: inc_b.mk false make: Failed to remake makefile 'inc_a.mk'. hello
This also failed to create included files, and showed "Failed to remake" message, but continued running, then executed the 'all' target.
I think the reason is the target in question in the pattern rule is inc_b.mk, which is an optional include file.
As far as I examined, the last included file becomes the target in question of the pattern rule.
So, I see some sort of sense in this behavior.
However, Makefile2 failed to create the mandatory include file, inc_a.mk, so Make cannot (should not) continue parsing the Makefile.
One way to fix this is, the target in question should be chosen from mandatory include files over optional ones.
(Note: upload size limit is set to 16384 kB, after insertion of the required escape characters.)
Attach Files: Comment:
Depends on the following items: None found
Items that depend on this one: None found
There are 0 votes so far. Votes easily highlight which items people would like to see resolved in priority, independently of the priority of the item set by tracker managers.
Only logged-in users can vote.
Please enter the title of George Orwell's famous dystopian book (it's a date):
Follow 3 latest changes.
Copyright © 2022 Free Software Foundation, Inc. Verbatim copying and distribution of this entire article is permitted in any medium, provided this notice is preserved. The Levitating, Meditating, Flute-playing Gnu logo is a GNU GPL'ed image provided by the Nevrax Design Team. Source Code
Powered by Savane 3.9