Com base no Manual do GNU Make irei fazer abaixo uma descrição do algoritimo usado pelo make para busca de regras implicitas no arquivo makefile, é uma tradução livre e sujeita ainda a muitas correções, os termos especificos estão sendo analisados para uma melhor tradução e uso, sendo um material original e singular de minha autoria, estarei evitando me apoiar em material de terceiros e em portugues, buscando focar no material original dos autores e desenvolvedores originais.

Há conceitos que são importantes já serem compreendidos antes de continuar a leitura desta publicação, o que é uma “Regra” (Rule) e o que é um “Objetivo” (Target), tais termos estarão presentes nesta publicação e serão usados com a primeira letra maiscula para evitar dúvidas.

O procedimento de busca por “Regras implicitas” (Implicit Rules), é executado, tanto pela Regra (Rule) seguida de dois-pontos mas que não tenha um bloco de instruções, para cada Objetivo (Target) de uma Regra ordinária que não tenha um bloco de instruções, quanto também por cada prerequisito que não é Objetivo de alguma Regra. O procedimento é também seguido recursivamente por prerequisitos proveniêntes de Regras implicitas, na cadeia de busca por Regras.

Regras de sufixo, não são mencionsados neste algoritmo porque Regras de sufixo são convertidas por suas regras padrões equivalentes uma vez o arquivo “makefile”, tenha sido carregado.

Para um Objetivo membro de um arquivo na forma ‘arquivo(membro)’, o seguinte algoritmo é executado duas vezes, primeiro usando o nome do ‘Objetivo’ inteiro (t), e na segunda vez usando o ‘(membro)’, como Objetivo (t), se a primeira vez não encontrar a Regra.

  1. Quebrar (t) em uma parte do diretorio, chamado (d), e o restante chamado (n). Por exemplo, se (t) é src/foo.o, então (d) é o valor src/ e (n) é o valor foo.o.
  2. Faça uma lista de todo o padrão de Regras do qual um dos Objetivos corresponde a “t” ou “n”. Se o padrão de Regras contém uma barra, que é comparado com “t”; caso contrário, tente com o “n”.
  3. Se alguma Regra nesta lista não coincidir com nenhuma Regra, então remova todas as regras não-terminais da lista.
  4. Remova da lista todas a Regras que não tem um bloco de instrução.
  5. Para cada padrão de Regra na lista:
    1. Encontre a Ramificação (s), que é uma parte não vazia de (t) ou (n) que coincide com ‘%’ no padrão da Regra.
    2. Calcule os nomes de prerequisitos pela substituição de (s) por ‘%’; se o padrão do Objetivo não contiver uma barra, adicione (d) para o inicio de cada nome de prerequisito.
    3. Teste quando todos os prerequisitos existem ou devam exitir. (Se um nome de arquivo é mencionado no makefile como um Objetivo ou como um prerequisito explicito, então nos dizemos que ele deve existir)

      Se todos os prerequisitos exisitrem ou não existirem, ou não há prerequisitos, então esta Regra é aplicada.

  6. Se nenhum padrão de Regra foi encontrado até agora, tente de forma mais vezes. Para cada padrão de Regra na lista:
    1. Se a regra é terminal, ignore á, e vá para a próxima regra.
    2. Calcule os nomes de prerequisitos como antes.
    3. Teste ou todos os prerequisitos existenes ou que não existam.
    4. Para cada prerrequisito que não existir, siga este algoritmo recursivamente para ver se o prerrequisito pode ser atendido por uma Regra implicita.
    5. Se todos os prerequisitos existem, podem existir, ou as Regras implicitas podem ser executadas, então as Regras se aplicam.
  7. Se a Regra implicita não se aplica, a regra para .DEFAULT, se alguma, aplica. Neste caso, Dê a (t) o mesmo bloco de comandos que .DEFAULT tem. caso contrário, não há bloco de comandos para (t).

Uma vez a Regra regra que se aplica foi encontrada, para cada padrão de Objetivo de uma regra otra que uma que coincida com (t) ou (n), o “%” no padrão é subistituido com o (s) e o nome de arquivo resultante é gravado até o bloco de comandos reconstruir o arquivo (t) que é Objetivo é executado. Após o bloco de comandos é executado, cada um destes nomes de arquivos são armazenados no banco de dados e marcados como tendo sido atualizado e tendo a mesma situação de atualizado como no arquivo (t).

Quando o bloco de comandos de um padrão de Regra é execudado para (t), as variáveis automáticas são setadas para corresponder com o Objetivo e prerequisitos. Veja sobre Variáveis Automáticas.


Carlos Delfino

Escrito por:

Analista de Redes Windows e Linux, Analista de Desenvolvimento em diversas linguagens, incluindo para Microcontroladores, Consultor, mais de 20 anos de experiência no mercado de TICs

Google LinkedIn Digg Reddit StumbleUpon

Atualizado em