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
Hello 포함"이 항상 반환됩니다.
a를 실행 make clean
한 다음 a를 실행하면 make check
"Hello 포함"이 반환되지 않습니다.
참고: 두 경우 모두 인쇄를 위해 비어 있지 않은 파일을 반환합니다 ls -ltr
.gen
답변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
검사 자체에는 파일 테스트를 포함하여 셸에서 실행할 수 있는 모든 명령이 포함될 수 있지만 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>
또는 더 구체적으로 단일 쉘 호출에서 실행해야 하므로 이스케이프 문자를 사용하십시오.
check: file_name file_name1
if [ -s file_name ]; then \
<do something with both files> \
else \
<do something with file_name1> \
fi