Make

Makefile:文件存在檢查不一致

  • April 5, 2022
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 check沒有make clean時,make check總是返回“你好存在”。

做 amake clean然後 a make check,它不會返回“你好存在”。

注意:在這兩種情況下,ls -ltringen返回一個非空文件列印。

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

引用自:https://unix.stackexchange.com/questions/603997