ProHoster > Blog > notícias da internet > Um funcionário da Red Hat apresentou o sistema de montagem de Metas. Lançamento do GNU Make 4.2
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+.
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.
Problema ao fornecer apenas um parâmetro para instruções de montagem.
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:
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.
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).
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 %