User Tools

Site Tools


makefile

Differences

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

Link to this comparison view

Next revision
Previous revision
makefile [2016/09/01 19:18] – criada jefersonmakefile [2016/09/01 20:02] (current) – [Opção 3] jeferson
Line 1: Line 1:
-O programa <font inherit/inherit;;inherit;;inherit></font><font inherit/courier new,courier,monospace;;inherit;;inherit>make</font> é uma ferramenta bastante utilizada para o controle de grandes programasfacilitando as tarefas de compilação e execução.+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: 
 + 
 +<code> 
 +ifort main.f part1.f part2.f -o exec 
 +</code> 
 + 
 +ou 
 + 
 +<code> 
 +ifort -c main.f 
 +ifort -c part1.f 
 +ifort -c part2.f 
 +ifort main.o part1.o part2.o -o exec 
 +</code> 
 + 
 +que cria um arquivo executável chamado exec que pode ser executado a partir do comando: 
 + 
 +<code> 
 +./exec 
 +</code> 
 + 
 +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 ==== 
 + 
 +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 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 1nesta 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 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.1472757524.txt.gz · Last modified: by jeferson