2016-12-16 15 views
1

我試圖建立一個通用的非遞歸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) 
+0

兩條評論: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,$ ^)'直接。 –

回答

0

我不知道哪兒的差異從何而來,但這裏有兩個建議:

1)由於好像你不想擴張不惜一切,只需使用單引號,而不是通過箍跳躍逃跑的東西

2)你的性格類規範似乎是錯的,你的意思[a-z_.:]

0

我不明白sed -E "s/[a-z],_,.,:]+/\$(DIR)&/g" file.d.tmp > file.d在shell提示下運行時可以如何工作。字符分類[a-z],_,.,:]+是不正確的,因爲它意味着[a-z](單個字符a到z),後面跟着文字字符,_,.,:]+,我假定您沒有輸出文件。

我還以爲你想要的東西,如:

sed -E "s/[]a-z,_.:]+/\$(DIR)&/g" file.d.tmp > file.d 

即將開放的支架包括在字符類支架之後的密切支架,它不會關閉它。查看正則表達式的文檔。你也不需要多次包含逗號。

+0

這確實是錯誤的正則表達式;我已經是如何工作了。 – VannTen

+0

我不知道它是如何工作的。我在另一個系統上測試了它(第一個是MacOS,第二個Linux),那個時候它沒有工作。 隨着shinobi的發展,'[a-z_.:]'就是我想要的。 – VannTen