Ejecutar make en cada subdirectorio
Tengo un directorio (root_dir
), que contiene un número de subdirectorios (subdir1, subdir2, ...
).
Quiero ejecutar el make
en cada directorio en root_dir
, usando un Makefile colocado en él.
(Obviamente supone que cada uno de subdir...
tiene dentro su propio Makefile).
Así que 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é en orden para ejecutar make en un directorio específico hago lo siguiente:
$(MAKE) -C subdir
3 answers
Hay varios problemas al 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 GNU make specific; no mencionaste ninguna restricción en la versión de make que estás usando).
ETA Esta es 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)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-27 17:13:56
Prueba esto:
SUBDIRS = foo bar baz
subdirs:
for dir in $(SUBDIRS); do \
$(MAKE) -C $$dir; \
done
Esto puede ayudarte link
Editar: también puedes hacer:
La forma más sencilla es hacer:
CODE_DIR = code
.PHONY: project_code
project_code:
$(MAKE) -C $(CODE_DIR)
El.Regla falsa significa que project_code no es un archivo que necesita ser construido, y la bandera-C indica un cambio en el directorio (equivalente a ejecutar el código del CD antes de llamar a make). Puede utilizar el mismo enfoque para llamar a otros destinos en el código Makefile.
Por ejemplo:
clean:
$(MAKE) -C $(CODE_DIR) clean
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:18:11
Existe una biblioteca llamada prorab para GNU make que soporta la inclusión de makefiles independientes en subdirectorios.
Algo de información sobre github: https://github.com/igagis/prorab/blob/master/wiki/HomePage.md
Básicamente, con prorab invocando todos los makefiles en subdirectorios se ve así:
include prorab.mk
$(eval $(prorab-build-subdirs))
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-20 18:15:03