#################################################################################
#   The MIT License
#   
#   Tempest Renderer
#   Copyright (c) 2010-2014 Zdravko Velinov
#   
#   Permission is hereby granted, free of charge, to any person obtaining a copy
#   of this software and associated documentation files (the "Software"), to deal
#   in the Software without restriction, including without limitation the rights
#   to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
#   copies of the Software, and to permit persons to whom the Software is
#   furnished to do so, subject to the following conditions:
#
#   The above copyright notice and this permission notice shall be included in
#   all copies or substantial portions of the Software.
#
#   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
#   IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
#   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
#   AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
#   LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
#   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
#   THE SOFTWARE.
##################################################################################

CMAKE_MINIMUM_REQUIRED(VERSION 2.8)

INCLUDE(ExternalProject)
INCLUDE(CheckCXXCompilerFlag)

SET(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake_modules)

SET_PROPERTY(GLOBAL PROPERTY USE_FOLDERS ON)

PROJECT(Tempest)

INCLUDE(cmake_modules/PrecompiledHeader.cmake)

CMAKE_POLICY(SET CMP0020 OLD)
CMAKE_POLICY(SET CMP0054 OLD)
CMAKE_POLICY(SET CMP0058 OLD)

IF(${CMAKE_SOURCE_DIR} EQUAL ${CMAKE_BINARY_DIR})
    MESSAGE(FATAL_ERROR "DON'T BUILD IN THE SAME FOLDER! YOU ARE GOING TO REGRET IT!")
ENDIF()

SET(CMAKE_VERBOSE_MAKEFILE on)

set(CMAKE_CONFIGURATION_TYPES Debug Release RelWithDebInfo CACHE TYPE INTERNAL FORCE)

MACRO(TEMPEST_ADD_EXECUTABLE NAME FIRST_ARG)
    ADD_EXECUTABLE(${NAME} ${FIRST_ARG} ${ARGN})
    IF(MINGW_CROSS)
	    IF(${FIRST_ARG} EQUAL WIN32)
            SET_PROPERTY(TARGET ${NAME} APPEND PROPERTY LINK_FLAGS "-lmingw32 -static-libgcc -static-libstdc++")
	    ELSE()
            SET_PROPERTY(TARGET ${NAME} APPEND PROPERTY LINK_FLAGS "-static-libgcc -static-libstdc++")
        ENDIF()
    ENDIF()
ENDMACRO()

OPTION(DISABLE_TESTS "Disable the build of test executables")
OPTION(DISABLE_VULKAN "Disable Vulkan support and fallback to opengl")
OPTION(DISABLE_QT "Disable QT support")
OPTION(DISABLE_RELOADING "Disable reloading mechanism")

IF(MINGW_CROSS)
    SET(DISABLE_RELOADING on)
ENDIF()

IF(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/workset.cmake)
    FILE(READ ${CMAKE_CURRENT_SOURCE_DIR}/workset.cmake TEMPEST_WORKSET)

    STRING(REGEX REPLACE ";" "\\\\;" TEMPEST_WORKSET "${TEMPEST_WORKSET}")
    STRING(REGEX REPLACE "\n" ";" TEMPEST_WORKSET "${TEMPEST_WORKSET}")

    MESSAGE("Active workset:")
    FOREACH(TEMPEST_PROJECT ${TEMPEST_WORKSET})
        MESSAGE("Project: " ${TEMPEST_PROJECT})
    ENDFOREACH()
ENDIF()

SET(SPECTRUM_SAMPLES "3" CACHE STRING "Specify number of spectrum samples")

SET(DEBUG_SOURCE_SHADING_DIR "${CMAKE_SOURCE_DIR}/shading")

SET(TEMPEST_BINARY_DIR ${CMAKE_BINARY_DIR})
SET(TEMPEST_TEST_ASSETS_DIR ${CMAKE_SOURCE_DIR}/share/test_assets)
SET(TEMPEST_SOURCE_DIR ${CMAKE_SOURCE_DIR})

IF(APPLE)
    SET(EXTRA_DEFS "-DAPPLE")
