SHELL = /bin/sh
CC := gcc
OBJS = raytrace-2d_matlab_wrapper.o raytrace-2d-sp_matlab_wrapper.o raytrace-3d_matlab_wrapper.o raytrace-3d-sp_matlab_wrapper.o irreg_strength_matlab_wrapper.o dop_spread_eq_matlab_wrapper.o iri2007_matlab_wrapper.o igrf2007_matlab_wrapper.o iri2012_matlab_wrapper.o igrf2011_matlab_wrapper.o iri2016_matlab_wrapper.o igrf2016_matlab_wrapper.o iri2020_matlab_wrapper.o igrf2020_matlab_wrapper.o ground_bs_loss_matlab_wrapper.o ground_fs_loss_matlab_wrapper.o abso_bg_matlab_wrapper.o  nrlmsise00_matlab_wrapper.o check_ref_data.o stepmemcpyd.o

# NOTE: 1. if the the Intel Fortran compiler has been used with the -ip or -ipo 
#          optimisation flags then the ifort linker must be used'
#       2. ifort can static link the intel fortran libs (use -static-intel flag)
#          gcc and mex linkers cannot static link the intel fortran libs
#       3. ifort linker (18.0.1) is not compatible with Mac OS 10.15 (Catelina)
#
# if gcc is the linker then both fortran and mex libs need to be specified
#LINK := gcc
#LINKFLAGS = -shared -O3
#LINKOUTFLAG = -o
#
# if mex is the linker then only fortran libs need to be specified
#LINK = mex
#LINKFLAGS = -largeArrayDims -O
#LINKOUTFLAG = -output
#
# if ifort is the linker then only mex libs need to be specified 
#LINK = ifort
#LINKFLAGS := -shared -static-intel -O3 -nofor-main
#LINKOUTFLAG = -o    
#      
MEX_INSTALL_PATH = ../../mex
NULLSTRING =
ifeq (${MATLAB_VERSION}, ${NULLSTRING})
  MATLAB_VERSION := R2020a
endif
ifeq (${OSTYPE}, $(filter ${OSTYPE}, darwin bsd44))       # this is Mac OS X
  LINK := gcc
  LINKFLAGS = -shared -O3
  LINKOUTFLAG = -o
  CFLAGS := -fpic -O3 -m64
  FORTLIBPATH = /opt/intel/compilers_and_libraries/mac/lib
  MEXINCLUDE := /Applications/MATLAB_${MATLAB_VERSION}.app/extern/include
  MEXLIBPATH := /Applications/MATLAB_${MATLAB_VERSION}.app/bin/maci64
  MEXEXT := mexmaci64
  LINKFLAGS := $(LINKFLAGS)
  PHARLAP_LIB_PATH = ../../lib/mac
endif
ifneq (,$(findstring linux,${OSTYPE}))       # this is linux
  LINK = ifort
  LINKFLAGS := -shared -static-intel -O3 -nofor-main
  LINKOUTFLAG = -o    
  FORTLIBPATH = /opt/intel/compilers_and_libraries/linux/lib/intel64
  MEXINCLUDE := /usr/local/MATLAB/${MATLAB_VERSION}/extern/include
  MEXLIBPATH := /usr/local/MATLAB/${MATLAB_VERSION}/bin/glnxa64
  MEXEXT := mexa64
  CFLAGS := -fpic -O3 -m64
  ifeq (${P6}, true) 
    CFLAGS := $(CFLAGS) -DP6
  endif
  LINKFLAGS := $(LINKFLAGS)
  PHARLAP_LIB_PATH = ../../lib/linux
endif

pharlap: raytrace_2d raytrace_2d_sp raytrace_3d raytrace_3d_sp irreg_strength dop_spread_eq iri2007 igrf2007 iri2012 igrf2011 iri2016 igrf2016 iri2020 igrf2020 ground_bs_loss ground_fs_loss abso_bg nrlmsise00

build_objs : ${OBJS}

.c.o :
	${CC} ${CFLAGS} -I${MEXINCLUDE} -c $<

raytrace_2d: build_objs
	${LINK} ${LINKFLAGS} raytrace-2d_matlab_wrapper.o stepmemcpyd.o -L${PHARLAP_LIB_PATH} -lpropagation -lmaths -L${FORTLIBPATH} -lifcore -limf -liomp5 -L${MEXLIBPATH} -lmx -lmex ${LINKOUTFLAG} raytrace_2d.${MEXEXT}

raytrace_2d_sp: build_objs
	${LINK} ${LINKFLAGS} raytrace-2d-sp_matlab_wrapper.o stepmemcpyd.o -L${PHARLAP_LIB_PATH} -lpropagation -lmaths -L${FORTLIBPATH} -lifcore -limf -liomp5 -L${MEXLIBPATH} -lmx -lmex ${LINKOUTFLAG} raytrace_2d_sp.${MEXEXT}

raytrace_3d: build_objs
	${LINK} ${LINKFLAGS} raytrace-3d_matlab_wrapper.o stepmemcpyd.o -L${PHARLAP_LIB_PATH} -lpropagation -lmaths -L${FORTLIBPATH} -lifcore -limf -liomp5 -L${MEXLIBPATH} -lmx -lmex ${LINKOUTFLAG} raytrace_3d.${MEXEXT}

raytrace_3d_sp: build_objs
	${LINK} ${LINKFLAGS} raytrace-3d-sp_matlab_wrapper.o stepmemcpyd.o -L${PHARLAP_LIB_PATH} -lpropagation -lmaths -L${FORTLIBPATH} -lifcore -limf -liomp5 -L${MEXLIBPATH} -lmx -lmex ${LINKOUTFLAG} raytrace_3d_sp.${MEXEXT}

