Um funcionário da Red Hat apresentou o sistema de montagem de Metas. Lançamento do GNU Make 4.2

Richard WM Jones, autor libguestfs, trabalhando na Red Hat, introduzido novo utilitário de montagem Objetivos, com o objetivo de eliminar deficiências e problemas na utilidade do make, mantendo ao mesmo tempo a simplicidade geral e a compreensão dos scripts. O utilitário make foi projetado em 1976 e apresenta uma série de deficiências conceituais. Os objetivos são planos para eliminar essas deficiências sem alterar o conceito geral;
Código-fonte das metas distribuído por licenciado sob GPLv2+.

Resolvidos problemas:

  • Suporte para apenas uma tática de resolução de dependências - “a instrução assembly é executada se o arquivo de destino estiver faltando ou for mais antigo que uma das dependências”. A Goals planeja implementar outras táticas, como verificar a presença de uma URL, comparar tempos de modificação com qualquer arquivo, avaliar o pacote compilado quem, comparação de somas de verificação, execução de casos de teste com salto seletivo de testes.
  • Ao processar alvos de construção, make não separa arquivos e nomes de regras e, como resultado, não há verificação de que, ao executar uma regra, o arquivo que ele afirma ter sido criado será realmente criado. Por exemplo, se você tem uma regra chamada "teste" que executa scripts com testes, um arquivo chamado "teste" é criado acidentalmente, então os testes não serão mais chamados, pois o make considerará que o alvo está compilado e não requer qualquer ação (para contornar o problema no make, você pode especificar a diretiva “.PHONY: test”). As metas separam explicitamente arquivos e nomes de regras.

    Um funcionário da Red Hat apresentou o sistema de montagem de Metas. Lançamento do GNU Make 4.2

  • Problema ao fornecer apenas um parâmetro para instruções de montagem.

    Um funcionário da Red Hat apresentou o sistema de montagem de Metas. Lançamento do GNU Make 4.2

    As metas permitem que você use um número arbitrário de parâmetros nomeados. Por exemplo, você pode extrair separadamente o sinal de um arquivo de depuração do nome:

    Um funcionário da Red Hat apresentou o sistema de montagem de Metas. Lançamento do GNU Make 4.2

  • Problemas ao interagir com o interpretador de shell. Por exemplo, a necessidade de controlar o escape de espaços em nomes de arquivos e diretórios, o desperdício de recursos ao lançar um interpretador de shell separado ao executar cada comando, a dupla interpretação do caractere “$” (usado tanto no shell quanto no make), levando em consideração os recuos.

    Esses problemas são resolvidos em Goals usando o símbolo “%” em vez de “$” para variáveis ​​de montagem (“$” permanece apenas para o shell), usando um analisador LALR(1), que exige que você coloque caminhos e nomes de arquivos entre aspas e destaque blocos de código com chaves. Todo o bloco de comando é iniciado em uma instância do shell de comando, e a formatação arbitrária de código é permitida dentro do bloco, sem referência a espaços especiais.

    Foi:
    alvo: foo.o bar.o
    ${CC} ${CFLAGS} $< -o $@

    Tornou-se:
    "alvo": "foo.o", "bar.o" {
    %CC %CFLAGS %< -o %@
    }

Outras características das metas:

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

    meta tudo =: "alvo"

    link do gol =
    "target" : "foo.o", "bar.o" { ... }

    compilação de meta (nome) =
    "%nome.o": "%nome.c", "dep.h" {%CC %CFLAGS -c $^ -o $@ }

  • Dois modos de inicialização: modo make para combinar destinos de construção com nomes de arquivos (por exemplo, o arquivo "foo.o" corresponde ao destino "%name.o") e modo de compilação direta:

    objetivo tudo =: link

    link do gol =
    "target" : "foo.o", compile ("bar") { ... }

    compilação de meta (nome) =
    "%nome.o": "%nome.c", "dep.h" {%CC %CFLAGS -c $^ -o $@ }

  • As táticas de montagem são determinadas por regras especiais que podem ser usadas para determinar a necessidade de remontar um alvo de montagem. Se for feita uma ligação à presença de um arquivo, então esta é explicitamente determinada através do sinal correspondente (“destino” para o nome da regra e *arquivo (“destino”) para verificação do arquivo).

    "target" : "foo.o", "bar.o" { ... }

    *arquivo("destino") : *arquivo("foo.o"), *arquivo("bar.o") { ... }

  • O desenvolvedor pode definir atributos arbitrários de táticas de montagem. O sinalizador "*file" é definido por padrão (@{...} indica supressão de saída e "exit 99" sinaliza a necessidade de reconstrução):

    tática *arquivo (nome do arquivo) = @{
    teste -f %nome do arquivo || saída 99
    para f em %

    Fonte: opennet.ru

Adicionar um comentário