blob: a573f83852c0c9b554d8ac6377991c4777ab6c8d [file] [log] [blame]
cmake_minimum_required(VERSION 3.0.2)
project(openvr_samples)
# -----------------------------------------------------------------------------
## SYSTEM PROPERTIES ##
# If not set, determines the running platform architecture.
if(NOT PLATFORM)
if(CMAKE_SIZEOF_VOID_P MATCHES 8)
set(PLATFORM 64)
else()
set(PLATFORM 32)
endif()
endif()
message(STATUS "Compilation set for ${PLATFORM}bits architectures.")
set(SDL_REQUIRED_LIBRARIES SDL2)
if(${CMAKE_SYSTEM_NAME} MATCHES "Linux")
add_definitions(-DLINUX -DPOSIX)
set(ARCH_TARGET linux64)
if(${PLATFORM} MATCHES 32)
message(WARNING "OpenVR x86 binaries not provided on GNU/Linux.")
endif()
elseif(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
set(CMAKE_MACOSX_RPATH 0)
add_definitions(-DOSX -DPOSIX)
set(ARCH_TARGET osx32)
elseif(${CMAKE_SYSTEM_NAME} MATCHES "Windows")
set(SDL_REQUIRED_LIBRARIES ${SDL_REQUIRED_LIBRARIES} SDL2main)
add_definitions(-D_WIN32)
set(ARCH_TARGET win${PLATFORM})
# Binaries path for thirdparties are not generics so we try to guess their suffixes.
set(WINDOWS_PATH_SUFFIXES win${PLATFORM} Win${PLATFORM} x${PLATFORM})
if(${PLATFORM} MATCHES 64)
message(WARNING "SDL x64 runtime binaries not provided on Windows.")
endif()
endif()
# -----------------------------------------------------------------------------
## PATHS ##
set(THIRDPARTY_DIR ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty)
set(SHARED_SRC_DIR ${CMAKE_CURRENT_SOURCE_DIR}/shared)
# Check that the steamVR SDK is installed
# (needed to prevent a segfault in OpenVR).
if(CMAKE_HOST_UNIX)
find_file(OPENVRPATHS openvrpaths.vrpath PATHS $ENV{HOME}/.config/openvr "$ENV{HOME}/Library/Application Support/OpenVR/.openvr")
if(${OPENVRPATHS} MATCHES OPENVRPATHS-NOTFOUND)
message(FATAL_ERROR "${OPENVRPATHS} Please install SteamVR SDK to continue..")
endif()
endif()
# Default output directory.
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/bin/${ARCH_TARGET})
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/bin/${ARCH_TARGET})
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/bin/${ARCH_TARGET})
# Force output directory destination, especially for MSVC (@so7747857).
function(setTargetOutputDirectory target)
foreach(type RUNTIME LIBRARY ARCHIVE)
set_target_properties(${target} PROPERTIES
${type}_OUTPUT_DIRECTORY ${CMAKE_${type}_OUTPUT_DIRECTORY}
${type}_OUTPUT_DIRECTORY_DEBUG ${CMAKE_${type}_OUTPUT_DIRECTORY}
${type}_OUTPUT_DIRECTORY_RELEASE ${CMAKE_${type}_OUTPUT_DIRECTORY}
)
endforeach()
endfunction()
# -----------------------------------------------------------------------------
## COMPILER DETECTION ##
if( (${CMAKE_CXX_COMPILER_ID} MATCHES "GNU")
OR (${CMAKE_CXX_COMPILER_ID} MATCHES "Clang"))
# Better to use the prebuilt GNU preprocessor define __GNUC__,
# kept for legacy reason with the sample code.
add_definitions(-DGNUC)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -include ${SHARED_SRC_DIR}/compat.h")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Wall -Wextra -pedantic -g")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O2")
# Handles x86 compilation support on x64 arch.
if(${PLATFORM} MATCHES 32)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m32")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -m32")
endif()
elseif(CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /W2 /DEBUG")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MP /INCREMENTAL:NO")
else()
message(FATAL_ERROR "Unsupported compiler '${CMAKE_CXX_COMPILER_ID}'")
endif()
# -----------------------------------------------------------------------------
## LIBRARIES ##
## OpenGL / GLU
find_package(OpenGL REQUIRED)
## GLEW 1.11
if(${CMAKE_SYSTEM_NAME} MATCHES "Linux")
# On GNU/Linux, glew can be found on the package manager.
find_package(GLEW 1.11 REQUIRED)
else()
# Otherwise, use the shipped binaries.
find_library(GLEW_LIBRARIES
NAMES
GLEW
glew32
PATHS
${THIRDPARTY_DIR}/glew/glew-1.11.0/lib/Release
PATH_SUFFIXES
osx32
${WINDOWS_PATH_SUFFIXES}
)
set(GLEW_INCLUDE_DIR ${THIRDPARTY_DIR}/glew/glew-1.11.0/include)
endif()
## SDL 2
## osx32 and linux32 cmake can spot each others' .so and .a files, so keep them apart
if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
foreach(lib ${SDL_REQUIRED_LIBRARIES})
find_library(${lib}_LIBRARY
NAMES
${lib}
PATHS
${THIRDPARTY_DIR}/sdl2-2.0.3/bin
PATH_SUFFIXES
osx32
)
list(APPEND SDL2_LIBRARIES ${${lib}_LIBRARY})
endforeach()
else()
foreach(lib ${SDL_REQUIRED_LIBRARIES})
find_library(${lib}_LIBRARY
NAMES
${lib}
PATHS
${THIRDPARTY_DIR}/sdl2-2.0.3/bin
PATH_SUFFIXES
linux${PLATFORM}
${WINDOWS_PATH_SUFFIXES}
)
list(APPEND SDL2_LIBRARIES ${${lib}_LIBRARY})
endforeach()
endif()
set(SDL2_INCLUDE_DIR ${THIRDPARTY_DIR}/sdl2-2.0.3/include)
## Vulkan
if(NOT (${CMAKE_SYSTEM_NAME} MATCHES "Darwin"))
find_library(VULKAN_LIBRARY
NAMES
vulkan-1
vulkan
PATHS
${THIRDPARTY_DIR}/vulkan-1.0.49.0/lib
PATH_SUFFIXES
linux${PLATFORM}
${WINDOWS_PATH_SUFFIXES}
NO_DEFAULT_PATH
)
set(VULKAN_INCLUDE_DIR ${THIRDPARTY_DIR}/vulkan-1.0.49.0/include)
endif()
## Qt 5
## Important :
## Remember to set CMAKE_PREFIX_PATH to Qt5 cmake modules path for your targeted platform
## or set them here manually (not portable).
# if(CMAKE_HOST_UNIX)
# list(APPEND CMAKE_PREFIX_PATH "/opt/Qt/5.6/gcc_64/lib/cmake")
# else()
# if(${PLATFORM} MATCHES 64)
# set(suffix "_64")
# endif
# list(APPEND CMAKE_PREFIX_PATH "C:/Qt/5.6/msvc2013${suffix}/lib/cmake")
# endif()
# Set CMake to run moc automatically has needed.
set(CMAKE_AUTOMOC ON)
# Set CMake to handle *.ui generation to avoid using QT5_WRAP_UI() macro.
set(CMAKE_AUTOUIC ON)
# Add the build dir to include paths to find UI's headers.
set(CMAKE_INCLUDE_CURRENT_DIR ON)
# Find Qt5 libraries.
foreach(module Core Gui Widgets)
find_package(Qt5 REQUIRED COMPONENTS ${module})
list(APPEND QT_INCLUDE_DIRS "${Qt5${module}_INCLUDE_DIRS}")
list(APPEND QT_LIBRARIES "${Qt5${module}_LIBRARIES}")
list(APPEND QT_FLAGS "${Qt5${module}_EXECUTABLE_COMPILE_FLAGS}")
list(APPEND QT_DEFINITIONS "${Qt5${module}_DEFINITIONS}")
endforeach()
# Correct QT_FLAGS having semicolons, which break the compile step on POSIX
list(REMOVE_DUPLICATES QT_FLAGS)
## OpenVR API path
find_library(OPENVR_LIBRARIES
NAMES
openvr_api
PATHS
${CMAKE_CURRENT_SOURCE_DIR}/../bin
${CMAKE_CURRENT_SOURCE_DIR}/../lib
PATH_SUFFIXES
osx32
linux64
${WINDOWS_PATH_SUFFIXES}
NO_DEFAULT_PATH
NO_CMAKE_FIND_ROOT_PATH
)
set(OPENVR_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../headers)
# -----------------------------------------------------------------------------
## SHARED SOURCES ##
file(GLOB SHARED_SRC_FILES
${SHARED_SRC_DIR}/*.cpp
${SHARED_SRC_DIR}/*.h
)
include_directories(
.
${OPENGL_INCLUDE_DIR}
${GLEW_INCLUDE_DIR}
${SDL2_INCLUDE_DIR}
${QT_INCLUDE_DIRS}
${OPENVR_INCLUDE_DIR}
)
if(NOT (${CMAKE_SYSTEM_NAME} MATCHES "Darwin"))
include_directories(${VULKAN_INCLUDE_DIR})
endif()
# -----------------------------------------------------------------------------
## SUBDIRECTORIES ##
add_subdirectory(driver_sample)
add_subdirectory(hellovr_opengl)
if(NOT (${CMAKE_SYSTEM_NAME} MATCHES "Darwin"))
add_subdirectory(hellovr_vulkan)
endif()
add_subdirectory(helloworldoverlay)
add_subdirectory(tracked_camera_openvr_sample)
# -----------------------------------------------------------------------------