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
EvertonS (discussão | contribs)
Linha 1:
== Makefile ==
 
Linha 4 ⟶ 5:
,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çaocompilação 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 saosão para o utilitário GNU make.
 
Então vamos para a apresentação do Makefile através da compilação de um pequeno projeto em
Linha 38 ⟶ 39:
#endif
 
Agora a funçaofunção main :
 
/*====================== main.c =================*/
Linha 69 ⟶ 70:
rm -rf teste
 
Para naonão ter erros os espaços devem ser feito com a tecla TAB.<br>
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 então make modifica
teste.o e se naonão deixa teste.o como esta.
 
* all : É o nome do arquivo binariobinário que cera criado "Nome do programa"
* teste: teste.c .Pode ser interpretado com arquivo_de_destino: arquivo_de_origem.
* clean: Apaga os arquivos intermediários.Se vocevocê 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 86 ⟶ 87:
regra: dependências
Apertar o botaobotão TAB comando
comando ...
 
Linha 97 ⟶ 98:
====Definir Variáveis:====
As variáveis servem para facilitar o trabalho.<br>
Em vez de mudar varias linhas mudamos so o valor da variavelvariável.<br>
Deve ser por isso que se chama variável naonão?<br>
Definimos da forma seguinte.
 
Linha 113 ⟶ 114:
Será que na pratica funciona?? Vamos ver..
 
#Para escrever comentarioscomentários ##
############################# Makefile ##########################
#Definimos a variável
Linha 137 ⟶ 138:
 
*CC=gcc .Definimos CC para nomes de compiladores de C ou C++ .Aqui o gcc.
*CFLAGS=-W -Wall -ansi -pedantic .Serve para definir opções passadas ao compilador.
Para o c++ o NOME e CXXFLAGS .
*LDFLAGS e utilizado para editar as opções de links.
*EXEC=teste .EXEC define o NOME do futuro programa executável.
*OBJ=teste.o main.o . Para cada arquivo.c um arquivo OBJETO e criado com a extensão ".o" arquivo.o .
EntaoEntão e so olhar na sua pasta todos os arquivos com a extensão ".c" e colocar na variável OBJ com a extensã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 idéia camarada.<br>
*Mais tenho 200 arquivos.c e naonão quero olhar o nome de todos um por um.<br>
** Tem outra ideiaidéia??
** Poderíamos utilizar *c mais naonão podemos utilizar este caracter joker na definição de uma variável.
** Então vamos utilizar o comando " wildcard " ele permite a utilização de caracteres joker na definição de variáveis.<br> Fica assim.
SRC= $(wildcard *.c)
Linha 154 ⟶ 156:
*Observação se quiser fazer aparecer uma mensagem durante a compilação escreva @echo "Minha mensagem" .
*E mais tem um monte de mensagens e fica muito feio
*Tem outra idéia??.. O pessoal vamos parando ;) naonão sou uma maquina de idéias.
*Para deixar as mensagens enem modo silencioso coloque "@" no começo do comando.
*Fica assim
@$(CC) -o $@ $^
Linha 169 ⟶ 171:
====As regras de interferência:====
 
NaoNão disse nada antes porque estávamos no estado principiantes "noob".<br>
SaoSão regras genéricas chamadas por default.
* .c.o : .Ela significa fazer um arquivo.o a 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ção. Esta regra permite de evitar conflitos.
** Por exemplo "clean:" e uma regra sem nem uma dependência naonão temos nada na pasta que se chame clean.
** Agora vamos colocar na pasta um arquivo chamado clean. Se vocevocê tentar apagar os "arquivos.o" escrevendo "make clean" naonão vai acontecer nada porque make diz que clean naonão foi modificado.
** Para evitar esse problema usamos a regra .PHONY : . Fica assim.
** .PHONY: clean mrproper
Linha 191 ⟶ 193:
all: $(EXEC)
@echo "Vou comesar a compilaçao"
#NaoNão coloquei a variavelvariável OBJ para que possao entender as variáveis internas.
#Se entenderão podem colocar $(OBJ) no lugar de teste.o main.o
teste: teste.o main.o
Linha 212 ⟶ 214:
 
====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 Patrão Makefile.<br>
Aonde estávamos??...A sim para que serve??<br>
Linha 219 ⟶ 221:
Usamos uma variá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
 
Dentro da pasta sub-make coloque este Makefile.
Linha 245 ⟶ 248:
#include <stdlib.h>
/* Informaçao
* Nao utilisem este codigocódigo para fazer um kernel
*/
int main(void)
Linha 255 ⟶ 258:
 
Agora retorne na pasta "Projeto" vamos modificar o Makefile .<br>
Vamos colocar a siguinteseguinte linha:
@cd sub-make && $(MAKE)
*Explicando: "@" silencioso "cd" para abrir a pasta sub-make "&&" e executar make "$(MAKE)"
*Vamos fazer a mesma coisa para "clean:" e "mrproper:" entaoentão ao executar "make clean" no console ele vai executar o mesmo comando no sub-makefile.
########################## O Makefile principal ##########################"
Linha 288 ⟶ 291:
@cd sub-make && $(MAKE) $@
 
NaoNão esquesa de dar TAB em todas as llinhaslinhas que estaoestão em baixo dos ":" dois pontinhos.
OK agora e so dar um F4 dentro da pasta projetos e vocevocê tem trstreis comandos a disposiçaodisposição.<br>
 
*make
Linha 297 ⟶ 300:
====Make install:====
 
Automatisando a instalaçaoinstalação do programa com a regra install: .<br>
* install: .Coloca o binario ou executavel em uma determinada pasta ,/bin ou /usr/bin no linux
mais pode ser em qualquer outra.E so usar o comando "mv" ou "cp" mover ou copiar.
Linha 343 ⟶ 346:
@cd sub-make && $(MAKE) $@
 
EntaoEntão quando vocevocê digitar no console "make" depois "make install" ele vai colocar o binario que esta em
"Projetos" dentro de "bin".<br>
Se vocevocê quizer colocar o binario que esta na pasta "sub-make" na pasta "bin"
*Copiar e colar no makefile da "sub-make" as variaveis "prefix" e "bindir"e a regra install:com seu comando.
*E no "Makefile principal" em baixo de "install:" coloque esta linha @cd sub-make && $(MAKE) $@
*Aqui eu modifiquei o "mrproper" porque agora os binarios que devem ser apagados com "make mrproper" estaoestão em "bin".
*Vou deixar voces modificarem o "mrproper" do "sub-makefile" como pessoas adultas e responsaveis ;) Valeu galera.
Os comandos no console saosão:<br>
*make
*make install