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!

Foi útil?

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.

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