ELSEIF(UNIX)
    SET(EXTRA_DEFS "-DLINUX")
    FIND_PACKAGE(X11 REQUIRED)
    FIND_PACKAGE(XCB REQUIRED)
    SET(WINDOW_SYSTEM_INCLUDE_DIR ${X11_INCLUDE_DIR})
    SET(WINDOW_SYSTEM_LIBRARIES ${X11_LIBRARIES} ${XCB_LIBRARIES})
ENDIF()

# FIND_PACKAGE(PNG REQUIRED)
FIND_PACKAGE(FLEX)

FIND_PATH(EMBREE_INCLUDE_DIR NAMES "embree2/rtcore.h" PATHS ${CMAKE_SOURCE_DIR}/external/embree/include)

FILE(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/Debug/bin/)
FILE(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/Release/bin/)
FILE(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/RelWithDebInfo/bin/)
FILE(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/Debug/bin/platforms)
FILE(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/Release/bin/platforms)
FILE(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/RelWithDebInfo/bin/platforms)

SET(SUPPORTED_CONFIGS Release RelWithDebInfo Debug)

IF(WIN32)
    FIND_LIBRARY(EMBREE_LIBRARIES NAMES embree PATHS ${CMAKE_SOURCE_DIR}/external/embree/lib)

    FIND_LIBRARY(LUA_LIBRARIES NAMES lua51.lib PATHS ${CMAKE_SOURCE_DIR}/external/LuaJIT/src/)

    #ADD_CUSTOM_TARGET(EmbreeCopyBinaries
    #                 COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_SOURCE_DIR}/external/LuaJIT/src/lua51.dll ${CMAKE_BINARY_DIR}/$<CONFIG>/bin/
    #                 COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_SOURCE_DIR}/external/embree/lib/embree.dll ${CMAKE_BINARY_DIR}/$<CONFIG>/bin/
    #                 COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_SOURCE_DIR}/external/embree/lib/tbb.dll ${CMAKE_BINARY_DIR}/$<CONFIG>/bin/
    #                 COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_SOURCE_DIR}/external/embree/lib/tbbmalloc.dll ${CMAKE_BINARY_DIR}/$<CONFIG>/bin/
    #                 COMMENT "Copying Embree binaries" VERBATIM)

    FOREACH(CONFIG ${SUPPORTED_CONFIGS})
        EXECUTE_PROCESS(COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_SOURCE_DIR}/external/LuaJIT/src/lua51.dll ${CMAKE_BINARY_DIR}/${CONFIG}/bin/
                        COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_SOURCE_DIR}/external/embree/lib/embree.dll ${CMAKE_BINARY_DIR}/${CONFIG}/bin/
                        COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_SOURCE_DIR}/external/embree/lib/tbb.dll ${CMAKE_BINARY_DIR}/${CONFIG}/bin/
                        COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_SOURCE_DIR}/external/embree/lib/tbbmalloc.dll ${CMAKE_BINARY_DIR}/${CONFIG}/bin/)
    ENDFOREACH()
ELSE()
    FIND_LIBRARY(EMBREE_LIBRARIES NAMES libembree.so.2 PATHS ${CMAKE_SOURCE_DIR}/external/embree/lib)

    FIND_LIBRARY(LUA_LIBRARIES NAMES libluajit.a PATHS ${CMAKE_SOURCE_DIR}/external/LuaJIT/src/)

    #ADD_CUSTOM_TARGET(EmbreeCopyBinaries
    #                 COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_SOURCE_DIR}/external/embree/lib/libembree.so.2 ${CMAKE_BINARY_DIR}/$<CONFIG>/bin/
    #                 COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_SOURCE_DIR}/external/embree/lib/libtbb.so.2 ${CMAKE_BINARY_DIR}/$<CONFIG>/bin/
    #                 COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_SOURCE_DIR}/external/embree/lib/libtbbmalloc.so.2 ${CMAKE_BINARY_DIR}/$<CONFIG>/bin/
    #                 COMMENT "Copying Embree binaries" VERBATIM)

    FOREACH(CONFIG ${SUPPORTED_CONFIGS})
        EXECUTE_PROCESS(COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_SOURCE_DIR}/external/embree/lib/libembree.so.2 ${CMAKE_BINARY_DIR}/${CONFIG}/bin/
                        COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_SOURCE_DIR}/external/embree/lib/libtbb.so.2 ${CMAKE_BINARY_DIR}/${CONFIG}/bin/
                        COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_SOURCE_DIR}/external/embree/lib/libtbbmalloc.so.2 ${CMAKE_BINARY_DIR}/${CONFIG}/bin/)
    ENDFOREACH()
