Kann ich in einem Makefile eine Regel aus einer anderen Regel aufrufen?
Ähnlich zu:
rule1:
echo "bye"
rule2:
date
rule3:
@echo "hello"
rule1
Kann ich in einem Makefile eine Regel aus einer anderen Regel aufrufen?
Ähnlich zu:
rule1:
echo "bye"
rule2:
date
rule3:
@echo "hello"
rule1
Antworten:
Verwenden Sie entweder Abhängigkeiten oder rekursives Erstellen, um eine Verbindung von einer Regel zur anderen herzustellen.
Abhängigkeiten würden wie folgt ausgeführt (obwohl die Reihenfolge unterschiedlich sein wird):
rule1:
echo "bye"
rule2:
date
rule3: rule1
@echo "hello"
Rekursives Erstellen würde folgendermaßen erfolgen (obwohl es sich um einen Unterprozess handelt):
rule1:
echo "bye"
rule2:
date
rule3:
@echo "hello"
$(MAKE) rule1
Weder ist perfekt; In der Tat können Sie mit rekursivem Make in erhebliche Probleme geraten, wenn Sie eine Schleife erstellen. Sie sollten wahrscheinlich auch eine .PHONYRegel hinzufügen , um diese Regeln als synthetisch zu kennzeichnen, damit ein Streuner rule1(usw.) im Verzeichnis keine Verwirrung stiftet.
Fügen Sie einfach eine neue Regel mit der gewünschten Reihenfolge hinzu.
rule1:
echo "bye"
rule2:
date
rule3:
@echo "hello"
rule4: rule3 rule1
make -j2zum Beispiel) eine unbestimmte Ausführungsreihenfolge.
rule4: | rule3 rule1
Makefiles sind nicht prozedural; "Regeln" sind keine Funktionen. Sie können jedoch angeben, dass eine Regel eine Voraussetzung für eine andere ist:
rule1:
@echo "Rule 1"
rule2: rule1
@echo "Rule 2"
Wenn Sie dies tun make rule2, sollten Sie sehen:
Rule 1
Rule 2
In GNU Make gibt es zwei erweiterte Funktionen, die dies tun können, obwohl sie nur unter mildernden Umständen verwendet werden sollten. Diese SO ist in Google am besten bewertet.
Regelvoraussetzungen werden eher empfohlen, aber manchmal benötigen Sie eine Nachanforderung.
Im Wesentlichen können Sie mit Eval Ziele im laufenden Betrieb erstellen, und mit Call können Funktionen wie "Definieren" erstellt werden.
Ein einfacher Weg, dies zu tun, ist:
ifeq (a, b)
build_target:=one
else
build_target:=two
endif
mytarget: $(build_target)