tutorial make makefile gnu-make

tutorial - makefile linux



¿Cómo llamar a Makefile desde otro Makefile? (4)

En lugar de la opción -f de, es posible que desee utilizar la opción -C <path> . Esto primero cambia a la ruta '' <path> '', y luego las calles lo 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

Recibo algunos resultados inesperados que llaman 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 último. 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

Productos:

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

Ya 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 comando rm en /path/to/project , en lugar de /path/to/makefile/gtest-1.4.0/make/ .

¿Me estoy perdiendo algo fundamental para llamar makefiles 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 era que simplemente llamar a make -f <name> sería suficiente.

Esto es make / gmake 3.81 en bash.


No estoy muy claro qué es lo que estás preguntando, pero usar la opción de línea de comando -f solo especifica un archivo, no hace cambiar de directorio. Si desea hacer el trabajo en otro directorio, debe cd un cd al directorio:

clean: cd gtest-1.4.0 && $(MAKE) clean

Tenga en cuenta que cada línea en Makefile ejecuta en un shell separado, por lo que no es necesario volver a cambiar el directorio.


Parece claro que $(TESTS) está vacío, por lo que su archivo MAKE 1.4.0 es efectivamente

all: clean: rm -f gtest.a gtest_main.a *.o

De hecho, todo no tiene nada que hacer. y clean hace exactamente lo que dice rm -f gtest.a ...