2012-03-18 93 views
0

我寫了一個小的Makefile文件,編譯它們,然後幾個簡單的C程序測試它們的執行時間:奇怪的化妝隱含規則

CC = gcc 
CFLAGS = -Wall 
PTEST = /usr/bin/time -f "%Us" 
ARCH=-march=native 
OPTIMIZATION= 
NOPTIMIZATION= 

%comp : %.c 
    $(CC) $(CFLAGS) $(NOPTIMIZATION) -o $* $< 
    $(CC) $(CFLAGS) $(OPTIMIZATION) -o $*_opt $< 
    $(CC) $(CFLAGS) $(NOPTIMIZATION) $(ARCH) -o $*_arch $< 
    $(CC) $(CFLAGS) $(OPTIMIZATION) $(ARCH) -o $*_opt_arch $< 

%test: 
    @echo ---$<--- 
    @echo Bez optymalizacji, bez podowania architektury 
    @$(PTEST) ./$* 
    @echo Bez optymalizacji, uwzgledniana architektura 
    @$(PTEST) ./$*_arch 
    @echo Opcja $(OPTIMIZATION), bez podawania architektury 
    @$(PTEST) ./$*_opt 
    @echo Opcja $(OPTIMIZATION), uwzgledniania architektura 
    @$(PTEST) ./$*_opt_arch 

loop%:OPTIMIZATION=-O2 
logic%:OPTIMIZATION=-O1 
math%:OPTIMIZATION=-O1 -ffast-math 
recursive%:OPTIMIZATION=-O2 -foptimize-sibling-calls 
recursive%:NOPTIMIZATION=-O2 -fno-optimize-sibling-calls 

#all: loopcomp logiccomp mathcomp recursivecomp looptest logictest mathtest recursivetest 

loop:loopcomp looptest 

clean: 
    rm -rf loop loop_opt loop_arch loop_opt_arch \ 
    logic logic_opt logic_arch logic_opt_arch \ 
    math math_opt math_arch math_opt_arch \ 
    recursive recursive_opt recursive_arch recursive_opt_arch 

當我鍵入使循環它編譯和測試他們,但隨後調用奇怪的隱含規則,這是否:

gcc -Wall loop.c loopcomp looptest -o loop 
gcc: error: loopcomp: No such file or directory 
gcc: error: looptest: No such file or directory 

我知道,這是使隱性規則,因爲當調用make -r loop一切都OK。我無法弄清楚:哪個內置隱式規則是試圖調用的,我怎樣才能覆蓋它,最好是在調用make時最好不要添加-r選項?如果可能的話,我想重寫它或以某種方式可以使makefile中的隱式規則可以使用。

回答

1

如果你不想創建一個名爲「loop」的文件,並且你只想說「make loop」來捆綁其他目標(比如「make all」),那麼你應該聲明「循環」是假的,並不會搜索隱含規則:

.PHONY: loop 
loop: loopcomp looptest 

如果你不想這樣做,但要確保給定的目標不經歷隱含規則的搜索,那麼你應該爲它聲明明確的規則。一個簡單的辦法做到這一點是添加一個什麼都不做的食譜,像這樣:

loop: loopcomp looptest 
     @: 

(下稱「:」命令是shell的「什麼也不做」命令)。

+0

.PHONY工作,謝謝 – Andna 2012-03-18 15:56:51

1

在makefile您的默認目標是:

loop: loopcomp looptest 

這告訴make,要建立loop,它必須首先確保loopcomplooptest是最新的,然後它必須找到一個方法來建立loop 。既然有文件loop.c,它調用其默認%.c:規則建立loop

gcc -Wall loop.c loopcomp looptest -o loop 

這包括兩個文件(程序),你告訴它loop依賴。

雖然你有一個loop.c,我想你可能會遇到這個問題。

似乎沒有辦法在makefile中說「不要使用任何內置規則」。如果有的話,你會期望它是一個「特殊內置目標名稱」(版本3.82的GNU Make手冊的§4.8),例如.DEFAULT

您唯一剩下的希望是聲明.PHONY: loop可能會壓制這一點。否則,重寫默認的目標規則爲:

check-loop: loopcomp looptest 

這是一個令人難以置信的makefile。將其移植到GNU make以外的任何地方都不是微不足道的。

+0

我並不是故意的,這是我嘗試編寫簡短的make-file的小分配,感謝您對.PHONY的建議,它工作正常。 – Andna 2012-03-18 15:56:36