# SPI-specific settings
ifneq (${VERBOSE},)
$(info Including spi/Makefile-bits-spcomp2)
endif

# READ THIS FIRST
#
# If you are building for installation as an SpComp2, make like this:
# 1) On Linux, you must be setshot, for patchelf to be found.
# 2) make spcomp2_install_local
# or 2) make spcomp2_install
#
# Other notes about the SpComp2:
# - it also tries to install OIIO's binaries alongside the libs. It would
#   be really nice if somebody would either appwrap those binaries or
#   symlink them to an spi show path on each install. For the moment
#   though, they are just there for people who know.
# - it would also be nice if we had a convention for tagging SpComp2
#   release versions on the svn server.
#

OPENIMAGEIO_SPCOMP2_VERSION=45

# Default namespace
NAMESPACE ?= 'OpenImageIO_SPI'
MY_CMAKE_FLAGS += -DEXTRA_CPP_ARGS:STRING="-DOIIO_SPI=1" -DOIIO_SITE:STRING=SPI
SOVERSION ?= ${OPENIMAGEIO_SPCOMP2_VERSION}
SPCOMP2_LOCATION = /shots/spi/home/lib/SpComp2
NUKE_VERSION ?= 10.0v4
PYLIB_LIB_PREFIX ?= 1
PYLIB_INCLUDE_SONAME ?= 1
CPPSTDSUFFIX=


## Detect which SPI platform and set $platform, $COMPILER, $SPCOMP2_COMPILER,
## and PYTHON_VERSION. Lots of other decisions are based on these.
ifeq (${SP_OS}, rhel7)
    # Rhel7 (current)
    platform := rhel7
    SPCOMP2_COMPILER ?= gcc48m64
else ifeq (${platform}, macosx)
    # Generic OSX machines (including LG's laptop)
    COMPILER ?= clang
    SPCOMP2_COMPILER ?= clang
    PYTHON_VERSION ?= 2.6
else
    $(error Unknown SP_OS=${SP_OS} platform=${platform})
endif  # endif ${SP_OS}

PYTHON_VERSION ?= 2.7
PYTHON_LIBRARY_DIR ?= /usr/lib64
PYTHON_LIBRARY ?= ${PYTHON_LIBRARY_DIR}/libpython${PYTHON_VERSION}.so
PYTHON_INCLUDE_DIR ?= /usr/include/python${PYTHON_VERSION}
OCIO_SPCOMP_VERSION ?= 2
OPENVDB_SPCOMP2_VERSION ?= v5020000

## Rhel7 (current)
ifeq (${SP_OS}, rhel7)
    USE_CPP ?= 11
    USE_SIMD ?= sse4.1,aes
    CMAKE ?= cmake
    USE_NINJA ?= 0
    NINJA ?= ninja
    ifeq ($(USE_NINJA),1)
        MY_CMAKE_FLAGS += -DCMAKE_MAKE_PROGRAM=${NINJA}
    endif
    export CCACHE_CPP2 ?= 1
    # Override lib64 and use SPI convention of lib
    MY_CMAKE_FLAGS += -DCMAKE_INSTALL_LIBDIR="${INSTALL_PREFIX}/lib"
    MY_CMAKE_FLAGS += -DPYTHON_SITE_DIR="${INSTALL_PREFIX}/python"
    BOOSTVERS ?= 1.55
    SPCOMP2_USE_BOOSTVERS ?= 1
    BOOSTSPSUFFIX ?=
    BOOSTVERSSP=${BOOSTVERS}${BOOSTSPSUFFIX}
    BOOSTVERS_SUFFIX = -${shell echo ${BOOSTVERS} | sed "s/\\./_/"}
    BOOSTVERS_PREFIX = ${shell echo ${BOOSTVERS} | sed "s/\\./_/"}_0
    CONSTRUCTED_BOOSTVERS = ${shell echo ${BOOSTVERS} | sed "s/\\./0/"}00
    SPCOMP2_BOOSTVERS_SUFFIX = ${shell echo ${BOOSTVERSSP} | sed "s/\\.//"}
    SPCOMP2_FULLBOOST_SUFFIX = ${SP_OS}-${SPCOMP2_COMPILER}-boost${shell echo ${BOOSTVERSSP} | sed "s/\\.//"}
    # $(info BOOSTVERSSP ${BOOSTVERSSP})
    # $(info BOOSTVERS_SUFFIX ${BOOSTVERS_SUFFIX})
    # $(info BOOSTVERS_PREFIX ${BOOSTVERS_PREFIX})
    # $(info CONSTRUCTED_BOOSTVERS ${CONSTRUCTED_BOOSTVERS})
    # $(info SPCOMP2_BOOSTVERS_SUFFIX ${SPCOMP2_BOOSTVERS_SUFFIX})
    # $(info SPCOMP2_FULLBOOST_SUFFIX ${SPCOMP2_FULLBOOST_SUFFIX})
    OCIO_PATH ?= ${SPCOMP2_LOCATION}/OpenColorIO/${SP_OS}-${SPCOMP2_COMPILER}/v${OCIO_SPCOMP_VERSION}
