# Makefile for genlib
#
# [+GenLib General Purpose Library+] Sw+ss Plasma Center EPF+Lausanne 2022. All rights reserved.
#
# To choose a particular version of MATLAB/MEX
#   define either the MATPATH or MATLAB variable
#   to point to the root of your MATLAB installation
#   i.e. $(MATPATH)/bin/matlab should exist
# Set VERBOSE=true to see some debugging variables

# Set up MATLAB-related path
include mexargs/Makefile.mex

ifeq ($(VERBOSE),true)
  $(info CLEAN_ONLY is $(CLEAN_ONLY))
endif

# Set up compiler flags
CFLAGS+= -Iinclude
MEX_CFLAGS+= -std=c99

# OpenMP flags
ifneq (no,$(USE_OPENMP))
  MEXOPTS_OMP=-DBSPPAR
  ifeq ($(COMPILER_FAMILY),GNU)
    # OpenMP flags for GNU family
    CFLAGS_OMP=-fopenmp
    LDFLAGS_OMP=
    MEXOPTS_OMP+=-lgomp
  endif
  ifeq ($(COMPILER_FAMILY),Intel)
    # OpenMP flags for Intel family
    CFLAGS_OMP =-qopenmp
    LDFLAGS_OMP=-qopenmp
    MEXOPTS_OMP+=
  endif
else
  MEXOPTS_BSP=
  $(info genlib: Disabling OpenMP support)
endif

ifeq ($(VERBOSE),true)
  $(info      CFLAGS_OMP is $(CFLAGS_OMP))
  $(info     MEXOPTS_OMP is $(MEXPOTS_OMP))
  $(info     LDFLAGS_OMP is $(LDFLAGS_OMP))
endif

MEX = bspbasemex bspsummex ellipfastmex greenemmex iflooriroundmex ztrig bytesofmex nansmex
# OS-specific options
ifeq ($(OS),MacOS)
  # MacOS options
  ifneq (no,$(USE_OPENMP))
    ifeq ($(CLEAN_ONLY),no)
      ifneq ($(COMPILER_FAMILY),Intel)
        $(error genlib: OpenMP support on MacOS is only available with icc/icx, please use USE_OPENMP=no)
      endif
    endif
  endif
  RM=/bin/rm
  # do not mex nansmex since ieee754.h not found on MacOS..
  MEX := $(filter-out nansmex,$(MEX))
endif
ifeq ($(OS),Linux)
  # Linux options
  RM=/usr/bin/rm
endif
ifeq ($(OS),Windows)
  # Windows options
  RM=/usr/bin/rm
  # do not mex nansmex since ieee754.h not found on Windows..
  MEX := $(filter-out nansmex,$(MEX))
endif

MEXSRC = $(MEX:%=mexc/%.c)
MEXMEX = $(MEX:%=%.$(MEXEXT)) bspsum.$(MEXEXT)

.PHONY: all clean
all: $(MEXMEX)

%.$(MEXEXT):mexc/%.c include/genlib.h mexargs/include/mexargs.h
	$(MEXCMD) -output $@ $(filter-out %.h,$^) $(MEXOPTS) $(CFLAGS)

bspbasemex.$(MEXEXT): src/bspbase.c
bspsummex.$(MEXEXT): src/bspsum.c
bspsummex.$(MEXEXT): MEXOPTS+=-DBSPSUM4 $(MEXOPTS_OMP)
bspsummex.$(MEXEXT): MEX_CFLAGS+= $(CFLAGS_OMP)
bspsummex.$(MEXEXT): MEX_LDFLAGS+= $(LDFLAGS_OMP)
ellipfastmex.$(MEXEXT): src/ellipfast.c
greenemmex.$(MEXEXT): src/greenem.c
# OpenMP disabled in greenem for now (incompatibility btw MATLAB and gcc versions)
#greenemmex.$(MEXEXT): MEX_CFLAGS+= $(CFLAGS_OMP)
#greenemmex.$(MEXEXT): MEX_LDFLAGS+= $(LDFLAGS_OMP)
iflooriroundmex.$(MEXEXT): src/ifloor.c src/iround.c
bspsum.$(MEXEXT): bspsummex.$(MEXEXT)
	ln -sf $< $@

clean:
	$(RM) -f *.mex*
