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 check"Hello presents"가 반환됩니다.

a를 수행 make clean한 다음 a를 수행하면 make check"Hello presents"가 반환되지 않습니다.

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

답변1

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

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

Makefile은 가능한 한 파일 측면에서 설명되어야 합니다. 귀하의 경우에는 checkneed 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

관련 정보