Makefile:文件存在檢查不一致

Makefile:文件存在檢查不一致
check: gen
#       ls -ltr file_name*
ifeq ($(shell test -s file_name && echo -n yes),yes)
        Do something with file_name and file_name1
else
       Do something else with file_name1
endif

# Will generate file_name and file_name1. Depending on the implementation , file_name can be empty sometimes.
gen: 
        <some command to generate file_name and file_name1>

clean:
        -rm -rf file_name*

當我執行make checkwithout時make cleanmake check總是返回“Hello contains”。

執行 amake clean然後執行 a make check,它不會回傳「Hello contains」。

注意:在這兩種情況下,ls -ltringen都會傳回非空文件列印。

答案1

ifeq ($(shell test -e file_name && echo -n yes),yes)

在 Make 讀取 Makefile 時進行評估,而不是在執行命令時進行評估。因此,如果file_name讀取 Makefile 時存在,則check目標將運行echo "Hello exists",否則不會運行。

Makefile 其實應該盡可能地用文件來描述;在您的情況下,check需要file_namefile_name1,所以這就是應該指定的內容:

check: file_name file_name1
        <run your checks>

file_name file_name1:
        <some command to generate file_name and file_name1>

clean:
        rm -f file_name file_name1

檢查本身可以涉及您可以在 shell 中執行的任何命令,包括對檔案的測試,但您不能根據 Makefile 處理期間更改的條件來使 Makefile 的某些部分成為條件(至少不容易)。對於你的情況,你可以做類似的事情

check: file_name file_name1
        test -s file_name && <do something with both files>
        ! test -s file_name && <do something with only file_name1>

或者更明確地說,使用轉義符,因為這需要在單一 shell 呼叫中運行:

check: file_name file_name1
        if [ -s file_name ]; then \
            <do something with both files> \
        else \
            <do something with file_name1> \
        fi

相關內容