Jawaban:
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.
export PROJECT_MAKE_ARGS = CC=$(CC) CFLAGS=$(CFLAGS)
dan meneruskannya sebagai make -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:
make foo=bar target
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
included
di makefile utama?
Dari manual :
Variabel dalam make dapat berasal dari lingkungan di mana make dijalankan. Setiap variabel lingkungan yang membuat melihat ketika mulai diubah menjadi variabel make dengan nama dan nilai yang sama. Namun, tugas eksplisit dalam makefile, atau dengan argumen perintah, menimpa lingkungan.
Jadi, Anda dapat melakukan (dari bash):
FOOBAR=1 make
menghasilkan variabel FOOBAR
di Makefile Anda.
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:
archive.a: ...
ifneq (,$(findstring t,$(MAKEFLAGS)))
+touch archive.a
+ranlib -t archive.a
else
ranlib archive.a
endif
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 ini Makefile
:
CXX=clang++-3.5
CXXFLAGS = -Wall -Werror -std=c++11
LDLIBS = -lpthread
SOURCES = class01 class02 class03
%: %.cxx
$(CXX) $(CXXFLAGS) -o $@.out $^ $(LDLIBS)
ifneq (,$(findstring r, $(MAKEFLAGS)))
./$@.out
endif
all: $(SOURCES)
.PHONY: clean
clean:
find . -name "*.out" -delete
Dengan itu, Anda akan:
make -r class02
;make
atau make all
;make -r
(misalkan semuanya berisi beberapa jenis hal tertentu dan Anda hanya ingin menguji semuanya)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:
make unittest=*
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
make A='"as df"'