2010-07-13 13 views
22

Gnu, derleyici tanımından etkilenen nesneleri yeniden oluşturmaya zorlar

make OPTION_1=1 

komut satırında seçenekleri alan bir makefile var. Değere bağlı olarak, bir alt kümesine ek derleyici tanımları ekleyecektir.

ifeq ($(OPTION_1), 1) 
CC_FLAGS += -DOPTION_1_ON 
endif 

Tanımdaki değişiklik içerilen başlık dosyası içeriğini etkiler - bir saplama veya bir uygulama nesne dosyalarına açıktır.

Bu seçeneğin değiştirilmesiyle 'etkilenen' dosyaları yeniden oluşturmak için nasıl yapabilirim?

cevap

39

böyle böyle seçeneklerin son değerini, hatırlamak için bir dosya kullanın:

.PHONY: force 
compiler_flags: force 
    echo '$(CC_FLAGS)' | cmp -s - [email protected] || echo '$(CC_FLAGS)' > [email protected] 

cmp || echo bit ayarı değişiklikleri, şimdi

gibi bir şey yazabilirsiniz zaman dosya compiler_flags sadece dokundu demektir
$(OBJECTS): compiler_flags 

derleyici bayrakları değiştirdiğinizde bir $(OBJECTS) rebuild neden. Compiler_flags kuralı, her çalıştırdığınızda yürütülür, ancak $(OBJECTS)'un yeniden oluşturulması, yalnızca compiler_flags dosyasının gerçekten değiştirilmiş olması durumunda tetiklenir.

+0

Örnek için teşekkürler. Bir geçici dosya olmadan bunu yapmak mümkün görünmüyor utanç. – Oliver

+0

“compiler_flags.tmp” oluşturulmasını önlemek için düzenlenmiş, biraz daha bulanık görünüyor. Yine de demek istediğin şeyden şüpheleniyorum. Ayarı hatırlamak için * bazı * dosyalarının yaratılmasının bir yolu yoktur, çünkü yapının birden çok çağrıda durumu korumanın başka bir yolu yoktur. – slowdog

+1

Yapınız büyük olursa, bu biraz verimsizdir. Kabuk çağırma ve güncel bir yapı için bile okunan bir dosya anlamına gelir. Bu durumlarda, derleyici bayraklarını _filename_ içinde kodlayın. – bobbogo

0

bunları bir hedefe yerleştirin, ardından her dosyaya dokunarak arayın.

İlgili konular