Yanıtlar:
Dosyanızın dışından değişkenleri ayarlamak için birkaç seçeneğiniz vardır:
Ortamdan - her ortam değişkeni aynı ad ve değere sahip bir makefile değişkenine dönüştürülür.
Ayrıca -e
(aka --environments-override
) seçeneğini de ayarlamak isteyebilirsiniz ve ortam değişkenleriniz makefile'a yapılan atamaları geçersiz kılar (bu atamaların kendileri override
yönerge kullanmadığı sürece . Ancak, önerilmez ve ?=
atamayı (koşullu değişken) kullanmak çok daha iyi ve esnektir atama işleci, yalnızca değişken henüz tanımlanmadıysa bir etkisi vardır):
FOO?=default_value_if_not_set_in_environment
Bazı değişkenlerin ortamdan miras alınmadığını unutmayın:
MAKE
senaryo adından alınmıştırSHELL
bir makefile içinde ayarlanır veya varsayılan olarak /bin/sh
(rationale: komutlar makefile içinde belirtilir ve kabuklara özgüdür).Komut satırından - komut satırının birmake
parçası olarak değişken atamaları hedeflerle karışabilir:
make target FOO=bar
Ancak , atamada yönergeyi kullanmazsanız, makefile içindeki değişkene yapılan tüm atamalar FOO
yok sayılır . (Etki, ortam değişkenleri seçeneğiyle aynıdır ).override
-e
Üst markadan dışa aktarma - Bir Makefile'den Make'ı çağırırsanız, genellikle açıkça aşağıdaki gibi değişken atamaları yazmamalısınız:
# Don't do this!
target:
$(MAKE) -C target CC=$(CC) CFLAGS=$(CFLAGS)
Bunun yerine, bu değişkenleri dışa aktarmak daha iyi bir çözüm olabilir. Bir değişkeni dışa aktarmak, onu her kabuk çağrısının ortamına dönüştürür ve bu komutlardan çağrı yap, bu ortam değişkenini yukarıda belirtildiği gibi seçer.
# Do like this
CFLAGS=-g
export CFLAGS
target:
$(MAKE) -C target
Ayrıca bağımsız değişkenleri kullanarak tüm değişkenleri dışa aktarabilirsiniz export
.
export PROJECT_MAKE_ARGS = CC=$(CC) CFLAGS=$(CFLAGS)
ve iletmek olabilir make -C folder $(PROJECT_MAKE_FLAGS)
. Eğer kütüphanenin yapıtını çevreyi görmezden gelmesini söylemenin bir yolu varsa, bu ideal olur (-e'nin tersi).
make target FOO=bar
make FOO=bar target
?
En basit yol:
make foo=bar target
Daha sonra makyaj dosyanızda $(foo)
. Bunun otomatik olarak alt markalara yayılmayacağını unutmayın.
Alt marka kullanıyorsanız, şu makaleye bakın: Değişkenleri Alt Marka ile İletişim
included
ile ana makefile makefiles demek ?
Gönderen manuel :
Markadaki değişkenler, markanın çalıştığı ortamdan gelebilir. Başladığında gören her ortam değişkeni, aynı ada ve değere sahip bir marka oluşturma değişkenine dönüştürülür. Ancak, makefile veya komut bağımsız değişkeni içeren açık bir atama ortamı geçersiz kılar.
Böylece (bash'tan) şunları yapabilirsiniz:
FOOBAR=1 make
FOOBAR
Makefile'nizde bir değişkenle sonuçlanır .
Burada belirtilmeyen, Stallman ve McGrath'in GNU Make kitabında yer alan başka bir seçenek var (bkz. Http://www.chemie.fu-berlin.de/chemnet/use/info/make/make_7.html ). Örneği sağlar:
archive.a: ...
ifneq (,$(findstring t,$(MAKEFLAGS)))
+touch archive.a
+ranlib -t archive.a
else
ranlib archive.a
endif
Belirli bir parametrenin görünüp görünmediğini doğrulamayı içerir MAKEFLAGS
. Örneğin, diyelim ki c ++ 11'deki konuları inceliyorsunuz ve çalışmanızı birden fazla dosyaya ( class01
, ..., classNM
) bölüyorsunuz ve şunları yapmak istiyorsunuz: hepsini derleyin ve tek tek çalıştırın veya bir zamanını seçin ve bir bayrak belirtilmişse ( -r
örneğin) çalıştırın. Yani, aşağıdakileri ortaya çıkarabilirsiniz 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
Buna sahip olsaydınız:
make -r class02
;make
veya make all
;make -r
(hepsi assert bazı şeyler belli bir tür içerir ve sadece hepsini test etmek istediğinizi varsayalım)anlaşılan
komut argümanları üzerine yazma ortam değişkeni
Makefile
send:
echo $(MESSAGE1) $(MESSAGE2)
Örneği çalıştır
$ MESSAGE1=YES MESSAGE2=NG make send MESSAGE2=OK
echo YES OK
YES OK
Makefile adlı bir dosya yaparsanız ve bu $ (unittest) gibi bir değişken eklerseniz, bu değişkeni Makefile içinde joker karakterlerle bile kullanabilirsiniz.
misal :
make unittest=*
BOOST_TEST kullanın ve --run_test = $ (unittest) parametresine bir joker karakter vererek daha sonra Makefile çalıştırmak istiyorum testi filtrelemek için düzenli ifade kullanabilecektir
make A='"as df"'