irreg_strength: build_objs
	${LINK} ${LINKFLAGS} irreg_strength_matlab_wrapper.o -L${PHARLAP_LIB_PATH} -lpropagation -liri2016 -L${FORTLIBPATH} -lifcore -limf -lirc -lsvml -L${MEXLIBPATH} -lmx -lmex ${LINKOUTFLAG} irreg_strength.${MEXEXT}

dop_spread_eq: build_objs
	${LINK} ${LINKFLAGS} dop_spread_eq_matlab_wrapper.o -L${PHARLAP_LIB_PATH} -lpropagation -liri2016 -L${FORTLIBPATH} -lifcore -limf -lirc  -lsvml -L${MEXLIBPATH} -lmx -lmex ${LINKOUTFLAG} dop_spread_eq.${MEXEXT}

iri2007: build_objs
	${LINK} ${LINKFLAGS} iri2007_matlab_wrapper.o check_ref_data.o -L${PHARLAP_LIB_PATH} -liri2007 -L${FORTLIBPATH} -lifcore -limf -lirc -lsvml -L${MEXLIBPATH} -lmx -lmex ${LINKOUTFLAG} iri2007.${MEXEXT}

igrf2007: build_objs
	${LINK} ${LINKFLAGS} igrf2007_matlab_wrapper.o check_ref_data.o -L${PHARLAP_LIB_PATH} -liri2007 -lmaths -L${FORTLIBPATH} -lifcore -limf -lirc -L${MEXLIBPATH} -lmx -lmex ${LINKOUTFLAG} igrf2007.${MEXEXT}

iri2012: build_objs
	${LINK} ${LINKFLAGS} iri2012_matlab_wrapper.o check_ref_data.o -L${PHARLAP_LIB_PATH} -liri2012 -L${FORTLIBPATH} -lifcore -limf -lirc -lsvml -L${MEXLIBPATH} -lmx -lmex ${LINKOUTFLAG} iri2012.${MEXEXT}

igrf2011: build_objs
	${LINK} ${LINKFLAGS} igrf2011_matlab_wrapper.o check_ref_data.o -L${PHARLAP_LIB_PATH} -liri2012 -lmaths -L${FORTLIBPATH} -lifcore -limf -lirc -lsvml -L${MEXLIBPATH} -lmx -lmex ${LINKOUTFLAG} igrf2011.${MEXEXT}

iri2016: build_objs
	${LINK} ${LINKFLAGS} iri2016_matlab_wrapper.o check_ref_data.o -L${PHARLAP_LIB_PATH} -liri2016 -L${FORTLIBPATH} -lifcore -limf -lirc -lsvml -L${MEXLIBPATH} -lmx -lmex ${LINKOUTFLAG} iri2016.${MEXEXT}

igrf2016: build_objs
	${LINK} ${LINKFLAGS} igrf2016_matlab_wrapper.o check_ref_data.o -L${PHARLAP_LIB_PATH} -liri2016 -lmaths -L${FORTLIBPATH} -lifcore -limf -lirc -lsvml -L${MEXLIBPATH} -lmx -lmex ${LINKOUTFLAG} igrf2016.${MEXEXT}

iri2020: build_objs
	${LINK} ${LINKFLAGS} iri2020_matlab_wrapper.o check_ref_data.o -L${PHARLAP_LIB_PATH} -liri2020 -L${FORTLIBPATH} -lifcore -limf -lirc -lsvml -L${MEXLIBPATH} -lmx -lmex ${LINKOUTFLAG} iri2020.${MEXEXT}

igrf2020: build_objs
	${LINK} ${LINKFLAGS} igrf2020_matlab_wrapper.o check_ref_data.o -L${PHARLAP_LIB_PATH} -liri2020 -lmaths -L${FORTLIBPATH} -lifcore -limf -lirc -lsvml -L${MEXLIBPATH} -lmx -lmex ${LINKOUTFLAG} igrf2020.${MEXEXT}

nrlmsise00: build_objs
	${LINK} ${LINKFLAGS} nrlmsise00_matlab_wrapper.o check_ref_data.o -L${PHARLAP_LIB_PATH} -liri2020 -lmaths -L${FORTLIBPATH} -lifcore -limf -lirc -lsvml -L${MEXLIBPATH} -lmx -lmex ${LINKOUTFLAG} nrlmsise00.${MEXEXT}

ground_bs_loss: build_objs
	${LINK} ${LINKFLAGS} ground_bs_loss_matlab_wrapper.o check_ref_data.o -L${PHARLAP_LIB_PATH} -lpropagation -L${FORTLIBPATH} -lifcore -limf -L${MEXLIBPATH} -lmx -lmex ${LINKOUTFLAG} ground_bs_loss.${MEXEXT}

ground_fs_loss: build_objs
	${LINK} ${LINKFLAGS} ground_fs_loss_matlab_wrapper.o check_ref_data.o -L${PHARLAP_LIB_PATH} -lpropagation -L${FORTLIBPATH} -lifcore -limf -L${MEXLIBPATH} -lmx -lmex ${LINKOUTFLAG} ground_fs_loss.${MEXEXT}

abso_bg: build_objs
	${LINK} ${LINKFLAGS} abso_bg_matlab_wrapper.o check_ref_data.o -L${PHARLAP_LIB_PATH} -lpropagation -lmaths -liri2016 -L${FORTLIBPATH} -lifcore -limf -lirc -lsvml -L${MEXLIBPATH} -lmx -lmex ${LINKOUTFLAG} abso_bg.${MEXEXT}
