Um funcionário da Red Hat apresentou o sistema de construção Goals. Lançamento do GNU Make 4.2

Richard Jones (Richard WM Jones), autor libguestfs, trabalhando na Red Hat, apresentou nova ferramenta de construção Objetivos, destinada a corrigir falhas e problemas na ferramenta make, mantendo a simplicidade e clareza dos scripts. A ferramenta make foi projetada em 1976 e possui várias deficiências conceituais que se busca corrigir nos Objetivos, sem alterar a concepção geral.
Código-fonte dos Objetivos é distribuído sob a licença GPLv2+.

Problemas abordados:

  • Apoio apenas a uma tática de resolução de dependências — "a instrução de construção é executada se o arquivo alvo estiver ausente ou for mais antigo que uma das dependências". Em Goals, pretende-se implementar outras táticas, como verificar a presença de URLs, comparar o tempo de modificação com qualquer arquivo, avaliar a construção do pacote em Koji, comparar somas de verificação, executar conjuntos de teste com omissões seletivas de testes.
  • Ao processar objetivos de construção, a ferramenta make não distingue entre arquivos e nomes de regras, resultando na falta de verificação se, ao executar uma regra, um arquivo que deveria ser criado realmente o é. Por exemplo, se existir uma regra chamada "test" que executa scripts de teste, e um arquivo com o nome "test" for criado por acaso, os testes deixarão de ser chamados, pois o make considerará que o alvo já foi construído e não precisa executar qualquer ação (para evitar esse problema no make, pode-se especificar a diretiva ".PHONY: test"). Goals separa claramente arquivos e nomes de regras.

    Um funcionário da Red Hat apresentou o sistema de construção Goals. Lançamento do GNU Make 4.2
  • Problema de fornecer apenas um parâmetro para instruções de construção.

    Um funcionário da Red Hat apresentou o sistema de construção Goals. Lançamento do GNU Make 4.2

    Nos Objetivos, sugere-se o uso de um número arbitrário de parâmetros nomeados. Por exemplo, pode-se destacar separadamente o indicador do arquivo de depuração do nome:

    Um funcionário da Red Hat apresentou o sistema de construção Goals. Lançamento do GNU Make 4.2
  • Problemas de interação com o interpretador shell. Por exemplo, a necessidade de controlar a escape de espaços em nomes de arquivos e diretórios, o desperdício de recursos ao iniciar um interpretador shell separado para executar cada comando, a dupla interpretação do símbolo “$” (usado tanto no shell quanto no make), e a consideração de identações.

    Os problemas mencionados são resolvidos em Goals utilizando o símbolo "%" em vez de "$" para variáveis de construção ("$" permanece apenas para shell), aplicando-se o parser LALR(1), que requerem que os caminhos e nomes de arquivos sejam envolvidos em aspas e que os blocos de código sejam destacados com chaves. Todo o bloco é executado em uma única instância do shell de comando, e dentro do bloco, a formatação de código é livre, sem associação a espaços especiais.

    Era:
    target: foo.o bar.o
    ${CC} ${CFLAGS} $< -o $@

    Tornou-se:
    «target»: «foo.o», «bar.o» {
    LAGS <-o %@
    }

Outras características dos Goals:

  • Suporte opcional para a definição de nomes e parâmetros arbitrários:

    goal all = : «target»

    goal link =
    «target» : «foo.o», «bar.o» { … }

    goal compile (name) =
    «%name.o»: «%name.c», «dep.h» { LAGS -c $^ -o $@ }

  • Dois modos de execução: modo make para associar os objetivos de construção aos nomes de arquivos (por exemplo, o arquivo «foo.o» corresponde ao objetivo «%name.o»), e modo de execução direta de compilação:

    goal all = : link

    goal link =
    «target» : «foo.o», compile («bar») { … }

    goal compile (name) =
    «%name.o»: «%name.c», «dep.h» { LAGS -c $^ -o $@ }

  • A tática de construção é determinada por regras especiais que definem a necessidade de recompilação do objetivo de construção. Se houver um link à presença do arquivo, isso é definido explicitamente através do respectivo indicador («target» para o nome da regra e *file(«target») para a verificação do arquivo).

    «target» : «foo.o», «bar.o» { … }

    *file(«target») : *file(«foo.o»), *file(«bar.o») { … }

  • O desenvolvedor pode definir indicadores arbitrários para táticas de construção. O indicador «*file» é definido por padrão (@{…} indica a supressão da saída, e «exit 99» sinaliza a necessidade de recompilação):

    tactic *file (filename) = @{
    test -f %filename || exit 99
    for f in %

    Fonte: opennet.ru

Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS 🔥 Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS | ProHoster