Makefile中使用GNU利用文件作爲目標SUFFIXES
.SUFFIXES: .ext1
.ext1:
echo bla bla
我有一個配置文件路徑/到/ abc.ext1所以化妝路徑/到/ ABC工作正常。
我想要使path/to/abc.ext1也能正常工作。如果我可以重新使用現有的.ext1目標,那將會很棒。
Makefile中使用GNU利用文件作爲目標SUFFIXES
.SUFFIXES: .ext1
.ext1:
echo bla bla
我有一個配置文件路徑/到/ abc.ext1所以化妝路徑/到/ ABC工作正常。
我想要使path/to/abc.ext1也能正常工作。如果我可以重新使用現有的.ext1目標,那將會很棒。
讓我試着總結一下我已經明白:
path/to/abc.ext1
已經存在。make path/to/abc
呼應bla bla
而不創建文件path/to/abc
。make path/to/abc.ext1
一樣表現得像make path/to/abc
。在您當前的設置中,它不起作用,因爲path/to/abc.ext1
已經存在,所以make
沒有理由觸發規則來「重建」它。在你的情況,你是不是建築的任何文件或abc
的abc.ext1
,所以你應該告訴make
,這些都是僞目標。 (我假設你想make abc
,即使abc
已經存在的工作和較新,abc.ext1
,對吧?)
對於單個文件,你可以有這樣的:
.PHONY: path/to/abc.ext1 path/to/abc
path/to/abc.ext1 path/to/abc:
@echo bla bla
這樣,make path/to/abc.ext1
或make path/to/abc
將始終運行echo bla bla
,無論是否存在path/to/abc.ext1
或path/to/abc
(make
都不會檢查它們的存在)。
不幸的是,.PHONY
需要一個明確的目標列表。藉助GNU,您可以使用$(wildcard...)
或者如果需要遞歸到子目錄中,使用$(shell find...)
來計算目標列表。例如:
EXT1_FILES = $(shell find -type f -name '*.ext1' -print)
PHONY_TARGETS = $(EXT1_FILES) $(EXT1_FILES:.ext1=)
.PHONY: $(PHONY_TARGETS)
$(PHONY_TARGETS):
@echo bla bla
的$(EXT1_FILES:.ext1=)
只是條從$(EXT1_FILES)
文件名全部.ext1
擴展。
如果您有一棵非常大的樹,您將受到$(shell find...)
調用的困擾:每當您的Makefile
被make
加載時,它都會運行。如果速度太慢,可以用顯式的文件名列表替換它(可能會自動生成)。
你的問題給出了零上下文,所以很難提出更多有用的選擇。它仍然覺得你試圖濫用make
。當你陳述像「make foo.ext1
應該運行一些命令,即使foo.ext1
存在」的東西,這是可疑的。難道你不能寫一個只帶一個參數的簡單shell腳本嗎?只要$1
或$1.ext1
存在,是否echo bla bla
?這可能比試圖解決make
的語義要容易得多。
這確實解決了上述問題。我必須解決make語義問題,因爲回聲「bla bla」要複雜得多,並且需要遞歸調用回目標。因此,使用make語義進行編譯將需要修改構建系統。謝謝 – useratuniv 2013-04-08 14:38:00
您可以只爲abc.ext1
添加規則,然後運行make abc.ext1
就可以工作。只有在沒有可用的明確規則時纔會搜索後綴規則。
如果這不適合您的情況,請更清楚地解釋您的問題。
我之前嘗試過這樣做,因爲conf文件位於文件夾內,所以無法工作。看起來像/不在目標,建議? – useratuniv 2013-04-04 14:18:16
如果我使用%.ext1:作爲我的目標,它不起作用。它說:make'path/to/abc.ext1'更新至今。 – useratuniv 2013-04-04 14:27:26
您需要編輯您的問題以添加這些詳細信息。諸如文件位於不同目錄等事實對於提供答案是絕對關鍵的。因爲這是你的問題,我們無法提供足夠的信息來回答它。你應該顯示你的makefile,剪切/粘貼你現在輸入的命令和輸出,然後顯示你想要輸入的命令,以及你輸入時想要發生的事情。 – MadScientist 2013-04-04 18:14:45
MadScientist的答案似乎是正確的,但我認爲這裏存在一個錯誤的交流。
如果你有這樣的規則:
%.ext1:
echo bla bla
,你make abc.ext1
,會發生什麼?
它對make path/to/abc.ext1不起作用 – useratuniv 2013-04-05 16:58:54
當你做「make abc.ext1」時,你想做什麼?你想要它建立'abc.ext1'嗎?或'路徑/到/ abc.ext1'? – Beta 2013-04-04 14:54:35
path/to/abc.ext1已經存在,我不想構建它。我想要回應bla bla打印。正常運行make abc print echo bla bla。 – useratuniv 2013-04-04 14:56:45
如果你不努力清楚地提出問題,我們不能給你一個有用的答案。 *你用什麼命令來調用Make?* – Beta 2013-04-05 16:41:54