Estoy obteniendo algunos resultados inesperados llamando a un archivo MAKE de otro. Tengo dos 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 segundo. En / path / to / project / 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 lo 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 dice que está ingresando al 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 para ejecutar el rm
comando en /path/to/project
lugar de /path/to/makefile/gtest-1.4.0/make/
.
¿Me estoy perdiendo algo fundamental para llamar a los makefiles el uno del otro? ¿He cometido un error conceptual atroz o he encontrado un error común? ¿Cómo cambio efectivamente los directorios y llamo a un segundo archivo MAKE desde el primero? Comprendí que simplemente llamar make -f <name>
sería suficiente.
Esto es make / gmake 3.81 en bash.
make -f gtest-1.4.0/make/Makefile clean
ti, mejor dilo$(MAKE) -C gtest-1.4.0/make clean
. ¿Por qué no has definido objetivos falsos?Respuestas:
Realmente no estoy muy claro lo que está preguntando, pero el uso de la
-f
opción de línea de comando solo especifica un archivo; no le dice a make que cambie los directorios. Si desea hacer el trabajo en otro directorio, debe hacerlocd
en el directorio:Tenga en cuenta que cada línea se
Makefile
ejecuta en un shell separado, por lo que no es necesario volver a cambiar el directorio.fuente
cd
ir manualmente algtest-1.4.0
directorio, debe usar la-C
opción demake
.&&
entre el cd y el comando make. De lo contrario, si el CD falla, se ejecutarámake clean
... ¡en el directorio incorrecto! Además, siempre debe usar SÓLO$(MAKE)
, nunca la palabra puramake
, al recurrir. Así que algo como:cd gtest-1.4.0 && $(MAKE) clean
-C
no está en la especificación-C
está en la especificación: gnu.org/software/make/manual/make.html#RecursionEn lugar de la
-f
demake
usted, es posible que desee utilizar la-C <path>
opción. Esto primero cambia a la ruta '<path>
', y luego las callesmake
allí.Ejemplo:
fuente
cd
hacen que la terminal entre en un bucle infinito.http://www.gnu.org/software/make/manual/make.html#Recursion
o, equivalentemente, esto:
fuente
Parece claro que
$(TESTS)
está vacío, por lo que su archivo MAKE 1.4.0 es efectivoDe hecho, todo no tiene nada que hacer. y limpio hace exactamente lo que dice
rm -f gtest.a ...
fuente
wildcard
y apatsubst
, sin embargo, estos regresan vacíos desde el archivo MAKE principal, porque el directorio no se está cambiando efectivamente. Buen ojo.