Makefile: 일관성 없는 파일 존재 확인

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 checkHello 포함"이 항상 반환됩니다.

a를 실행 make clean한 다음 a를 실행하면 make check"Hello 포함"이 반환되지 않습니다.

참고: 두 경우 모두 인쇄를 위해 비어 있지 않은 파일을 반환합니다 ls -ltr.gen

답변1

ifeq ($(shell test -e file_name && echo -n yes),yes)

평가는 명령이 실행될 때가 아니라 Make가 Makefile을 읽을 때 발생합니다. 따라서 file_nameMakefile을 읽을 때 존재 하면 check대상이 실행되고 echo "Hello exists", 그렇지 않으면 실행되지 않습니다.

Makefile은 실제로 가능한 한 파일에 설명되어야 하며 필수이므로 check다음 file_namefile_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

관련 정보