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:31] jefersonmakefile [2016/09/01 20:02] (current) – [Opção 3] jeferson
Line 1: Line 1:
-O programa <font inherit/courier new,courier,monospace;;inherit;;inherit>make</font> é uma ferramenta bastante utilizada para o controle de grandes programas, facilitando as tarefas de compilação e execução. Para entender o seu funcionamento, suponha a existência de um programa composto por três arquivos: <font inherit/courier new,courier,monospace;;inherit;;inherit>main.f</font><font inherit/courier new,courier,monospace;;inherit;;inherit>part1.f</font> <font inherit/courier new,courier,monospace;;inherit;;inherit>part2.f</font>.+O programa make é uma ferramenta bastante utilizada para o controle de grandes programas, facilitando as tarefas de compilação e execução. Para entender o seu funcionamento, suponha a existência de um programa composto por três arquivos: main.f, part1.f e part2.f.
  
 A compilação deste programa utilizando o Intel® Fortran Compiler é realizada por meio do comando: A compilação deste programa utilizando o Intel® Fortran Compiler é realizada por meio do comando:
Line 16: Line 16:
 </code> </code>
  
-que cria um arquivo executável chamado <font inherit/courier new,courier,monospace;;inherit;;inherit>exec</font>.+que cria um arquivo executável chamado exec que pode ser executado a partir do comando:
  
-Na segunda opção, os três primeiros comandos tem como finalidade a obtenção de arquivos do tipo "objeto", com extensão ".o". Já o último comando realiza a conexão entre os três subprogramas. Esta forma de organização e compilação dos arquivos que compõem o programa é mais conveniente para a utilização do arquivo <font inherit/courier new,courier,monospace;;inherit;;inherit>Makefile</font>. Isso possibilitará que a tarefa de compilação seja mais rápida, pois apenas as partes do programa que foram editadas precisam ser compiladas novamente.+<code> 
 +./exec 
 +</code>
  
-A seguir, serão exibidas três opções de criação do arquivo <font inherit/courier new,courier,monospace;;inherit;;inherit>Makefile</font>, avançando em grau de dificuldade e generalidade.+Na segunda opção de compilação, os três primeiros comandos tem como finalidade a obtenção de arquivos do tipo "objeto", com extensão ".o". Já o último comando realiza a conexão entre os três subprogramas. Esta forma de organização e compilação dos arquivos que compõem o programa é mais conveniente para a utilização do arquivo Makefile. Isso possibilitará que a tarefa de compilação seja mais rápida, pois apenas as partes do programa que foram editadas precisam ser compiladas novamente. 
 + 
 +A seguir, serão exibidas três opções de criação do arquivo Makefile, avançando em grau de dificuldade e generalidade.
  
 ==== Opção 1 ==== ==== Opção 1 ====
 +
 +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>
 +compile:
 +   ifort main.f part1.f part2.f -o exec
 +
 +run:
 +   ./exec
 +
 +clear:
 +   rm -f *.o *.mod exec
 +</code>
 +
 +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 ====
 +
 +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
 +
 +compile: exec
 +
 +exec: main.o part1.o part2.o
 +   $(COMPILADOR) main.o part1.o part2.o -o exec
 +
 +part1.o: part1.f
 +   $(COMPILADOR) -c part1.f
 +
 +part2.o: part2.f
 +   $(COMPILADOR) -c part2.f
 +
 +main.o: main.f part1.o part2.o
 +   $(COMPILADOR) -c main.f part1.o part2.o
 +
 +run:
 +   ./exec
 +
 +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.
 +
 +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.1472758307.txt.gz · Last modified: by jeferson