2010-02-05 25 views
83

Recibo algunos resultados inesperados llamando a un archivo MAKE desde otro. Tengo dos archivos makefiles, uno llamado /path/to/project/makefile y otro llamado /path/to/project/gtest-1.4.0/make/Makefile. Estoy intentando que el primero llame al último. En/ruta/a/proyecto/makefile, tengoCómo llamar a Makefile desde otro Makefile?

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 publico 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, /path/to/project/makefile me está diciendo que está entrando en el directorio de trabajo actual. En el primer caso, no cree que tenga trabajo que hacer (cuando lo hace) y en el segundo caso, es capaz de encontrar la directiva adecuada (cuando la salida me dice que está buscando en el directorio incorrecto) pero intenta ejecutar el comando rm en /path/to/project, en lugar de /path/to/makefile/gtest-1.4.0/make/.

¿Me falta algo fundamental para llamar a los archivos MAKE el uno del otro? ¿He cometido un error conceptual atroz o alcancé un error común? ¿Cómo cambio efectivamente los directorios y llamo a un segundo archivo MAKE desde dentro del primero? Mi entendimiento fue que simplemente llamar al make -f <name> sería suficiente.

Esto es make/gmake 3.81 en bash.

+3

Creo que, en lugar de 'make -f GTEST-1.4.0/marca/Makefile clean' es mejor decir '$ (MAKE) -C gtest-1.4.0/make clean'. ¿Por qué no ha definido objetivos falsos? –

+0

http://stackoverflow.com/questions/3494999/subdirectories-and-makefiles –

Respuesta

81

No estoy muy claro qué es lo que está preguntando, pero usar la opción de línea de comando -f solo especifica un archivo; no indica a make que cambie los directorios. 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 carreras en una carcasa separada, así que no hay necesidad de cambiar el directorio de espalda.

+0

Golpea el clavo en la cabeza, ¡gracias! –

+49

En lugar de 'cd' 'manualmente al directorio 'gtest-1.4.0', debe usar la opción' -C' de 'make'. – Tader

+22

O al menos, definitivamente debe usar '&&' entre el comando cd y make. De lo contrario, si el cd falla, seguirá ejecutando 'make clean' ... en el directorio incorrecto. Además, siempre debes usar SOLAMENTE '$ (MAKE)', nunca la palabra clave 'make', cuando se repiten. Así que algo como: 'cd gtest-1.4.0 && $ (MAKE) clean' – MadScientist

1

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. y limpiar hace exactamente lo que dice rm -f gtest.a ...

+0

$ (PRUEBAS) se define con un 'comodín' y una 'carpeta de servidor', sin embargo, estas vuelven vacías desde el archivo MAKE principal, porque el directorio no se está cambiando efectivamente. Buen ojo. –

89

En lugar de -f de make, puede usar la opción -C <path>. Esto primero cambia a la ruta '<path>', y luego a las 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 
+0

De esta manera parece ser la mejor. Vamos de las otras respuestas que usan 'cd' porque la terminal entra en un ciclo infinito. – gbmhunter