ENDIF()

FILE(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/Debug/share/tempest/assets/)
FILE(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/Release/share/tempest/assets/)
FILE(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/RelWithDebInfo/share/tempest/assets/)

#ADD_CUSTOM_TARGET(CopyTestAssets
#                 COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_SOURCE_DIR}/share/test_assets/light-probes/ennis.exr ${CMAKE_BINARY_DIR}/$<CONFIG>/share/tempest/assets/
#                 COMMENT "Copying Test assets" VERBATIM
#				  )

FOREACH(CONFIG ${SUPPORTED_CONFIGS})
    EXECUTE_PROCESS(COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_SOURCE_DIR}/share/test_assets/light-probes/ennis.exr ${CMAKE_BINARY_DIR}/${CONFIG}/share/tempest/assets/)
ENDFOREACH()

FIND_PACKAGE(Threads)

IF(MINGW_CROSS)
    ADD_LIBRARY(libvpx STATIC IMPORTED)
    SET_PROPERTY(TARGET libvpx PROPERTY IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/external/libvpx/x64/Release/libvpx-cross.lib)
ELSEIF(MSVC)
	IF(MSVC_VERSION GREATER 1800)
		SET(VPX_SOURCE_DIR ${CMAKE_SOURCE_DIR}/external/libvpx-msvs15)
		SET(VPX_LIBRARY ${CMAKE_BINARY_DIR}/libvpx-msvs/x64/Release/vpxmd.lib)
	ELSE()
		SET(VPX_SOURCE_DIR ${CMAKE_SOURCE_DIR}/external/libvpx-msvs)
	    SET(VPX_LIBRARY ${CMAKE_BINARY_DIR}/libvpx-msvs/x64/Release/vpxmt.lib)
	ENDIF()
    
	#ADD_CUSTOM_TARGET(CopyLibVPX
	#              COMMAND ${CMAKE_COMMAND} -E copy_directory ${VPX_SOURCE_DIR} ${CMAKE_BINARY_DIR}/libvpx-msvs
	#			   COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_SOURCE_DIR}/external/libvpx ${CMAKE_BINARY_DIR}/libvpx
    #              COMMENT "Copying libvpx source" VERBATIM
	#			   )

    EXECUTE_PROCESS(COMMAND ${CMAKE_COMMAND} -E copy_directory ${VPX_SOURCE_DIR} ${CMAKE_BINARY_DIR}/libvpx-msvs
				    COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_SOURCE_DIR}/external/libvpx ${CMAKE_BINARY_DIR}/libvpx)

    EXTERNALPROJECT_ADD(libvpx_build
                        DOWNLOAD_COMMAND ""
                        UPDATE_COMMAND ""
                        PATCH_COMMAND ""
                        CONFIGURE_COMMAND ""
                        INSTALL_COMMAND ""
                        BUILD_COMMAND msbuild /p:Configuration=Release /m ${CMAKE_BINARY_DIR}/libvpx-msvs/vpx.sln
                        SOURCE_DIR ""
                        BINARY_DIR ""
                        BUILD_BYPRODUCTS ${VPX_LIBRARY})

	#ADD_DEPENDENCIES(libvpx_build CopyLibVPX)

    ADD_LIBRARY(libvpx STATIC IMPORTED)
    SET_PROPERTY(TARGET libvpx PROPERTY IMPORTED_LOCATION ${VPX_LIBRARY})
    ADD_DEPENDENCIES(libvpx libvpx_build)
