2009-04-07 16 views
8

Estoy aprendiendo makefiles y sé cómo crear un archivo MAKE simple. Me estoy moviendo a makefiles anidados. Aquí está mi estructura de directoriosCreación de makefile anidado

/src 
...makefile 
...main.cpp 
...foo 
......makefile 
......foo.cpp 
......foo.h 

Cuando raíz makefile se llama, llama al makefile en el directorio foo . Aquí están mis preguntas

  1. Qué makefile debería usar para escribir código para enlazar todos los archivos de objetos? Si está en el archivo make de raíz, ¿necesito especificar todos los nombres de archivos de objetos?
  2. ¿Son estos makefiles anidados una mejor práctica? ¿O es bueno tener solo un archivo MAKE que esté en la raíz?

¡Cualquier ayuda sería genial!

Respuesta

15

Hay mucho que decir acerca de no haciendo esto. Lee Recursive Make Considered Harmful. También en PDF form.

La versión abreviada corta es que recursive make construye efectivamente varios árboles de dependencias disjuntos pero posiblemente superpuestos y no puede garantizar una compilación correcta o máximamente eficiente. El problema empeora si espera construir en paralelo.

Para resolver el problema, se organiza una única creación no recursiva que crea un único árbol de dependencias que abarca todo y que permite resolver todos los problemas anteriores.

estructuras de ejemplo para hacer de la no-recursivo y soluciones a los diversos problemas difíciles que se presentan por escrito las mismas puede encontrarse en el documento original y en las respuestas a:

+1

Si no hacerlo es una mala idea, tal vez se deba sugerir una solución alternativa como respuesta. – deadalnix

+1

Sí. Esta respuesta está en una forma que ya no es aceptable en el sitio. Las ediciones solo reparan parcialmente la deficiencia, pero es algo. – dmckee

3

La marca recursiva generalmente se considera nociva.

Si realmente desea poder escribir "make" en el directorio raíz y hacer que construya todo utilizando sólo archivos makeIX, es la única forma. En ese caso, vincule los subproyectos en su propio directorio, y las cosas finales juntas en la raíz.

Si usted está dispuesto a utilizar la sintaxis gmake, echar un vistazo a los ficheros Makefile aquí: http://github.com/singpolyma/theveeb-ecosystem

+1

Puede usar un make POSIX (no GNU) para realizar una compilación no recursiva dividiéndola en dos pasos: 1) concatenar todos los archivos make.inc en todos los subdires; 2) ejecuta el archivo MAKE resultante. Pero la mayoría de las personas usa GNU make de todos modos, que tiene la directiva "incluir". –

+0

Ah, eso es cierto, nunca pensé en el hack de concatenación. Tiendo a usar incluir. Normalmente quiero ser muy POSIX, pero con makefiles a veces es un poco complicado debido a la directiva no include :) – singpolyma

0

Hay sistemas de construcción más modernos como SCons que tienen una sintaxis más fácil que hacer y evitar muchas trampas de maquillaje. Por ejemplo, SCons escanea los archivos fuente para determinar dependencias propias, mientras que para hacer uno necesita especificar las dependencias manualmente. Si, por ejemplo, agregue una nueva instrucción #include a un archivo de implementación make no recompilará ese archivo de implementación si el encabezado cambia (a menos que agregue la nueva dependencia). SCons detectará automáticamente la nueva dependencia y volverá a compilar todo lo necesario.