#    FIELD3D_HOME ?= ${SPCOMP2_LOCATION}/Field3D/${SPCOMP2_FULLBOOST_SUFFIX}/v412
    TBB_ROOT_DIR ?= /net/apps/rhel7/intel/tbb
    OPENVDB_ROOT_DIR ?= ${SPCOMP2_LOCATION}/openvdb/${SPCOMP2_FULLBOOST_SUFFIX}/${OPENVDB_SPCOMP2_VERSION}
    OIIO_SPCOMP2_PATH := ${SPCOMP2_LOCATION}/OpenImageIO/${SP_OS}-${SPCOMP2_COMPILER}$(CPPSTDSUFFIX)-boost${SPCOMP2_BOOSTVERS_SUFFIX}/v${OPENIMAGEIO_SPCOMP2_VERSION}
    $(info New rhel7 OIIO_SPCOMP2_PATH is ${OIIO_SPCOMP2_PATH})

    ## If not overridden, here is our preferred LLVM installation
    ## (may be changed as new versions are rolled out to the facility)
    LLVM_DIRECTORY ?= /shots/spi/home/lib/arnold/rhel7/llvm_7.0.0

    # A variety of tags can be used to try specific versions of gcc or
    # clang from the site-specific places we have installed them.
    ifeq (${COMPILER},clang5)
        LLVM_DIRECTORY := /shots/spi/home/lib/arnold/rhel7/llvm_5.0.1
        MY_CMAKE_FLAGS += -DCMAKE_C_COMPILER=${LLVM_DIRECTORY}/bin/clang -DCMAKE_CXX_COMPILER=${LLVM_DIRECTORY}/bin/clang++
        MY_CMAKE_FLAGS += -DCMAKE_C_FLAGS="--gcc-toolchain=/usr" -DCMAKE_CXX_FLAGS="--gcc-toolchain=/usr"
    else ifeq (${COMPILER},clang6)
	    LLVM_DIRECTORY := /shots/spi/home/lib/arnold/rhel7/llvm_6.0.1
        MY_CMAKE_FLAGS += -DCMAKE_C_COMPILER=${LLVM_DIRECTORY}/bin/clang -DCMAKE_CXX_COMPILER=${LLVM_DIRECTORY}/bin/clang++
        MY_CMAKE_FLAGS += -DCMAKE_C_FLAGS="--gcc-toolchain=/usr" -DCMAKE_CXX_FLAGS="--gcc-toolchain=/usr"
    else ifeq (${COMPILER},clang7)
	    LLVM_DIRECTORY := /shots/spi/home/lib/arnold/rhel7/llvm_7.0.0
        MY_CMAKE_FLAGS += -DCMAKE_C_COMPILER=${LLVM_DIRECTORY}/bin/clang -DCMAKE_CXX_COMPILER=${LLVM_DIRECTORY}/bin/clang++
	MY_CMAKE_FLAGS += -DCMAKE_C_FLAGS="--gcc-toolchain=/usr" -DCMAKE_CXX_FLAGS="--gcc-toolchain=/usr"
    else ifeq (${COMPILER},clang)
        MY_CMAKE_FLAGS += -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++
        MY_CMAKE_FLAGS += -DCMAKE_C_FLAGS="--gcc-toolchain=/usr" -DCMAKE_CXX_FLAGS="--gcc-toolchain=/usr"
    else ifeq (${COMPILER}, gcc490)
      MY_CMAKE_FLAGS += \
         -DCMAKE_C_COMPILER=/net/soft_scratch/apps/arnold/tools/gcc-4.9-20130512-test/bin/gcc \
         -DCMAKE_CXX_COMPILER=/net/soft_scratch/apps/arnold/tools/gcc-4.9-20130512-test/bin/g++
    else ifeq (${COMPILER}, gcc6)
        MY_CMAKE_FLAGS += \
           -DCMAKE_C_COMPILER=/opt/rh/devtoolset-6/root/usr/bin/gcc \
           -DCMAKE_CXX_COMPILER=/opt/rh/devtoolset-6/root/usr/bin/g++
    else ifeq (${COMPILER},gcc)
        MY_CMAKE_FLAGS += -DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g++
    else ifeq (${COMPILER},)
        # default compiler is clang, taken from the LLVM directory
        MY_CMAKE_FLAGS += \
           -DCMAKE_C_COMPILER=${LLVM_DIRECTORY}/bin/clang \
           -DCMAKE_CXX_COMPILER=${LLVM_DIRECTORY}/bin/clang++
        MY_CMAKE_FLAGS += -DCMAKE_C_FLAGS="--gcc-toolchain=/usr" -DCMAKE_CXX_FLAGS="--gcc-toolchain=/usr"
    endif

    # Set our preferred OpenEXR path, but allow env variable to override
    # with custom/test version.
    ifeq (${OPENEXR_ROOT_DIR},)
	MY_CMAKE_FLAGS += \
	    -DOPENEXR_INCLUDE_DIR=/usr/include/OpenEXR2 \
	    -DOPENEXR_LIBRARY_DIR=/usr/lib64/OpenEXR2
    endif

    MY_CMAKE_FLAGS += \
	-DOCIO_PATH=${OCIO_PATH} \
	-DFIELD3D_HOME=${FIELD3D_HOME} \
	-DOPENVDB_ROOT_DIR=${OPENVDB_ROOT_DIR} \
	-DTBB_ROOT_DIR=${TBB_ROOT_DIR} \
	-DHDF5_CUSTOM=1 \
	-DHDF5_LIBRARIES=/usr/lib64/libhdf5.so \
	-DNuke_ROOT=/net/apps/rhel7/foundry/nuke${NUKE_VERSION} \
	-DLIBRAW_INCLUDEDIR_HINT=/usr/include/libraw-0.18.11 \
	-DLIBRAW_LIBDIR_HINT=/usr/lib64/libraw-0.18.11

    # Special sauce for Python 3.6
    ifeq (${PYTHON_VERSION},3.6)
	PYTHON_INCLUDE_DIR := /usr/include/python${PYTHON_VERSION}m
        PYTHON_LIBRARY := ${PYTHON_LIBRARY_DIR}/libpython${PYTHON_VERSION}m.so
        MY_CMAKE_FLAGS += \
            -DPYTHONINTERP_FOUND=1 \
            -DPYTHON_VERSION_STRING=3.6.3 \
            -DPYTHON_VERSION_MAJOR=3 \
            -DPYTHON_VERSION_MINOR=6 \
            -DPYTHON_VERSION_PATCH=3 \
            -DPython_ADDITIONAL_VERSIONS="${PYTHON_VERSION}"
    endif

    MY_CMAKE_FLAGS += \
        -DBOOST_CUSTOM=1 \
        -DBoost_VERSION=${CONSTRUCTED_BOOSTVERS} \
        -DBoost_INCLUDE_DIRS=/usr/include/boost_${BOOSTVERSSP} \
        -DBoost_LIBRARY_DIRS=/usr/lib64/boost_${BOOSTVERSSP} \
        -DPYTHON_INCLUDE_DIR:STRING=${PYTHON_INCLUDE_DIR} \
        -DPYTHON_LIBRARY:STRING=${PYTHON_LIBRARY}

    ifeq (${BOOSTSPSUFFIX}, sp)
      MY_CMAKE_FLAGS += \
	-DBoost_LIBRARIES:STRING="/usr/lib64/boost_${BOOSTVERSSP}/lib${BOOSTSPSUFFIX}boost_${BOOSTVERS_PREFIX}_filesystem-gcc48-mt${BOOSTVERS_SUFFIX}.so;/usr/lib64/boost_${BOOSTVERSSP}/lib${BOOSTSPSUFFIX}boost_${BOOSTVERS_PREFIX}_regex-gcc48-mt${BOOSTVERS_SUFFIX}.so;/usr/lib64/boost_${BOOSTVERSSP}/lib${BOOSTSPSUFFIX}boost_${BOOSTVERS_PREFIX}_system-gcc48-mt${BOOSTVERS_SUFFIX}.so;/usr/lib64/boost_${BOOSTVERSSP}/lib${BOOSTSPSUFFIX}boost_${BOOSTVERS_PREFIX}_thread-gcc48-mt${BOOSTVERS_SUFFIX}.so"
    else
      MY_CMAKE_FLAGS += \
	-DBoost_LIBRARIES:STRING="/usr/lib64/boost_${BOOSTVERSSP}/lib${BOOSTSPSUFFIX}boost_filesystem-gcc48-mt${BOOSTVERS_SUFFIX}.so;/usr/lib64/boost_${BOOSTVERSSP}/lib${BOOSTSPSUFFIX}boost_regex-gcc48-mt${BOOSTVERS_SUFFIX}.so;/usr/lib64/boost_${BOOSTVERSSP}/lib${BOOSTSPSUFFIX}boost_system-gcc48-mt${BOOSTVERS_SUFFIX}.so;/usr/lib64/boost_${BOOSTVERSSP}/lib${BOOSTSPSUFFIX}boost_thread-gcc48-mt${BOOSTVERS_SUFFIX}.so"
    endif

    # Use libtiff I built myself, static, and try to hide its symbols.
    MY_CMAKE_FLAGS += -DTIFF_INCLUDE_DIR:STRING=/usr/include \
                      -DTIFF_LIBRARIES:STRING=/net/soft_scratch/users/lg/tiff-4.0.3/rhel7/lib/libtiff.a
    MY_CMAKE_FLAGS += -DHIDE_SYMBOLS=1
    MY_CMAKE_FLAGS += -DVISIBILITY_MAP_FILE:STRING="${working_dir}/site/spi/hidesymbols.map"
    MY_CMAKE_FLAGS += -DEXTRA_DSO_LINK_ARGS:STRING="-Wl,--exclude-libs,libtiff.a"
    MY_CMAKE_FLAGS += -DUSE_OPENCV=0

    # end rhel7

