Mithilfe von bedingten Regeln in einem makefile
Ich erfassen die Absicht des Makefile in pseudo-code, dann geben die Fragen, die ich habe. Ich bin auf der Suche nach ein Makefile, das ist benutzerfreundlicher in einer test-Umgebung. Die korrekte Verwendung des Makefiles wird einer der unten.
make CATEGORY=parser TEST=basic.
make ALL
Wenn ein Benutzer gibt "NUR" die Befehle, wie unten angegeben, sollte es zu drucken die Meldung "KATEGORIE definierten TEST-undefiniert", und vice-versa
make CATEGORY=parser
make TEST=basic
Ich habe versucht zu schreiben das Makefile in der folgenden Weise, aber Fehler aus:
help:
echo"Usage: make CATEGORY=<advanced|basic> TEST=<test-case>
echo" make ALL
ifdef CATEGORY
ifdef TEST
CATEGORY_TEST_DEFINED = 1
else
echo "TEST not defined"
else
echo "CATEGORY not defined"
endif
ifeq ($(CATEGORY_TEST_DEFINED), 1)
$(CATEGORY):
cd $(PROJ)/$(CATEGORY)
make -f test.mk $(TEST)
endif
ifdef ALL
$(ALL):
for i in `ls`
cd $$(i)
make all
endif
Fragen, die ich habe sind:
-
Ob die Regeln in einem Makefile können wählerisch sein (mit ifdef wählen Sie die Regeln und Ziele).
-
echo funktioniert nicht. echo sollte helfen, den Benutzer mit der richtigen Verwendung.
- Folgt auf @Beta ' s point, sollten Sie sich die FAQ und insbesondere den Abschnitt Wie kann ich die Fragen hier?.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das problem ist, dass
echo
gehört zu der Schale; Machen, kann es passieren, um in der shell einen Befehl, sondern Machen, nicht ausführen. Verwendeninfo
statt:Wenn Sie möchten, dass die Regeln, die auf bedingten:
echo
ist in einem Befehl in derhello
Regel. Wenn Sie "make hello", Machen Sie sendet diesen Befehl an die shell. Wenn Sie möchten, es so zu tun, müssen Sie die Verbindung der "nicht definiert" Nachrichten mit irgendeinem Ziel, das scheint unordentlich.Diese Linien sind zweifelhaft:
Benötigen Sie einen Raum zwischen
echo
und den string, und der string beendet werden muss:Diese Linien sind zweifelhaft:
Sicherlich benötigen Sie eine
endif
vor dem zweitenelse
? (Auch wenn es nicht syntaktisch obligatorisch, ich würde es empfehlen.)Darüber hinaus
make
nur ausgeführt wird, Befehle wieecho
soll bei der Verarbeitung ein Ziel (Regel). Es wird nicht ausgeführtecho
vorhanden; es wird einfach das Objekt aus, das Sie nicht definieren kann, Befehle ohne Aktionen für ein Ziel. Trotz allem, dass GNU Make, fügt sich ein makefile, das die Sprache in ein makefile ist eine deklarative Sprache und nicht eine prozedurale Sprache.Einen anderen Weg, der Umgang mit dieser ist zu definieren, default-Werte für die Makros:
Vorschlagswerte, die etwas tun, semi-vernünftig; damit der Benutzer den Standardwert überschreiben, wenn Sie möchten. Sie können eine Regel wie:
Lassen Sie
help
als die erste Regel. Ich habe einige Verzeichnisse, in denen die erste Regel ist:Dies ist äquivalent zu dem, was Sie haben (außer, dass
make
nicht den echo Befehl vor der Ausführung, so sehe ich nur die Meldung anstelle des echo Befehls-Zeile und der Nachricht; das ist die@
bei der Arbeit). Das makefile dies kommt auch in der Regelall
die sonst in der Regel der vernünftigste erste (Standard -) Regel.