ELSEIF(UNIX)
    ADD_LIBRARY(libvpx STATIC IMPORTED)
    SET_PROPERTY(TARGET libvpx PROPERTY IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/external/libvpx/x64/Release/libvpx.a)
ELSE()
    MESSAGE(FATAL_ERROR "Unsupported platform")
ENDIF()

IF(MSVC)
    ADD_DEFINITIONS("/DNOMINMAX /D_SCL_SECURE_NO_WARNINGS /D_CRT_SECURE_NO_WARNINGS /arch:AVX")
    SET(CMAKE_CXX_FLAGS_DEBUG ${CMAKE_CXX_FLAGS_DEBUG})
    SET(HAS_SSE on)
ELSE()
    SET(EXTRA_DEFS ${EXTRA_DEFS} -std=c++11)
    CHECK_CXX_COMPILER_FLAG(-mavx HAS_SSE)
    IF(HAS_SSE)
        SET(SIMD_FLAGS "-msse -msse2 -msse3 -mssse3 -msse4 -msse4.1 -msse4.2 -mavx")
    ELSE(HAS_SSE)
        CHECK_CXX_COMPILER_FLAG(-mfpu=neon HAS_ARM_NEON)
        IF(HAS_ARM_NEON)
            SET(SIMD_FLAGS -mfpu=neon)
        ELSE(HAS_ARM_NEON)
            MESSAGE(WARNING "No supported SIMD instruction set has been found.")
        ENDIF(HAS_ARM_NEON)
    ENDIF(HAS_SSE)
ENDIF()

SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_FORCE_INLINES")

ADD_DEFINITIONS(${EXTRA_DEFS} ${SIMD_FLAGS})

SET(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG ${CMAKE_BINARY_DIR}/Debug/lib)
SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG ${CMAKE_BINARY_DIR}/Debug/bin)
SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ${CMAKE_BINARY_DIR}/Debug/bin)

SET(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/Release/lib)
SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/Release/bin)
SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/Release/bin)

SET(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE ${CMAKE_BINARY_DIR}/Release/lib)
SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE ${CMAKE_BINARY_DIR}/Release/bin)
SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${CMAKE_BINARY_DIR}/Release/bin)

SET(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELWITHDEBINFO ${CMAKE_BINARY_DIR}/RelWithDebInfo/lib)
SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELWITHDEBINFO ${CMAKE_BINARY_DIR}/RelWithDebInfo/bin)
SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELWITHDEBINFO ${CMAKE_BINARY_DIR}/RelWithDebInfo/bin)

