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.

¿Fue útil?

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 ...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top