Chris Betti
Chris Betti

Reputation: 2923

Can prerequisites in a static pattern rule be filtered?

I'm trying to limit $(all_possible_inputs) to $(relevant_inputs). $(all_possible_inputs) is a concatenation of multiple files from other included makefiles. The following functions correctly (the perl scripts know how to ignore the extra inputs), but everything is rebuilt if a single input changes:

$(step2_outputs): $(data)/%.step2: $(routines)/step2.%.pl $(all_possible_inputs)
        perl $^ > $@

UPDATE: Filter must match more than one *.step1 file. If step1 produced:

A.foo.step1
A.bar.step1
B.foo.step1
B.bar.step1
B.baz.step1

Then step2's rules should expand to:

A.step2: routines/step2.A.pl A.foo.step1 A.bar.step1
B.step2: routines/step2.B.pl B.foo.step1 B.bar.step1 B.baz.step1

Logically, this is what I want to work:

$(step2_outputs): $(data)/%.step2: $(routines)/step2.%.pl $(filter $(data)/%.*.step1,$(all_possible_inputs))
        perl $^ > $@

The % is supposed to match the static pattern rule stem. The * is supposed to be a wildcard (which I'm aware won't work). I believe the problem is that filter repurposes '%', so the filter expression fails. I thought it might be solvable with Secondary Expansion, but I tried this, and the filter still returned the empty string:

UPDATE: I switched the examples to use $$* based on Beta's good suggestion:

.SECONDEXPANSION:
$(step2_outputs): $(data)/%.step2: $(routines)/step2.%.pl $$(filter $(data)/$$*.%.step1,$(all_possible_inputs))
        perl $^ > $@

This is running on gnu make 3.81 in a linux environment.

Upvotes: 3

Views: 1488

Answers (1)

Beta
Beta

Reputation: 99124

Your third method works for me, but you can try this: instead of % (which is expanded in the first phase) use $$*

.SECONDEXPANSION:
$(step2_outputs): $(data)/%.step2: $(routines)/step2.%.pl $$(filter $(data)/$$*.step1,$(all_possible_inputs))
    perl $^ > $@

Upvotes: 4

Related Questions