O bloco do switch case dentro define a palavra-chave em uma única linha lógica em um makefile

1

Este é o trecho de código de ghc.mk , parte da compilação de código-fonte do Haskell. Eu acho diferente, porque o autor escolheu escrever um bloco de funções em uma única linha. É uma prática comum em escrever makefiles?

E eu gosto de colocar echo declarações em cada uma das alças de caso para depuração, mas com a configuração atual, eu não sou capaz e interpreto minhas instruções echo como comandos shell.

define installLibsTo
        $(call INSTALL_DIR,$2)
        for i in $1; do \
                case $$i in \
                  *.a) \
                    $(call INSTALL_DATA,$(INSTALL_OPTS),$$i,$2); \
                    $(RANLIB_CMD) $2/'basename $$i' ;; \
                  *.dll) \
                    $(call INSTALL_PROGRAM,$(INSTALL_OPTS),$$i,$2) ; \
                    $(STRIP_CMD) $2/'basename $$i' ;; \
                  *) \
                  $(call INSTALL_DATA,$(INSTALL_OPTS),$$i,$2); \
                  esac; \
    done
endef
    
por Madhavan Kumar 25.03.2015 / 18:19

1 resposta

1

O comando shell inteiro está em uma única linha lógica porque a sintaxe de makefiles torna isso necessário. Em uma regra de makefile, cada linha de receita é executada em uma instância de shell separada. Antes que o analisador chegue a este ponto, sequências de barra invertida-nova linha são removidas, portanto, uma nova linha imediatamente precedida por uma barra invertida não conta como uma nova linha. Isso significa que você pode escrever isso (eu uso 8 espaços para representar uma tab):

target:
        for x in $^; do \
          somecommand $$x; \
        done

e um comando shell como este será executado para construir target :

for x in dependency1 dependency2 dependency3; do           somecommand $x;         done

O shell não recebe nenhuma nova linha aqui (é por isso que o ; é necessário antes de done ).

Se você escreveu este makefile:

target:
        for x in $^; do
          somecommand $$x;
        done

então cada um dos for x in …; do , somecommand $x; e done seria executado em um shell separado, o que não funcionaria.

A variável installLibsTo que você mostra é um exemplo maior com as mesmas restrições. Quando usado, expandirá para duas linhas de receita lógicas, uma que executa o comando construído pela chamada à função INSTALL_DIR e outra que executa o loop for.

    
por 26.03.2015 / 01:56