ROOTDIR = ..
BINARY=mmc

FILES=mmc_mesh mmc_raytrace mmc_utils mmc_tictoc mmc_host mmc_highorder mmc_bench mmc_cl_utils mmc_cl_host
CLPROGRAM=mmc_core

DOXYCFG=mmc_doxygen.cfg

USERCCFLAGS=-DUSE_OS_TIMER -DUSE_OPENCL -DMMC_XORSHIFT

DUMMY:=$(shell mkdir -p built/cjson)

ifneq (,$(filter $(MAKECMDGOALS),cuda cudamex cudaoct optix optixmex optixoct cudaunittest optixunittest))
    FILES+=mmc_cu_host
    USERCCFLAGS+=-DUSE_CUDA
    CUCCOPT= -DMCX_SAVE_DETECTORS -DMCX_DO_REFLECTION -DUSE_DMMC -DUSE_BLBADOUEL -Xcompiler -fPIC $(USERCUCCOPT)
    EXTRALIB+=-lcudart
    LIBCUDART=-L$(LIBOPENCLDIR) -lcudart
endif

ifneq (,$(filter $(MAKECMDGOALS),optix optixmex optixoct optixunittest))
    PTXSOURCE=mmc_optix_utils
    FILES+=$(PTXSOURCE) mmc_optix_host
    OPTIXPROGRAM=mmc_optix_core
    USERCCFLAGS+=-DUSE_OPTIX -DUSE_CUDA_VECTOR_TYPES -I$(CUDAHOME)/include -I$(OPTIXHOME)/include
    LIBCUDART+=-lcuda -ldl
    EXTRALIB+=-lcuda -ldl
endif

include $(ROOTDIR)/commons/Makefile_common.mk

## mmc_utils.c embeds the OpenCL kernel; recompile whenever mmc_core.cl changes ##
$(OBJDIR)/mmc_utils$(OBJSUFFIX): $(CLSOURCE)

##  Host unit tests (test/unit), linked with the same objects as mmc except its main() ##
##  and built with the flags of the default goal (ssemath, or omp on arm64 macOS)      ##
unittest: CCFLAGS+= -O3 $(OPENMP) $(FASTMATH)
unittest: ARFLAGS+= $(OPENMPLIB) $(FASTMATH)
ifeq ($(.DEFAULT_GOAL),ssemath)
unittest: CCFLAGS+=$(SSEFLAGS) -DUSE_SSE2 -DMMC_USE_SSE_MATH
endif
# the EXPECT_EXIT cases run OpenCL in a fork()ed child, which macOS kills unless
# its Objective-C runtime (under the OpenCL framework) allows that; ignored elsewhere
unittest: makedirs $(CLSOURCE) $(ZMATLIB) $(OBJS)
	$(CC) $(CCFLAGS) $(USERCCFLAGS) -I$(INCLUDEDIR) -DMMC_EXAMPLE_DIR=\"$(abspath ../examples)\" -o $(OBJDIR)/test_mmc$(OBJSUFFIX) ../test/unit/test_mmc.c
	$(AR) $(ARFLAGS) $(AROUTPUT) $(BINDIR)/mmc_unittest $(OBJDIR)/test_mmc$(OBJSUFFIX) $(filter-out $(OBJDIR)/mmc$(OBJSUFFIX),$(OBJS)) $(USERARFLAGS) $(EXTRALIB)
	OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES $(BINDIR)/mmc_unittest

##  the same unit tests linked with the CUDA (and OptiX) backends, which add their GPU cases ##
cudaunittest optixunittest: unittest
