Make
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 check
沒有make clean
時,make check
總是返回“你好存在”。做 a
make clean
然後 amake check
,它不會返回“你好存在”。注意:在這兩種情況下,
ls -ltr
ingen
返回一個非空文件列印。
ifeq ($(shell test -e file_name && echo -n yes),yes)
在 Make 讀取 Makefile 時進行評估,而不是在執行命令時進行評估。因此,如果
file_name
在讀取 Makefile 時存在,則check
目標將執行echo "Hello exists"
,否則不會。Makefile 應該盡可能地用文件來描述;在你的情況下,
check
需要file_name
和file_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