2016-06-10 91 views
0

這似乎與How to write Makefile where target and source files have the same extension?略有關係。在這個問題中,擴展名是相同的,但輸入和輸出文件似乎在同一個目錄中,並且文件名被有條件地重命名。具有相同擴展名的Makefile處理文件

我在../src/大集合.txt文件需要處理,並倒入./(被稱爲target/目錄)作爲同名的txt文件。我想使用make,以便只有../src/中已更改的文件才能在./中更新。我想獲得原型工作之前,我把真正的代碼中

Makefile./如下:。

DIR = ../src 
INPUTS = $(wildcard $(DIR)/*.txt) 
OUTPUTS = $(patsubst $(DIR)/%.txt,%.txt,$(INPUTS)) 

all: $(OUTPUTS) 

.PHONY: $(INPUTS) 

check: 
    @echo "DIR = $(DIR)" 
    @echo "INPUTS = $(INPUTS)" 
    @echo "OUTPUTS = $(OUTPUTS)" 

%.txt: $(DIR)/%.txt 
    sed -e "s/test/cat/g" "$<" > [email protected] 

就目前而言,../src/內容是test1.txttest2.txt。 由於Makefile立即生效,運行make test2.txt會按預期生成文件。

target/ $ make test2.txt 
sed -e "s/test/cat/g" "../src/test2.txt" > test2.txt 

運行make check顯示INPUTSOUTPUTS正確。

target/ $ make check 
DIR = ../src 
INPUTS = ../src/test1.txt ../src/test2.txt 
OUTPUTS = test1.txt test2.txt 

如果我運行make all,它會每次生成每個文件。預計這裏有.PHONY $(INPUTS)行。

如果我刪除了.PHONY $(INPUTS)目標,使得到所有在自己有義務設法發現目標,使../src/test1.txt並不斷在它前面的前綴$(DIR),直至它太長的文件名和放棄。

make: stat: ../src/../src/../src/ [repeat for a few pages] ../src/../src/test1.txt: File name too long 
make: stat: ../src/../src/../src/ [repeat for a few pages] ../src/../src/../src/test1.txt: File name too long 
make: *** No rule to make target `../src/../src/../src/[repeat]../src/../src/test1.txt', needed by `../src/[repeat]../src/../src/test1.txt'. Stop. 

它從來沒有去處理test2.txt


正如我草擬這一點,我有想法,請從DIR, 的../和重新定位的Makefile所以這是父母雙方src/target/。這種方法似乎有效,但並不理想。最終會有這些Makefiles的鏈條,每個鏈接都從一個目錄拖到另一個目錄。

有沒有辦法將Makefile與生成的目標文件一起保存在'target /'中,並且將這些目標文件基於相對路徑中的某些內容?

回答

0

更換

%.txt: $(DIR)/%.txt 

有:

${CURDIR}/%.txt: $(DIR)/%.txt 

這樣%.txt沒有任何目錄匹配任何.txt文件。換句話說,您僅將此規則的範圍限制爲僅在${CURDIR}/中的文件,這可以防止無限遞歸。

有關更多詳細信息,請參閱§10.5.4 How Patterns Match

這也是很好的做法,以避免相對路徑:

DIR = $(abspath ../src) 
+0

完美。我不得不將OUTPUTS = ...行改爲OUTPUTS = $(patsubst $(DIR)/%.txt,$ {CURDIR} /%.txt,$(INPUTS))' 。謝謝! –

+0

@MattD。好,'make'對路徑有點過於敏感,它只會對字符串進行文件名比較,例如「../src/x」不等於「../src/../src/x」。 –

+0

@MattD。這就是將所有路徑轉換爲絕對值有助於避免此問題的原因。 –

相關問題