## Generic OSX machines (including LG's laptop)
else ifeq (${platform}, macosx)
    USE_SIMD ?= sse4.2
    MY_CMAKE_FLAGS += \
        -DCMAKE_BUILD_WITH_INSTALL_RPATH=1 \
        -DCMAKE_INSTALL_NAME_DIR="${working_dir}/dist/${platform}${variant}/lib"

    # A variety of tags can be used to try specific versions of gcc or
    # clang from the site-specific places we have installed them.
    ifeq (${COMPILER}, gcc48)
        MY_CMAKE_FLAGS += \
           -DCMAKE_C_COMPILER=gcc-4.8 -DCMAKE_CXX_COMPILER=g++-4.8
        USE_LIBCPLUSPLUS := 0
    else ifeq (${COMPILER}, gcc49)
        MY_CMAKE_FLAGS += \
           -DCMAKE_C_COMPILER=gcc-4.9 -DCMAKE_CXX_COMPILER=g++-4.9
        USE_LIBCPLUSPLUS := 0
    else ifeq (${COMPILER}, gcc5)
        MY_CMAKE_FLAGS += \
           -DCMAKE_C_COMPILER=gcc-5 -DCMAKE_CXX_COMPILER=g++-5
        USE_LIBCPLUSPLUS := 0
    else ifeq (${COMPILER}, gcc6)
        MY_CMAKE_FLAGS += \
           -DCMAKE_C_COMPILER=gcc-6 -DCMAKE_CXX_COMPILER=g++-6
        USE_LIBCPLUSPLUS := 0
    else ifeq (${COMPILER}, gcc8)
        MY_CMAKE_FLAGS += \
           -DCMAKE_C_COMPILER=gcc-8 -DCMAKE_CXX_COMPILER=g++-8
        USE_LIBCPLUSPLUS := 0
    else ifeq (${COMPILER},clang7)
        MY_CMAKE_FLAGS += -DCMAKE_C_COMPILER=/usr/local/Cellar/llvm/7.0.0/bin/clang -DCMAKE_CXX_COMPILER=/usr/local/Cellar/llvm/7.0.0/bin/clang++
    else ifeq (${COMPILER},clang)
        MY_CMAKE_FLAGS += -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++
    else ifeq (${COMPILER},gcc)
        MY_CMAKE_FLAGS += -DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g++
    else ifeq (${COMPILER},)
        # default compiler is clang, taken from the LLVM directory
        MY_CMAKE_FLAGS += \
           -DCMAKE_C_COMPILER=${LLVM_DIRECTORY}/bin/clang \
           -DCMAKE_CXX_COMPILER=${LLVM_DIRECTORY}/bin/clang++
    endif

    # end generic OSX

