# compiler executables --------------------------------------------------------

CC = gcc
CXX = g++
FC = gfortran

# language standard -----------------------------------------------------------

# CSTD = -std=c89
  CSTD = -std=c99
  CXXSTD = -std=c++98
# CXXSTD = -std=c++11
  FSTD = -std=f2003 -ffree-form -Wno-c-binding-type

# common compiler options -----------------------------------------------------

OPTFLAGS = -O3
FLAGS = $(OPTFLAGS) -fPIC -pedantic -Wall -Wextra
SOFLAGS =

# OpenMP compiler options -----------------------------------------------------

# do not uncomment; use "make ZFP_WITH_OPENMP=0" to disable OpenMP
OMPFLAGS = -fopenmp

# optional compiler macros ----------------------------------------------------

# use long long for 64-bit types
# DEFS += -DZFP_INT64='long long' -DZFP_INT64_SUFFIX='ll'
# DEFS += -DZFP_UINT64='unsigned long long' -DZFP_UINT64_SUFFIX='ull'

# use smaller bit stream word type for finer rate granularity
# DEFS += -DBIT_STREAM_WORD_TYPE=uint8
# DEFS += -DBIT_STREAM_WORD_TYPE=uint16
# DEFS += -DBIT_STREAM_WORD_TYPE=uint32
# DEFS += -DBIT_STREAM_WORD_TYPE=uint64

# cache alignment
# DEFS += -DZFP_CACHE_LINE_SIZE=256

# enable strided access for progressive zfp streams
# DEFS += -DBIT_STREAM_STRIDED

# use aligned memory allocation
# DEFS += -DZFP_WITH_ALIGNED_ALLOC

# use two-way skew-associative cache
# DEFS += -DZFP_WITH_CACHE_TWOWAY

# use faster but more collision prone hash function
# DEFS += -DZFP_WITH_CACHE_FAST_HASH

# count cache misses
# DEFS += -DZFP_WITH_CACHE_PROFILE

# reduce bias and slack in errors
# DEFS += -DZFP_ROUNDING_MODE=ZFP_ROUND_FIRST
# DEFS += -DZFP_ROUNDING_MODE=ZFP_ROUND_LAST
# DEFS += -DZFP_WITH_TIGHT_ERROR

# treat subnormals as zero to avoid overflow
# DEFS += -DZFP_WITH_DAZ

# build targets ---------------------------------------------------------------

# default targets
BUILD_CFP = 0
BUILD_ZFORP = 0
BUILD_UTILITIES = 1
BUILD_EXAMPLES = 0
BUILD_TESTING = 1
BUILD_SHARED_LIBS = 0

# build all targets?
ifdef BUILD_ALL
  ifneq ($(BUILD_ALL),0)
    BUILD_CFP = 1
    BUILD_ZFORP = 1
    BUILD_UTILITIES = 1
    BUILD_EXAMPLES = 1
    BUILD_TESTING = 1
  endif
endif

# build shared libraries?
ifneq ($(BUILD_SHARED_LIBS),0)
  LIBRARY = shared
  LIBZFP = libzfp.so
  LIBCFP = libcfp.so
else
  LIBRARY = static
  LIBZFP = libzfp.a
  LIBCFP = libcfp.a
endif

# conditionals ----------------------------------------------------------------

# macOS configuration; compile with "make OS=mac"
ifeq ($(OS),mac)
  SOFLAGS += -undefined dynamic_lookup
endif

# suppress unused function warnings when compiling C89
ifeq ($(CSTD),-std=c89)
  FLAGS += -Wno-unused-function
endif

# enable OpenMP?
ifdef ZFP_WITH_OPENMP
  ifneq ($(ZFP_WITH_OPENMP),0)
    ifneq ($(ZFP_WITH_OPENMP),OFF)
      FLAGS += $(OMPFLAGS)
    endif
  endif
endif

# rounding mode and slack in error
ifdef ZFP_ROUNDING_MODE
  FLAGS += -DZFP_ROUNDING_MODE=$(ZFP_ROUNDING_MODE)
  ifneq ($(ZFP_ROUNDING_MODE),0)
    # tight error bound requires round-first or round-last mode
    ifdef ZFP_WITH_TIGHT_ERROR
      ifneq ($(ZFP_WITH_TIGHT_ERROR),0)
        FLAGS += -DZFP_WITH_TIGHT_ERROR
      endif
    endif
  endif
endif

# treat subnormals as zero to avoid overflow
ifdef ZFP_WITH_DAZ
  ifneq ($(ZFP_WITH_DAZ),0)
    FLAGS += -DZFP_WITH_DAZ
  endif
endif

# chroma mode for ppm example
ifdef PPM_CHROMA
  PPM_FLAGS += -DPPM_CHROMA=$(PPM_CHROMA)
endif

# compiler options ------------------------------------------------------------

CFLAGS = $(CSTD) $(FLAGS) $(DEFS)
CXXFLAGS = $(CXXSTD) $(FLAGS) $(DEFS)
FFLAGS = $(FSTD) $(FLAGS) $(DEFS)