Programar em C/Makefiles: diferenças entre revisões

[edição não verificada][edição não verificada]
Conteúdo apagado Conteúdo adicionado
EvertonS (discussão | contribs)
Sem resumo de edição
Linha 1:
== Makefile ==
 
O makefile eé um arquivo utilisadoutilizado por um programa chamado make ou em outros sistemas operativos
,gmake, nmake, tmake, etc.<br>
Ele pode variar de um sistema a outro pois não faz parte de nem uma normalização .<br>
O texto contido em um makefile e usado para a compilaçao de um projeto.<br>
Vantagens do uso.<br>
Evita a compilação de arquivos desnecessários.<br>
Por exemplo, se seu programa utiliza 120 bibliotecas e você altera apenas uma, o makefile descobre (comparando as datas de alteração dos arquivos fontes com as dos arquivos anteriormente compilados) qual arquivo foi alterado e compila apenas a biblioteca necessária.<br>
 
As explicações a seguir sao para o utilitarioutilitário GNU make.
 
EntaoEntão vamos para a apresentaçaoapresentação do Makefile através da compilação de um pequeno projeto em
linguagem C.<br>
*Criar uma pasta com esses 4 arquivos :<br>
teste.c ,teste.h , main.c, Makefile.<br>
*De um nome para a pasta Projeto.
 
Linha 51 ⟶ 54:
minimal.
 
#Para escrever comentarioscomentários ##
############################# Makefile ##########################
all: teste
Linha 69 ⟶ 72:
E compilar e so ir dentro da pasta "Projeto" apertar F4 escrever make e apertar enter.
 
Uma vez compilado podemos modificar teste.c . Se teste.c foi modificado entaoentão make modifica
teste.o e se nao deixa teste.o como esta.
 
* all : EÉ o nome do arquivo binario que seracera criado "Nome do programa"
* teste: teste.c .Pode ser interpretado com arquivo_de_destino: arquivo_de_origem.
* clean: Apaga os arquivos intermediariosintermediários.Se voce escrever no console make clean
ele apaga os arquivos objeto da pasta.
* mrproper: Apaga tudo o que deve ser modificado.No console escreva make mrproper
Linha 88 ⟶ 91:
====Regras complementarias:====
 
* all : EÉ o nome do arquivo binariobinário que seracera criado "Nome do programa"
* clean: Apaga os arquivos intermediariosintermediários.
* mrproper: Apaga tudo o que deve ser modificado.
 
====Definir VariaveisVariáveis:====
As variaveisvariáveis servem para facilitar o trabalho.<br>
Em vez de mudar varias linhas mudamos so o valor da variavel.<br>
Deve ser por isso que se chamaochama variaveisvariável nao?? ;)<br>
Definimos da forma seguinte.
 
NOME=VALOR
E para utilisarutilizar esta variavelvariável colocamos entre $() .<br>
EntaoEntão ela vai ficar assim $(NOME)
 
Vamos para o exemplo com o nosso Makefile.<br>
Linha 108 ⟶ 111:
*E para poder usar $(SRC) <br>
 
SeraSerá que na pratica funciona?? Vamos ver..
 
#Para escrever comentarios ##
############################# Makefile ##########################
#Definimos a variavelvariável
SRC=main.c
all: teste
Linha 129 ⟶ 132:
rm -rf teste
 
Todos os lugares do codigocódigo que contem o CONTEUDOCONTEÚDO da variavelvariável e modificado colocando em seu lugar o NOME da<br> variavelvariável.
 
====VariaveisVariáveis PersonalisadasPersonalizadas:====
 
