這似乎與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.txt
和test2.txt
。 由於Makefile立即生效,運行make test2.txt
會按預期生成文件。
target/ $ make test2.txt
sed -e "s/test/cat/g" "../src/test2.txt" > test2.txt
運行make check
顯示INPUTS
和OUTPUTS
正確。
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 /'中,並且將這些目標文件基於相對路徑中的某些內容?
完美。我不得不將OUTPUTS = ...行改爲OUTPUTS = $(patsubst $(DIR)/%.txt,$ {CURDIR} /%.txt,$(INPUTS))' 。謝謝! –
@MattD。好,'make'對路徑有點過於敏感,它只會對字符串進行文件名比較,例如「../src/x」不等於「../src/../src/x」。 –
@MattD。這就是將所有路徑轉換爲絕對值有助於避免此問題的原因。 –