Compilazione di sorgenti fortan (f77) mediante lo script makemake e make

Esiste un modo rapido e automatico per compilare e linkare sorgenti fortran quando sono in così elevato numero da rendere noioso l'utilizzo di g77.

Si può utilizzare uno script scritto in perl detto "makemake" per generare il makefile del nostro progetto in fortran (oppure in C).

Lo script è qui reperibile. Deve essere prima decompresso, poi è necessario modificare la prima riga dello script affinchè indichi il path dell'interprete perl installato nel proprio sistema.

Si rende lo script eseguibile mediante

$ chmod +x makemake

quindi per comodità si sposta nella cartella /usr/bin mediante

# cp makemake /usr/bin

Questo script crea automaticamente il makefile a partire dalle sorgenti fortran (nel formato file.f) presenti nella directory corrente.

La sintassi è

$ makemake [nome_eseguibile] f77

Se nella directory corrente sono presenti ad esempio i sorgenti:

bodyrig.f estest.f getcart.f MAIN.f randvelo.f util.f contrten.f eulero.f getteta.f output.f result.f veloverl.f diagon3.f findcoup.f inertia.f posverl.f scaling.f vextcart.f duni.f force.f input.f printres.f tremol.f wrtener.f esbasis.f getbarus.f kinetic.f programma.f update.f ;

il comando

$ makemake dinamica f77

genera il makefile del progetto che nell'esempio è

PROG = dinamica

SRCS = bodyrig.f contrten.f diagon3.f duni.f esbasis.f estest.f eulero.f findcoup.f force.f getbarus.f getcart.f getteta.f inertia.f input.f kinetic.f MAIN.f output.f posverl.f printres.f programma.f randvelo.f result.f scaling.f tremol.f update.f util.f veloverl.f vextcart.f wrtener.f

OBJS = bodyrig.o contrten.o diagon3.o duni.o esbasis.o estest.o eulero.o findcoup.o force.o getbarus.o getcart.o getteta.o inertia.o input.o kinetic.o MAIN.o output.o posverl.o printres.o programma.o randvelo.o result.o scaling.o tremol.o update.o util.o veloverl.o vextcart.o wrtener.o LIBS =

CC = cc

CFLAGS = -O

FC = f77

FFLAGS = -O

F90 = f90

F90FLAGS = -O

LDFLAGS = -s

all: $(PROG)

$(PROG): $(OBJS)

$(FC) $(LDFLAGS) -o $@ $(OBJS) $(LIBS)

clean:

rm -f $(PROG) $(OBJS) *.mod

.SUFFIXES: $(SUFFIXES) .f

.f90.o:

$(F90) $(F90FLAGS) -c $<

bodyrig.o: PARAM.INC BLOK1.INC BLOK2.INC ENER.INC

contrten.o: PARAM.INC BLOK1.INC

esbasis.o: PARAM.INC BLOK1.INC BLOK2.INC

estest.o: PARAM.INC BLOK1.INC

eulero.o: PARAM.INC BLOK1.INC ENER.INC PARAM.INC BLOK1.INC

findcoup.o: PARAM.INC BLOK1.INC

force.o: PARAM.INC BLOK1.INC ENER.INC PARAM.INC BLOK1.INC ENER.INC

getbarus.o: PARAM.INC BLOK1.INC

getcart.o: PARAM.INC BLOK1.INC

getteta.o: PARAM.INC BLOK1.INC

inertia.o: PARAM.INC BLOK1.INC

input.o: PARAM.INC BLOK1.INC ENER.INC

kinetic.o: PARAM.INC BLOK1.INC ENER.INC

output.o: PARAM.INC BLOK1.INC

posverl.o: PARAM.INC BLOK1.INC ENER.INC ENER.INC PARAM.INC BLOK1.INC

printres.o: PARAM.INC BLOK1.INC

randvelo.o: PARAM.INC BLOK1.INC ENER.INC PARAM.INC BLOK1.INC PARAM.INC BLOK1.INC ENER.INC

