Follow-up Comment #3, bug #48643 (project make): With the is_target test restored in implicit.c, "make check" fails:
features/patternrules ................................... Error running /home/simpsons/Works/make/tests/../make (expected 0; got 512): '/home/simpsons/Works/make/tests/../make' '-f' 'work/features/patternrules.mk.6' FAILED (11/12 passed) Seems to be in conflict with bug #17752 - the is_target test was removed to resolve it, I gather. I adapted a makefile from features/patternrules so that the intermediate can have a specific suffix: STEM = xyz BIN = $(STEM)$(SFX) COPY = $(STEM).cp SRC = $(STEM).c allbroken: $(COPY) $(BIN) ; @echo ok $(SRC): ; @echo 'main(){}' %.cp: %$(SFX) ; @echo $@ from $< %$(SFX) : %.c ; @echo $@ from $< Used with no builtin rules, if $(SFX) is non-empty, this works in 3.80, 3.81 and 4.3. If $(SFX) is empty, only 3.81 fails. So a %.sfx:%.c rule works, but %:%.c doesn't, because the target lacks a suffix. It seems this test eliminates the rule from the candidates: /* Rules that can match any filename and are not terminal are ignored if we're recursing, so that they cannot be intermediate files. */ if (recursions > 0 && target[1] == '\0' && !rule->terminal) continue; This suggests that the test case in bug #17752 is a 'feature', as it tries to use a rule "that can match any filename" to build an intermediate, specifically, a builtin rule %:%.c. The in_use flag prevents these repeating, as in foo.c.c.c, but with umpteen builtin rules of this sort, every arrangement of every subset of suffixes in these rules is tried, and that takes a long time, which can result in some checks (variables/EXTRA_PREREQS) being aborted. I managed to introduce a new parameter to pattern_search, unsigned anydepth, which is incremented on the recursive call only if such a rule is used. The test above then becomes: char anyrule = 0; if (target[1] == '\0' && !rule->terminal) { if (anydepth > 3) continue; anyrule = 1; } anyrule is then stored in the tryrules entry, so it can be tested on recursion: if (pattern_search (int_file, 0, depth + 1, recursions + 1, anydepth + !!tryrules[ri].anyrule)) This allows %:%.X rules to be applied at any depth, but limits the total number on the stack. For me, "make check" passes with the anydepth limit set to 0, 1, 2 or 3, but 4 took too long on the variables/EXTRA_PREREQS tests. _______________________________________________________ Reply to this item at: <https://savannah.gnu.org/bugs/?48643> _______________________________________________ Message sent via Savannah https://savannah.gnu.org/