*CC=gcc .Definimos CC para nomes de compiladores de C ou C++ .Aqui o gcc.
*CFLAGS=-W -Wall -ansi -pedantic .Serve para definir opçoesopções pasadaspassadas ao compilador.Para o c++ o NOME e CXXFLAGS .
*LDFLAGS e utlisadoutilizado para editar as opçoesopções de links.
*EXEC=teste .EXEC define o NOME do futuro programa executavelexecutável.
*OBJ=teste.o main.o . Para cada arquivo.c um arquivo OBJETO e criado com a extençaoextensão ".o" arquivo.o .
Entao e so olhar na sua pasta todos os arquivos com a extençaoextensão ".c" e colocar na variavelvariável OBJ com a extençaoextensão".o" .
* Outra maneira e mesma coisa. OBJ agora e igual a main.o teste.o
SRC = main.c teste.c <br>
OBJ= $(SRC:.c=.o)
* E super manero a tua ideiaidéia camarada.<br>
*Mais tenho 200 arquivos.c e nao quero olhar o nome de todos um por um.<br>
** Tem outra ideia??
** PoderiamosPoderíamos utilisarutilizar *c mais nao podemos utilisarutilizar este caracter joker na definiçaodefinição de uma variavelvariável.
** EntaoEntão vamos utilisarutilizar o comando " wildcard " ele paermitepermite a utilisaçoautilização de caracteres joker na definiçaodefinição de variaveisvariáveis.<br> Fica assim.
SRC= $(wildcard *.c)
OBJ= $(SRC:.c=.o)
*ObservaçaoObservação se quizerquiser fazer aparecer uma mensagem durante a compilaçaocompilação escreva @echo "Minha mensagem" .
*E mais tem um monte de mensagemsmensagens e fica muito feio
*Tem outra ideiaidéia??.. O pessoal vamos parando ;) nao sou uma maquina de ideiasidéias.
*Para deixar as mensagens en modo silencioso coloque "@" no comesocomeço do comando.
*Fica assim
@$(CC) -o $@ $^
 
====VariaveisVariáveis internas:====
 
$@ Nome da regra.
$< Nome da primeira dependenciadependência
$^ Lista de dependenciasdependências
$? Lista de dependenciasdependências mais recentes que a regra.
$* Nome do arquivo sem sufixo
 
====As regras de interferenciainterferência:====
 
Nao disse nada antes porque estavamosestávamos no estado principiantes "noob".<br>
Sao regras genericasgenéricas chamadas por default.
* .c.o : .Ela significa fazer um arquivo.o apartira partir de um arquivo.c .
* %.o: %.c .A mesma coisa. A linha teste.o: teste.c pode ser modificada com essa regra.
* .PHONY: .Preste bem atençaoatenção. Esta regra permite de evitar conflitos.
** Por exemplo "clean:" e uma regra sem nem uma dependenciadependência nao temos nada na pasta que se chame clean.
** Agora vamos colocar na pasta um arquivo chamado clean. Se voce tentar apagar os "arquivos.o" escrevendo "make clean" nao vai aconteseracontecer nada porque make diz que clean nao foi modificado.
** Para evitar esse problema usamos a regra .PHONY : . Fica assim.
** .PHONY: clean mrproper
** .PHONY: diz que clean e mrproper devem ser executados mesmo se arquivos com esses nomes existem.
 
Agora vamos modificar mais uma vez o nosso Makefile com tudo o que sabemos sobre variaveisvariáveis.<br>
 
#Para escrever comentarioscomentários ##
############################# Makefile ##########################
#Definimos a variavelvariável
CC=gcc
CFLAGS=-W -Wall -ansi -pedantic
Linha 187 ⟶ 191:
all: $(EXEC)
@echo "Vou comesar a compilaçao"
#Nao coloquei a variavel OBJ para que possao entender as variaveisvariáveis internas.
#Se entenderaoentenderão podem colocar $(OBJ) no lugar de teste.o main.o
teste: teste.o main.o
# $@ = teste:
Linha 209 ⟶ 213:
====Sub Makefiles:====
Ler tudo isso so para compilar uma programa??<br>
O sub-makefile e lançado por meio de um "Makefile principal" vamos simplificar para o PatraoPatrão Makefile.<br>
Aonde estavamosestávamos??...A sim para que serve??<br>
O Makefile Principal executa os sub-makesfiles de outras pastas.<br>
Como ele faz?? <br>
Usamos uma variavelvariável pre-definida $(MAKE).<br>
Bao ao trabalho..
Crie dentro da pasta "Projetos" outra pasta com o nome "sub-make".Dentro da pasta sub-make crie um arquivo <br>Makefile e um arquivo submake.c