else
    $(error Unknown SP_OS=${SP_OS} platform=${platform})
endif  # endif ${SP_OS}


SPARCH=${SP_OS}-$(SPCOMP2_COMPILER)$(CPPSTDSUFFIX)
BOOSTVERSSP?=${BOOSTVERS}${BOOSTSPSUFFIX}
ifdef SPCOMP2_USE_BOOSTVERS
	ifneq ($(BOOSTVERS),1.42)
        SPARCH=${SP_OS}-$(SPCOMP2_COMPILER)$(CPPSTDSUFFIX)-boost$(subst .,,$(BOOSTVERSSP))
	endif
endif
PYVERNOSPACE=${shell echo ${PYTHON_VERSION} | sed "s/\\.//"}
SPPYARCH=$(SPARCH)-py$(PYVERNOSPACE)



all: dist

.PHONY: spcomp2_install spcomp2_install_local clean all

comma:= ,
empty:=
space:= $(empty) $(empty)

INSTALL_BIN_LOCATION = /shots/spi/home/bin/${SP_OS}
INSTALL_SPCOMP2_CURRENT = $(SPCOMP2_LOCATION)/OpenImageIO/$(SPARCH)/v$(OPENIMAGEIO_SPCOMP2_VERSION)

SPCOMP2_RPATH_OPT ?= ${OCIO_PATH}/lib:${FIELD3D_HOME}/lib:/usr/lib64/libraw-0.18.11
SPCOMP2_RPATH_DEBUG ?= ${OCIO_PATH}/lib/debug:${FIELD3D_HOME}/lib/debug:/usr/lib64/libraw-0.18.11:${OPENVDB_ROOT_DIR}/lib/debug
PYSPCOMP2_RPATH_OPT ?= ${SPCOMP2_RPATH_OPT}:${OIIO_SPCOMP2_PATH}/lib:${PYTHON_LIBRARY_DIR}
PYSPCOMP2_RPATH_DEBUG ?= ${SPCOMP2_RPATH_DEBUG}:${OIIO_SPCOMP2_PATH}/lib/debug:${PYTHON_LIBRARY_DIR}


