Normalerweise übergebe ich Makrodefinitionen von "make command line" an ein "makefile" mit der Option: -Dname = value. Die Definition ist im Makefile zugänglich.
Ich übergebe auch Makrodefinitionen aus dem "Makefile" an den "Quellcode" mit der ähnlichen Compileroption: -Dname = value (wird von vielen Compilern unterstützt). Auf diese Definition kann im Quellcode zugegriffen werden.
Was ich jetzt brauche, ist, dem Benutzer meines Makefiles zu ermöglichen, beliebige Makrodefinitionen von der "make.exe-Befehlszeile" sofort an "Quellcode" zu übergeben, ohne etwas im Makefile ändern zu müssen.
Der Benutzer kann also Folgendes eingeben: make -f mymakefile.mk -SOMEOPTION var = 5
dann kann direkt der Code main.c var sehen:
int main()
{
int i = var;
}
Antworten:
Rufen Sie den
make
Befehl folgendermaßen auf:Und stellen Sie sicher, dass Sie
$(CFLAGS)
Ihren Kompilierungsbefehl im Makefile verwenden. Wie @ jørgensen erwähnt hat,make
überschreibt das Setzen der Variablenzuweisung nach dem Befehl denCFLAGS
Wert, der bereits im Makefile definiert wurde.Alternativ können Sie eine
-Dvar=42
andere Variable als festlegenCFLAGS
und diese Variable dann wiederverwendenCFLAGS
, um ein vollständiges Überschreiben zu vermeidenCFLAGS
.quelle
$(CFLAGS)
sie als letztes gelten sollen, damit alle von einem Benutzer angegebenen Optionen alles überschreiben, was das Makefile intern festlegt. Das würde bedeuten, zB zu verwendenlocal_CFLAGS = -Wall $(CFLAGS)
. Umgekehrt, wenn es etwas gibt, das wirklich Vorrang haben soll, setzen Sie es nach$(CFLAGS)
, wie im @ MadScientist-Kommentar.CFLAGS="-Dvar1=42 -Dvar2=314"
CPPFLAGS
könnte eine bessere Passform darstellen alsCFLAGS
oderCXXFLAGS
: stackoverflow.com/a/53527858/2278206Verwenden Sie dazu einfach eine bestimmte Variable.
quelle
Rufen Sie machen diese Art und Weise
weil Sie die CFLAGS Ihres Makefiles überschreiben möchten und nicht nur die Umgebung (die in Bezug auf Makefile-Variablen eine niedrigere Priorität hat).
quelle
Aufgrund des geringen Ansehens kann ich die akzeptierte Antwort nicht kommentieren.
Ich möchte die vordefinierte Variable erwähnen
CPPFLAGS
. Es könnte eine bessere Passform darstellen alsCFLAGS
oderCXXFLAGS
, da es im GNU Make- Handbuch wie folgt beschrieben wird :Beispiele für integrierte implizite Regeln, die verwendet werden
CPPFLAGS
n.o
wird automatischn.c
mit einem Rezept des Formulars erstellt:$(CC) $(CPPFLAGS) $(CFLAGS) -c
n.o
wird automatisch aus hergestelltn.cc
,n.cpp
odern.C
mit einem Rezept der Form:$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c
Man würde den Befehl verwenden
make CPPFLAGS=-Dvar=123
, um das gewünschte Makro zu definieren.Mehr Info
quelle
quelle
Suchen Sie unten die C-Datei und die Makefile-Implementierung, um Ihre Anforderungen zu erfüllen
foo.c
Makefile
quelle