harfang3d/extern/CMakeLists.txt

419 lines
16 KiB
CMake

function(install_cppsdk_external_target TARGET)
if(NOT HG_BUILD_CPP_SDK)
return()
endif()
if (DEFINED ARGV1)
set(TargetHeaderPath ${ARGV1})
else()
set(TargetHeaderPath ${TARGET})
endif()
get_target_property(TargetType ${TARGET} TYPE)
if ((TargetType STREQUAL "STATIC_LIBRARY") OR MSVC)
set(LibraryDestination ${CppSdkLibraryDestination})
else()
set(LibraryDestination ${CppSdkRuntimeDestination})
endif()
install(
TARGETS ${TARGET}
EXPORT cppsdkTargets
COMPONENT cppsdk
PUBLIC_HEADER DESTINATION ${CppSdkHeadersDestination}/extern/${TargetHeaderPath}
ARCHIVE DESTINATION ${CppSdkLibraryDestination}
LIBRARY DESTINATION ${LibraryDestination}
RUNTIME DESTINATION ${CppSdkRuntimeDestination}
INCLUDES DESTINATION ${CppSdkHeadersDestination}/extern
)
endfunction(install_cppsdk_external_target)
# glfw
if(HG_USE_GLFW)
# determine glfw backend (as we do not have access to glfw_config.h).
if(GLFW_USE_WAYLAND)
set(HG_GLFW_BACKEND "WAYLAND")
elseif (WIN32)
set(HG_GLFW_BACKEND "WIN32")
elseif (APPLE)
set(HG_GLFW_BACKEND "COCOA")
elseif (UNIX)
set(HG_GLFW_BACKEND "X11")
else ()
message(ERROR "GLFW: unknown or unsupported backed")
endif()
set(HG_GLFW_BACKEND ${HG_GLFW_BACKEND} PARENT_SCOPE)
if(NOT DEFINED HG_REBUILD_GLFW)
set(HG_REBUILD_GLFW ON)
endif()
if(NOT HG_REBUILD_GLFW)
# use system package
find_package(glfw3 3.2)
if(glfw3_FOUND)
# check that we are using the shared library version
get_target_property(glfw_target_type glfw TYPE)
if(glfw_target_type STREQUAL "SHARED_LIBRARY")
set_target_properties(glfw PROPERTIES IMPORTED_GLOBAL TRUE)
# we set the corresponding compile definition. This define will be exported in the CMake configuration files.
target_compile_definitions(glfw INTERFACE GLFW_${HG_GLFW_BACKEND}=1)
else()
message(WARNING "Only the dynamic library version of GLFW is allowed")
set(HG_REBUILD_GLFW ON)
endif()
else()
message(WARNING "GLFW was not found")
set(HG_REBUILD_GLFW ON)
endif()
endif()
if(HG_REBUILD_GLFW)
# build it from sources
if(HG_BUILD_HARFANG_STATIC)
set(BUILD_SHARED_LIBS OFF CACHE BOOL "Build shared libraries" FORCE)
else()
set(BUILD_SHARED_LIBS ON CACHE BOOL "Build shared libraries" FORCE)
endif()
set(GLFW_INSTALL OFF CACHE BOOL "")
set(GLFW_BUILD_EXAMPLES OFF CACHE BOOL "")
set(GLFW_BUILD_TESTS OFF CACHE BOOL "")
set(GLFW_BUILD_DOCS OFF CACHE BOOL "")
add_subdirectory(glfw EXCLUDE_FROM_ALL)
# here we completly hijack glfw shared library output name.
# on *nix we don't want all the so names with versions (libgflw.so.3 libglfw.so.3.x etc...)
set_property(TARGET glfw PROPERTY VERSION)
set_property(TARGET glfw PROPERTY SOVERSION)
set_property(TARGET glfw PROPERTY OUTPUT_NAME glfw3)
set(BUILD_SHARED_LIBS OFF CACHE BOOL "Build shared libraries" FORCE)
install_cppsdk_external_target(glfw)
set_target_properties(glfw PROPERTIES FOLDER "harfang/3rdparty")
set_target_properties(glfw PROPERTIES
INCLUDE_DIRECTORIES
"$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/glfw/include>;${CMAKE_CURRENT_SOURCE_DIR}/glfw/src;${CMAKE_CURRENT_BINARY_DIR}/glfw/src"
INTERFACE_INCLUDE_DIRECTORIES
"$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/glfw/include>"
)
# we set the corresponding compile definition. This define will be exported in the CMake configuration files.
target_compile_definitions(glfw PUBLIC GLFW_${HG_GLFW_BACKEND}=1)
endif()
set(HG_REBUILD_GLFW ${HG_REBUILD_GLFW} PARENT_SCOPE)
else()
set(HG_GLFW_BACKEND "NONE" PARENT_SCOPE)
endif()
# miniz
add_library(miniz STATIC miniz/miniz.c miniz/miniz.h)
set_target_properties(miniz PROPERTIES FOLDER "harfang/3rdparty")
target_include_directories(miniz PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/miniz> )
install_cppsdk_external_target(miniz)
# bgfx
add_subdirectory(bgfx EXCLUDE_FROM_ALL)
install_cppsdk_external_target(bx)
install_cppsdk_external_target(bimg)
install_cppsdk_external_target(bgfx)
install_cppsdk_external_target(astc-codec)
install_cppsdk_external_target(astc)
install_cppsdk_external_target(edtaa3)
install_cppsdk_external_target(etc1)
install_cppsdk_external_target(etc2)
install_cppsdk_external_target(iqa)
install_cppsdk_external_target(squish)
install_cppsdk_external_target(nvtt)
install_cppsdk_external_target(pvrtc)
# Lua
if(UNIX AND NOT APPLE AND NOT (CMAKE_SYSTEM_NAME STREQUAL "Emscripten"))
# lua links against libreadline but does not check for its availability.
find_package(readline REQUIRED)
endif()
add_subdirectory(lua EXCLUDE_FROM_ALL)
set_property(TARGET lua luac liblua libluadll PROPERTY FOLDER "harfang/3rdparty/lua")
if(HG_BUILD_CPP_SDK)
set_target_properties(libluadll PROPERTIES PUBLIC_HEADER "${CMAKE_CURRENT_SOURCE_DIR}/lua/src/lua.h;${CMAKE_CURRENT_SOURCE_DIR}/lua/src/luaconf.h;${CMAKE_CURRENT_SOURCE_DIR}/lua/src/lualib.h;${CMAKE_CURRENT_SOURCE_DIR}/lua/src/lauxlib.h;${CMAKE_CURRENT_SOURCE_DIR}/lua/src/lua.hpp")
endif()
target_include_directories(libluadll PUBLIC $<INSTALL_INTERFACE:${CppSdkHeadersDestination}/extern/lua>)
install_cppsdk_external_target(libluadll lua)
# STB vorbis (customized to handle raw VORBIS stream)
add_library(stb_vorbis STATIC stb_vorbis/stb_vorbis.c)
set_target_properties(stb_vorbis PROPERTIES FOLDER "harfang/3rdparty")
target_compile_definitions(stb_vorbis PUBLIC STB_VORBIS_NO_STDIO=1)
target_include_directories(stb_vorbis PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/stb_vorbis>)
install_cppsdk_external_target(stb_vorbis)
# STB truetype
add_library(stb_truetype STATIC stb_truetype/stb_truetype.c stb_truetype/stb_truetype.h)
target_include_directories(stb_truetype PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/stb_truetype>)
set_target_properties(stb_truetype PROPERTIES FOLDER "harfang/3rdparty")
install_cppsdk_external_target(stb_truetype)
# STB image write
add_library(stb_image_write STATIC stb_image/stb_image_write.c stb_image/stb_image_write.h)
target_include_directories(stb_image_write PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/stb_image>)
set_target_properties(stb_image_write PROPERTIES FOLDER "harfang/3rdparty")
install_cppsdk_external_target(stb_image_write)
# Bullet 3
if(HG_ENABLE_BULLET3_SCENE_PHYSICS)
add_subdirectory(bullet3 EXCLUDE_FROM_ALL)
set_target_properties(BulletDynamics PROPERTIES FOLDER "harfang/3rdparty/bullet3")
set_target_properties(BulletCollision PROPERTIES FOLDER "harfang/3rdparty/bullet3")
set_target_properties(BulletCommon PROPERTIES FOLDER "harfang/3rdparty/bullet3")
set_target_properties(LinearMath PROPERTIES FOLDER "harfang/3rdparty/bullet3")
set_target_properties(BulletWorldImporter PROPERTIES FOLDER "harfang/3rdparty/bullet3")
set_target_properties(BulletFileLoader PROPERTIES FOLDER "harfang/3rdparty/bullet3")
install_cppsdk_external_target(BulletDynamics)
install_cppsdk_external_target(BulletCollision)
install_cppsdk_external_target(BulletCommon)
install_cppsdk_external_target(LinearMath)
install_cppsdk_external_target(BulletWorldImporter)
install_cppsdk_external_target(BulletFileLoader)
endif()
# imgui
add_library(imgui STATIC
imgui/misc/cpp/imgui_stdlib.cpp
imgui/imgui.cpp
imgui/imgui_draw.cpp
imgui/imgui_tables.cpp
imgui/imgui_widgets.cpp
imgui/imgui.h
imgui/imgui_internal.h
imgui/imconfig.h)
target_include_directories(imgui
PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/imgui>
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/../harfang>
$<INSTALL_INTERFACE:${CppSdkHeadersDestination}/extern/imgui>
)
set_target_properties(imgui PROPERTIES FOLDER "harfang/3rdparty")
install_cppsdk_external_target(imgui)
if(HG_BUILD_CPP_SDK)
install(DIRECTORY imgui DESTINATION cppsdk/include/extern FILES_MATCHING PATTERN "*.h" PATTERN "fonts" EXCLUDE)
endif()
# OpenAL soft
if(NOT (CMAKE_SYSTEM_NAME STREQUAL "Emscripten"))
message("Configuring OpenAL soft")
set(ALSOFT_UTILS OFF CACHE BOOL "OpenAL soft: Build and install utility programs")
set(ALSOFT_EXAMPLES OFF CACHE BOOL "OpenAL soft: Build and install example programs")
set(ALSOFT_TESTS OFF CACHE BOOL "OpenAL soft: Build and install test programs")
set(ALSOFT_CONFIG OFF CACHE BOOL "OpenAL soft: Install alsoft.conf sample configuration file")
set(ALSOFT_INSTALL OFF CACHE BOOL "OpenAL soft: Install headers and libraries")
set(LIBTYPE STATIC) # build as static library
add_subdirectory(openal-soft EXCLUDE_FROM_ALL)
target_include_directories(OpenAL PRIVATE openal-soft-hrtf)
target_include_directories(OpenAL PUBLIC $<BUILD_INTERFACE:${OpenAL_SOURCE_DIR}/include>)
target_compile_definitions(OpenAL PUBLIC AL_LIBTYPE_STATIC=1) # make sure to correctly propagate this flag to consuming librairies
set_target_properties(OpenAL PROPERTIES FOLDER "harfang/3rdparty")
# ... try to fix include directories
get_target_property(OpenAL_include_dirs OpenAL INTERFACE_INCLUDE_DIRECTORIES)
list(REMOVE_ITEM OpenAL_include_dirs "$<INSTALL_INTERFACE:include>")
set_property(TARGET OpenAL PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${OpenAL_include_dirs})
install_cppsdk_external_target(OpenAL)
endif()
# json.hpp
add_library(jsonhpp INTERFACE)
target_include_directories(jsonhpp
INTERFACE
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/json>
$<INSTALL_INTERFACE:${CppSdkHeadersDestination}/extern/json>
)
set_target_properties(jsonhpp PROPERTIES PUBLIC_HEADER "json/json.hpp;json/json_fwd.hpp")
install_cppsdk_external_target(jsonhpp json)
# tiny-process-library
add_subdirectory(tiny-process-library EXCLUDE_FROM_ALL)
target_include_directories(tiny-process-library INTERFACE tiny-process-library)
target_compile_definitions(tiny-process-library PUBLIC UNICODE=1)
set_target_properties(tiny-process-library PROPERTIES FOLDER "harfang/3rdparty")
# OpenVR
if(HG_ENABLE_OPENVR_API)
if(CMAKE_SIZEOF_VOID_P EQUAL 8)
set(_OPENVR_BIT 64)
else()
set(_OPENVR_BIT 32)
endif()
if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
set(_OPENVR_ARCH "linux${_OPENVR_BIT}")
elseif(CMAKE_SYSTEM_NAME STREQUAL "Windows")
set(_OPENVR_ARCH "win${_OPENVR_BIT}")
elseif(CMAKE_SYSTEM_NAME STREQUAL "Darwin") # OpenVR only supports 32 bits osx...
set(_OPENVR_ARCH "osx32")
else(HG_ENABLE_OPENVR_API)
message(WARNING "OpenVR: unsupported platform ${CMAKE_SYSTEM_NAME}")
set(HG_ENABLE_OPENVR_API OFF)
endif()
if(HG_ENABLE_OPENVR_API)
set(OPENVR_INCLUDE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/openvr/headers)
find_library(OPENVR_LIBRARY name openvr_api PATHS ${CMAKE_CURRENT_SOURCE_DIR}/openvr/lib/${_OPENVR_ARCH} NO_DEFAULT_PATH)
add_library(OpenVR SHARED IMPORTED GLOBAL)
if(CMAKE_SYSTEM_NAME STREQUAL "Windows")
set(OPENVR_DLL ${CMAKE_CURRENT_SOURCE_DIR}/openvr/bin/${_OPENVR_ARCH}/openvr_api.dll)
set(OPENVR_DLL ${OPENVR_DLL} PARENT_SCOPE)
set_target_properties(OpenVR PROPERTIES
IMPORTED_IMPLIB ${OPENVR_LIBRARY}
IMPORTED_LOCATION ${OPENVR_DLL}
INTERFACE_INCLUDE_DIRECTORIES ${OPENVR_INCLUDE_PATH}
)
if(HG_BUILD_CPP_SDK)
install(FILES ${OPENVR_DLL} DESTINATION ${CppSdkRuntimeDestination} COMPONENT cppsdk)
endif()
else()
set_target_properties(OpenVR PROPERTIES
IMPORTED_LOCATION ${OPENVR_LIBRARY}
IMPORTED_NO_SONAME TRUE
INTERFACE_INCLUDE_DIRECTORIES ${OPENVR_INCLUDE_PATH}
)
endif()
if(HG_BUILD_CPP_SDK)
install(FILES ${OPENVR_LIBRARY} DESTINATION ${CppSdkLibraryDestination} COMPONENT cppsdk)
endif()
endif(HG_ENABLE_OPENVR_API)
unset(_OPENVR_BIT)
unset(_OPENVR_ARCH)
endif()
# OpenXR
if(HG_ENABLE_OPENXR_API)
set(BUILD_WITH_SYSTEM_JSONCPP OFF CACHE BOOL "Build json openxr with system" FORCE)
add_subdirectory(OpenXR EXCLUDE_FROM_ALL)
set_target_properties(openxr_loader PROPERTIES FOLDER "harfang/3rdparty")
add_library(openxr INTERFACE)
# Several files use these compile-time platform switches
if(WIN32)
target_compile_definitions(openxr INTERFACE XR_USE_PLATFORM_WIN32 XR_USE_GRAPHICS_API_D3D11)# XR_USE_GRAPHICS_API_D3D12)
elseif(ANDROID)
target_compile_definitions(openxr INTERFACE XR_USE_PLATFORM_ANDROID)
elseif(PRESENTATION_BACKEND MATCHES "xlib")
target_compile_definitions(openxr INTERFACE XR_USE_PLATFORM_XLIB)
elseif(PRESENTATION_BACKEND MATCHES "wayland")
target_compile_definitions(openxr INTERFACE XR_USE_PLATFORM_WAYLAND)
endif()
target_compile_definitions(openxr INTERFACE XR_USE_GRAPHICS_API_OPENGL)
# find_package(Vulkan)
# if(Vulkan_FOUND)
# target_include_directories(openxr INTERFACE "bgfx/bgfx/3rdparty/khronos")
# target_compile_definitions(openxr INTERFACE XR_USE_GRAPHICS_API_VULKAN)
# endif()
target_link_libraries(openxr INTERFACE openxr_loader)
get_target_property(openxr_loader_INCLUDES openxr_loader INCLUDE_DIRECTORIES)
install_cppsdk_external_target(openxr)
endif()
# SRanipal
if(HG_ENABLE_SRANIPAL_API)
# [todo] linux
find_library(SRANIPAL_LIBRARY name SRanipal PATHS ${CMAKE_CURRENT_SOURCE_DIR}/sranipal/lib NO_DEFAULT_PATH)
set(SRANIPAL_DLL
${CMAKE_CURRENT_SOURCE_DIR}/sranipal/bin/libHTC_License.dll
${CMAKE_CURRENT_SOURCE_DIR}/sranipal/bin/nanomsg.dll
${CMAKE_CURRENT_SOURCE_DIR}/sranipal/bin/SRanipal.dll
${CMAKE_CURRENT_SOURCE_DIR}/sranipal/bin/SRWorks_Log.dll
${CMAKE_CURRENT_SOURCE_DIR}/sranipal/bin/ViveSR_Client.dll)
set(SRANIPAL_DLL ${SRANIPAL_DLL} PARENT_SCOPE)
add_library(SRanipal SHARED IMPORTED GLOBAL)
set_target_properties(SRanipal PROPERTIES
IMPORTED_IMPLIB ${CMAKE_CURRENT_SOURCE_DIR}/sranipal/lib/SRanipal.lib
IMPORTED_LOCATION "${SRANIPAL_DLL}"
INTERFACE_INCLUDE_DIRECTORIES ${CMAKE_CURRENT_SOURCE_DIR}/sranipal/include
)
if(HG_BUILD_CPP_SDK)
install(FILES ${SRANIPAL_DLL} DESTINATION ${CppSdkRuntimeDestination} COMPONENT cppsdk)
install(FILES ${SRANIPAL_LIBRARY} DESTINATION ${CppSdkLibraryDestination} COMPONENT cppsdk)
endif()
endif()
# RecastDetour
if(HG_ENABLE_RECAST_DETOUR_API)
set(RECASTNAVIGATION_DEMO OFF CACHE BOOL "Build demo")
set(RECASTNAVIGATION_TESTS OFF CACHE BOOL "Build tests")
set(RECASTNAVIGATION_EXAMPLES OFF CACHE BOOL "Build examples")
add_subdirectory(recastnavigation EXCLUDE_FROM_ALL)
set_property(TARGET Recast Detour DetourCrowd PROPERTY FOLDER "harfang/3rdparty/Detour")
install_cppsdk_external_target(Recast)
install_cppsdk_external_target(Detour)
install_cppsdk_external_target(DetourCrowd)
endif()
# CMFT
if(NOT MINGW)
add_executable(cmft
cmft/src/cmft/common/stb_image.cpp
cmft/src/cmft/common/print.cpp
cmft/src/cmft/allocator.cpp
cmft/src/cmft/clcontext.cpp
cmft/src/cmft/cubemapfilter.cpp
cmft/src/cmft/image.cpp
cmft/src/main.cpp)
target_include_directories(cmft PRIVATE cmft/include cmft/dependency cmft/src/cmft)
target_compile_definitions(cmft PRIVATE CMFT_ENABLE_INFO_MESSAGES=1)
set_target_properties(cmft PROPERTIES FOLDER "harfang/tools")
if(APPLE)
target_link_libraries(cmft pthread dl)
elseif(UNIX)
target_compile_definitions(cmft PRIVATE linux)
target_link_libraries(cmft pthread dl)
endif()
endif()
# meshoptimizer
set(CMAKE_INSTALL_INCLUDEDIR ${CppSdkHeadersDestination}/extern)
add_subdirectory(meshoptimizer EXCLUDE_FROM_ALL)
set_target_properties(meshoptimizer PROPERTIES FOLDER "harfang/3rdparty")
install_cppsdk_external_target(meshoptimizer)
if(HG_ENABLE_OPENXR_API)
install_cppsdk_external_target(openxr_loader)
endif()
# meshoptimizer: in emscripten remove some compile options flag
if(CMAKE_SYSTEM_NAME STREQUAL "Emscripten")
get_target_property(_target_cxx_flags meshoptimizer COMPILE_OPTIONS)
if(_target_cxx_flags)
list(REMOVE_ITEM _target_cxx_flags -Wall -Wextra -Wshadow -Werror)
set_target_properties(meshoptimizer PROPERTIES COMPILE_OPTIONS "${_target_cxx_flags}")
endif()
endif()
# mikktspace
add_library(mikktspace STATIC mikktspace/mikktspace.c mikktspace/mikktspace.h)
target_include_directories(mikktspace PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/mikktspace>)
set_target_properties(mikktspace PROPERTIES FOLDER "harfang/3rdparty")
install_cppsdk_external_target(mikktspace)