spcomp2_install_local: SPCOMP2_LOCATION = $(SPCOMP2_LOCAL_PATH)
spcomp2_install_local: INSTALL_BIN_LOCATION = $(INSTALL_SPCOMP2_CURRENT)/bin
spcomp2_install_local: spcomp2_install

local: dist

spcomp2: MY_CMAKE_FLAGS += \
		-DCMAKE_SKIP_BUILD_RPATH:BOOL=ON \
		-DCMAKE_INSTALL_RPATH=$(SPCOMP2_LOCATION)/OpenImageIO/$(SPARCH)/v$(OPENIMAGEIO_SPCOMP2_VERSION)/lib \
		-DCMAKE_INSTALL_RPATH_USE_LINK_PATH:BOOL=ON \
		-DPYLIB_INCLUDE_SONAME:BOOL=ON \
		-DPYLIB_LIB_PREFIX:BOOL=ON \
		-DPYMODULE_SUFFIX="V${OPENIMAGEIO_SPCOMP2_VERSION}"

spcomp2: dist

spcomp2_debug: MY_CMAKE_FLAGS += \
		-DCMAKE_SKIP_BUILD_RPATH:BOOL=ON \
		-DCMAKE_INSTALL_RPATH=$(SPCOMP2_LOCATION)/OpenImageIO/$(SPARCH)/v$(OPENIMAGEIO_SPCOMP2_VERSION)/lib \
		-DCMAKE_INSTALL_RPATH_USE_LINK_PATH:BOOL=ON \
		-DPYLIB_INCLUDE_SONAME:BOOL=ON \
		-DPYLIB_LIB_PREFIX:BOOL=ON \
		-DPYMODULE_SUFFIX="V${OPENIMAGEIO_SPCOMP2_VERSION}"

