terça-feira, 7 de fevereiro de 2012

Automatizando a compilação

Automatizando a compilação
O processo de compilação pode ser automatizando quando utilizamos um makefile. O arquivo makefile é um arquivo utilizado por um programa chamado make.  Considere que você precise compilar vários arquivos para obter um arquivo executável digitando o seguinte comando:
g++ main.cpp hello.cpp factorial.cpp -o hello

Você poderia fazer um makefile da seguinte maneira:
all:
        g++ main.cpp hello.cpp factorial.cpp -o hello

Para compilar agora, você precisaria apenas digitar
make all
Usando dependência
 Às vezes é útil definir o uso de diferentes alvos para a compilação. Se você modificar um único arquivo em seu projeto não implicará recompilação de todo o projeto,mas apenas o que foi modificado.
alvo:  dependência
Arquivo makefile com dependência
all: hello
 
hello: main.o factorial.o hello.o
        g++ main.o factorial.o hello.o -o hello
 
main.o: main.cpp
        g++ -c main.cpp
 
factorial.o: factorial.cpp
        g++ -c factorial.cpp
 
hello.o: hello.cpp
        g++ -c hello.cpp
 
clean:
        rm -rf *o hello

make all: compila projeto
make clean: remove todos os arquivos-objetos e o executável forçando uma nova compilação.
Usando variáveis e comentários
#Comentário do arquivo makefile
#compilador que será utilizado
CC = g++
#opções de compilação que serão utilizadas
#-Wall = Mostra todos os warnings
CFLAGS = -c –Wall
all: hello
 
hello: main.o factorial.o hello.o
        $(CC) main.o factorial.o hello.o -o hello
 
main.o: main.cpp
        $(CC) $(CFLAGS) main.cpp
 
factorial.o: factorial.cpp
        $(CC) $(CFLAGS) factorial.cpp
 
hello.o: hello.cpp
        $(CC) $(CFLAGS) hello.cpp
 
clean:
        rm -rf *o hello

Usando alguns coringas
$@ = o alvo
$< = a dependência
#Comentário do arquivo makefile
#compilador que será utilizado
CC = g++
#opções de compilação que serão utilizadas
#-Wall = Mostra todos os warnings
CFLAGS = -c –Wall
OBJECTS = main.o factorial.o hello.o
 
all: hello
 
hello: $(OBJECTS)
        $(CC) $(OBJECTS) -o $@
 
%.o : %.c
        $(CC) $(CFLAGS) -c $<
        
clean:
        rm -rf *o hello

 
 



Nenhum comentário: