具有多个目标的Makefile模式规则

时间:2016-10-13 15:04:41

标签: makefile

以下是我的makefile:

src/config-comp/%.o: ../src/config-comp/%.c
    @echo 'Building file: $<'
    @echo 'Invoking: GCC C Compiler'
    gcc-4.8 -std=gnu11 -DDEBUG=$(DEBUGOPT) -I"$(ROOT_DIR)/../.local/include" -O0 -g3 -Wall $(GPROF) -c -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -o "$@" "$<"
    @echo 'Finished building: $<'
    @echo ' '

在src / config-comp中,我有两个C源文件,一个是config-comp.c,另一个是config-proxy.c。我读了GNU make book那个说

  

“如果模式规则有多个目标,则make知道该规则   食谱负责制定所有目标。食谱是   只执行一次以制作所有目标。“

但是,我的输出结果如下:

Building file: ../src/config-comp/config-comp.c
Invoking: GCC C Compiler
gcc-4.8 -std=gnu11 -DDEBUG=0 -I"/home/cheng/crane/libevent_paxos/target/../.local/include" -O0 -g3 -Wall  -c -MMD -MP -MF"src/config-comp/config-comp.d" -MT"src/config-comp/config-comp.d" -o "src/config-comp/config-comp.o" "../src/config-comp/config-comp.c"
Finished building: ../src/config-comp/config-comp.c

Building file: ../src/config-comp/config-proxy.c
Invoking: GCC C Compiler
gcc-4.8 -std=gnu11 -DDEBUG=0 -I"/home/cheng/crane/libevent_paxos/target/../.local/include" -O0 -g3 -Wall  -c -MMD -MP -MF"src/config-comp/config-proxy.d" -MT"src/config-comp/config-proxy.d" -o "src/config-comp/config-proxy.o" "../src/config-comp/config-proxy.c"
Finished building: ../src/config-comp/config-proxy.c

这意味着配方已经执行了两次,对吗?但根据上面的引用,它应该只执行一次。

1 个答案:

答案 0 :(得分:1)

多个目标意味着:

%.foo %.bar: %.c

您的规则将负责制作*.foo*.bar。单次执行适用于具有相同词干的目标:如果必须同时baz.foobaz.bar,则规则将仅执行一次,但如果baz.foo和{{1}必须使它被执行两次(对于词干blargh.barbaz)。

在您的情况下,您有一个目标(blargh),因此它将针对您构建的每个目标文件执行(这是您大多数时候想要的)。