User Tools

Site Tools


makefile

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
makefile [2016/09/01 19:44] jefersonmakefile [2016/09/01 20:02] (current) – [Opção 3] jeferson
Line 28: Line 28:
 ==== Opção 1 ==== ==== Opção 1 ====
  
-O arquivo Makefile mais simples de ser escrito consiste em agrupar os comandos necessários da seguinte forma:+O arquivo <font inherit/courier new,courier,monospace;;inherit;;inherit>Makefile</font> mais simples de ser escrito consiste em agrupar os comandos necessários da seguinte forma:
  
 <code> <code>
 compile: compile:
- 
    ifort main.f part1.f part2.f -o exec    ifort main.f part1.f part2.f -o exec
  
 run: run:
- 
    ./exec    ./exec
  
 clear: clear:
- 
    rm -f *.o *.mod exec    rm -f *.o *.mod exec
 </code> </code>
  
-Com este arquivo, basta digitar "make" ou "make compile" para que o programa seja compilado e "make run" para que seja executado. A opção "make clear", por sua vez, apaga todos os arquivos gerados durante a compilação e execução do programa.+Com este arquivo, basta digitar "<font inherit/courier new,courier,monospace;;inherit;;inherit>make</font>" ou "make <font inherit/courier new,courier,monospace;;inherit;;inherit>compile</font>" para que o programa seja compilado e "<font inherit/courier new,courier,monospace;;inherit;;inherit>make run</font>" para que seja executado. A opção "<font inherit/courier new,courier,monospace;;inherit;;inherit>make clear</font>", por sua vez, apaga todos os arquivos gerados durante a compilação e execução do programa. 
  
 ==== Opção 2 ==== ==== Opção 2 ====
  
-Nesta opção, serão criados os arquivos do tipo "objeto" com a posterior conexão entre os subprogramas. No entanto, é necessário que se saibam as dependências entre cada subprograma. Para este exemplo, suponha que o programa main.f dependa dos demais arquivos. Neste caso, o arquivo Makefile deve ser escrito da seguinte forma:+Nesta opção, serão criados os arquivos do tipo "objeto" com a posterior conexão entre os subprogramas. No entanto, é necessário que se saibam as dependências entre cada subprograma. Para este exemplo, suponha que o programa main.f dependa dos demais arquivos. Neste caso, o arquivo <font inherit/courier new,courier,monospace;;inherit;;inherit>Makefile</font> deve ser escrito da seguinte forma:
  
 +<code>
 COMPILADOR = ifort COMPILADOR = ifort
  
Line 55: Line 54:
  
 exec: main.o part1.o part2.o exec: main.o part1.o part2.o
- +   $(COMPILADOR) main.o part1.o part2.o -o exec
-$(COMPILADOR) main.o part1.o part2.o -o exec+
  
 part1.o: part1.f part1.o: part1.f
- +   $(COMPILADOR) -c part1.f
-$(COMPILADOR) -c part1.f+
  
 part2.o: part2.f part2.o: part2.f
- +   $(COMPILADOR) -c part2.f
-$(COMPILADOR) -c part2.f+
  
 main.o: main.f part1.o part2.o main.o: main.f part1.o part2.o
- +   $(COMPILADOR) -c main.f part1.o part2.o
-$(COMPILADOR) -c main.f part1.o part2.o+
  
 run: run:
- +   ./exec
-./exec+
  
 clear: clear:
 +   rm -f *.o *.mod exec
 +</code>
 +
 +Apesar de ser uma forma mais rebuscada do que a opção 1, nesta opção é necessário que se conheçam as dependências entre cada subprograma, o que nem sempre é tarefa fácil. Além disso, para cada novo subprograma adicionado é necessária a edição do Makefile para a sua inclusão na rotina de compilação.
 +
 +
 +==== Opção 3 ====
 +
 +Esta opção, apesar de mais abstrata, é a que traz mais generalidade ao Makefile. Para o exemplo aqui apresentado, inclui-se o arquivo global_var.f, que contém a declaração das variáveis em um módulo e que deve ser compilado antes dos demais arquivos. Neste caso, o arquivo Makefile deve ser da seguinte forma:
 +
 +<code>
 +COMPILADOR =  ifort -O2
 +
 +FSOURCES = $(wildcard *.f)
 +
 +compile:exec
 +exec: $(FSOURCES:.f=.o)
 +   @$(COMPILADOR) -o $@ $^
 +
 +global_var.o: global_var.f
 +   @$(COMPILADOR) -c global_var.f
 +
 +%.o: %.f global_var.o
 +   @$(COMPILADOR) -c $<-o $@
 +
 +clean:
 +    @rm -f *.o *.mod exec
 +run:
 +    @./exec
 +</code>
 +
 +Neste arquivo, o @ no início de cada comando faz com que este não seja impresso na tela. O comando "FSOURCES = $(wildcard *.f)" faz com que todos os arquivos com extensão ".f" sejam compilados.
  
-rm -*.o *.mod exec+Em seguida, a variável especial "$^" é incluída e realiza a substituição de todas as dependências de cada um dos arquivos compilados. Com o comando "%.o", o arquivo entende que todos os arquivos ".f" devem ser compilados para a extensão ".o" (atentar para a criação da dependência entre os demais arquivos ".f" com "global_var.f" neste comando). A variável "$<" é substituída pelas dependências do subprograma. Por fim, a variável especial "$@" é substituída pelo nome do arquivo sendo compilado.
  
  
makefile.1472759088.txt.gz · Last modified: by jeferson