2012-10-19 17 views
8

ile sınırlı bir kapsamdaki değişkenler Mevcut projemde özyinelemeli bir make build sistemi uygulamaya çalışıyorum. Mücadele ettiğim değişkenler kapsamları. Hedefe özel değişkenler gereksinimlerime uymuyor, değişkenler genellikle hedefleri tanımlar ve önkoşulları değil. Benim ihtiyacım olan:GNU Make. Tek bir Makefile

Makefile1:

SOMEVAR := original_value 
include Makefile2 
$(warning $(SOMEVAR)) 

Makefile2:

#some magic here to do what I want and make me happy 
SOMEVAR := included_value 
#and maybe here 

Ve istediğim çıktısında 'original_value'.

Bunu yapmak için herhangi bir strateji var mı?

DÜZENLEME: =

+0

Bu çözüm oldukça iyi geliyor. Bunun nesi var? Ve SOMEVAR nedir, ne için kullanılır? – Beta

+1

Bu çözümde sevmediğim şey çok titrek olmasıdır. Eğer yerimi alacak olan zavallı bir adam fikrini ve yerini alamıyorsa, başka bir yerde bir sürü sürprizle karşılaşacaksınız. –

+1

Eğer Makefile2 bir kereden fazla içeriyorsa ve "$ (SOMEVAR)" anlamına gelen bir tarifi tanımlar. o zaman korkunç bir şekilde kırılacak --- tariflerin içindeki değişkenler, tarifler uygulandığında değerlendirilir, yani hepsinin '$ (SOMEVAR) 'son değerini, tarifi tanımlandığında sahip olduğu değeri göremeyeceği anlamına gelir. –

cevap

5

bir strateji, eski moda bir çözümdür: Şu an için geldi tek çözüm hemen değişken atama her bir Makefile sonunda tüm inlcudes yerleştirmek ve kullanmak için kendimi zorlamak ve organize etmektir tüm değişkenleriniz global değişkenler olduğunda değişken ad çarpışmalarına: değişken isimlerinize kötü isimlerin ad alanlarına bir önek ekleyin.

Makefile1:

Makefile1_SOMEVAR := original_value 
include Makefile2 
$(warning $(Makefile1_SOMEVAR)) 

Makefile2:

# no magic needed 
Makefile2_SOMEVAR := included_value 
# rest of Makefile2 uses $(Makefile2_SOMEVAR) of course 

, presto Hey ile her makefile en azından kendi değişkenleri içinde, kendi yerel değişkenleri (veya sanki var böyle bir kongre diğer maketlerle çakışmayan bir ad alanı).