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.

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top