2016-05-04 72 views
0

我有一個腳本,它在運行時會生成一個文件。如果生成的文件不存在或腳本更改,我想創建一個Makefile來運行腳本以生成文件。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確實會生成。

這是怎麼回事?爲什麼我會看到「正在更新」的信息,我該如何擺脫它?

謝謝!

+2

爲什麼在配方中使用'shell'?只需寫'$(GEN_SCRIPT)'而不是'$(shell $(GEN_SCRIPT))'。 – user657267

回答

1

當我運行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. 看到命令是爲空,因此沒有命令可以運行。

  5. make然後再次檢查文件(如果變量擴展有副作用)並且看到目標是最新的。然而,由於擴展的命令是空的,所以make打印它的通用is up to date消息。