IF(NOT DISABLE_QT)
    FIND_PACKAGE(Qt5Widgets)

    IF(EXISTS ${Qt5Core_DIR}/../../../bin/icuin53.dll)
        SET(ICU_STUFF COMMAND ${CMAKE_COMMAND} -E copy_if_different ${Qt5Core_DIR}/../../../bin/icuin53.dll          ${CMAKE_BINARY_DIR}/Debug/bin/
                      COMMAND ${CMAKE_COMMAND} -E copy_if_different ${Qt5Core_DIR}/../../../bin/icuin53.dll          ${CMAKE_BINARY_DIR}/RelWithDebInfo/bin/
                      COMMAND ${CMAKE_COMMAND} -E copy_if_different ${Qt5Core_DIR}/../../../bin/icuin53.dll          ${CMAKE_BINARY_DIR}/Release/bin/
 
                      COMMAND ${CMAKE_COMMAND} -E copy_if_different ${Qt5Core_DIR}/../../../bin/icuuc53.dll          ${CMAKE_BINARY_DIR}/Debug/bin/
                      COMMAND ${CMAKE_COMMAND} -E copy_if_different ${Qt5Core_DIR}/../../../bin/icuuc53.dll          ${CMAKE_BINARY_DIR}/RelWithDebInfo/bin/
                      COMMAND ${CMAKE_COMMAND} -E copy_if_different ${Qt5Core_DIR}/../../../bin/icuuc53.dll          ${CMAKE_BINARY_DIR}/Release/bin/

                      COMMAND ${CMAKE_COMMAND} -E copy_if_different ${Qt5Core_DIR}/../../../bin/icudt53.dll          ${CMAKE_BINARY_DIR}/Debug/bin/
                      COMMAND ${CMAKE_COMMAND} -E copy_if_different ${Qt5Core_DIR}/../../../bin/icudt53.dll          ${CMAKE_BINARY_DIR}/RelWithDebInfo/bin/
                      COMMAND ${CMAKE_COMMAND} -E copy_if_different ${Qt5Core_DIR}/../../../bin/icudt53.dll          ${CMAKE_BINARY_DIR}/Release/bin/)
    ENDIF()

    IF(WIN32)
        SET(PLATFORM_STUFF COMMAND ${CMAKE_COMMAND} -E copy_if_different ${Qt5Core_DIR}/../../../plugins/platforms/qwindowsd.dll      ${CMAKE_BINARY_DIR}/Debug/bin/platforms
                           COMMAND ${CMAKE_COMMAND} -E copy_if_different ${Qt5Core_DIR}/../../../plugins/platforms/qwindows.dll       ${CMAKE_BINARY_DIR}/RelWithDebInfo/bin/platforms
                           COMMAND ${CMAKE_COMMAND} -E copy_if_different ${Qt5Core_DIR}/../../../plugins/platforms/qwindows.dll       ${CMAKE_BINARY_DIR}/Release/bin/platforms)
    ENDIF()

	EXECUTE_PROCESS(
    #ADD_CUSTOM_TARGET(Qt5CopyBinaries
                      COMMAND ${CMAKE_COMMAND} -E copy_if_different ${Qt5Core_DIR}/../../../bin/Qt5Cored.dll         ${CMAKE_BINARY_DIR}/Debug/bin/
                      COMMAND ${CMAKE_COMMAND} -E copy_if_different ${Qt5Core_DIR}/../../../bin/Qt5Core.dll          ${CMAKE_BINARY_DIR}/RelWithDebInfo/bin/
                      COMMAND ${CMAKE_COMMAND} -E copy_if_different ${Qt5Core_DIR}/../../../bin/Qt5Core.dll          ${CMAKE_BINARY_DIR}/Release/bin/

                      COMMAND ${CMAKE_COMMAND} -E copy_if_different ${Qt5Core_DIR}/../../../bin/Qt5Guid.dll          ${CMAKE_BINARY_DIR}/Debug/bin/
                      COMMAND ${CMAKE_COMMAND} -E copy_if_different ${Qt5Core_DIR}/../../../bin/Qt5Gui.dll           ${CMAKE_BINARY_DIR}/RelWithDebInfo/bin/
                      COMMAND ${CMAKE_COMMAND} -E copy_if_different ${Qt5Core_DIR}/../../../bin/Qt5Gui.dll           ${CMAKE_BINARY_DIR}/Release/bin/

                      COMMAND ${CMAKE_COMMAND} -E copy_if_different ${Qt5Core_DIR}/../../../bin/Qt5Widgetsd.dll      ${CMAKE_BINARY_DIR}/Debug/bin/
                      COMMAND ${CMAKE_COMMAND} -E copy_if_different ${Qt5Core_DIR}/../../../bin/Qt5Widgets.dll       ${CMAKE_BINARY_DIR}/RelWithDebInfo/bin/
                      COMMAND ${CMAKE_COMMAND} -E copy_if_different ${Qt5Core_DIR}/../../../bin/Qt5Widgets.dll       ${CMAKE_BINARY_DIR}/Release/bin/

                      ${PLATFORM_STUFF}

                      ${ICU_STUFF}

    #                 COMMENT "Copying Qt binaries" VERBATIM
                      )
ENDIF()

