Pergunta

Eu tenho um makefile que começa executando uma ferramenta antes de aplicar as regras de construção (que essa ferramenta escreve para mim). Se essa ferramenta, que for um script python, sai com um código de status não nulo, quero que o GNU faça parado ali e não continue a criação do programa.

Atualmente, eu faço algo assim (nível superior, ou seja, coluna 1):

$(info Generating build rules...)
$(shell python collect_sources.py)
include BuildRules.mk

Mas isso não para de fazer se collect_sources.py sai com um código de status de 1. Isso também captura a saída padrão de collect_sources.py Mas não o imprime, então tenho a sensação de que estou olhando na direção errada.

Se possível, a solução deve funcionar quando um shell simples do MS-DOS for o shell do sistema padrão.

Alguma sugestão?

Foi útil?

Solução 2

OK, aqui está minha própria solução, que infelizmente não se baseia no código de status do script colecion_sources.py, mas que funciona para mim (TM) e permite que eu veja qualquer saída que o script produz:

SHELL_OUTPUT := $(shell python collect_sources.py 2>&1)
ifeq ($(filter error: [Errno %],$(SHELL_OUTPUT)),)
  $(info $(SHELL_OUTPUT))
else
  $(error $(SHELL_OUTPUT))
endif

O script é escrito para que qualquer erro produz uma saída começando com "collect_sources: error:". Além disso, se o python não conseguir encontrar ou executar o script fornecido, ele gera uma mensagem de erro que contém a mensagem "[Errno 2]" ou similar. Portanto, este pequeno pedaço de código apenas captura a saída (redirecionando o stderr para o stdout) e procura mensagens de erro. Se nenhum for encontrado, ele simplesmente usa $(info) Para imprimir a saída, caso contrário, ele usa $(error), que efetivamente faz parar.

Observe que o recuo no ifeq ... endif é feito com espaços. Se as guias forem usadas, faça pensar que você está tentando invocar um comando e reclamar disso.

Outras dicas

Pode haver uma maneira melhor, mas tentei o seguinte e funciona:

$(if $(shell if your_command; then echo ok; fi), , $(error your_command failed))

Aqui eu assumi isso your_command Não fornece nenhuma saída, mas não deve ser difícil contornar essa situação.

Editar: Para fazê -lo funcionar com o shell do Windows padrão (e provavelmente qualquer shell decente), você pode escrever your_command && echo ok ao invés de if dentro do shell função. Eu não acho que isso seja possível para conchas (mais antigas). Para estes, você provavelmente deseja se adaptar your_command Ou escreva um script de wrapper para imprimir algo sobre erro (ou sucesso).

Você deve usar um destino regular para criar BuildRules.mk:

BuildRules.mk: collect_sources.py
        python $< >$@

include BuildRules.mk

Este é o truque padrão para usar ao gerar automaticamente dependências.

Fixação https://stackoverflow.com/a/226974/192373

.PHONY: BuildRules.mk

BuildRules.mk: collect_sources.py
        echo Generating build rules...)
        python $< >$@
        $(MAKE) -f BuildRules.mk

Certifique -se de que você não está invocando Make/Gmake com a opção -k.

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