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