IF(NOT DISABLE_VULKAN)
    IF(WIN32)
        SET(GLSLANG_LIBRARY_DIR ${CMAKE_BINARY_DIR}/glslang-bin)
        SET(GLSLANG_BYPRODUCTS ${GLSLANG_LIBRARY_DIR}/${CMAKE_STATIC_LIBRARY_PREFIX}SPIRV${CMAKE_STATIC_LIBRARY_SUFFIX}
                               ${GLSLANG_LIBRARY_DIR}/${CMAKE_STATIC_LIBRARY_PREFIX}glslang${CMAKE_STATIC_LIBRARY_SUFFIX}
                               ${GLSLANG_LIBRARY_DIR}/${CMAKE_STATIC_LIBRARY_PREFIX}OSDependent${CMAKE_STATIC_LIBRARY_SUFFIX}
                               ${GLSLANG_LIBRARY_DIR}/${CMAKE_STATIC_LIBRARY_PREFIX}HLSL${CMAKE_STATIC_LIBRARY_SUFFIX}
                               ${GLSLANG_LIBRARY_DIR}/${CMAKE_STATIC_LIBRARY_PREFIX}OGLCompiler${CMAKE_STATIC_LIBRARY_SUFFIX})

        IF(WIN32)
            SET(GLSLANG_BYPRODUCTS ${GLSLANG_BYPRODUCTS}
                                   ${GLSLANG_LIBRARY_DIR}/${CMAKE_STATIC_LIBRARY_PREFIX}SPIRVd${CMAKE_STATIC_LIBRARY_SUFFIX}
                                   ${GLSLANG_LIBRARY_DIR}/${CMAKE_STATIC_LIBRARY_PREFIX}glslangd${CMAKE_STATIC_LIBRARY_SUFFIX}
                                   ${GLSLANG_LIBRARY_DIR}/${CMAKE_STATIC_LIBRARY_PREFIX}OSDependentd${CMAKE_STATIC_LIBRARY_SUFFIX}
                                   ${GLSLANG_LIBRARY_DIR}/${CMAKE_STATIC_LIBRARY_PREFIX}HLSLd${CMAKE_STATIC_LIBRARY_SUFFIX}
                                   ${GLSLANG_LIBRARY_DIR}/${CMAKE_STATIC_LIBRARY_PREFIX}OGLCompilerd${CMAKE_STATIC_LIBRARY_SUFFIX})
        ENDIF()

        EXTERNALPROJECT_ADD(glslang_build
                            DOWNLOAD_COMMAND ""
                            UPDATE_COMMAND ""
                            PATCH_COMMAND ""
                            INSTALL_COMMAND ""
                            SOURCE_DIR ${CMAKE_SOURCE_DIR}/external/glslang
                            BINARY_DIR glslang-bin
                            BUILD_BYPRODUCTS ${GLSLANG_BYPRODUCTS})

        IF(WIN32)
		    ADD_LIBRARY(SPIRVd STATIC IMPORTED)
            SET_PROPERTY(TARGET SPIRVd PROPERTY IMPORTED_LOCATION ${GLSLANG_LIBRARY_DIR}/SPIRV/Debug/${CMAKE_STATIC_LIBRARY_PREFIX}SPIRVd${CMAKE_STATIC_LIBRARY_SUFFIX})
            ADD_DEPENDENCIES(SPIRVd glslang_build)

            ADD_LIBRARY(libglslangd STATIC IMPORTED)
            SET_PROPERTY(TARGET libglslangd PROPERTY IMPORTED_LOCATION ${GLSLANG_LIBRARY_DIR}/glslang/Debug/${CMAKE_STATIC_LIBRARY_PREFIX}glslangd${CMAKE_STATIC_LIBRARY_SUFFIX})
            ADD_DEPENDENCIES(libglslangd glslang_build)

            ADD_LIBRARY(OSDependentd STATIC IMPORTED)
            SET_PROPERTY(TARGET OSDependentd PROPERTY IMPORTED_LOCATION ${GLSLANG_LIBRARY_DIR}/glslang/OSDependent/Windows/Debug/${CMAKE_STATIC_LIBRARY_PREFIX}OSDependentd${CMAKE_STATIC_LIBRARY_SUFFIX})
            ADD_DEPENDENCIES(OSDependentd glslang_build)

            ADD_LIBRARY(HLSLd STATIC IMPORTED)
            SET_PROPERTY(TARGET HLSLd PROPERTY IMPORTED_LOCATION ${GLSLANG_LIBRARY_DIR}/hlsl/Debug/${CMAKE_STATIC_LIBRARY_PREFIX}HLSLd${CMAKE_STATIC_LIBRARY_SUFFIX})
            ADD_DEPENDENCIES(HLSLd glslang_build)

            ADD_LIBRARY(OGLCompilerd STATIC IMPORTED)
            SET_PROPERTY(TARGET OGLCompilerd PROPERTY IMPORTED_LOCATION ${GLSLANG_LIBRARY_DIR}/OGLCompilersDLL/Debug/${CMAKE_STATIC_LIBRARY_PREFIX}OGLCompilerd${CMAKE_STATIC_LIBRARY_SUFFIX})
            ADD_DEPENDENCIES(OGLCompilerd glslang_build)
        ENDIF()

        ADD_LIBRARY(SPIRV STATIC IMPORTED)
        SET_PROPERTY(TARGET SPIRV PROPERTY IMPORTED_LOCATION ${GLSLANG_LIBRARY_DIR}/SPIRV/Release/${CMAKE_STATIC_LIBRARY_PREFIX}SPIRV${CMAKE_STATIC_LIBRARY_SUFFIX})
        ADD_DEPENDENCIES(SPIRV glslang_build)

        ADD_LIBRARY(libglslang STATIC IMPORTED)
        SET_PROPERTY(TARGET libglslang PROPERTY IMPORTED_LOCATION ${GLSLANG_LIBRARY_DIR}/glslang/Release/${CMAKE_STATIC_LIBRARY_PREFIX}glslang${CMAKE_STATIC_LIBRARY_SUFFIX})
        ADD_DEPENDENCIES(libglslang glslang_build)

        ADD_LIBRARY(OSDependent STATIC IMPORTED)
        SET_PROPERTY(TARGET OSDependent PROPERTY IMPORTED_LOCATION ${GLSLANG_LIBRARY_DIR}/glslang/OSDependent/Windows/Release/${CMAKE_STATIC_LIBRARY_PREFIX}OSDependent${CMAKE_STATIC_LIBRARY_SUFFIX})
        ADD_DEPENDENCIES(OSDependent glslang_build)

        ADD_LIBRARY(HLSL STATIC IMPORTED)
        SET_PROPERTY(TARGET HLSL PROPERTY IMPORTED_LOCATION ${GLSLANG_LIBRARY_DIR}/hlsl/Release/${CMAKE_STATIC_LIBRARY_PREFIX}HLSL${CMAKE_STATIC_LIBRARY_SUFFIX})
        ADD_DEPENDENCIES(HLSL glslang_build)

        ADD_LIBRARY(OGLCompiler STATIC IMPORTED)
        SET_PROPERTY(TARGET OGLCompiler PROPERTY IMPORTED_LOCATION ${GLSLANG_LIBRARY_DIR}/OGLCompilersDLL/Release/${CMAKE_STATIC_LIBRARY_PREFIX}OGLCompiler${CMAKE_STATIC_LIBRARY_SUFFIX})
        ADD_DEPENDENCIES(OGLCompiler glslang_build)
    ELSE()
        SET(GLSLANG_LIBRARY_DIR ${CMAKE_BINARY_DIR}/glslang-bin/)
        SET(GLSLANG_BYPRODUCTS ${GLSLANG_LIBRARY_DIR}/SPIRV/${CMAKE_STATIC_LIBRARY_PREFIX}SPIRV${CMAKE_STATIC_LIBRARY_SUFFIX}
                               ${GLSLANG_LIBRARY_DIR}/glslang/${CMAKE_STATIC_LIBRARY_PREFIX}glslang${CMAKE_STATIC_LIBRARY_SUFFIX}
                               ${GLSLANG_LIBRARY_DIR}/glslang/OSDependent/Unix/${CMAKE_STATIC_LIBRARY_PREFIX}OSDependent${CMAKE_STATIC_LIBRARY_SUFFIX}
                               ${GLSLANG_LIBRARY_DIR}/hlsl/${CMAKE_STATIC_LIBRARY_PREFIX}HLSL${CMAKE_STATIC_LIBRARY_SUFFIX}
                               ${GLSLANG_LIBRARY_DIR}/OGLCompilersDLL/${CMAKE_STATIC_LIBRARY_PREFIX}OGLCompiler${CMAKE_STATIC_LIBRARY_SUFFIX})

        EXTERNALPROJECT_ADD(glslang_build
                            DOWNLOAD_COMMAND ""
                            UPDATE_COMMAND ""
                            PATCH_COMMAND ""
                            INSTALL_COMMAND ""
                            SOURCE_DIR ${CMAKE_SOURCE_DIR}/external/glslang
                            BINARY_DIR glslang-bin
                            BUILD_BYPRODUCTS ${GLSLANG_BYPRODUCTS})

        ADD_LIBRARY(SPIRV STATIC IMPORTED)
        SET_PROPERTY(TARGET SPIRV PROPERTY IMPORTED_LOCATION ${GLSLANG_LIBRARY_DIR}/SPIRV/${CMAKE_STATIC_LIBRARY_PREFIX}SPIRV${CMAKE_STATIC_LIBRARY_SUFFIX})
        ADD_DEPENDENCIES(SPIRV glslang_build)

        ADD_LIBRARY(libglslang STATIC IMPORTED)
        SET_PROPERTY(TARGET libglslang PROPERTY IMPORTED_LOCATION ${GLSLANG_LIBRARY_DIR}/glslang/${CMAKE_STATIC_LIBRARY_PREFIX}glslang${CMAKE_STATIC_LIBRARY_SUFFIX})
        ADD_DEPENDENCIES(libglslang glslang_build)

        ADD_LIBRARY(OSDependent STATIC IMPORTED)
        SET_PROPERTY(TARGET OSDependent PROPERTY IMPORTED_LOCATION ${GLSLANG_LIBRARY_DIR}/glslang/OSDependent/Unix/${CMAKE_STATIC_LIBRARY_PREFIX}OSDependent${CMAKE_STATIC_LIBRARY_SUFFIX})
        ADD_DEPENDENCIES(OSDependent glslang_build)

        ADD_LIBRARY(HLSL STATIC IMPORTED)
        SET_PROPERTY(TARGET HLSL PROPERTY IMPORTED_LOCATION ${GLSLANG_LIBRARY_DIR}/hlsl/${CMAKE_STATIC_LIBRARY_PREFIX}HLSL${CMAKE_STATIC_LIBRARY_SUFFIX})
        ADD_DEPENDENCIES(HLSL glslang_build)

        ADD_LIBRARY(OGLCompiler STATIC IMPORTED)
        SET_PROPERTY(TARGET OGLCompiler PROPERTY IMPORTED_LOCATION ${GLSLANG_LIBRARY_DIR}/OGLCompilersDLL/${CMAKE_STATIC_LIBRARY_PREFIX}OGLCompiler${CMAKE_STATIC_LIBRARY_SUFFIX})
        ADD_DEPENDENCIES(OGLCompiler glslang_build)
    ENDIF()
ENDIF()

ADD_SUBDIRECTORY(include)
ADD_SUBDIRECTORY(share)
ADD_SUBDIRECTORY(src)
IF(NOT DISABLE_TESTS)
    ADD_SUBDIRECTORY(tests)
ENDIF()
ADD_SUBDIRECTORY(samples)
ADD_SUBDIRECTORY(tools)
ADD_SUBDIRECTORY(external/zstd)
ADD_SUBDIRECTORY(external/xxhash)
ADD_SUBDIRECTORY(external/triangle)
ADD_SUBDIRECTORY(external/faddeeva)
ADD_SUBDIRECTORY(external/kissfft)
ADD_SUBDIRECTORY(external/tinyxml2)


CONFIGURE_FILE(
    "${CMAKE_CURRENT_SOURCE_DIR}/include/tempest/utils/config.hh.in"
    "${CMAKE_CURRENT_BINARY_DIR}/include/tempest/utils/config.hh"
    )
