Entrar    Registrar

How to create a make file ?

Discussão sobre linux para plataformas Intel x86 ou x64 (PC)

Moderadores: guest2003, 51, Renie, gpenga

  • Autor
    Mensagem

Mensagempor xultz » 24 Abr 2012 13:35

Cara, em se tratando do make eu não sei, mas você pode experimentar.
Se você cria um shell script, e cria variáveis dentro dele, elas só valem durante a execução do script. Quando ele termina, essas variáveis vão direto para /dev/null.
Porém, se você digitar ponto espaço nome_do_arquivo_script, quando ele terminar as variáveis continuam disponíveis.
Exemplo: você tem um script chamado cagada.sh
Se digitar:
. ./cagada.sh
(é, a coisa é estranha mesmo) as variáveis continuarão disponíveis. Quanto ao make, eu não sei se o mesmo vale.
Porém, provavelmente você não precise disso. Por exemplo, eu tava programando LPC no Linux. Eu tava gravando ele por serial, ele tem aquele bootloader super simpático. E achei um programete de linha de comando que passava o .hex, a porta serial e velocidade e ele gravava o LPC.
Assim, quando eu digitava make, ele compilava o programa. Se eu quisesse gravar, eu digitava make grava e ele gravava o hex. Dentro da seção "grava" que eu criei, eu chamava o comando de gravação e funcionava que era um doce.
98% das vezes estou certo, e não estou nem aí pros outros 3%.
Avatar do usuário
xultz
Dword
 
Mensagens: 2963
Registrado em: 13 Out 2006 18:41
Localização: Curitiba

Mensagempor fabim » 26 Abr 2012 09:24

AH, tá agóra eu consegui destravar o fuse de limitação de visão longa. Consegui entender agora, bhá !!

Na verdade, o make, é simplesmente uma automação do que pode ser feito manualmente.

Eu por exemplo posso compilar 10 X *.C.
E depois eu posso montar eles, etc.

O make na verdade faz tudo como se eu estivesse no terminal digitando aqueles comandos.

É isso mêmu ?
Mano, ve só.
Sou responsável pelo que escrevo!!! E não pelo que você entende !!!
fabim
Dword
 
Mensagens: 4982
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

Mensagempor xultz » 26 Abr 2012 10:01

É exatamente isso.

Ele na verdade é um batch file. Porém, peça a um programador fazer um executor de batch file, para ser usado por outros programadores, e pronto: você tem um treco extremamente complexo que só meia dúzia vai entender.

Ele tem algumas sacadas espertinhas, como por exemplo de só compilar arquivos que foram efetivamente modificados, e os que não foram ele não perde tempo compilando. Num projetinho pequeno isso não inflói muito, mas se pensar num kernel Linux, por exemplo, onde você só mudou um arquivo que dizia "(c) By Linus Torvalds" para "(C) By Fabim", esperar horas prá ele recompilar a árvore toda não faz sentido.
98% das vezes estou certo, e não estou nem aí pros outros 3%.
Avatar do usuário
xultz
Dword
 
Mensagens: 2963
Registrado em: 13 Out 2006 18:41
Localização: Curitiba

Mensagempor msamsoniuk » 26 Abr 2012 14:53

o make nao eh arquivo de lote ou script nao! :)

o make eh uma ferramenta que verifica pares do tipo "eu quero isso":"eu tenho isso". em cada par ele verifica se o cara da direita eh mais novo ou nao que o cara da esquerda. por exemplo, pega um Makefile simples:

all: fabim

o all eh o target geral do make. para ele atingir os objetivos, ele precisa do fabim. ali tah simples, p/ fazer o fabim, ele nao precisa de mais nada, entao ele vai inferir:

fabim: fabim.c

se vc quiser, pode fazer um Makefile com as duas regras:

all: fabim

fabim: fabim.c

veja que aih tem tb uma segunda diferenca cavalar p/ um arquivo de lote: o make checa as datas. vc roda make e ele soh recompila realmente se fabim.c for mais novo que o atual binario fabim. e daih vc rapidamente percebe q isso pode ser muito util com headers:

all: fabim

fabim: fabim.c fabim.h

nao eh perfeito, mas se vc alterar tanto o .c quanto o .h ele recompila. mas quando vc tem muitos arquivos, vc normalmente precisa compilar os .o separadamente e linkar. entao vc pode ter:

all: fabim

fabim: fabim.o mastk.o

fabim.o: fabim.c fabim.h

mastk.o: mastk.c mastk.h

agora a coisa ficou seria! quando vc compila a primeira vez, ele chega das datas de cada .h e .c, gera o .o e, se tiver algum .o novo, ele relinka p/ formar o binario final.

mas escrever cada .o e suas dependencias .c e .h eh um saco, entao:

TARGET=fabim
OBJS=fabim.o mastk.o
DEPS=fabim.h mastk.h
CFLAGS=-Wall -O3

all: $(TARGET)

$(TARGET): $(OBJS)

%.o: %.c $(DEPS)

clean:
-rm $(TARGET) $(OBJS)

se vc alterar um .c, ele recompila apenas ele e relinka. se vc alterar um .h, ele falha. infelizmente a descricao precisa ser mais completa, pq ele nao sabe exatamente o que estamos querendo fazer... o mais completo seria ensinar ele o que precisa ser feito:

TARGET = fabim
OBJS = fabim.o mastk.o
DEPS = fabim.h mastk.h
CFLAGS = -Wall -O3

