
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*
Wenn ich eins make check
ohne mache make clean
, make check
wird immer „Hallo, existiert“ zurückgegeben.
Wenn Sie a make clean
und dann a ausführen make check
, wird nicht „Hallo, existiert“ zurückgegeben.
Hinweis: In beiden Fällen gibt der ls -ltr
Ausdruck gen
eine nicht leere Datei zurück.
Antwort1
ifeq ($(shell test -e file_name && echo -n yes),yes)
wird ausgewertet, wenn Make das Makefile liest, nicht wenn die Befehle ausgeführt werden. Wenn also file_name
beim Lesen des Makefiles vorhanden ist, check
wird das Ziel ausgeführt echo "Hello exists"
, andernfalls nicht.
Makefiles sollten wirklich so weit wie möglich in Form von Dateien beschrieben werden. In Ihrem Fall sind und check
erforderlich , daher sollte Folgendes angegeben werden: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
Die Prüfungen selbst können jeden Befehl umfassen, den Sie in Ihrer Shell ausführen könnten, einschließlich Tests an den Dateien, aber Sie können Teile des Makefiles nicht von Kriterien abhängig machen, die sich während der Verarbeitung des Makefiles ändern (zumindest nicht einfach). In Ihrem Fall könnten Sie etwas wie Folgendes tun:
check: file_name file_name1
test -s file_name && <do something with both files>
! test -s file_name && <do something with only file_name1>
oder expliziter mit Escapezeichen, da dies in einem einzigen Shell-Aufruf ausgeführt werden muss:
check: file_name file_name1
if [ -s file_name ]; then \
<do something with both files> \
else \
<do something with file_name1> \
fi