spcomp2_debug: debug

spcomp2_install_fixup_rhel7: spcomp2 spcomp2_debug
	echo $(SPCOMP2_LOCATION)
	patchelf --set-rpath ${SPCOMP2_RPATH_OPT} ${dist_dir}/lib/libOpenImageIO.so
	patchelf --set-rpath ${SPCOMP2_RPATH_DEBUG} ${dist_dir}.debug/lib/libOpenImageIO.so
	patchelf --set-rpath ${SPCOMP2_RPATH_OPT} ${dist_dir}/lib/libOpenImageIO_Util.so
	patchelf --set-rpath ${SPCOMP2_RPATH_DEBUG} ${dist_dir}.debug/lib/libOpenImageIO_Util.so
	patchelf --set-rpath ${PYSPCOMP2_RPATH_OPT} ${dist_dir}/python/libPyOpenImageIO.so
	patchelf --set-rpath ${PYSPCOMP2_RPATH_DEBUG} ${dist_dir}.debug/python/libPyOpenImageIO.so

# This goal can't start with 'install' because something elsewhere picks
# it up and starts doing bad things
spcomp2_install: spcomp2_install_fixup_${SP_OS}
	perl -I/usr/local/spi/lib/make /usr/local/spi/bin/spcomp_install.pl -m installhost \
	  --project=OpenImageIO \
	  --version=$(OPENIMAGEIO_SPCOMP2_VERSION) \
	  --root=$(SPCOMP2_LOCATION) \
	  --arch=$(SPARCH) \
	  --headers=$(subst $(space),$(comma),$(wildcard ${dist_dir}/include/OpenImageIO/*)) \
	  --cflags= --static_lflags="$(LINK_BOOST) $(LINK_OPENEXR) -lpthread" \
	  --namespace=${NAMESPACE} \
	  --srcdir=${dist_dir}/lib \
	  --builddir_o=${dist_dir}/lib \
	  --builddir_d=${dist_dir}.debug/lib
	perl -I/usr/local/spi/lib/make /usr/local/spi/bin/spcomp_install.pl -m installhost \
	  --project=OpenImageIO_Util \
	  --version=$(OPENIMAGEIO_SPCOMP2_VERSION) \
	  --root=$(SPCOMP2_LOCATION) \
	  --arch=$(SPARCH) \
	  --headers=$(subst $(space),$(comma),$(wildcard ${dist_dir}/include/OpenImageIO/*)) \
	  --cflags= --static_lflags="$(LINK_BOOST) $(LINK_OPENEXR) -lpthread" \
	  --namespace=${NAMESPACE} \
	  --srcdir=${dist_dir}/lib \
	  --builddir_o=${dist_dir}/lib \
	  --builddir_d=${dist_dir}.debug/lib
	perl -I/usr/local/spi/lib/make /usr/local/spi/bin/spcomp_install.pl -m installhost \
	  --project=PyOpenImageIO \
	  --version=$(OPENIMAGEIO_SPCOMP2_VERSION) \
	  --root=$(SPCOMP2_LOCATION) \
	  --arch=$(SPPYARCH) \
	  --cflags= --static_lflags="$(LINK_BOOST) $(LINK_OPENEXR) -lpthread"\
	  --namespace=${NAMESPACE} \
	  --srcdir=${dist_dir}/python \
	  --builddir_o=${dist_dir}/python \
	  --builddir_d=${dist_dir}.debug/python

