
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 presents"가 반환됩니다.
a를 수행 make clean
한 다음 a를 수행하면 make check
"Hello presents"가 반환되지 않습니다.
참고: 두 경우 모두 ls -ltr
in은 gen
비어 있지 않은 파일 인쇄를 반환합니다.
답변1
ifeq ($(shell test -e file_name && echo -n yes),yes)
명령이 실행될 때가 아니라 Make가 Makefile을 읽을 때 평가됩니다. 따라서 file_name
Makefile을 읽을 때 존재 하면 check
대상이 실행되고 echo "Hello exists"
그렇지 않으면 실행되지 않습니다.
Makefile은 가능한 한 파일 측면에서 설명되어야 합니다. 귀하의 경우에는 check
need 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