Mestre Makefile para Subprojetos não irá compilar Subprojetos
-
22-08-2019 - |
Pergunta
Eu tenho um projeto que eu estou trabalhando para liberar que realmente contém 3 subprojetos, todos os quais precisam ser compilados de uma só vez. Meus olhares makefile mais ou menos assim:
all: a b c
a:
@cd a && make
b:
@cd b && make
c:
@cd c && make
Projetos A e B ambos muito bem compilação mas para o terceiro projeto, ele me diz que não há nada a ser feito, embora a mudança para o diretório C e executar o make faz no código de compilação fato.
Para ser um pouco mais específico: Projeto C no exemplo acima é realmente SpiderMonkey da Mozilla. Considerando A e B são makefiles código / que tenho escrito, C é apenas uma cópia bruta do SpiderMonkey do site da Mozilla. O comando realmente compilação para ele é:
make JS_DIST=/usr JS_THREADSAFE=1 JS_HAS_FILE_OBJECT=1
Em meu mestre Makefile, eu tenho:
spidermonkey:
@cd spidermonkey/src && $(MAKE) JS_DIST=/usr JS_THREADSAFE=1 JS_HAS_FILE_OBJECT=1
Running "make spidermonkey" outputs "make: Nada a ser feito para` spidermonkey'." Como faço para obter make para executar o comando?
EDIT: Eu tentei adicionar as seguintes linhas ao meu makefile:
.PHONY: spidermonkey
Além de renomear a regra spidermonkey para sm, mas ainda nenhuma mudança.
EDIT: Foi mal! I teve espaços quando eu deveria ter tido um guia. doh!
Solução
Você provavelmente tem um arquivo ou pasta no nível superior chamado de "spidermonkey". Faça acha que isso é o que seu suposto para criar, e uma vez que já está lá, fazer paradas.
Uma das mais importantes regras a seguir ao escrever makefiles é cada alvo deve criar um arquivo com o mesmo nome que o alvo . Em outras palavras, se você tiver
a:
<some command>
Esse comando deve produzir um único arquivo chamado "a".
Regras que não produzem arquivos, mas só estão lá como espaços reservados são chamados alvos falsos , e eles devem ser declaradas como este:
.PHONY: a
Faça, então, sempre assumir que um tem que ser refeito.
Além disso, como regra geral não use "make" para invocar make de forma recursiva, use $ (MAKE) em vez .
EDIT: mudou "pseudo" para "falso"
Outras dicas
Faça apenas verifica a existência de um arquivo (ou diretório) nomeado o mesmo que o alvo regra, e se houver (e é mais recente do que as dependências), em seguida, a partir do ponto de vista de make não há nada mais a fazer.
Portanto, o seu problema é que você tem uma regra spidermonkey (sem dependências), bem como um diretório chamado spidermonkey, e depois fazer pensa "o alvo já está feito, nada para eu fazer". Para obter make para fazer o que quiser, mudar o nome da regra spidermonkey (ou o diretório).
Falando de make recursiva, a propósito, isso não é neccessarily uma boa idéia, consulte recursiva Faça Considerado Nocivo.