
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
without時make clean
,make check
總是返回“Hello contains”。
執行 amake clean
然後執行 a make check
,它不會回傳「Hello contains」。
注意:在這兩種情況下,ls -ltr
ingen
都會傳回非空文件列印。
答案1
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