# cmake build file for squish
# by Stefan Roettger (snroettg@gmail.com)
# updated by Simon Brown (si@sjbrown.co.uk)

# features:
#   uses -fopenmp when available
#    use BUILD_SQUISH_WITH_OPENMP to override
#   Unix and VS: SSE2 support is enabled by default
#    use BUILD_SQUISH_WITH_SSE2 and BUILD_SQUISH_WITH_ALTIVEC to override

CMAKE_MINIMUM_REQUIRED(VERSION 3.6.0...4.0)

OPTION(BUILD_SQUISH_WITH_OPENMP "Build with OpenMP." OFF)

if((${CMAKE_SYSTEM_PROCESSOR} MATCHES "arm") OR
   (${CMAKE_SYSTEM_PROCESSOR} MATCHES "arm64") OR
   (${CMAKE_SYSTEM_PROCESSOR} MATCHES "aarch64") OR
   (${CMAKE_SYSTEM_PROCESSOR} MATCHES "powerpc") OR
   (${CMAKE_SYSTEM_PROCESSOR} MATCHES "ppc64") OR
   (${CMAKE_SYSTEM_PROCESSOR} MATCHES "s390") OR
   (${CMAKE_SYSTEM_PROCESSOR} MATCHES "mips"))
   OPTION(BUILD_SQUISH_WITH_SSE2 "Build with SSE2." OFF)
else()
   OPTION(BUILD_SQUISH_WITH_SSE2 "Build with SSE2." ON)
endif()

OPTION(BUILD_SQUISH_WITH_ALTIVEC "Build with Altivec." OFF)

OPTION(BUILD_SHARED_LIBS "Build shared libraries." OFF)

OPTION(BUILD_SQUISH_EXTRA "Build extra source code." OFF)

IF (BUILD_SQUISH_WITH_OPENMP)
   FIND_PACKAGE(OpenMP)
   IF (OPENMP_FOUND)
       SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}")
       SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
       ADD_DEFINITIONS(-DSQUISH_USE_OPENMP)
   ENDIF()
ENDIF()

IF (CMAKE_GENERATOR STREQUAL "Xcode")
    #SET(CMAKE_OSX_ARCHITECTURES ${CMAKE_SYSTEM_PROCESSOR})
    IF (BUILD_SQUISH_WITH_SSE2 AND WIN32)
        ADD_DEFINITIONS(-DSQUISH_USE_SSE=2)
    ENDIF (BUILD_SQUISH_WITH_SSE2 AND WIN32)
    IF (BUILD_SQUISH_WITH_SSE2 AND NOT WIN32)
        ADD_DEFINITIONS(-DSQUISH_USE_SSE=2 -msse2)
    ENDIF (BUILD_SQUISH_WITH_SSE2 AND NOT WIN32)
    IF (BUILD_SQUISH_WITH_ALTIVEC AND NOT WIN32)
        ADD_DEFINITIONS(-DSQUISH_USE_ALTIVEC=1 -maltivec)
    ENDIF (BUILD_SQUISH_WITH_ALTIVEC AND NOT WIN32)
ENDIF (CMAKE_GENERATOR STREQUAL "Xcode")

# A fix for MinGW compilation
IF (BUILD_SQUISH_WITH_SSE2 AND MINGW)
    ADD_DEFINITIONS(-msse2)
ENDIF ()

SET(SQUISH_HDRS
    squish.h
    )

SET(SQUISH_SRCS
    alpha.cpp
    alpha.h
    clusterfit.cpp
    clusterfit.h
    colourblock.cpp
    colourblock.h
    colourfit.cpp
    colourfit.h
    colourset.cpp
    colourset.h
    maths.cpp
    maths.h
    rangefit.cpp
    rangefit.h
    simd.h
    simd_float.h
    simd_sse.h
    simd_ve.h
    singlecolourfit.cpp
    singlecolourfit.h
    singlecolourlookup.inl
    squish.cpp
    )

INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR})

ADD_LIBRARY(squish ${SQUISH_SRCS} ${SQUISH_HDRS})

SET_TARGET_PROPERTIES(
    squish PROPERTIES
    PUBLIC_HEADER "${SQUISH_HDRS}"
    VERSION 0.0
    SOVERSION 0.0
    DEBUG_POSTFIX "d"
    XCODE_ATTRIBUTE_GCC_PREPROCESSOR_DEFINITIONS "$(SQUISH_CPP_$(CURRENT_ARCH))"
    XCODE_ATTRIBUTE_OTHER_CFLAGS "$(SQUISH_CFLAGS_$(CURRENT_ARCH))"
    XCODE_ATTRIBUTE_SQUISH_CPP_i386 "SQUISH_USE_SSE=2"
    XCODE_ATTRIBUTE_SQUISH_CFLAGS_i386 ""
    XCODE_ATTRIBUTE_SQUISH_CPP_ppc "SQUISH_USE_ALTIVEC=1"
    XCODE_ATTRIBUTE_SQUISH_CFLAGS_ppc "-maltivec"
    )
