2016-10-13 11 views
0

Unten ist mein Make-Datei:Makemusterregel mit mehreren Zielen

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 "[email protected]" "$<" 
    @echo 'Finished building: $<' 
    @echo ' ' 

In src/config-comp, ich habe zwei Quelldateien C, ist eine config-comp.c und das andere ist config-Proxy .c. Ich las GNU Buch machen sagen, dass

„Wenn ein Muster Regel mehrere Ziele hat, machen weiß, dass die Rezept-Regel für die Herstellung alle Ziele verantwortlich ist. Das Rezept nur einmal ausgeführt ist, um alle Ziele zu machen . "

jedoch meine Ausgabe ist wie folgt:

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 

Das bedeutet, das Rezept zweimal ausgeführt wurde, nicht wahr? Aber laut dem obigen Zitat sollte es nur einmal ausgeführt werden.

Antwort

1

Mehrere Ziele bedeutet soviel wie:

%.foo %.bar: %.c 

Und Ihre Regel wird sowohl *.foo und *.bar für die Herstellung verantwortlich. Die Einzelausführung gilt für Ziele, die den gleichen Stamm haben: wenn baz.foo und baz.bar beide gemacht werden müssen, wird die Regel nur einmal ausgeführt, aber wenn baz.foo und blargh.bar gemacht werden müssen, wird sie zweimal ausgeführt (für die Stämme baz und blargh).

In Ihrem Fall haben Sie ein einzelnes Ziel (src/config-comp/%.o), so dass es für jede Objektdatei ausgeführt wird, die Sie erstellen (was Sie die meiste Zeit wünschen).

Verwandte Themen