
#Files containing classes to include
#e.g. change RECOMBINATION_FILES to "recfast cosmorec" to also support cosmorec
#     or to "recfast hyrec" to support HYREC-2
POWERSPECTRUM_FILES ?= InitialPower
REIONIZATION_FILES ?= reionization
RECOMBINATION_FILES ?= recfast
NONLINEAR_FILES     ?= halofit SecondOrderPK
DARKENERGY_FILES  ?= DarkEnergyFluid DarkEnergyPPF PowellMinimize DarkEnergyQuintessence

BISPECTRUM ?= SeparableBispectrum

#Driver program
DRIVER        ?= inidriver
#DRIVER       ?= sigma8
#DRIVER       ?= tester

Release: OUTPUT_DIR = Release
Debug: OUTPUT_DIR = Debug

Release: DLL_DIR = Releaselib
Debug: DLL_DIR = Debuglib

OUTPUT_DIR ?= Release
PYCAMB_OUTPUT_DIR ?= ../camb
DLL_DIR ?= Releaselib


CAMBLIB       = libcamb.a

SOURCEFILES      = constants config classes MathUtils subroutines DarkAge21cm \
        DarkEnergyInterface SourceWindows massive_neutrinos model results bessels \
        $(RECOMBINATION_FILES) $(DARKENERGY_FILES) equations \
        $(REIONIZATION_FILES) $(POWERSPECTRUM_FILES) $(NONLINEAR_FILES) \
        lensing $(BISPECTRUM) cmbmain camb camb_python


F90WFLAGS     = -Waliasing -Wampersand -Wconversion -Wc-binding-type -Wintrinsics-std \
        -Wno-tabs -Wintrinsic-shadow -Wline-truncation -Wtarget-lifetime -Wreal-q-constant
# -Wsurprising -Wunused

F90FLAGS      = $(FFLAGS)
#F90FLAGS      += $(F90WFLAGS)

SF90FLAGS      = $(SFFLAGS) $(FFLAGS)

HEALPIXLD     = -L$(HEALPIXDIR)/lib -lhealpix -L$(FITSDIR) -l$(FITSLIB)


CAMBOBJ       = $(patsubst %,%.o,$(SOURCEFILES))

FORUTILS_DIR ?= $(FORUTILSPATH)/$(OUTPUT_DIR)/
python: FORUTILS_DIR=$(FORUTILSPATH)/$(DLL_DIR)/

LIBLINK = -L"$(FORUTILS_DIR)" -lforutils
	

## CosmoRec
ifneq (,$(findstring cosmorec,$(RECOMBINATION_FILES)))
camb: libCosmoRec.a
python: libCosmoRec.a
FFLAGS += -DCOSMOREC
COSMOREC_PATH ?=../../CosmoRec/
GSL_LINK ?=-lgsl -lgslcblas
LIBLINK += -L$(COSMOREC_PATH) -lCosmoRec $(GSL_LINK) -lstdc++
endif


ifneq (,$(findstring hyrec,$(RECOMBINATION_FILES)))
FFLAGS += -DHYREC
HYREC_PATH ?= ../../HYREC-2/
LIBLINK += -L$(HYREC_PATH) -lhyrec
camb: libhyrec.a
python: libhyrec.a
endif

default: camb

all: camb python libcamb
Release: camb python
Debug: camb python

MAKEOPT ?= --no-print-directory

cur_ver := $(shell cat compiler.ver 2>&1 || echo "")
ifneq ($(cur_ver),$(compiler_ver))
$(shell rm -f compiler.ver *.d)
endif

compiler.ver:
	@echo $(compiler_ver) > compiler.ver
	@rm -f *.d

camb: libforutils directories
	@$(MAKE) -C $(OUTPUT_DIR) $(MAKEOPT) -r -f ../Makefile_main $(CAMBLIB) ../camb

libcamb: libforutils directories
	@$(MAKE) -C $(OUTPUT_DIR) $(MAKEOPT) -r -f ../Makefile_main $(CAMBLIB)

python: libforutils_so directories_so
	@$(MAKE) -C $(DLL_DIR) $(MAKEOPT) -r -f ../Makefile_main camblib.so F90FLAGS="$(SF90FLAGS)" OUTPUT_DIR=$(DLL_DIR)

../camb: $(CAMBLIB) $(DRIVER).o | silent
	@$(MAKE) -C .. $(MAKEOPT) -f Makefile_main camb_exe

camb_exe:
	$(F90C) $(F90FLAGS) $(MODOUT) $(IFLAG)$(OUTPUT_DIR)/ $(IFLAG)"$(FORUTILS_DIR)" \
		$(OUTPUT_DIR)/$(DRIVER).o $(OUTPUT_DIR)/$(CAMBLIB) $(F90CRLINK) $(LIBLINK) -o camb

camblib.so: $(CAMBOBJ)
	@$(MAKE) -C .. $(MAKEOPT) -f Makefile_main $(DLL_DIR)/camblib.so

libcambobj:
    LIBCAMBOBJ = $(patsubst %,$(DLL_DIR)/%.o,$(SOURCEFILES))

#cannot link the .a library, or the linker will strip out some things we might need
$(DLL_DIR)/camblib.so: libcambobj
	$(F90C) $(SF90FLAGS) $(SMODOUT) $(IFLAG)$(DLL_DIR)/ $(IFLAG)"$(FORUTILS_DIR)"  \
		$(LIBCAMBOBJ) $(F90CRLINK) $(LIBLINK) -o $(DLL_DIR)/camblib.so
	cp $(DLL_DIR)/camblib.so $(PYCAMB_OUTPUT_DIR)


$(CAMBLIB): $(CAMBOBJ)
	$(AR) -r $@ $(CAMBOBJ)

camb_fits: libforutils directories writefits.f90 $(CAMBOBJ) $(DRIVER).o
	$(F90C) $(F90FLAGS) -I$(HEALPIXDIR)/include $(CAMBOBJ) writefits.f90 $(DRIVER).o \
		$(F90CRLINK) $(LIBLINK) $(HEALPIXLD) -DWRITE_FITS -o $@

#../Makefile ../Makefile_main
%.o: ../%.f90 compiler.ver 
	$(F90C) $(F90FLAGS) $(IFLAG)"$(FORUTILS_DIR)" -c $< -o $*.o

directories:
	@mkdir -p $(OUTPUT_DIR)

directories_so:
	@mkdir -p $(DLL_DIR)

libforutils_so:
	@cd "$(FORUTILSPATH)" && \
	$(MAKE) $(MAKEOPT) $(DLL_DIR)

libforutils:
	@cd "$(FORUTILSPATH)" && \
	$(MAKE) $(MAKEOPT) $(OUTPUT_DIR)


clean:
	-rm -f *.o *.a *.d core *.mod *.optrpt
	-rm -rf Release* Debug* WinDLL*

delete:
	rm -f camb	
	rm -f ../camb/*.so

## CosmoRec make parts
cleanCR:
	cd $(COSMOREC_PATH); make tidy;

libCosmoRec.a:
	cd $(COSMOREC_PATH); make lib;

libhyrec.a:
	cd $(HYREC_PATH); make libhyrec.a;

silent:
	@:

export
-include *.d

.PHONY: clean directories libcamb Release Releaselib Debuglib Debug \
        camb python camb_exe libcambobj libcamb
