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