result.o: PARAM.INC BLOK1.INC ENER.INC

scaling.o: PARAM.INC BLOK1.INC ENER.INC

tremol.o: PARAM.INC BLOK1.INC

update.o: PARAM.INC BLOK1.INC ENER.INC

veloverl.o: PARAM.INC BLOK1.INC

vextcart.o: PARAM.INC BLOK1.INC

wrtener.o: PARAM.INC BLOK1.INC ENER.INC

SRCS = bodyrig.f contrten.f diagon3.f duni.f esbasis.f estest.f eulero.f findcoup.f force.f getbarus.f getcart.f getteta.f inertia.f input.f kinetic.f MAIN.f output.f posverl.f printres.f programma.f randvelo.f result.f scaling.f tremol.f update.f util.f veloverl.f vextcart.f wrtener.f

OBJS = bodyrig.o contrten.o diagon3.o duni.o esbasis.o estest.o eulero.o findcoup.o force.o getbarus.o getcart.o getteta.o inertia.o input.o kinetic.o MAIN.o output.o posverl.o printres.o programma.o randvelo.o result.o scaling.o tremol.o update.o util.o veloverl.o vextcart.o wrtener.o

LIBS =

CC = cc

CFLAGS = -O

FC = f77

FFLAGS = -O

F90 = f90

F90FLAGS = -O

LDFLAGS = -s

all: $(PROG)

$(PROG): $(OBJS)

$(FC) $(LDFLAGS) -o $@ $(OBJS) $(LIBS)

clean:

rm -f $(PROG) $(OBJS) *.mod

.SUFFIXES: $(SUFFIXES) .f90

.f90.o:

$(F90) $(F90FLAGS) -c $<

bodyrig.o: PARAM.INC BLOK1.INC BLOK2.INC ENER.INC

contrten.o: PARAM.INC BLOK1.INC

esbasis.o: PARAM.INC BLOK1.INC BLOK2.INC

estest.o: PARAM.INC BLOK1.INC

eulero.o: PARAM.INC BLOK1.INC ENER.INC PARAM.INC BLOK1.INC

findcoup.o: PARAM.INC BLOK1.INC

force.o: PARAM.INC BLOK1.INC ENER.INC PARAM.INC BLOK1.INC ENER.INC

getbarus.o: PARAM.INC BLOK1.INC

getcart.o: PARAM.INC BLOK1.INC

getteta.o: PARAM.INC BLOK1.INC

inertia.o: PARAM.INC BLOK1.INC

input.o: PARAM.INC BLOK1.INC ENER.INC

kinetic.o: PARAM.INC BLOK1.INC ENER.INC

output.o: PARAM.INC BLOK1.INC

posverl.o: PARAM.INC BLOK1.INC ENER.INC ENER.INC PARAM.INC BLOK1.INC

printres.o: PARAM.INC BLOK1.INC

randvelo.o: PARAM.INC BLOK1.INC ENER.INC PARAM.INC BLOK1.INC PARAM.INC BLOK1.INC ENER.INC

result.o: PARAM.INC BLOK1.INC ENER.INC

scaling.o: PARAM.INC BLOK1.INC ENER.INC

tremol.o: PARAM.INC BLOK1.INC

update.o: PARAM.INC BLOK1.INC ENER.INC

veloverl.o: PARAM.INC BLOK1.INC

vextcart.o: PARAM.INC BLOK1.INC

wrtener.o: PARAM.INC BLOK1.INC ENER.INC

Generato il makefile è sufficiente compilare e linkare i sorgenti. Non a mano ovviamente! Basta il comando: $ make Vengono quindi compilati separatamente da g77 i sorgenti *.f, dando luogo ai binari *.o ; quindi questi vengono automaticamente linkati per generare l'eseguibile che nell'esempio sopra sarà "dinamica".

Dato che make è intelligente, qualora in futuro si modificassero alcuni sorgenti e si ricompilasse, i sorgenti non modificati non verranno ricompilati, rendendo l'operazione più snella.

Buona compilazione!