我試圖建立一個通用的非遞歸Makefile,並自動生成依賴關係(使用gcc預處理器)(如下所述:http://make.mad-scientist.net/papers/advanced-auto-dependency-generation/#combine。 I我試圖用一種可以在我的項目樹中的任何位置使用'make'的方式來實現它,爲此,我使用跟蹤變量$(DIR)和每個目錄中的本地子畫面文件,如上所述這裏https://evbergen.home.xs4all.nl/nonrecursive-make.htmlSed命令在被Makefile調用時效果不一樣
所有生成的文件在其本地目錄中生成的,因此他們可以從項目樹的任何級別。
這包括依賴文件。 gcc的預處理器的輸出(帶有標誌-MT $(notdir [email protected]) -MP -MMD -MF file.d.tmp
樣子:
target.o: target.c includefile.h includefile2.h
includefile.h:
includefile2.h:
現在,我想追加到這種依賴文件$(DIR)
(不展開)每個單詞的開頭,讓每一次文件包含的變量被擴展,並允許做出正確定位在任何地方已調用它的文件。
所以我寫了一個sed命令sed -E "s/[a-z],_,.,:]+/\$(DIR)&/g" file.d.tmp > file.d
做到這一點。
Makefile中的命令寫在方式(在$(DIR)上有額外的$不可以) PAND它),包含在一個變量更易讀
sed -E "s/[a-z],_,.,:]+/\$$(DIR)&/g" file.d.tmp > file.d
現在,這裏是我的問題: 當我使用的終端上sed命令,它做什麼,我希望:加$(DIR)到每個單詞的開頭。 但是,當我運行Makefile時,它運行相同的sed命令(以正確的方式打印,因此它似乎不是Makefile中的擴展問題),它什麼也不做。 (和我file.d看起來同樣的方式,我file.d.tmp)
如果你有這方面的一些線索,我將不勝感激;)
PS:有Makefile文件關注的完整零件:
DEPFLAGS = -MT [email protected] -MP -MMD -MF $(word 2,$^).tmp
COMPILE = $(CC) $(DEPFLAGS) $(CFLAGS) $(CPPFLAGS) -c -o [email protected] $<
POSTCOMPILE = sed -E "s/[a-z],_,.,:]+/\$$(DIR)&/g" $(word 2,$^).tmp > $(word 2,$^)
和隱含規則:
%.o: %.c
%.o: %.c %.d
$(COMPILE)
$(POSTCOMPILE)
兩條評論:1.你確定隱式規則'%.o:%.c%.d'真的被執行嗎?由於缺少'%.d',我必須訴諸第一條規則,其中'$(word 2,$ ^)'爲空。然後,我不得不使用$(subst .cpp,.d,$ ^) 2.我不確定POSTCOMPILE何時被計算,以及$ ^在該時間點是否爲空。嘗試使用'sed -E「s/[az],_,。,:] +/\ $$(DIR)&g」$(subst .cpp,.d,$ ^)。tmp> $(subst .cpp,.d,$ ^)'直接。 –