Tengo un proyecto donde la estructura de directorios es así:
$projectroot
|
+---------------+----------------+
| | |
part1/ part2/ part3/
| | |
+------+-----+ +---+----+ +---+-----+
| | | | | | |
data/ src/ inc/ src/ inc/ src/ inc/
¿Cómo debo escribir un archivo MAKE que estaría en parte / src (o donde sea realmente) que podría completar / enlazar en parte los archivos fuente de c / c ++? / Src?
¿Puedo hacer algo como -I $ projectroot / part1 / src -I $ projectroot / part1 / inc -I $ projectroot / part2 / src ...
Si eso funcionara, ¿hay una manera más fácil de hacerlo? ¿He visto proyectos en los que hay un archivo MAKE en cada parte correspondiente? carpetas [en esta publicación usé el signo de interrogación como en la sintaxis bash]
recursive invocation
, que podría ser bastante elegante.Respuestas:
La forma tradicional es tener un
Makefile
en cada uno de los subdirectorios (part1
,part2
, etc.) que le permite construir de forma independiente. Además, tenga unMakefile
directorio raíz del proyecto que construya todo. La "raíz"Makefile
se vería similar a la siguiente:Dado que cada línea en un destino de creación se ejecuta en su propio shell, no hay necesidad de preocuparse por atravesar el árbol de directorios u otros directorios.
Sugiero echar un vistazo a la sección 5.7 de GNU make manual ; es de mucha ayuda.
fuente
+$(MAKE) -C part1
etc. Esto permite que el control de trabajo de Make funcione en los subdirectorios.Si tiene código en un subdirectorio que depende del código en otro subdirectorio, probablemente esté mejor con un solo archivo MAKE en el nivel superior.
Vea Recursive Make Considered Damful para la justificación completa, pero básicamente desea que tenga la información completa que necesita para decidir si un archivo necesita ser reconstruido o no, y no tendrá eso si solo le cuenta un tercio de tu proyecto.
El enlace de arriba parece no ser accesible. Aquí se puede acceder al mismo documento:
fuente
La opción VPATH puede ser útil, que le dice a qué directorios buscar el código fuente. Sin embargo, aún necesitaría una opción -I para cada ruta de inclusión. Un ejemplo:
Esto buscará automáticamente los archivos partXapi.cpp coincidentes en cualquiera de los directorios especificados por VPATH y los compilará. Sin embargo, esto es más útil cuando su directorio src se divide en subdirectorios. Por lo que describe, como han dicho otros, probablemente sea mejor con un archivo MAKE para cada parte, especialmente si cada parte puede estar sola.
fuente
VPATH=..
funcionó para mí!Puede agregar reglas a su Makefile raíz para compilar los archivos cpp necesarios en otros directorios. El siguiente ejemplo de Makefile debería ser un buen comienzo para llevarte a donde quieres estar.
fuente
Si las fuentes se distribuyen en muchas carpetas, y tiene sentido tener Makefiles individuales, como se sugirió anteriormente, make recursivo es un buen enfoque, pero para proyectos más pequeños me resulta más fácil enumerar todos los archivos fuente en el Makefile con su ruta relativa al Makefile así:
Entonces puedo configurar de
VPATH
esta manera:Luego construyo los objetos:
Ahora la regla es simple:
Y construir la salida es aún más fácil:
Incluso se puede
VPATH
automatizar la generación mediante:O usando el hecho de que
sort
elimina duplicados (aunque no debería importar):fuente
Creo que es mejor señalar que usar Make (recursivo o no) es algo que generalmente querrás evitar, porque en comparación con las herramientas actuales, es difícil de aprender, mantener y escalar.
Es una herramienta maravillosa, pero su uso directo debería considerarse obsoleto en 2010+.
A menos, por supuesto, que esté trabajando en un entorno especial, es decir, con un proyecto heredado, etc.
Use un IDE, CMake o, si tiene un núcleo duro, los Autotools .
(editado debido a votos negativos, ty Honza por señalar)
fuente
La publicación de RC fue SUPER útil. Nunca pensé en usar la función $ (dir $ @), pero hizo exactamente lo que necesitaba que hiciera.
En parentDir, tenga un montón de directorios con archivos fuente en ellos: dirA, dirB, dirC. Varios archivos dependen de los archivos de objetos en otros directorios, por lo que quería poder crear un archivo desde dentro de un directorio y hacer que esa dependencia llame al archivo MAKE asociado con esa dependencia.
Esencialmente, hice un Makefile en parentDir que tenía (entre muchas otras cosas) una regla genérica similar a las RC:
Cada subdirectorio incluía este archivo MAKE de nivel superior para heredar esta regla genérica. En el Makefile de cada subdirectorio, escribí una regla personalizada para cada archivo para poder hacer un seguimiento de todo de lo que dependía cada archivo individual.
Cada vez que necesitaba hacer un archivo, usaba (esencialmente) esta regla para hacer recursivamente cualquiera / todas las dependencias. ¡Perfecto!
NOTA: hay una utilidad llamada "makepp" que parece realizar esta tarea aún más intuitivamente, pero en aras de la portabilidad y no dependiendo de otra herramienta, elegí hacerlo de esta manera.
¡Espero que esto ayude!
fuente
Uso recursivo de Make
Esto permite
make
dividirse en trabajos y usar múltiples núcleosfuente
make -j4
?make
usar el control del trabajo. Cuando se ejecuta un proceso de creación por separado, no está sujeto al control del trabajo.Estaba buscando algo como esto y después de algunos intentos y caídas creo mi propio archivo MAKE, sé que esa no es la "forma idiomática", pero es un comienzo para entender hacer y esto funciona para mí, tal vez podrías intentarlo en tu proyecto.
Sé que eso es simple y para algunas personas mis indicadores están equivocados, pero como dije, este es mi primer Makefile para compilar mi proyecto en múltiples directorios y vincularlos para crear mi bin.
Estoy aceptando sugerencias: D
fuente
Sugiero usar
autotools
://##
Coloque los archivos de objetos generados (.o) en el mismo directorio que sus archivos de origen, para evitar colisiones cuando se utiliza la creación no recursiva.solo incluyéndolo
Makefile.am
con otras cosas bastante simples.Aquí está el tutorial .
fuente