CC = gcc
LD = gcc
RM = rm

all: $(TARGET)

$(TARGET): $(OBJS)
$(LD) -o $@ $< $(LDFLAGS)

%.o: %.c $(DEPS)
$(CC) -c -o $@ $< $(CFLAGS)

clean:
-$(RM) $(TARGET) $(OBJS)

agora sim. mexeu em um .h, ele recompila tudo. mexeu em um .c, ele recompila soh o .c. veja que eh um caminho: uma alternativa mais completa, mas mais dificil de manter seria ter uma entrada p/ cada .o referenciando seu respectivo .c e .h. mas eh mais dificil de manter.

uma dica eh ter varios diretorios e makefiles, assim as dependencias ficam hierarquicas e vc nao precisa recompilar o sistema inteiro soh pq mudou um .h em uma aplicacao. isso fica restrito ao Makefile daquela aplicacao. mas, normalmente, mudar um .h jah gera bastante problemas e acho que nao tem uma receita de bolo universal.

da mesma forma, tem gente q prefere fazer um find e achar todos os .c e .h. eu francamente nao acho muito interessante pq as vezes tem arquivos .c e .h q estao no projeto, mas nao estao sendo usados. dah p/ automatizar isso, mas tem que saber o que esta fazendo tb neh hehehe

vc pode automatizar tudo e com isso ter uma compilacao bem simples, mas eu prefiro ter certeza do que estou compilando. de qq forma, o make facilita enormemente a vida em projetos grandes, pq poupa bastante tempo de compilacao. se vc muda uma unica linha em um arquivo .c, ele nao precisa recompilar tudo novamente.

ah sim: roda um make -d que ele mostra tudo! ;D

fabim escreveu:AH, tá agóra eu consegui destravar o fuse de limitação de visão longa. Consegui entender agora, bhá !!

Na verdade, o make, é simplesmente uma automação do que pode ser feito manualmente.

Eu por exemplo posso compilar 10 X *.C.
E depois eu posso montar eles, etc.

O make na verdade faz tudo como se eu estivesse no terminal digitando aqueles comandos.

É isso mêmu ?
Avatar do usuário
msamsoniuk
Dword
 
Mensagens: 2928
Registrado em: 13 Out 2006 18:04

Mensagempor xultz » 26 Abr 2012 16:05

É um arquivo de lote sim. Com a única diferença que, como eu havia dito duas vezes anteriormente, ele checa se o arquivo foi modificado e só compila se ele foi modificado.
Afora isso, o que ele tem de diferente é aquela parafernalha de variáveis que podem ser setados ao bel prazer (e me parece que tem nego com fixação sexual em definir variáveis em arquivos makefile), e como ele foi feito por programador para programadores, você define sub rotinas que podem ser chamadas por subrotinas, como num programa qualquer.
98% das vezes estou certo, e não estou nem aí pros outros 3%.
Avatar do usuário
xultz
Dword
 
Mensagens: 2963
Registrado em: 13 Out 2006 18:41
Localização: Curitiba

Mensagempor msamsoniuk » 26 Abr 2012 17:27

Imagem

fiquei sem palavras e essa figura foi a unica coisa q me veio a mente! :D

xultz escreveu:É um arquivo de lote sim. Com a única diferença que, como eu havia dito duas vezes anteriormente, ele checa se o arquivo foi modificado e só compila se ele foi modificado.
Afora isso, o que ele tem de diferente é aquela parafernalha de variáveis que podem ser setados ao bel prazer (e me parece que tem nego com fixação sexual em definir variáveis em arquivos makefile), e como ele foi feito por programador para programadores, você define sub rotinas que podem ser chamadas por subrotinas, como num programa qualquer.
Avatar do usuário
msamsoniuk
Dword
 
Mensagens: 2928
Registrado em: 13 Out 2006 18:04

Mensagempor EvandrPic » 26 Abr 2012 20:37

se você se descuidar... :lol:
Vídeo Mostra Tartaruga Escalando Parede De Casa
http://www.youtube.com/watch?v=P0Sjjczgumw

Tartaruga Aranha Original
http://www.youtube.com/watch?v=_3Zrps3QnnY



Marcelo Samsoniuk escreveu:Imagem

fiquei sem palavras e essa figura foi a unica coisa q me veio a mente! :D

xultz escreveu:É um arquivo de lote sim. Com a única diferença que, como eu havia dito duas vezes anteriormente, ele checa se o arquivo foi modificado e só compila se ele foi modificado.
Afora isso, o que ele tem de diferente é aquela parafernalha de variáveis que podem ser setados ao bel prazer (e me parece que tem nego com fixação sexual em definir variáveis em arquivos makefile), e como ele foi feito por programador para programadores, você define sub rotinas que podem ser chamadas por subrotinas, como num programa qualquer.
EvandrPic
Dword
 
Mensagens: 2083
Registrado em: 31 Mar 2010 15:05

Mensagempor xultz » 27 Abr 2012 10:13

Apesar dos pesares, eu ainda prefiro quando você coloca aquelas fotos de comida.
98% das vezes estou certo, e não estou nem aí pros outros 3%.
Avatar do usuário
xultz
Dword
 
Mensagens: 2963
Registrado em: 13 Out 2006 18:41
Localização: Curitiba

Anterior

Voltar para Linux ( x86 ou x64 )

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante