Formação Makefiles
Ricardo Miranda
Guillaume Riflet
Sumário
1.
2.
3.
4.
5.
6.
7.
Interesse e objectivos das makefiles
Invocar o compilador da linha de comando
“Hello world”
Criação da Makefile para o “Hello world”
“Hello world II” (com dependências)
Criação da Makefile para o “Hello world II”
Criação da Makefile para o “Hello world II” com
variáveis e regras implicitas
8. “Hello world III” (compilar bibliotecas)
9. Criação da Makefile para o “Hello world III”
10. Descrição da Makefile do Mohid
11. Referências e convenções
Interesse e objectivos das
makefiles
 Permite gerir programas grandes e
complexos
 Permite recompilar apenas as partes do
código que mudaram
 Não necessita reconfigurar a IDE (os
famigerados powerpoints de
configuracao...)
Invocar o compilador (algumas
noções)
1.
2.
3.
Compiler stage: o código (C, F90 etc) é convertido em código
assembler (.S).
Assembler stage: O código assembler é convertido em código
objecto (.o) i.e. linguagem máquina – que é legível pela máquina.
Linker stage: a étapa final da compilação consiste em “colar” os
vários objectos que compõem o programa e em “ligá-lo” às
bibliotecas que contém funções pré-definidas (HDF5, netcdf
etc..). O resultado é um ficheiro executável!
O comando é simplesmente cc file.c
Hello world!
 foo.f90
program hello
print*,"Hello World!"
end program hello
ifort foo.f90
ifort –c foo.f90
ifort foo.o
Makefile para Hello world!
 RULE:
Insert a tab!
Target : Dependencies ...
Commands
...
all:
ifort foo.f90
foo.exe :
ifort foo.f90
foo.exe : foo.o
ifort foo.o
foo.o : foo.90
ifort –c foo.f90
Hello world !! (dependências)
 foo.f90
program foo
Use a
Call printit
end program foo
ifort a.f90 foo.f90
?
ifort foo.f90 a.f90
 a.f90
module a
contains
subroutine printit
print*,"Hello World!!"
end subroutine printit
end module a
ifort –c foo.f90
ifort –c a.f90
ifort foo.o a.o
ifort –c a.f90
ifort –c foo.f90
ifort foo.o a.o
?
Algumas noções de compilação II
Compilando vários ficheiros

Árvore de dependências
O comando é simplesmente cc file.c blue.c
Makefile para Hello world !!
(dependências)
 RULE:
Ignora erros
Target : Dependencies ...
-Commands
...
foo.exe :
ifort a.f90 foo.f90
foo.exe : foo.o a.o
ifort foo.o a.o
foo.o : foo.f90
ifort –c foo.f90
a.o : a.f90
ifort –c a.f90
?
foo.exe : foo.o a.o
ifort foo.o a.o
foo.o : a.o foo.f90
ifort –c foo.f90
a.o : a.f90
ifort –c a.f90
Patternized rules (GNU make)
 RULE:
Ignora erros
foo.exe : foo.o a.o
ifort foo.o a.o
foo.o : a.o foo.f90
ifort –c foo.f90
a.o : a.f90
ifort –c a.f90
Target : Dependencies ...
-Commands
...
wildcard!
foo.exe : foo.o a.o
ifort foo.o a.o
%.o : %.f90
ifort –c $<
foo.o : a.o
Variáveis
 RULE:
Ignora erros
foo.exe : foo.o a.o
ifort foo.o a.o
%.o : %.f90
ifort –c $<
foo.o : a.o
Target : Dependencies ...
-Commands
...
SRCS = foo.f90 a.f90
OBJS = $(SRCS:.f90=.obj)
foo.exe : $(OBJS)
ifort $^
%.obj : %.f90
ifort -c $<
foo.obj : a.obj
Hello world !!! (Bibliotecas)

foo.f90
program foo
Use a
Use b
Use hdf5
Call printit
Call printthis
end program foo
Ifort –c b.f90
ifort –c a.f90
ifort –c foo.f90
ifort foo.o a.o b.o
 b.f90
module b
contains
subroutine printthis
print*,“This!!"
end subroutine printthis
end module b
ifort –c b.f90
ifort –c a.f90
ar rc ab.lib a.o b.o
Ifort –I../libs –c foo.f90
ifort foo.o ab.lib ../libs/hdf5.lib
Makefile para Hello world !!!
(Bibliotecas)
 RULE:
Não faz output do comando
ifort –c b.f90
ifort –c a.f90
ar rc ab.lib a.o b.o
Ifort –I../libs –c foo.f90
ifort foo.o ab.lib ../libs/hdf5.lib
Target : Dependencies ...
@Commands
...
SRCS = foo.f90 a.f90 b.f90
OBJS = $(SRCS:.f90=.obj)
LIBS = ab.lib ../Libs/hdf5.lib
foo.exe : foo.obj
ifort $^
%.obj : %.f90
ifort –I../Libs –c $<
foo.obj : $(LIBS)
ab.lib : a.obj b.obj
ar rc $@ $^
O comando make
 Make target
 Make –C subdir target
 Make –f filename target
Referências e convenções
•GNU make
http://www.gnu.org/software/make/manual/make.htmlhttp://www.gnu.
org/software/make/manual/make.html
•GNU make conventions
•Um tutorial popular: http://www.eng.hawaii.edu/Tutor/Make/1.html
SHELL=/bin/sh
.phony: all clean install
all: builds the project
clean: cleans the project
Install: installs the project
Download

Formação Makefiles