2011-11-22 86 views
1

我目前有一個makefile來處理一些數據。 makefile通過獲取CONFIG文件來獲取數據處理的輸入,CONFIG文件定義了變量中的輸入數據。目前,我輸入文件的符號鏈接到本地​​目錄,即生成文件包含:如何從變量生成makefile目標?

tmp/%.txt: tmp 
    ln -fs $(shell echo $(INPUTS) | tr ' ' '\n' | grep $(patsubst tmp/%,%,[email protected])) [email protected] 

這不是非常優雅,但似乎工作。有沒有更好的辦法?基本上,給出

INPUTS = /foo/bar.txt /zot/snarf.txt

上面將全部輸入文件鏈接到TMP /,這樣我可以像

%.out: tmp/%.txt 
    some command 
的規則處理它們

以及根據所有$(INPUT)文件合併結果的目標。

此外,除了klugosity之外,makefile不能正確使用-j,這對分析在合理的時間內完成至關重要。我想這是GNU make的一個錯誤,但歡迎提供任何提示。

+0

你試過了嗎? GNU支持你想要的語法。 –

+0

我用另一個替換了kludge,無條件鏈接所有輸入作爲變量初始化的一部分。這似乎工作,並不再使用-j時掛起。 LINKTMPFILES:= $(殼MKDIR -p TMP /; RM TMP/*; LN -fs $(輸入)TMP /) : %的.out:%的.txt 一些命令 還沒成爲優雅的典範,但是...... ***對不起,我沒有被允許作爲一個單獨的答案發布它*** – Ketil

+0

@JoachimPileborg:呃,你可能會更具體嗎? – Ketil

回答

0

你想要這樣的東西嗎?

TARGET = x 
INPUT = a.txt b.txt 
OUTPUT = $(INPUT:%.txt=%.out) 

.PHONY: default 
default: $(TARGET) 

$(TARGET): $(OUTPUT) 
    cat $^ > [email protected] 

%.out: %.txt 
    cp $< [email protected] 

試圖與-j選項make,但對於這樣一個簡單的例子可以很容易地解決依賴性和構建並行。

0

幾件事情在這裏:

  • make將輸入列表的照顧。沒有必要使用tr等。您可以使用make功能完成您想要的任何功能,例如patsubst
  • make適用於-j。如果它不像您預期​​的那樣工作,那麼這意味着您沒有在規則和依賴關係中表達所有想法。
  • 你寫過關於合併你的輸出。之前的項目符號的原因可能在這裏。您必須指示make您的合併目標取決於您所有的.out目標。然後,make將在合併之前等待所有目標。
  • 我想沒有必要創建符號鏈接到您的.txt源文件。我很確定你可以編寫使用輸入文件的模式規則。您必須允許輸出文件位於各個子目錄中。

它最終會沿着線的東西:

OUTPUTS = $(patsubst %.txt, out/%.out, $(INPUTS)) 

out/%.out: %.txt 
    <some command> 

merged: $(OUTPUTS) 
    <merge command> 
+0

在你的例子中的問題是,輸入(txt)文件駐留在當前目錄中,而我想從任意位置導入它們。我知道patsubst等人,但我不知道如何做到這一點(即從變量列表中選擇一個項目)。 – Ketil

+0

這沒有問題。你的輸入文件可以在任何地方。它會創建與完整源路徑匹配的目錄「out」以外的子目錄。 –

0

你可以嘗試使用vpath讓使找到輸入文件。然後您可以簡單地使用不帶目錄部分的文件名。像這樣的東西應該工作。 (該$(sort ...)有刪除重複;不是絕對必要)

INPUTS := ... 
OUTPUTS := $(patsubst %.txt, %.out, $(notdir $(INPUTS)) 

vpath %.txt $(sort $(dir $(INPUTS))) 

merged.txt: $(OUTPUTS) 
    <merge command> $^ -o [email protected] 

%.out: %.txt 
    <some command> $< -o [email protected] 

該解決方案依賴於有沒有被重複的文件名,但我認爲你通過創建符號鏈接暗示條件。

+0

我不知道VPATH,看起來它可能是我想要的,是的。謝謝! – Ketil

相關問題