Zazwyczaj przekazuję definicje makr z "make command line" do "makefile" używając opcji: -Dname = wartość. Definicja jest dostępna w pliku makefile.
Przekazuję również definicje makr z „makefile” do „kodu źródłowego” przy użyciu podobnej opcji kompilatora: -Dname = wartość (obsługiwana w wielu kompilatorach). Ta definicja jest dostępna w kodzie źródłowym.
To, czego teraz potrzebuję, to umożliwienie użytkownikowi mojego makefile natychmiastowego przekazania dowolnych definicji makr z wiersza polecenia „make.exe” do „kodu źródłowego”, bez konieczności zmiany czegokolwiek w pliku makefile.
więc użytkownik może wpisać: make -f mymakefile.mk -SOMEOPTION var = 5
następnie bezpośrednio kod main.c może zobaczyć var:
int main()
{
int i = var;
}
Odpowiedzi:
Wywołaj
make
polecenie w ten sposób:I pamiętaj, aby użyć
$(CFLAGS)
polecenia kompilacji w pliku Makefile. Jak wspomniał @ jørgensen, umieszczenie przypisania zmiennej pomake
poleceniu nadpisujeCFLAGS
wartość już zdefiniowaną w Makefile.Alternatywnie możesz ustawić
-Dvar=42
inną zmienną niż,CFLAGS
a następnie ponownie użyć tej zmiennej w,CFLAGS
aby uniknąć całkowitego zastąpieniaCFLAGS
.źródło
$(CFLAGS)
powinno to być ostatnie, tak aby wszelkie opcje określone przez użytkownika nadpisały wszystko, co wewnętrznie ustawia Makefile. Oznaczałoby to użycie nplocal_CFLAGS = -Wall $(CFLAGS)
. I odwrotnie, jeśli jest coś, co naprawdę chcesz mieć pierwszeństwo, umieść to po$(CFLAGS)
, jak w komentarzu @MadScientist.CFLAGS="-Dvar1=42 -Dvar2=314"
CPPFLAGS
może oznaczać lepsze dopasowanie niżCFLAGS
lubCXXFLAGS
: stackoverflow.com/a/53527858/2278206Po prostu użyj do tego określonej zmiennej.
źródło
Zadzwoń w ten sposób
ponieważ chcesz nadpisać CFLAGS swojego Makefile, a nie tylko środowisko (które ma niższy priorytet w odniesieniu do zmiennych Makefile).
źródło
Z powodu złej reputacji nie mogę skomentować zaakceptowanej odpowiedzi.
Chciałbym wspomnieć o predefiniowanej zmiennej
CPPFLAGS
. Może lepiej pasować niżCFLAGS
lubCXXFLAGS
, ponieważ jest opisane w podręczniku GNU Make jako:Przykłady wbudowanych niejawnych reguł, które używają
CPPFLAGS
n.o
jest wykonywany automatycznien.c
z receptury o postaci:$(CC) $(CPPFLAGS) $(CFLAGS) -c
n.o
odbywa się automatycznie zn.cc
,n.cpp
lubn.C
z przepisu w postaci:$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c
Polecenia
make CPPFLAGS=-Dvar=123
można by użyć do zdefiniowania żądanego makra.Więcej informacji
źródło
źródło
Znajdź plik C i implementację Makefile poniżej, aby spełnić swoje wymagania
foo.c
Makefile
źródło