tutorial how espaƱol create c++ c makefile

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 .