2013-04-04 45 views
0

Makefile中使用GNU利用文件作爲目標SUFFIXES

.SUFFIXES: .ext1 

.ext1: 
     echo bla bla 

我有一個配置文件路徑/到/ abc.ext1所以化妝路徑/到/ ABC工作正常。

我想要使path/to/abc.ext1也能正常工作。如果我可以重新使用現有的.ext1目標,那將會很棒。

+0

當你做「make abc.ext1」時,你想做什麼?你想要它建立'abc.ext1'嗎?或'路徑/到/ abc.ext1'? – Beta 2013-04-04 14:54:35

+0

path/to/abc.ext1已經存在,我不想構建它。我想要回應bla bla打印。正常運行make abc print echo bla bla。 – useratuniv 2013-04-04 14:56:45

+0

如果你不努力清楚地提出問題,我們不能給你一個有用的答案。 *你用什麼命令來調用Make?* – Beta 2013-04-05 16:41:54

回答

1

讓我試着總結一下我已經明白:

  1. 文件path/to/abc.ext1已經存在。
  2. 您已有make path/to/abc呼應bla bla而不創建文件path/to/abc
  3. 你會像make path/to/abc.ext1一樣表現得像make path/to/abc。在您當前的設置中,它不起作用,因爲path/to/abc.ext1已經存在,所以make沒有理由觸發規則來「重建」它。

在你的情況,你是不是建築的任何文件或abcabc.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.ext1make path/to/abc將始終運行echo bla bla,無論是否存在path/to/abc.ext1path/to/abcmake都不會檢查它們的存在)。

不幸的是,.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...)調用的困擾:每當您的Makefilemake加載時,它都會運行。如果速度太慢,可以用顯式的文件名列表替換它(可能會自動生成)。

你的問題給出了零上下文,所以很難提出更多有用的選擇。它仍然覺得你試圖濫用make。當你陳述像「make foo.ext1應該運行一些命令,即使foo.ext1存在」的東西,這是可疑的。難道你不能寫一個只帶一個參數的簡單shell腳本嗎?只要$1$1.ext1存在,是否echo bla bla?這可能比試圖解決make的語義要容易得多。

+0

這確實解決了上述問題。我必須解決make語義問題,因爲回聲「bla bla」要複雜得多,並且需要遞歸調用回目標。因此,使用make語義進行編譯將需要修改構建系統。謝謝 – useratuniv 2013-04-08 14:38:00

0

您可以只爲abc.ext1添加規則,然後運行make abc.ext1就可以工作。只有在沒有可用的明確規則時纔會搜索後綴規則。

如果這不適合您的情況,請更清楚地解釋您的問題。

+0

我之前嘗試過這樣做,因爲conf文件位於文件夾內,所以無法工作。看起來像/不在目標,建議? – useratuniv 2013-04-04 14:18:16

+0

如果我使用%.ext1:作爲我的目標,它不起作用。它說:make'path/to/abc.ext1'更新至今。 – useratuniv 2013-04-04 14:27:26

+2

您需要編輯您的問題以添加這些詳細信息。諸如文件位於不同目錄等事實對於提供答案是絕對關鍵的。因爲這是你的問題,我們無法提供足夠的信息來回答它。你應該顯示你的makefile,剪切/粘貼你現在輸入的命令和輸出,然後顯示你想要輸入的命令,以及你輸入時想要發生的事情。 – MadScientist 2013-04-04 18:14:45

0

MadScientist的答案似乎是正確的,但我認爲這裏存在一個錯誤的交流。

如果你有這樣的規則:

%.ext1: 
    echo bla bla 

,你make abc.ext1,會發生什麼?

+0

它對make path/to/abc.ext1不起作用 – useratuniv 2013-04-05 16:58:54

相關問題