23 de mar. de 2015

Makefile


    O GNU make foi escrito por Richard Stallman e Roland McGrath sendo mantido atualmente por Paul Smith. O make determina qual pedaço de um programa precisa ser recompilado. Ele é bastante usado nos programas em C, mas podemos usar o make em qualquer linguagem de programação onde o compilador pode ser executado no shell. Para usar o make, precisamos de um arquivo chamado makefile para dizer ao make o que fazer.
  • Makefile:
    Consiste em "regras" com a seguinte forma:
alvo ... : pré-requisitos ...    
 <TAB> comando   
  ...
  • Elementos:
- Macros: São escritos na forma x=y. Para converter uma macro em seu valor, podemos colocar dentro do $().
- Alvo: é geralmente o nome do arquivo gerado pelo programa. Ex: executáveis, objetos ou um phony (alvo que não é o nome do arquivo) como o 'clean'.

Makefile1:
CC = gcc
# flags do compilador:
# -g  adiciona informacao do debug no arquivo executavel.
# -Wall ativa os avisos do compilador.
CFLAGS = -g -Wall
ALVO = meuprograma

all: $(ALVO)
$(ALVO): $(ALVO).c
 $(CC) $(CFLAGS) -o $(ALVO) $(ALVO).c

clean:
 $(RM) $(ALVO)
  • Libs + Shell:
    O Makefile pode ser bastante últil quando precisamos usar vários arquivos, ou quando criamos uma biblioteca onde é preciso executar alguns comandos shell. Por exemplo:

Makefile2:
# $(shell) pega como argumento um comando shell e captura sua saida.
CMD=$(shell mkdir ~/lib)
CMD2=$(shell mkdir ~/include)
CMD3=$(shell mv liblprprint.a ~/lib)
CMD4=$(shell mv liblprprint.so ~/include)
CMD5=$(shell export LD_LIBRARY_PATH=/home/zeldani/lib:$LD_LIBRARY_PATH)
DIR=-I../../include -L../../lib
DIR2=../../lib/liblprprint.a

all: print

print: printer.c lpr_print.c
 $(CMD)
 @echo Criando o diretorio lib.
 $(CMD2)
 @echo Criando o diretorio include.
 $(CC) -c lpr_print.c
 $(CFLAGS) liblprprint.a lpr_print.o
 $(CMD3)
 @echo Movendo o liblprprint.a para o diretorio lib.
 $(CC) $(CFLAGS2) lpr_print.c
 $(CC) $(CFLAGS3) -o liblprprint.so lpr_print.o
 $(CMD4)
 @echo Movendo o libprprint.so para o diretorio include.
 $(CMD5)
 $(CC) $(DIR) -o printer printer.c $(DIR2)

clean:
 $(RM) printer *.o *~

    No exemplo acima, a biblioteca liblprprint.a foi criada pelos comandos:
$ gcc -c lpr_print.c
$ ar rs liblprprint.a lpr_print.o

    O arquivo liblprprint.a foi movido para o diretorio ~/lib através do CMD3. A biblioteca liblprprint.so foi criada pelos comandos:
$ gcc -c -fpic lpr_print.c
$ gcc -shared -o liblprprint.so lpr_print.o

    Para executar o programa lincado com a versão compartilhada da biblioteca, foi usado o CMD5. E para compilar o programa foi especificado a versão estática da biblioteca explicitamente:
$ gcc -I../../include -L../../lib -o printer printer.c ../../lib/libprprint.a   
    E finalmente, foi criado o executável printer. O código fonte do exemplo acima pode ser encontrado nesse link.
    Como vimos nesse artigo, o Makefile facilita a nossa vida pois vários processos podem ser executados automagicamente por apenas um comando make!! ;)
   
* Referências:
[1] GNU Make -  Richard M. Stallman, Roland McGrath, Paul D. Smith.
[2] http://www.gnu.org/software/make/manual/make.html
[3] http://www.cs.swarthmore.edu/~newhall/unixhelp/howto_makefiles.html
[4] http://www.cprogramming.com/tutorial/makefiles.html
[5] http://crasseux.com/books/ctutorial/Building-a-library.html

0 comentários:

Postar um comentário