Saya biasanya meneruskan definisi makro dari "make command line" ke "makefile" menggunakan opsi: -Dname = value. Definisi tersebut dapat diakses di dalam makefile.
Saya juga meneruskan definisi makro dari "makefile" ke "kode sumber" menggunakan opsi compiler serupa: -Dname = value (didukung di banyak kompiler). Definisi ini dapat diakses di kode sumber.
Yang saya butuhkan sekarang, adalah mengizinkan pengguna makefile saya untuk dapat melewatkan definisi makro sembarang dari "baris perintah make.exe" ke "kode sumber" langsung, tanpa harus mengubah apa pun di makefile.
sehingga pengguna dapat mengetik: make -f mymakefile.mk -SOMEOPTION var = 5
lalu langsung kode main.c bisa lihat var:
int main()
{
int i = var;
}
Jawaban:
Panggil
make
perintah dengan cara ini:Dan pastikan untuk menggunakan
$(CFLAGS)
perintah kompilasi Anda di Makefile. Seperti yang disebutkan @ jørgensen, meletakkan tugas variabel setelahmake
perintah akan menimpaCFLAGS
nilai yang sudah ditentukan Makefile.Cara lainnya, Anda dapat menetapkan
-Dvar=42
variabel lain dariCFLAGS
dan kemudian menggunakan kembali variabel iniCFLAGS
untuk menghindari penggantian sepenuhnyaCFLAGS
.sumber
$(CFLAGS)
harus datang terakhir, sehingga setiap opsi yang ditentukan oleh pengguna akan menimpa semua set Makefile secara internal. Itu berarti menggunakan mislocal_CFLAGS = -Wall $(CFLAGS)
. Sebaliknya, jika ada sesuatu yang benar-benar ingin Anda$(CFLAGS)
utamakan , letakkan setelahnya , seperti pada komentar @MadScientist.CFLAGS="-Dvar1=42 -Dvar2=314"
CPPFLAGS
mungkin mewakili kecocokan yang lebih baik daripadaCFLAGS
atauCXXFLAGS
: stackoverflow.com/a/53527858/2278206Cukup gunakan variabel khusus untuk itu.
sumber
Panggilan lakukan seperti ini
karena Anda ingin menimpa CFLAGS Makefile Anda, dan bukan hanya lingkungannya (yang memiliki prioritas lebih rendah terkait variabel Makefile).
sumber
Karena reputasinya yang rendah, saya tidak dapat berkomentar tentang jawaban yang diterima.
Saya ingin menyebutkan variabel standar
CPPFLAGS
. Ini mungkin mewakili kecocokan yang lebih baik daripadaCFLAGS
atauCXXFLAGS
, karena ini dijelaskan oleh manual GNU Make sebagai:Contoh aturan implisit bawaan yang digunakan
CPPFLAGS
n.o
dibuat secara otomatisn.c
dengan resep berupa:$(CC) $(CPPFLAGS) $(CFLAGS) -c
n.o
dibuat secara otomatis darin.cc
,,n.cpp
ataun.C
dengan resep berbentuk:$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c
Seseorang akan menggunakan perintah
make CPPFLAGS=-Dvar=123
untuk menentukan makro yang diinginkan.Info lebih lanjut
sumber
sumber
Temukan file C dan implementasi Makefile di bawah ini untuk memenuhi kebutuhan Anda
foo.c
Makefile
sumber