Na página anterior apresentei um exemplo de como utilizar a
diretiva
include. Num projeto grande, compilar o
programa manualmente (ou seja, sem o recurso oferecido pelo
make) seria realmente desastroso.
O make é um programa que realiza uma séries de operações
armazenadas em um arquivo especial, que geralmente chamados
de Makefile (este nome é reconhecido por padrão pelo make). Tais
operações podem ser a compilação de uma série de arquivos fontes
onde haja dependência entre eles. Com a estrutura oferecida pelo
Makefile, fica fácil resolver todas as dependências.
Por exemplo, no exemplo da página anterior, a compilação do arquivo
main.c exige primeiro a compilação do arquivo metodos.c, pois no
arquivo main.c fazemos o uso de funções localizadas naquele
arquivo (metodos.c). Usar o make para o exemplo da página anterior
talvez não faça muita diferença, mas para projetos maiores as
vantagens tornam-se evidente. O make permite ainda que o programa
compile apenas os arquivos modificados caso após a primeira
compilação fizéssemos alteração em algum arquivo e resolvêssemos
recompilar o programa. Para criar o executável manualmente para o
exemplo da página anterior, entraríamos na pasta criada (projetoC)
e executaríamos os seguintes comandos na ordem em que aparecem:
$ gcc -c metodos.c
$ gcc main.c metodos.o -o exemplo
O resultado seria o arquivo executável exemplo. Para construir um
Makefile para o exemplo dado, primeiro vamos entender um pouco da
estrutura de um arquivo Makefile. Um arquivo Makefile é dividido
em seções. Uma dessas seções são pré-definidas, a seção all
(a primeira seção a ser executada). As outras são aquelas que a
seção all depende direta ou indiretamente. Estas outras seções tem
seus nomes definidas pelo criador do arquivo Makefile, no caso pode
ser o próprio programador ou algum programa que gere
automaticamente arquivos Makefile. Como ficaria a seção all:
all:[dependência1] [dependência2] ... [dependênciaN]
[TAB][COMANDO1]
[TAB][COMANDO2]
...
[TAB][COMANDON]
[dependência1]: [dependências de 1]
...
[dependência2]: [dependências de 2]
,,,
Onde:
- [TAB] representa uma tabulação (você pressiona a tecla TAB
no início da da linha). As dependências são declaradas colocando
o nome da dependência (ou regra, como também é chamada) seguido
de dois pontos. Caso haja dependência para um seção, após os dois
pontos os nomes das dependências devem ser colocados separados
apenas por espaços, nenhum outro caractere deve ser colocado
entre o nome das regras.
Cada comando numa dependência deve ser posto após uma tabulação
logo abaixo da linha onde está o nome da seção. As dependências
são também chamadas de regras. O exemplo abaixo mostra o Makefile
para o exemplo de programa dado da página anterior (página 1).
Este exemplo irá ilustrar as idéias abordadas até aqui.
Exemplo Makefile para o exemplo de programa dado na página
anterior: dentro da pasta projetoC cria o seguinte arquivo
(nomeado Makefile):
Arquivo
Makefile:
Agora, dentro da pasta projetoC, execute o comando "make". O
resultado será um arquivo compilado denominado exemplo. Para
obter informações sobre o compilador
gcc, no terminal
execute o seguinte comando:
$ man gcc
Para mais informações sobre o comando make, consulte a página
de manual do make também executando o comando man como segue:
$ man make
Essas duas últimas instruções só são válidas se as páginas de
manual das ferramentas mencionadas estiverem instaladas em seu
sistema
GNU/Linux.