![Makefile:文件存在检查不一致](https://linux22.com/image/178404/Makefile%EF%BC%9A%E6%96%87%E4%BB%B6%E5%AD%98%E5%9C%A8%E6%A3%80%E6%9F%A5%E4%B8%8D%E4%B8%80%E8%87%B4.png)
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