Como chamar makefile de outro makefile?
Pergunta
Estou recebendo alguns resultados inesperados chamando um makefile de outro. Eu tenho dois makefiles, um chamado /path/to/project/makefile
e um chamado /path/to/project/gtest-1.4.0/make/Makefile
. Estou tentando fazer o primeiro chamado. In/Path/para/Project/makefile, eu 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 em /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 emite esses comandos:
cd /path/to/project
make clean
Eu vejo:
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'
Eu não entendo: em ambos os casos, /path/to/project/makefile
está me dizendo que está entrando no diretório de trabalho atual. No primeiro caso, não acha que trabalha a fazer (quando o fizer) e, no segundo caso, é capaz de encontrar a diretiva apropriada (quando a saída está me dizendo que está olhando no diretório errado), mas tenta Para executar o rm
comando em /path/to/project
, ao invés de /path/to/makefile/gtest-1.4.0/make/
.
Estou perdendo algo fundamental para chamar o Makefiles um do outro? Cometi um erro conceitual flagrante ou acertei uma armadilha comum? Como faço para alterar efetivamente os diretórios e chamar um segundo Makefile de dentro do primeiro? Meu entendimento era que simplesmente ligar make -f <name>
seria suficiente.
Este é o MAKE/GMAKE 3.81 em Bash.
Solução
Não estou realmente muito claro o que você está perguntando, mas usando o -f
A opção de linha de comando apenas especifica um arquivo - ela não diz para alterar os diretórios. Se você quiser fazer o trabalho em outro diretório, você precisa cd
para o diretório:
clean:
cd gtest-1.4.0 && $(MAKE) clean
Observe que cada linha em Makefile
Executa em um shell separado, portanto, não há necessidade de alterar o diretório de volta.
Outras dicas
Ao invés de -f
do make
Você pode querer usar o -C <path>
opção. Isso primeiro muda o caminho '<path>
', e então as chamadas make
lá.
Exemplo:
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)
ou, equivalente, isso:
subsystem:
$(MAKE) -C subdir
Parece claro que $(TESTS)
está vazio, então o seu 1.4.0 makefile é efetivamente
all:
clean:
rm -f gtest.a gtest_main.a *.o
De fato, tudo não tem nada a fazer. e limpo faz exatamente o que diz rm -f gtest.a ...