2012-07-09 13 views
7

Bazı günlerde, hiyerarşik bir yazımın nasıl yazılacağı hakkında bilgi yığınının içine bir cevap gönderdim (http://stackoverflow.com/questions/1498213/make-hierarchical-make-file). Cevap silindi, bu yüzden tamamen yanlış olduğunu veya konu (veya her ikisi) olduğunu varsayalım.Basit bir hiyerarşik Makefile nasıl yazılır?

Hiyerarşik Makefile yazmayı öğrenmek isterim. Bu, alt dizinlerde birkaç Makefile çağıran Makefile'dir. (varsayılan), yükleme, temiz ve böylece:

- project 
    |--module1 
     |--Makefile 
     |--... 
    |--module2 
    |--Makefile 
    |--module2.1 
    |--module2.2 
    |--... 
    |--module3 
    |--Makefile 
    |--... 
    |--etc 

Ayrıca proje üyeleri yalnızca gibi makefile hedefleri en az sayıda mutabık kalmışlardır varsayılmaktadır: Ben böyle bir dizin yapısını varsayalım. Yani, dahil aşağıdaki komutlar bayrakları modülleri yaymak olacaktır olun:

Aşağıdaki proje Makefile sorununun ne
cd project 
make clean 
make -k 
make install 
#etc 

:

PACKAGES = \ 
    module1 \ 
    module2 \ 
    emodule3 

VIRTUAL_PACKAGES = $(addsuffix /.virtual.Makefile,${PACKAGES}) 

TARGETS=clean install all 

.PHONY: $(TARGETS) 
default: all 

FLAGS = $(ifeq $(MAKEFLAGS) "","",-$(MAKEFLAGS)) 

$(TARGETS): $(VIRTUAL_PACKAGES) 

$(VIRTUAL_PACKAGES): 
    $(MAKE) $(FLAGS) -C $(@D) $(MAKECMDGOALS) 

evet, Makefiledaki $ VIRTUAL_PACKAGES tuhaf görünüyor. for döngüsü karıştırma alternatif biraz daha kısa ama daha iyiyse (ı bash güvenmek gerekir gibi) emin değilim: PAKETLERİ = \ module1 \ modül2 emodule3

TARGETS=clean install all 

.PHONY: $(TARGETS) 
default: all 

FLAGS = $(ifeq $(MAKEFLAGS) "","",-$(MAKEFLAGS)) 

$(TARGETS): 
    for p in $(PACKAGES) ; do $(MAKE) $(FLAGS) -C $$p [email protected] || break; done 

teşekkür \ !

+0

'FLAGS' çalışmalarına bu atamayı mu? Make'in hangi sürümünü kullanıyorsunuz? – Beta

+0

Yinelemeli olmayan bir çözüm: http://stackoverflow.com/a/7321954/412080 –

+0

Sizin için yararlı olabilir veya olmayabilir, ancak karmaşık projeleri yönetmek için cmake yolunu daha kolay buluyorum. CMakeLists.txt bir hiyerarşisine sahip olmak gerçekten kolaydır. Makefiller otomatik olarak oluşturulacak. – Hindol

cevap

7

Burada "ejderhalar" var. Bu yapılabilir, ancak etkileri zor olabilir.

Google, "Özyineleşmiş Olması Zararlı Olmalıdır". Tam olarak ne istediğinizi (örn. Hiyerarşik-yapım) çok iyi (basit) çizimler, artı tuzakların/endişelerin iyi açıklamalarını alacaksınız. Bazı “yanıtlar” olası “en iyi uygulamaları” tartışacak ve sorunları azaltmanın yolları. Ardından, ortaya çıkan sorunların uygulamanız için zorlayıcı olup olmadığına karar verebilirsiniz.

orijinal kağıt:

http://miller.emu.id.au/pmiller/books/rmch/

Diğer bazı bağlantılar:

http://c2.com/cgi/wiki?RecursiveMakeConsideredHarmful

http://dbaspot.com/configuration-management/194597-thoughts-recursive-make-considered-harmful.html