簡體   English   中英

Makefile始終說生成文件目標是最新的,但按預期生成目標

[英]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上輸出),則對該行為的解釋非常簡單:

  1. make檢測到需要重建$(GEN_FILE)並去調用規則。

  2. 在命令調用之前, make將在命令內部執行變量的擴展。 由於(不必要的) $(shell) ,在擴展過程中已經調用了$(GEN_SCRIPT)

  3. $(GEN_SCRIPT)可以工作,但是不產生任何輸出,因此$(shell $(GEN_SCRIPT))被擴展為空字符串。

  4. Make看到該命令為 ,因此沒有命令可以運行。

  5. 然后, make再次檢查文件(以防變量擴展具有副作用),並查看目標是否為最新。 但是,由於擴展命令為空,因此make打印其通用消息is up to date消息。

暫無
暫無

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

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