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:

  1. ¿Cómo obtener una lista de directorios en Makefile (automáticamente)?
  2. ¿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
Author: Alex, 2013-07-24

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)
 45
Author: MadScientist,
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

Fuente

 3
Author: avignat,
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))
 0
Author: igagis,
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