# 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.inc

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

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

# Enforce all compiler warnings
ifneq (no,$(WERROR))
  MEX_CFLAGS+= -Werror
endif

# OpenMP flags
ifneq (no,$(USE_OPENMP))
  ifdef USE_OCTAVE
    $(error genlib: Compiling with OpenMP directives for Octave is not supported, set USE_OPENMP=no)
  endif
  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_OMP=
  $(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 bspsum ellipfastmex greenemmex iflooriceiliroundmex ztrig bytesofmex nansmex cs2devalmex
# 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

MEXMEX = $(MEX:%=%.$(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
bspsum.$(MEXEXT): src/bspsum_src.c
bspsum.$(MEXEXT): MEXOPTS+=-DBSPSUM4
ifneq (no,$(USE_OPENMP))
  bspsum.$(MEXEXT): MEXOPTS+=-DBSPPAR $(MEXOPTS_OMP)
  bspsum.$(MEXEXT): MEX_CFLAGS+= $(CFLAGS_OMP)
  bspsum.$(MEXEXT): MEX_LDFLAGS+= $(LDFLAGS_OMP)
endif
ellipfastmex.$(MEXEXT): src/ellipfast.c
greenemmex.$(MEXEXT): src/greenem.c
ifneq (no,$(USE_OPENMP))
  greenemmex.$(MEXEXT): MEXOPTS+= -DGREENEMPAR $(MEXOPTS_OMP)
  greenemmex.$(MEXEXT): MEX_CFLAGS+= $(CFLAGS_OMP)
  greenemmex.$(MEXEXT): MEX_LDFLAGS+= $(LDFLAGS_OMP)
endif
iflooriceiliroundmex.$(MEXEXT): src/ifloor.c src/iround.c src/iceil.c
cs2devalmex.$(MEXEXT): src/cs2deval.c

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