SOURCE ?= .

AR ?= ar

.DEFAULT_GOAL := library.a

LIBRARY_OBJECTS = \
	binary.o \
	deriv.o \
	deriv_data.o \
	driver.o \
	errors.o \
	flags_data.o \
	formatting.o \
	hunting.o \
	integral_data.o \
	integrate.o \
	integrator_flags.o \
	orientation.o \
	parameters.o \
	physconst.o \
	quaternary.o \
	stardata.o \
	states.o \
	ternary.o \
	typedef.o \
	vector.o \
	unary.o \
	collision.o \
	linalg.o \
	utils.o \
	tree.o \
	polyadic.o \

F90 = gfortran -c -Ofast -fno-finite-math-only -fPIC -Wall
# F90 = gfortran -c -Ofast -fPIC -Wall

physconst.o physconst.mod &: ${SOURCE}/physconst.f90 \
	typedef.mod
	@rm -f physconst.mod
	$(F90) $(FFLAGS) $<

typedef.o typedef.mod &: ${SOURCE}/typedef.f90
	@rm -f typedef.mod
	$(F90) $(FFLAGS) $<

vector.o vector.mod &: ${SOURCE}/vector.f90 \
	typedef.mod
	@rm -f vector.mod
	$(F90) $(FFLAGS) $<

driver.o driver.mod &: ${SOURCE}/driver.f90 \
	typedef.mod integrate.mod integral_data.mod \
	formatting.mod errors.mod integrator_flags.mod \
	orientation.mod states.mod parameters.mod
	@rm -f driver.mod
	$(F90) $(FFLAGS) $<

integral_data.o integral_data.mod &: ${SOURCE}/integral_data.f90 \
	typedef.mod
	@rm -f integral_data.mod
	$(F90) $(FFLAGS) $<

integrator_flags.o integrator_flags.mod &: ${SOURCE}/integrator_flags.f90
	@rm -f integrator_flags.mod
	$(F90) $(FFLAGS) $<

integrate.o integrate.mod &: ${SOURCE}/integrate.f90 \
	typedef.mod errors.mod parameters.mod
	@rm -f integrate.mod
	$(F90) $(FFLAGS) $<

stardata.o stardata.mod &: ${SOURCE}/stardata.f90 \
	typedef.mod hunting.mod
	@rm -f stardata.mod
	$(F90) $(FFLAGS) $<

parameters.o parameters.mod &: ${SOURCE}/parameters.f90 \
	typedef.mod
	@rm -f parameters.mod
	$(F90) $(FFLAGS) $<

states.o states.mod &: ${SOURCE}/states.f90 \
	typedef.mod
	@rm -f states.mod
	$(F90) $(FFLAGS) $<

hunting.o hunting.mod &: ${SOURCE}/hunting.f90 \
	typedef.mod
	@rm -f hunting.mod
	$(F90) $(FFLAGS) $<

formatting.o formatting.mod &: ${SOURCE}/formatting.f90 \
	typedef.mod
	@rm -f formatting.mod
	$(F90) $(FFLAGS) $<

errors.o errors.mod &: ${SOURCE}/errors.f90 \
	typedef.mod
	@rm -f errors.mod
	$(F90) $(FFLAGS) $<

deriv_data.o deriv_data.mod &: ${SOURCE}/deriv_data.f90 \
	typedef.mod
	@rm -f deriv_data.mod
	$(F90) $(FFLAGS) $<

flags_data.o flags_data.mod &: ${SOURCE}/flags_data.f90 \
	typedef.mod
	@rm -f flags_data.mod
	$(F90) $(FFLAGS) $<

deriv.o deriv.mod &: ${SOURCE}/deriv.f90 \
	typedef.mod deriv_data.mod binary.mod ternary.mod quaternary.mod
	@rm -f deriv.mod
	$(F90) $(FFLAGS) $<

unary.o unary.mod &: ${SOURCE}/unary.f90 \
	typedef.mod stardata.mod deriv_data.mod flags_data.mod orientation.mod
	@rm -f unary.mod
	$(F90) $(FFLAGS) $<

binary.o binary.mod &: ${SOURCE}/binary.f90 \
	typedef.mod physconst.mod stardata.mod vector.mod integrate.mod \
	deriv_data.mod flags_data.mod parameters.mod states.mod \
	integrator_flags.mod orientation.mod collision.mod
	@rm -f binary.mod
	$(F90) $(FFLAGS) $<

ternary.o ternary.mod &: ${SOURCE}/ternary.f90 \
	typedef.mod physconst.mod stardata.mod vector.mod integrate.mod \
	deriv_data.mod flags_data.mod parameters.mod states.mod \
	integrator_flags.mod orientation.mod collision.mod
	@rm -f ternary.mod
	$(F90) $(FFLAGS) $<

quaternary.o quaternary.mod &: ${SOURCE}/quaternary.f90 \
	typedef.mod physconst.mod stardata.mod vector.mod integrate.mod \
	deriv_data.mod flags_data.mod parameters.mod states.mod \
	integrator_flags.mod orientation.mod collision.mod
	@rm -f quaternary.mod
	$(F90) $(FFLAGS) $<

polyadic.o polyadic.mod &: ${SOURCE}/polyadic.f90 \
	typedef.mod physconst.mod stardata.mod vector.mod integrate.mod \
	deriv_data.mod flags_data.mod parameters.mod states.mod \
	integrator_flags.mod orientation.mod collision.mod tree.mod
	@rm -f polyadic.mod
	$(F90) $(FFLAGS) $<

orientation.o orientation.mod &: ${SOURCE}/orientation.f90 \
	typedef.mod vector.mod
	@rm -f orientation.mod
	$(F90) $(FFLAGS) $<

collision.o collision.mod &: ${SOURCE}/collision.f90 \
	typedef.mod vector.mod linalg.mod
	@rm -f collision.mod
	$(F90) $(FFLAGS) $<

linalg.o linalg.mod &: ${SOURCE}/linalg.f90 \
	typedef.mod utils.mod
	@rm -f linalg.mod
	$(F90) $(FFLAGS) $<

utils.o utils.mod &: ${SOURCE}/utils.f90 \
	typedef.mod
	@rm -f utils.mod
	$(F90) $(FFLAGS) $<

tree.o tree.mod &: ${SOURCE}/tree.f90 \
	typedef.mod
	@rm -f tree.mod
	$(F90) $(FFLAGS) $<

# -----------------------------------------------------------------------

library.a: $(LIBRARY_OBJECTS)
	@rm -f library.a
	$(AR) cvr $@ $(LIBRARY_OBJECTS)

.PHONY:	clean

clean:
	-rm -f *.o *.a *.mod *.smod *~ \#*\# .*~ .\#*
	-rm -rf _build
	-rm -rf _library
	-rm -f *.so
	-rm -rf __pycache__
