2012-07-09 12 views
7

Hace algunos días publiqué una respuesta en desbordamiento de pila sobre cómo escribir una marca jerárquica (http://stackoverflow.com/questions/1498213/make-hierarchical-make-file). La respuesta fue eliminada, por lo tanto, supongo que fue completamente incorrecta o fuera del tema (o ambas cosas).¿Cómo escribir un simple Makefile jerárquico?

Me gustaría saber cómo escribir jerárquico Makefile. Este es un Makefile que llama a varios Makefiles en subdirectorios. Asumo una estructura de directorios como:

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

También suponen que los miembros del proyecto sólo se han puesto de acuerdo únicamente a un conjunto mínimo de objetivos makefile como: todos (por defecto), limpio, instalar, y así. Por lo tanto, los siguientes comandos hacen que incluyen banderas serán propagan a los módulos:

cd project 
make clean 
make -k 
make install 
#etc 

Lo que está mal con el siguiente Makefile proyecto:

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) 

sí, el $ VIRTUAL_PACKAGES en el Makefile parece extraño. La alternativa de la mezcla de un bucle for es un poco más corto, pero no estoy seguro de si es mejor (ya que necesito confiar en bash): PAQUETES = \ módulo 1 \ modulo2 \ 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 

Gracias !

+0

¿Eso asignación a 'trabajo FLAGS'? ¿Qué versión de Make estás usando? – Beta

+0

Una solución no recursiva: http://stackoverflow.com/a/7321954/412080 –

+0

Puede o no ser útil para usted, pero para administrar proyectos complejos me resulta mucho más fácil. Es realmente fácil tener una jerarquía de CMakeLists.txt. Los Makefiles se generarán automáticamente. – Hindol

Respuesta

7

Aquí están los "dragones". Se puede hacer, pero las implicaciones pueden ser complicadas.

Google, "Recursive Make Considered Harmful". Obtendrá ilustraciones muy buenas (simples) de exactamente lo que quiere (por ejemplo, creación jerárquica), además de buenas explicaciones de las trampas/preocupaciones. Algunas de las "respuestas" discutirán posibles "mejores prácticas" y formas de mitigar problemas. Luego, puede decidir si los problemas planteados son convincentes para su aplicación o no.

El documento original:

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

Algunos otros enlaces:

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

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

Cuestiones relacionadas