簡體   English   中英

Makefile:在構建任何目標之前創建文件

[英]Makefile: creating a file before building any target

(我的問題與Force Makefile在構建目標之前執行腳本不同)

我有以下Makefile

.PHONY: dump_params all

all: tmpA

tmpA: tmpB tmpC dump_params
    cat $(filter tmp%,$^) > $@

tmpB: dump_params
    touch $@

tmpC: dump_params
    touch $@

dump_params:
    echo "Makefile was run." >> config.txt

目標dump_params我想在每次調用新目標時創建/附加文件(以跟蹤所用工具的版本)。 但是,當我打電話的時候

make tmpA

所有目標都是從頭開始構建的

$ make tmpA
echo "Makefile was run " >> config.txt
touch tmpB
touch tmpC
cat tmpB tmpC > tmpA

$ make tmpA
echo "Makefile was run." >> config.txt
touch tmpB
touch tmpC
cat tmpB tmpC > tmpA

如何防止Make重新構建所有內容,因為該目標是'dump_params'? 有沒有另一種方法來創建這種日志文件?

編輯 :我正在使用並行make(選項-j)。 定義宏以在語句部分中創建文件不是一種選擇。

使用僅訂單的先決條件

.PHONY: dump_params all

all: tmpA

tmpA: tmpB tmpC | dump_params
    cat $(filter tmp%,$^) > $@

tmpB: | dump_params
    touch $@

tmpC: | dump_params
    touch $@

dump_params:
    echo "Makefile was run." >> config.txt

另一種選擇是立即使用擴展的shell函數,例如:

__dummy := $(shell echo "Makefile was run." >> config.txt)

由於它會立即展開,因此在讀入makefile時將調用一次shell腳本。無需定義dump_params目標或將其作為先決條件包含在內。 這是一個更老的學校,但它的優勢在於它將為make的每次調用運行,而不必經歷並確保每個目標都具有定義的正確的僅訂單先決條件。

非答案,但是snakemake(還有其他人,我懷疑)支持跟蹤規則(代碼),參數,輸入和可執行版本。

https://bitbucket.org/johanneskoester/snakemake

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM