Uma breve introdução a 'makefiles' no desenvolvimento de software de código aberto com GNU Make

Uma breve introdução a 'makefiles' no desenvolvimento de software de código aberto com GNU Make

GNU faz é um utilitário de desenvolvimento que determina as partes de uma base de código específica que deve ser recompilada e pode emitir comandos para executar essas operações na base de código. Este em particular fazer O utilitário pode ser usado com qualquer linguagem de programação, desde que sua compilação possa ser feita no shell, emitindo comandos.

Makefiles no Linux

Para ser usado GNU faz, Precisamos ter algum conjunto de regras que definem o relacionamento entre diferentes arquivos em nosso programa e comandos para atualizar cada arquivo. Estes são escritos em um arquivo especial chamado 'makefile'. O 'fazer'Comando usa o'makefile'Base de dados e os últimos tempos de modificação dos arquivos para decidir quais todos os arquivos devem recompilar novamente.

Conteúdo de um makefile

Geralmente 'makefiles'contém 5 tipos de coisas, a saber: regras implícitas, regras explícitas, Definições variáveis, diretivas, e comentários.

  1. Um regra explícita Especifica como fazer/remake um ou mais arquivos (chamados alvos, serão explicados mais tarde) e quando fazer o mesmo.
  2. Um regra implícita Especifica como fazer/remake um ou mais arquivos com base em seus nomes. Ele descreve como um nome de arquivo de destino está relacionado a um arquivo com um nome semelhante ao alvo.
  3. A definição variável é uma linha que especifica um valor de string para uma variável ser substituída posteriormente.
  4. A diretivo é uma instrução para fazer para fazer algo especial enquanto lê o makefile.
  5. A '#'O símbolo é usado representa o início de um Comente dentro makefiles. Uma linha começando com '#'é simplesmente ignorado.

Estrutura de makefiles

As informações que dizem fazer Como recompilar um sistema vem da leitura de um base de dados chamado makefile. Um simples makefile Will consiste nas regras da seguinte sintaxe:

Target…: Pré -requisitos… Receita… 

A alvo é definido como o arquivo de saída gerado pelo programa. Pode ser também alvos falsos, que será explicado abaixo. Exemplos de arquivos de destino incluem executáveis, arquivos de objeto ou alvos falsos como limpar, instalar, Desinstalar etc.

A Pré -requisito é um arquivo usado como uma entrada para criar os arquivos de destino.

A receita é a ação que fazer executa para criar o arquivo de destino com base nos pré -requisitos. É necessário colocar o caractere da guia antes de cada receita dentro do makefiles A menos que especifiquemos o '.Recipprefix'variável para definir algum outro personagem como prefixo para receita.

Uma amostra makefile

Final: Main.o fim.o inter.o Start.o GCC -O Final Main.o fim.o inter.o Start.o Main.O: Principal.C Global.h gcc -c main.C final.O: fim.C Local.H Global.H GCC -C END.c inter.O: inter.C Global.H GCC -C Inter.C Iniciar.O: Start.C Global.h gcc -c start.c limpo: rm -f principal.o fim.o inter.o Start.o

No exemplo acima, usamos 4 c arquivos de origem e dois arquivos de cabeçalho para criar o executável final. Aqui cada um '.o'O arquivo é um alvo e um pré -requisito dentro do makefile. Agora dê uma olhada no último nome do alvo limpar. É apenas uma ação em vez de um arquivo de destino.

Como normalmente não precisamos disso durante a compilação, ele não é escrito como um pré -requisito em nenhuma outra regras. Alvos que não se referem a arquivos, mas são apenas ações são chamadas alvos falsos. Eles não terão nenhum pré -requisito como outros arquivos de destino.

Como o GNU faz do processo um makefile

Por padrão fazer começa com o primeiro alvo no 'makefile'e é chamado de'meta padrão'. Considerando o nosso exemplo, temos final Como nosso primeiro alvo. Como seus pré -requisitos incluem outros arquivos de objeto, eles devem ser atualizados antes de criar final. Cada um desses pré -requisitos é processado de acordo com suas próprias regras.

A recompilação ocorre se houver modificações feitas para Arquivos Fonte ou arquivos de cabeçalho ou se o arquivo de objeto não existe nada. Depois de recompilar os arquivos de objeto necessários, fazer decide se deve trocar final ou não. Isso deve ser feito se o arquivo final não existe, ou se algum dos arquivos de objeto é mais novo do que ele.

Assim, se mudarmos o arquivo inter.c, então na corrida fazer Ele recompilará o arquivo de origem para atualizar o arquivo de objeto inter.o e depois vincular final.

Usando variáveis ​​dentro do Makefiles

Em nosso exemplo, tivemos que listar todos os arquivos de objeto duas vezes na regra para final como mostrado abaixo.

Final: Main.o fim.o inter.o Start.o GCC -O Final Main.o fim.o inter.o Start.o

Para evitar tais duplicações, podemos introduzir variáveis ​​para armazenar a lista de arquivos de objeto que estão sendo usados ​​dentro do makefile. Usando a variável Obj Podemos reescrever a amostra makefile a um semelhante mostrado abaixo.

Obj = main.o fim.o inter.o Start.o final: $ (obj) gcc -o final $ (obj) main.O: Principal.C Global.h gcc -c main.C final.O: fim.C Local.H Global.H GCC -C END.c inter.O: inter.C Global.H GCC -C Inter.C Iniciar.O: Start.C Global.h gcc -c start.c limpo: rm -f $ (obj)

Regras para limpar o diretório de origem

Como vimos no exemplo makefile, Podemos definir regras para limpar o diretório de origem removendo os arquivos de objeto indesejados após a compilação. Suponha que tenhamos um arquivo de destino chamado limpar. Como pode fazer Diferencie as duas situações acima? Aí vem o conceito de alvos falsos.

A alvo falso é um que não é realmente o nome de um arquivo, mas é apenas um nome para uma receita a ser executada sempre que uma solicitação explícita é feita do makefile. Um dos principais motivos para usar alvo falso é evitar um conflito com um arquivo de mesmo nome. Outra razão é melhorar o desempenho.

Para explicar isso, vou revelar uma reviravolta inesperada. A receita para limpar não será executado por padrão na execução fazer. Em vez disso, é necessário invocar o mesmo emitindo o comando Faça limpo.

.Fono: limpo limpo: rm -f $ (obj)

Agora tente criar makefiles Para sua própria base de código. Sinta -se à vontade para comentar aqui com suas dúvidas.