primer - makefile linux c
Ejecutar make en cada subdirectorio. (3)
Hay una biblioteca llamada prorab para GNU make que admite la inclusión de makefiles independientes en subdirectorios.
Alguna información sobre github: https://github.com/igagis/prorab/blob/master/wiki/HomePage.md
Básicamente, con prorab invocar todos los makefiles en subdirectorios se ve así:
include prorab.mk
$(eval $(prorab-build-subdirs))
Tengo un directorio ( root_dir
), que contiene varios subdirectorios ( subdir1, subdir2, ...
).
Quiero ejecutar el make
en cada directorio en root_dir
, usando un Makefile colocado en él. (Obviamente se supone que cada uno de los subdir...
tiene dentro de su propio Makefile).
Entonces hay esencialmente dos preguntas:
- ¿Cómo obtener una lista de directorios en Makefile (automáticamente)?
- ¿Cómo ejecutar make para cada uno de los directorios dentro de un archivo make?
Como sé para ejecutar make en un directorio específico, hago lo siguiente:
$(MAKE) -C subdir
Hay varios problemas para hacer la sub-marca dentro de un bucle for en una sola receta. La mejor manera de hacer múltiples subdirectorios es así:
SUBDIRS := $(wildcard */.)
all: $(SUBDIRS)
$(SUBDIRS):
$(MAKE) -C $@
.PHONY: all $(SUBDIRS)
(Solo para señalar que esto es específico de GNU; no mencionó ninguna restricción en la versión de make que está usando).
ETA Aquí hay una versión que soporta múltiples objetivos de nivel superior.
TOPTARGETS := all clean
SUBDIRS := $(wildcard */.)
$(TOPTARGETS): $(SUBDIRS)
$(SUBDIRS):
$(MAKE) -C $@ $(MAKECMDGOALS)
.PHONY: $(TOPTARGETS) $(SUBDIRS)
Prueba esto :
SUBDIRS = foo bar baz
subdirs:
for dir in $(SUBDIRS); do /
$(MAKE) -C $$dir; /
done
Esto puede ayudarte a link
Edición: también puedes hacer:
La forma más sencilla es hacer:
CODE_DIR = code
.PHONY: project_code
project_code:
$(MAKE) -C $(CODE_DIR)
La regla .PHONY significa que project_code no es un archivo que se debe compilar, y la marca -C indica un cambio en el directorio (equivalente a ejecutar el código cd antes de llamar a make). Puede usar el mismo método para llamar a otros destinos en el código Makefile.
Por ejemplo:
clean:
$(MAKE) -C $(CODE_DIR) clean