# known to compile with gfortran version 7, ifort version 17, pgfortran version 18
# Examples
# F90=ifort FFLAGS=-fast make clean all
# F90=gfortran F90FLAGS=-ffree-line-length-none make clean all
# F90=pgfortran F90FLAGS="-fast -Minfo=loop" make clean all

# if XCodeML F_Front is installed, set FFRONT=F_Front to parse code into XML
FFRONT ?= true

F90 ?= gfortran
F90FLAGS ?= -ffree-line-length-none

VPATH = obj
NAMES = $(basename $(notdir $(wildcard physics/*.F90)))
OBJECTS = $(addprefix obj/, $(addsuffix .o, $(NAMES)))

all : obj $(OBJECTS) lib/libphyparam.so

obj :
	@mkdir obj include lib xml

clean :
	rm -f obj/* include/* lib/* xml/*
	../bash/beautify.sh physics/*.F90
%.so : $(OBJECTS)
	$(F90) -shared $^ -o $@ 

obj/read_param_mod.o   : logging.o
obj/write_field_mod.o  : logging.o
obj/convection.o       : logging.o
obj/surface.o          : logging.o
obj/astronomy.o        : logging.o
obj/solar.o            : logging.o astronomy.o
obj/radiative_lw.o     : logging.o phys_const.o
obj/radiative_sw.o     : logging.o phys_const.o
obj/turbulence.o       : logging.o phys_const.o
MAIN                   : callkeys.o phys_const.o astronomy.o turbulence.o surface.o convection.o planet.o
obj/iniphyparam_mod.o  : MAIN read_param_mod.o
obj/phyparam_mod.o     : MAIN solar.o radiative_sw.o radiative_lw.o comgeomfi.o writefield_mod.o

SRC = $(basename $(notdir $@))
obj/%.o: physics/%.F90
	$(F90) -I include -fPIC $(F90FLAGS) -c $<
	@mv $(SRC).mod include
	@mv $(SRC).o obj
	@cpp -DXCODEML $< > xml/$(SRC).f90
	@$(FFRONT) -M xml xml/$(SRC).f90 > xml/$(SRC).xml
