Come chiamare Makefile da un altro Makefile?


125

Sto ottenendo risultati inaspettati chiamando un makefile da un altro. Ho due makefile, uno chiamato /path/to/project/makefilee uno chiamato /path/to/project/gtest-1.4.0/make/Makefile. Sto tentando di far chiamare il primo al secondo. In / path / to / project / makefile, ho

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

E in /path/to/project/gtest-1.4.0/make/Makefileho

all: $(TESTS)

clean:
  rm -f $(TESTS) gtest.a gtest_main.a *.o

Emettere quanto segue:

cd /path/to/project
make

Uscite:

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'

Tuttavia, quando emetto questi comandi:

cd /path/to/project
make clean

Vedo:

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'

Non capisco: in entrambi i casi, /path/to/project/makefilemi dice che sta entrando nella directory di lavoro corrente. Nel primo caso, non pensa di avere del lavoro da fare (quando lo fa) e nel secondo caso è in grado di trovare la direttiva appropriata (quando l'output mi dice che sta cercando nella directory sbagliata) eppure prova per eseguire il rmcomando /path/to/project, invece di /path/to/makefile/gtest-1.4.0/make/.

Mi manca qualcosa di fondamentale per chiamare i makefile l'uno dall'altro? Ho commesso un grave errore concettuale o ho incontrato una trappola comune? Come posso modificare efficacemente le directory e chiamare un secondo makefile dall'interno del primo? La mia comprensione era quella semplice chiamatamake -f <name> sarebbe stata sufficiente.

Questo è make / gmake 3.81 in bash.


3
Penso, invece di make -f gtest-1.4.0/make/Makefile cleandirlo tu $(MAKE) -C gtest-1.4.0/make clean. Perché non hai definito obiettivi fasulli?
dma_k

Risposte:


113

Non sono molto chiaro cosa stai chiedendo, ma l'uso -fdell'opzione della riga di comando specifica solo un file - non dice a make di cambiare directory. Se vuoi eseguire il lavoro in un'altra directory, devi accedere alla cddirectory:

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

Notare che ogni riga in Makefileviene eseguita in una shell separata, quindi non è necessario modificare nuovamente la directory.


67
Invece di accedere manualmente cdalla gtest-1.4.0directory, dovresti usare l' -Copzione di make.
Tader

29
O per lo meno, dovresti assolutamente usare &&tra il cd e il comando make. Altrimenti se il cd fallisce verrà comunque eseguito make clean... nella directory sbagliata !! Inoltre dovresti sempre usare SOLO $(MAKE), mai la makeparola nuda, quando ricorsivi. Quindi qualcosa del tipo: cd gtest-1.4.0 && $(MAKE) clean
MadScientist

3
@Tader: -Cnon è nelle specifiche
Janus Troelsen

1
Questa domanda su gnu-make -Cè nelle specifiche: gnu.org/software/make/manual/make.html#Recursion
Cas

123

Al posto del -fdi makeche si potrebbe desiderare di utilizzare l' -C <path>opzione. Questo prima cambia il nel percorso ' <path>', e poi chiama makelì.

Esempio:

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

1
In questo modo sembra il migliore. Venite dalle altre risposte che fanno cdsì che il terminale entri in un ciclo infinito.
gbmhunter

$ (MAKE) -C gtest-1.4.0 / make clean non funziona per me. Penso che dovrebbe essere $ (MAKE) -C gtest-1.4.0 clean
Arigion


1

Sembra chiaro che $(TESTS)sia vuoto quindi il tuo makefile 1.4.0 è effettivamente

all: 

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

In effetti, tutto non ha niente a che fare. e clean fa esattamente quello che dicerm -f gtest.a ...


$ (TESTS) è definito con a wildcarde a patsubst, tuttavia questi vengono restituiti vuoti dal makefile principale, perché la directory non viene effettivamente modificata. Buon occhio.
Chris Tonkinson
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.