Estou obtendo resultados inesperados chamando um makefile de outro. Eu tenho dois makefiles, um chamado /path/to/project/makefile
e outro chamado /path/to/project/gtest-1.4.0/make/Makefile
. Estou tentando fazer com que o primeiro ligue para o último. Em / path / to / project / makefile, tenho
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 /path/to/project/gtest-1.4.0/make/Makefile
eu tenho
all: $(TESTS)
clean:
rm -f $(TESTS) gtest.a gtest_main.a *.o
Emitindo o seguinte:
cd /path/to/project
make
Saídas:
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'
No entanto, quando eu emito estes comandos:
cd /path/to/project
make clean
Entendo:
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'
Não entendo: nos dois casos, /path/to/project/makefile
está me dizendo que está entrando no diretório de trabalho atual. No primeiro caso, ele não acha que tem trabalho a fazer (quando existe) e no segundo caso, é capaz de encontrar a diretiva apropriada (quando a saída está me dizendo que está procurando no diretório errado), mas tenta para executar o rm
comando /path/to/project
, em vez de /path/to/makefile/gtest-1.4.0/make/
.
Estou perdendo algo fundamental para chamar makefiles um do outro? Cometi um erro conceitual flagrante ou atingi uma armadilha comum? Como altero efetivamente os diretórios e chamo um segundo makefile de dentro do primeiro? Meu entendimento era que simplesmente chamar make -f <name>
seria suficiente.
Isso é make / gmake 3.81 no bash.
make -f gtest-1.4.0/make/Makefile clean
você dizer melhor$(MAKE) -C gtest-1.4.0/make clean
. Por que você não definiu alvos falsos?Respostas:
Não estou muito claro o que você está perguntando, mas o uso da
-f
opção de linha de comando apenas especifica um arquivo - ele não informa o make para alterar os diretórios. Se você quiser fazer o trabalho em outro diretório, precisarácd
do diretório:Observe que cada linha
Makefile
é executada em um shell separado, portanto, não há necessidade de alterar o diretório novamente.fonte
cd
para ogtest-1.4.0
dir, você deve usar a-C
opção demake
.&&
entre o cd e o comando make. Caso contrário, se o CD falhar, ele ainda será executadomake clean
... no diretório errado !! Além disso, você deve sempre usar SOMENTE$(MAKE)
, nunca a palavra de baralhomake
, ao recorrer. Então algo como:cd gtest-1.4.0 && $(MAKE) clean
-C
não está na especificação-C
está no spec: gnu.org/software/make/manual/make.html#RecursionEm vez de o
-f
demake
que você pode querer usar a-C <path>
opção. Isso primeiro muda para o caminho '<path>
' e depois chamamake
lá.Exemplo:
fonte
cd
fazem com que o terminal entre em um loop infinito.http://www.gnu.org/software/make/manual/make.html#Recursion
ou, equivalentemente, isto:
fonte
Parece claro que
$(TESTS)
está vazio, então seu makefile 1.4.0 é efetivamenteDe fato, tudo não tem nada a ver. e limpo faz exatamente o que diz
rm -f gtest.a ...
fonte
wildcard
apatsubst
, no entanto, eles retornam vazios do makefile principal, porque o diretório não está sendo efetivamente alterado. Bom olho.