Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Makefile: $subst in dependency list

Tags:

makefile

I have a Makefile which looks roughly like this:

FIGURES = A1_B1_C1.eps A2_B2_C2.eps A3_B3_C3.eps
NUMBERS = 1 2 3

all : $(FIGURES)

%.eps : $(foreach num, $(NUMBERS), $(subst B, $(num), %).out)
    # my_program($+, $@);

%.out :

The point is that the file names of my figures contain certain information (A, B, C) and that each figure is created by my_program from several (in the example 3) files. While the filename of each figure has the format Ax_Bx_Cx.eps, the names of the data files to create the figures from look like this:

Ax_1x_Cx.out
Ax_2x_Cx.out
Ax_3x_Cx.out

So for each figure, I need a dynamically created dependency list with several file names. In other words, my desired output for the example above would be:

# my_program(A1_11_C1.out A1_21_C1.out A1_31_C1.out, A1_B1_C1.eps);

# my_program(A2_12_C2.out A2_22_C2.out A2_32_C2.out, A2_B2_C2.eps);

# my_program(A3_13_C3.out A3_23_C3.out A3_33_C3.out, A3_B2_C3.eps);

Unfortunately, the subst command seems to be ignored, for the output looks like this:

# my_program(A1_B1_C1.out A1_B1_C1.out A1_B1_C1.out, A1_B1_C1.eps);

# my_program(A2_B2_C2.out A2_B2_C2.out A2_B2_C2.out, A2_B2_C2.eps);

# my_program(A3_B3_C3.out A3_B3_C3.out A3_B3_C3.out, A3_B3_C3.eps);

I had a look at this possible duplicate but figured that the answer cannot help me, since I am using % and not $@, which should be ok in the prerequisites.

Clearly I am getting something wrong here. Any help is greatly appreciated.

like image 483
Jenny Avatar asked Oct 25 '25 17:10

Jenny


1 Answers

To do fancy prerequisite manipulations you need at least make-3.82 which supports Secondary Expansion feature:

FIGURES = A1_B1_C1.eps A2_B2_C2.eps A3_B3_C3.eps
NUMBERS = 1 2 3

all : $(FIGURES)

.SECONDEXPANSION:

$(FIGURES) : %.eps : $$(foreach num,$$(NUMBERS),$$(subst B,$$(num),$$*).out)
    @echo "my_program($+, $@)"

%.out :
    touch $@

Output:

$ make
touch A1_11_C1.out
touch A1_21_C1.out
touch A1_31_C1.out
my_program(A1_11_C1.out A1_21_C1.out A1_31_C1.out, A1_B1_C1.eps)
touch A2_12_C2.out
touch A2_22_C2.out
touch A2_32_C2.out
my_program(A2_12_C2.out A2_22_C2.out A2_32_C2.out, A2_B2_C2.eps)
touch A3_13_C3.out
touch A3_23_C3.out
touch A3_33_C3.out
my_program(A3_13_C3.out A3_23_C3.out A3_33_C3.out, A3_B3_C3.eps)
like image 93
Maxim Egorushkin Avatar answered Oct 27 '25 10:10

Maxim Egorushkin