Cómo llamar desde otro Makefile Makefile?
Pregunta
Me estoy poniendo algunos resultados inesperados que llaman un makefile de otro. Tengo dos archivos make, uno llamado /path/to/project/makefile
y uno llamado /path/to/project/gtest-1.4.0/make/Makefile
. Estoy tratando de tener la convocatoria anterior este último. En / ruta / a / proyecto / makefile, tengo
dev: $(OBJ_FILES)
$(CPPC) $(LIBS) $(FLAGS_DEV) $(OBJ_FILES) -o $(BIN_DIR)/$(PROJECT)
$(MAKE) -f ./gtest-1.4.0/make/Makefile
clean:
rm -f ./*~ ./gmon.out ./core $(SRC_DIR)/*~ $(OBJ_DIR)/*.o
rm -f ../svn-commit.tmp~
rm -f $(BIN_DIR)/$(PROJECT)
make -f gtest-1.4.0/make/Makefile clean
Y en /path/to/project/gtest-1.4.0/make/Makefile
tengo
all: $(TESTS)
clean:
rm -f $(TESTS) gtest.a gtest_main.a *.o
emitiendo el siguiente:
cd /path/to/project
make
Salidas:
make -f ./gtest-1.4.0/make/Makefile
make[1]: Entering directory `/path/to/project'
make[1]: Nothing to be done for `all'.
make[1]: Leaving directory `/path/to/project'
Sin embargo, cuando ejecute estos comandos:
cd /path/to/project
make clean
veo:
make -f gtest-1.4.0/make/Makefile clean
make[1]: Entering directory `/path/to/project'
rm -f gtest.a gtest_main.a *.o
make[1]: Leaving directory `/path/to/project'
No entiendo: En ambos casos, se /path/to/project/makefile
me dice que está entrando en el directorio de trabajo actual. En el primer caso, se piensa que no tiene trabajo que hacer (cuando lo hace) y en el segundo caso, que es capaz de encontrar la directiva apropiada (cuando la salida me está diciendo que está buscando en el directorio equivocado), sin embargo, intenta para ejecutar el comando rm
en /path/to/project
, en lugar de /path/to/makefile/gtest-1.4.0/make/
.
Me estoy perdiendo algo fundamental para llamar a los archivos make el uno del otro? Yo he hecho un error conceptual atroz, o golpear un error común? ¿Cómo cambio efectivamente directorios y llamar a un segundo archivo MAKE desde dentro de la primera? Mi entendimiento es que simplemente llamando make -f <name>
sería suficiente.
Esto se hace / gmake 3,81 en bash.
Solución
No estoy realmente muy claro lo que están pidiendo, pero utilizando la opción de línea de comandos -f
simplemente especifica un archivo - no le dice a hacer para cambiar de directorio. Si desea hacer el trabajo en otro directorio, es necesario cd
al directorio:
clean:
cd gtest-1.4.0 && $(MAKE) clean
Tenga en cuenta que cada línea en Makefile
se ejecuta en una cáscara por separado, así que no hay necesidad de cambiar el directorio de espalda.
Otros consejos
En lugar de la -f
de make
es posible que desee utilizar la opción -C <path>
. Esto cambia la primera a la ruta '<path>
', y después Calles make
allí.
Ejemplo:
clean:
rm -f ./*~ ./gmon.out ./core $(SRC_DIR)/*~ $(OBJ_DIR)/*.o
rm -f ../svn-commit.tmp~
rm -f $(BIN_DIR)/$(PROJECT)
$(MAKE) -C gtest-1.4.0/make clean
http://www.gnu.org/software/make/manual/make.html #Recursion
subsystem:
cd subdir && $(MAKE)
o, equivalentemente, la siguiente:
subsystem:
$(MAKE) -C subdir
Parece claro que $(TESTS)
está vacía por lo que su eficacia es MAKE 1.4.0
all:
clean:
rm -f gtest.a gtest_main.a *.o
De hecho, todo tiene nada que ver. limpia y hace exactamente lo que dice rm -f gtest.a ...