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:
- 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'.
- 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