Makefile: Prüfung auf Dateiexistenz nicht konsistent

Makefile: Prüfung auf Dateiexistenz nicht konsistent
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 checkohne mache make clean, make checkwird immer „Hallo, existiert“ zurückgegeben.

Wenn Sie a make cleanund dann a ausführen make check, wird nicht „Hallo, existiert“ zurückgegeben.

Hinweis: In beiden Fällen gibt der ls -ltrAusdruck geneine 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_namebeim Lesen des Makefiles vorhanden ist, checkwird 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 checkerforderlich , daher sollte Folgendes angegeben werden: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

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

verwandte Informationen