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 cleanmake checkHelloを含む」が常に返されます。

aを実行しmake cleanてからaを実行すると、make check「Helloを含む」は返されません。

注:どちらの場合も、印刷用に空でないファイルを返しますls -ltrgen

答え1

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

評価は、コマンドが実行されたときではなく、MakeがMakefileを読み取るときに発生します。したがって、file_nameMakefileを読み取るときに存在する場合はターゲットが実行checkされecho "Hello exists"、それ以外の場合は実行されません。

Makefileは実際にはファイルに記述する必要があり、必須であるため、checkfile_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

関連情報