Bisakah saya meneruskan variabel ke Makefile GNU sebagai argumen baris perintah? Dengan kata lain, saya ingin memberikan beberapa argumen yang akhirnya akan menjadi variabel di Makefile.
Bisakah saya meneruskan variabel ke Makefile GNU sebagai argumen baris perintah? Dengan kata lain, saya ingin memberikan beberapa argumen yang akhirnya akan menjadi variabel di Makefile.
Anda memiliki beberapa opsi untuk mengatur variabel dari luar makefile Anda:
Dari lingkungan - setiap variabel lingkungan ditransformasikan menjadi variabel makefile dengan nama dan nilai yang sama.
Anda mungkin juga ingin mengatur -e
opsi (alias --environments-override
) aktif, dan variabel lingkungan Anda akan menimpa penugasan yang dibuat menjadi makefile (kecuali penugasan ini sendiri menggunakan override
arahan . Namun, tidak disarankan, dan jauh lebih baik dan fleksibel untuk menggunakan ?=
penugasan (variabel bersyarat) operator penugasan, itu hanya berpengaruh jika variabel belum didefinisikan):
FOO?=default_value_if_not_set_in_environment
Perhatikan bahwa variabel tertentu tidak diwarisi dari lingkungan:
MAKE
didapat dari nama skripSHELL
diatur dalam makefile, atau default ke /bin/sh
(rasional: perintah ditentukan dalam makefile, dan itu khusus shell).Dari baris perintah - make
dapat mengambil tugas variabel sebagai bagian dari baris perintahnya, berbaur dengan target:
make target FOO=bar
Tapi kemudian semua tugas ke FOO
variabel dalam makefile akan diabaikan kecuali jika Anda menggunakan override
arahan dalam penugasan. (Efeknya sama dengan -e
opsi untuk variabel lingkungan).
Mengekspor dari induk Make - jika Anda memanggil Make dari Makefile, Anda biasanya tidak boleh secara eksplisit menulis tugas variabel seperti ini:
# Don't do this!
target:
$(MAKE) -C target CC=$(CC) CFLAGS=$(CFLAGS)
Sebagai gantinya, solusi yang lebih baik mungkin untuk mengekspor variabel-variabel ini. Mengekspor variabel membuatnya ke lingkungan setiap permintaan shell, dan Melakukan panggilan dari perintah ini memilih variabel lingkungan seperti yang ditentukan di atas.
# Do like this
CFLAGS=-g
export CFLAGS
target:
$(MAKE) -C target
Anda juga dapat mengekspor semua variabel dengan menggunakan export
tanpa argumen.
make A='"as df"'
export PROJECT_MAKE_ARGS = CC=$(CC) CFLAGS=$(CFLAGS)
dan meneruskannya sebagaimake -C folder $(PROJECT_MAKE_FLAGS)
. Jika ada cara untuk memberitahu makefile perpustakaan untuk mengabaikan lingkungan, itu akan ideal (kebalikan dari -e).make target FOO=bar
make FOO=bar target
?Cara paling sederhana adalah:
Kemudian di makefile Anda, Anda bisa merujuk
$(foo)
. Perhatikan bahwa ini tidak akan menyebar ke sub-membuat secara otomatis.Jika Anda menggunakan sub-merek, lihat artikel ini: Mengkomunikasikan Variabel ke Sub-merek
sumber
included
di makefile utama?Katakanlah Anda memiliki makefile seperti ini:
Anda kemudian akan menyebutnya
make action argument=something
sumber
Dari manual :
Jadi, Anda dapat melakukan (dari bash):
menghasilkan variabel
FOOBAR
di Makefile Anda.sumber
Ada opsi lain yang tidak dikutip di sini yang termasuk dalam buku Make GNU oleh Stallman dan McGrath (lihat http://www.chemie.fu-berlin.de/chemnet/use/info/make/make_7.html ). Ini memberikan contoh:
Ini melibatkan verifikasi jika parameter yang diberikan muncul di
MAKEFLAGS
. Sebagai contoh .. misalkan Anda sedang mempelajari tentang utas di c ++ 11 dan Anda telah membagi studi Anda di beberapa file (class01
, ...,classNM
) dan Anda ingin: kompilasi maka semua dan jalankan secara individu atau kompilasi satu per satu waktu dan jalankan jika bendera ditentukan (-r
, misalnya). Jadi, Anda bisa membuat yang berikut iniMakefile
:Dengan itu, Anda akan:
make -r class02
;make
ataumake all
;make -r
(misalkan semuanya berisi beberapa jenis hal tertentu dan Anda hanya ingin menguji semuanya)sumber
kelihatannya
perintah args menimpa variabel lingkungan
Makefile
Jalankan contoh
sumber
Jika Anda membuat file bernama Makefile dan menambahkan variabel seperti ini $ (belum dikirim) maka Anda akan dapat menggunakan variabel ini di dalam Makefile bahkan dengan wildcard
contoh:
Saya menggunakan BOOST_TEST dan dengan memberikan wildcard ke parameter --run_test = $ (unittest) maka saya akan dapat menggunakan ekspresi reguler untuk menyaring tes. Saya ingin Makefile saya dijalankan
sumber
Kemudian gunakan variabel,
$(ROOT_DIR)
di Makefile.sumber