2012-08-13 61 views
0

我想make在目錄中創建所有.cpp與跟蹤標頭更改。我試圖通過先使GCC輸出的目標具有相關性與-MM選項來做到這一點,然後追加身體這個目標,將實際調用編譯:GNU使意想不到的行爲

OPTIONS = -std=c++11 -Wall 

export 

all : $(patsubst %.cpp, %.o, $(wildcard *.cpp)) 


%.o : %.mkt 
    make -f $*.mkt 

%.mkt : %.cpp 
    gcc $(OPTIONS) -MM $*.cpp > $&.mkt1 
    echo gcc $(OPTIONS) -c %.cpp > $*.mkt2 
    cat $*.mkt1 $*.mkt2 > $*.mkt 

然而,不知何故該腳本股形式

的電話
g++ -c -o something.o something.cpp 

每個.cpp文件在目錄中。未創建臨時文件.mkt1,.mkt2.mkt。爲什麼會發生?我如何達到所需的行爲?我正在用mingw在windows上做這個。

+0

如果您在'patsubst'調用中的逗號後面取出空格,它有幫助嗎? – tripleee 2012-08-13 13:02:23

+0

無論如何,如果您打算將它們用作Makefiles,那麼'mkt'文件是否應該有縮進標籤? – tripleee 2012-08-13 13:03:46

+0

@tripleee移除空格不起作用。 '.mkt'文件確實應該有標籤,我的不好,但是在這裏他們甚至沒有創建。 – 2012-08-13 13:06:27

回答

2

您已經提供了兩種模式規則鏈(%.cpp - >%.mkt%.mkt - >%.o),但讓已經有一個隱含規則(%.cpp - >%.o),它會首先發現,一種方式搜索時建立something.o

解決問題的最簡單方法是使用make -r(或make --no-builtin-rules),它將禁用內置的隱式規則。

+0

[用戶定義的規則覆蓋內置規則](http://www.gnu.org/software/make/manual/make.html#Canceling-Rules)。不要認爲這是正確的答案。 – 2012-08-13 14:22:51

+0

@MaximYegorushkin,用戶定義的*規則*覆蓋內置的*規則*。但OP沒有爲'%.o:%.cpp'定義一個規則。當Make尋找一種構建'something.o'的方法時,它會找到內置的規則(並且沒有用戶定義的規則),並且看起來沒有更多。如果禁用了內置規則,Make會進一步查找,找到鏈並使用它。我已經用GNU Make 3.81測試過了,但如果你能告訴我我錯了,我將不勝感激。 – Beta 2012-08-13 16:07:57

+0

'-MM'標誌導致gcc以'x.o:x.cpp'的形式生成行。我想作者的意圖是爲這種依賴添加一個配方,但是他錯過了'%.mkt'配方第二行中的選項卡。 – 2012-08-13 16:27:22