c++ - how - Fuentes de subdirectorios en Makefile
makefile linux c (6)
Esta es una nota al margen y no responde a su pregunta, pero hay un documento "Recursive Make Considered Harmful". Vale la pena leer.
Aqui esta el link. http://aegis.sourceforge.net/auug97.pdf
Tengo una biblioteca C ++ construida usando un Makefile. Hasta hace poco, todas las fuentes estaban en un solo directorio y Makefile hizo algo como esto
SOURCES = $(wildcard *.cpp)
que funcionó bien
Ahora agregué algunas fuentes que están en un subdirectorio, digamos subdir
. sé que puedo hacerlo
SOURCES = $(wildcard *.cpp) $(wildcard subdir/*.cpp)
pero estoy buscando una manera de evitar especificar el subdir
manualmente, es decir, hacer que el wildcard
examine los subdirectorios, o generar una lista de subdirectorios de alguna manera y expandirlo con varias funciones wildcard
. En este punto, tener una solución no recursiva (es decir, expandir solo el primer nivel) estaría bien.
No he encontrado nada, mi mejor opción es usar find -type d
para enumerar los subdirectorios, pero se siente como un hack. ¿Hay alguna forma incorporada de hacer esto?
Si no desea utilizar archivos make recursivos, esto podría brindarle algunas ideas:
subdirs := $(wildcard */)
sources := $(wildcard $(addsuffix *.cpp,$(subdirs)))
objects := $(patsubst %.cpp,%.o,$(sources))
$(objects) : %.o : %.cpp
Esto debería hacerlo:
SOURCES = $(wildcard *.cpp) $(wildcard */*.cpp)
Si cambia de opinión y desea una solución recursiva (es decir, a cualquier profundidad), se puede hacer pero implica algunas de las funciones de Make más poderosas. Ya sabes, los que te permiten hacer cosas que realmente no deberías hacer.
EDITAR:
Jack Kelly señala que $(wildcard **/*.cpp)
funciona a cualquier profundidad, al menos en algunas plataformas, usando GNUMake 3.81. (Cómo se dio cuenta de eso, no tengo ni idea).
Si puede usar el comando find
shell, puede definir una función para usarlo.
recurfind = $(shell find $(1) -name ''$(2)'')
SRCS := $(call recurfind,subdir1,*.c) $(call recurfind,subdir2,*.cc) $(call recurfind,subdir2,*.cu) /
...
Los comodines recursivos se pueden hacer puramente en Make, sin llamar al shell o al comando find. Hacer la búsqueda usando solo Hacer significa que esta solución también funciona en Windows, no solo en * nix.
# Make does not offer a recursive wildcard function, so here''s one:
rwildcard=$(wildcard $1$2) $(foreach d,$(wildcard $1*),$(call rwildcard,$d/,$2))
# How to recursively find all files with the same name in a given folder
ALL_INDEX_HTMLS := $(call rwildcard,foo/,index.html)
# How to recursively find all files that match a pattern
ALL_HTMLS := $(call rwildcard,foo/,*.html)
La barra inclinada en el nombre de la carpeta es obligatoria. Esta función de rwildcard no es compatible con varios comodines de la forma en que lo hace la función comodín incorporada de Make, pero agregar esa compatibilidad sería sencillo con un par de usos adicionales de foreach.
La práctica común es colocar un Makefile
en cada subdirectorio con las fuentes, luego
all: recursive
$(MAKE) -C componentX
# stuff for current dir
o
all: recursive
cd componentX && $(MAKE)
# stuff for current dir
recursive: true
Puede ser aconsejable establecer configuraciones para cada Makefile
en Makefile.inc
en el directorio de origen raíz. Las fuerzas objetivo recursive
make
que entren en los subdirectorios. Asegúrese de que no recompile nada en un destino que requiera recursive
.