2010-04-26 20 views
44

Makefile değişken değerini hedef gövdenin içinde yeniden atamanın bir yolu var mı?Makefile değişken değerini hedef gövde içinde değiştirme

Ne yapmaya çalışıyorum ayıklama derleme için fazladan bayraklar eklemektir: Ben de bazı yeni bayraklar eklemek benim çevreyi temizlemek istiyoruz testi hedef çağırmak durumunda

%.erl: %.beam 
    $(ERLC) $(ERLFLAGS) -o ebin $< 

test: clean debug_compile_flag compile compile_test 

debug_compile: 
    $(ERLCFLAGS) += -DTEST 

(gibi -DTEST mevcut olanlara), bütün kodu bir kez daha derleyin (önce kaynaklar, sonra test modülleri).

Burada ve orada bir çok mantık bulunduğundan bazı yeni bayraklar ile derleme kodunu kopyalamak/yapıştırmak istemiyorum.

Varolan kodu yeniden kullanabilmem için değişken değerini yeniden tanımlamanın kolay bir yolu var mı?

+0

olası yinelenen (http://stackoverflow.com/questions [kural yürütme anda değişkeni yapmak tanımla]/1909188/tanımlamak-yap-değişken -kuralı-yürütme-zamanı) –

cevap

-5

Edit: Beta tarafından other answer'da açıklandığı gibi, bu mümkündür.


Hayır. Makefile'de bunu yapmanın bir yolu yoktur. Ancak, bir değişkenin değerini make komut satırında değiştirebilirsiniz. aşağıdaki gibi Eğer Makefile yeniden edin:

ERLCFLAGS += $(ERLCFLAGSADDED) 

%.erl: %.beam 
    $(ERLC) $(ERLCFLAGS) -o ebin $< 

test: clean compile compile_test 

Sonra kullanarak testleri yapmak için marka çağırabilirsiniz:

make ERLCFLAGSADDED=-DTEST test 
+0

Evet, çözüldü sen debug_compile içinde submake çalışan, önerildiği gibi sorun: ERLC_FLAGS = $ (ERLC_DEBUG_FLAGS) $ (MARKA) Teşekkür derlemek ! – paulgray

+0

Oh evet, harika. Bu submake çağırma hakkında düşünmedim. –

+0

Submake çağırma, bayrakların farklı değerleriyle birden çok kez bir hedef çalıştırmak istiyorsanız hala yararlıdır. Aşağıdaki yorumda alıntıladığım dokümanları görün. – ntc2

58

Evet, bunu yapmak için kolay bir yoldur ve Make rerunning olmadan.

test: clean debug_compile 

debug_compile: ERLCFLAGS += -DTEST 
debug_compile: compile compile_test; 
+2

Yürütme emri burada garanti ediliyor mu? Ya da bir şey -j2 şeyleri kırabilir mi? – Marenz

+2

[Dokümanlar] (http://www.gnu.org/software/make/manual/make.html # Target_002dspecific): "Belirli bir önkoşulun, her ne kadar, en fazla bir kez, her ne zaman, en çok bir kez, her bir hedefin birden fazla hedefin önkoşulu olması gerektiğine ve aynı hedef için farklı bir değere sahip olduğuna dikkat edin. belirli bir değişken, daha sonra yapılacak ilk hedef, önkoşulun oluşturulmasına ve ön koşulun, hedefe özgü değeri ilk hedeften miras almasına neden olacaktır. Bu, hedefe özgü değerleri başka herhangi bir hedeften göz ardı edecektir. " – ntc2

38

Başka cevabı burada: Define make variable at rule execution time bir target-specific variable value kullanın.

tembel, aşağıdaki gibi kurala sahip olabilir aşağıdaki (FLAG ve DEBUG benim değişkenler):

.DBG: 
    $(eval FLAG += $(DEBUG)) 
+2

Sadece benim için çalışan sürüm, teşekkürler! – Raphael

+1

Tonlarca garip yan etkisi olan $ (eval xxx) 'ile çok fazla sorunum var. "Gerçek" bir Makefile değişken ataması kadar işe yaramıyor. – Cyan

+0

"eval" işleviyle ilgili bir sorun yaşadım - Değişkenlerim için boş değerler aldım çünkü değişkenin tanımladığı değişken, bu satır ulaşıldığında değil, hedef yürütme başlangıcındaki değeri alır. Örneğin, hedefin başında bazı dosyalar oluşturuyorsanız ve daha sonra 'eval FILES = $ (shell ls)' kullanarak bazı değişkenleri doldurmaya çalışırsanız, FILES değişkeniniz boş olacaktır –

0

Ben kaynak kodu yeniden derlenerek ima testleri, çalıştırmak için bir makefile Hedef eklemek istedim bazı hata ayıklama bayrakları ile. Ian'ın cevabı: https://stackoverflow.com/a/15561911/, çalışan tek çözümdü.

İşte make tests çalıştırırken yürütme sırasını garanti eder ben ile geldi Makefile verilmiştir: ait

TARGET  = a.out 

CC   = g++ 
GENERIC_F = -Wall -Wextra -I. -Idoctest/doctest/ 

CFLAGS  = -O0 -std=c++11 $(GENERIC_F) 
DEBUG_MODE = -DDEBUG 

LINKER  = g++ 
LFLAGS  = $(GENERIC_F) -lm 

SRCDIR  = src 
OBJDIR  = build 
BINDIR  = bin 

SOURCES = $(wildcard $(SRCDIR)/*.cc) 
INCLUDES = $(wildcard $(SRCDIR)/*.h) 
OBJECTS = $(SOURCES:$(SRCDIR)/%.cc=$(OBJDIR)/%.o) 
rm   = rm -f 

.PHONY: clear_screen tests extend_cflags 

$(BINDIR)/$(TARGET): $(OBJECTS) $(INCLUDES) 
    $(LINKER) $(OBJECTS) $(LFLAGS) -o [email protected] 
    @echo -e "Linking complete!\n" 

$(OBJECTS): $(OBJDIR)/%.o : $(SRCDIR)/%.cc $(INCLUDES) 
    @mkdir -p $(OBJDIR) $(BINDIR) 
    $(CC) $(CFLAGS) -c $< -o [email protected] 
    @echo -e "Compiled "$<" successfully!\n" 

.PHONY: clean 
clean: 
    @$(rm) $(OBJECTS) 
    @echo "Cleanup complete!" 

.PHONY: remove 
remove: clean 
    @$(rm) $(BINDIR)/$(TARGET) 
    @echo "Executable removed!" 

clear_screen: 
    @clear 

extend_cflags: 
    $(eval CFLAGS += $(DEBUG_MODE)) 

tests: | remove extend_cflags $(BINDIR)/$(TARGET) clear_screen 
    @$(BINDIR)/$(TARGET)