2012-06-17 49 views
0

我試圖在GNU makefile中編譯它之前檢查列表中的文件。每次調用規則或僅調用一次時,是否會評估下面的條件ifneq?這種情況似乎總是以同樣的方式進行評估。條件檢查GNU makefile命令中的字符串列表

如果不是唯一的方法來做到這一點,把條件在shell命令?我意識到目標列表可能「不行」,似乎很奇怪...... Make系統當然可以固定以消除這種怪異,但痛苦會更大。

有什麼建議嗎? 禮

OKSRC := realfile1.cpp realfile2.cpp 

%.o: %.cpp 
ifneq ($(findstring $<,$(OKSRC),),) 
     ... do the compile 
else 
     #skip the file 
endif 
+0

這並不是真正意義。如果你不編譯這個文件,那麼'target.o'不會被創建,這會破壞你的makefile中的其他規則。你的目標是什麼? –

+0

它不應該是target.o,而是更通用的%.o。我做了編輯。如果它很簡單,但是構建系統存在缺陷,並且某些%.o被錯誤地標識爲必需的先決條件,那麼您是對的。這些%.o可以安全地忽略。上下文需要段落,所以我已經抽象瞭解了Make的有用部分。我已經看到過之前沒有縮進的「ifneq」模式,但沒有一個明確說明是否重新評估每個新的$ <和$ @。如果沒有,我想我需要某種外殼解決方案。 –

回答

1

Make documentation報價:

條件指令立即解析。這意味着,例如,自動變量不能在條件指令中使用,因爲自動變量在調用該規則的配方之前不會被設置。如果您需要在條件指令中使用自動變量,則必須將條件移入配方並使用shell條件語法。

ifneq是一個條件指令,而$<是一個自動變量。簡而言之,你的上面的代碼不起作用,所以你將不得不使用基於shell的條件。

但我強烈建議您修復根本原因(即錯誤的依賴關係生成),而不是試圖繞開它。

0

我認爲你可以使用if函數推遲自動變量的擴展,直到條件被評估爲止。

OKSRC = realfile1.cpp realfile2.cpp 

.cpp.o: 
    $(if $(findstring $<,$(OKSRC)),$(CC) $(CFLAGS) -c $<,@echo skip $<) 

,結果表明:

$ make realfile1.o realfile2.o realfile3.o 
cc -c realfile1.cpp 
cc -c realfile2.cpp 
skip realfile3.cpp