[英]Makefile always says generated-file target is up to date, but generates target as expected
我有一個腳本,在運行時會生成一個文件。 如果生成的文件不存在或腳本更改,我想創建一個Makefile來運行腳本以生成文件。
這是簡化版。 假設我有一個可執行腳本gen_test.sh
如下所示:
#!/bin/sh
echo "This is a generated file" > genfile.foo
和一個像這樣的Makefile:
#
# Test Makefile
#
GEN_SCRIPT = $(CURDIR)/gen_test.sh
GEN_FILE = $(CURDIR)/genfile.foo
$(GEN_FILE): $(GEN_SCRIPT)
$(shell $(GEN_SCRIPT))
.PHONY: clean
clean:
$(RM) $(GEN_FILE)
運行make
,看到以下輸出:
make: '/workspace/sw/bhshelto/temp/makefile_test/genfile.foo' is up to date.
但實際上genfile.foo
確實會生成。
這里發生了什么? 為什么我看到“是最新的”消息,如何刪除它?
謝謝!
運行
make
,看到以下輸出:make: '/workspace/sw/bhshelto/temp/makefile_test/genfile.foo' is up to date.
但實際上
genfile.foo
確實會生成。
如user657267所建議:從配方主體中刪除$(shell)
。
假設gen_test.sh
不產生任何輸出(或僅在stderr上輸出),則對該行為的解釋非常簡單:
make
檢測到需要重建$(GEN_FILE)
並去調用規則。
在命令調用之前, make
將在命令內部執行變量的擴展。 由於(不必要的) $(shell)
,在擴展過程中已經調用了$(GEN_SCRIPT)
。
$(GEN_SCRIPT)
可以工作,但是不產生任何輸出,因此$(shell $(GEN_SCRIPT))
被擴展為空字符串。
Make看到該命令為空 ,因此沒有命令可以運行。
然后, make
再次檢查文件(以防變量擴展具有副作用),並查看目標是否為最新。 但是,由於擴展命令為空,因此make
打印其通用消息is up to date
消息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.