Bagaimana cara meneruskan definisi makro dari argumen baris perintah "make" (-D) ke kode sumber C?

107

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;
}
MohamedEzz
sumber
15
Mengapa suara negatifnya? Sepertinya pertanyaan yang benar-benar sah bagi saya.
Thomas

Jawaban:

99

Panggil makeperintah dengan cara ini:

make CFLAGS=-Dvar=42

Dan pastikan untuk menggunakan $(CFLAGS)perintah kompilasi Anda di Makefile. Seperti yang disebutkan @ jørgensen, meletakkan tugas variabel setelah makeperintah akan menimpa CFLAGSnilai yang sudah ditentukan Makefile.

Cara lainnya, Anda dapat menetapkan -Dvar=42variabel lain dari CFLAGSdan kemudian menggunakan kembali variabel ini CFLAGSuntuk menghindari penggantian sepenuhnya CFLAGS.

ouah
sumber
8
Anda tidak dapat menggunakan "CFLAGS = $ (CFLAGS) -Wall"; ini akan menjadi definisi rekursif dan make tidak mengizinkan ini. Anda dapat menggunakan "CFLAGS: = $ (CFLAGS) -Wall", atau "CFLAGS + = -Wall", tetapi itu tidak akan berfungsi karena tugas pada baris perintah memiliki prioritas yang lebih tinggi. Anda dapat menggunakan "override CFLAGS + = -Wall", tetapi umumnya kami menyarankan Anda untuk memilih variabel yang berbeda secara internal. Standar Pengkodean GNU membutuhkan CFLAGS dll. Dibiarkan untuk pengguna, dan file makefile memilih variabel lain, seperti "local_CFLAGS = $ (CFLAGS) -Wall".
MadScientist
2
Hanya untuk menambah catatan @MadScientist, Standar Pengkodean GNU juga menyatakan yang $(CFLAGS)harus datang terakhir, sehingga setiap opsi yang ditentukan oleh pengguna akan menimpa semua set Makefile secara internal. Itu berarti menggunakan mis local_CFLAGS = -Wall $(CFLAGS). Sebaliknya, jika ada sesuatu yang benar-benar ingin Anda $(CFLAGS)utamakan , letakkan setelahnya , seperti pada komentar @MadScientist.
Sam
1
Bagaimana cara mengatur beberapa makro dengan ini?
Woody Huang
2
@WoodyHuang misalnyaCFLAGS="-Dvar1=42 -Dvar2=314"
ouah
1
CPPFLAGSmungkin mewakili kecocokan yang lebih baik daripada CFLAGSatau CXXFLAGS: stackoverflow.com/a/53527858/2278206
psq
11

Cukup gunakan variabel khusus untuk itu.

$ cat Makefile 
all:
    echo foo | gcc $(USER_DEFINES) -E -xc - 

$ make USER_DEFINES="-Dfoo=one"
echo foo | gcc -Dfoo=one -E -xc - 
...
one

$ make USER_DEFINES="-Dfoo=bar"
echo foo | gcc -Dfoo=bar -E -xc - 
...
bar

$ make 
echo foo | gcc  -E -xc - 
...
foo
Tikar
sumber
10

Panggilan lakukan seperti ini

make CFLAGS=-Dvar=42

karena Anda ingin menimpa CFLAGS Makefile Anda, dan bukan hanya lingkungannya (yang memiliki prioritas lebih rendah terkait variabel Makefile).

jørgensen
sumber
6

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 daripada CFLAGSatau CXXFLAGS, karena ini dijelaskan oleh manual GNU Make sebagai:

Flag tambahan untuk diberikan ke C preprocessor dan program yang menggunakannya (compiler C dan Fortran).

Contoh aturan implisit bawaan yang digunakan CPPFLAGS

  • n.odibuat secara otomatis n.cdengan resep berupa:
    • $(CC) $(CPPFLAGS) $(CFLAGS) -c
  • n.odibuat secara otomatis dari n.cc,, n.cppatau n.Cdengan resep berbentuk:
    • $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c

Seseorang akan menggunakan perintah make CPPFLAGS=-Dvar=123untuk menentukan makro yang diinginkan.

Info lebih lanjut

psq
sumber
1
$ kucing x.mak
semua:
    echo $ (OPTION)
$ make -f x.mak 'OPTION = -DPASSTOC = 42'
echo -DPASSTOC = 42
-DPASSTOC = 42
pmg
sumber
-4

Temukan file C dan implementasi Makefile di bawah ini untuk memenuhi kebutuhan Anda

foo.c

 main ()
    {
        int a = MAKE_DEFINE;
        printf ("MAKE_DEFINE value:%d\n", a);
    }

Makefile

all:
    gcc -DMAKE_DEFINE=11 foo.c
mahendiran.b
sumber
pertanyaannya adalah meneruskan definisi sembarang dari baris perintah make langsung ke kode sumber C "tanpa mengubah makefile". Jadi saya ingin mengubah makefile saya sekali, untuk memungkinkan definisi sewenang-wenang itu dibuat.
MohamedEzz
Tidak bekerja untuk make. Itu membuat -DMAKE_DEFINE = 11 mengatakan opsi tidak valid.
Ramakrishnan Kannan