145 lines
4.8 KiB
CMake
145 lines
4.8 KiB
CMake
cmake_minimum_required(VERSION 3.24)
|
|
|
|
project(openxr_simulator VERSION 0.1.0 LANGUAGES CXX)
|
|
|
|
set(CMAKE_CXX_STANDARD 20)
|
|
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
|
set(CMAKE_CXX_EXTENSIONS OFF)
|
|
|
|
if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
|
|
set(CMAKE_BUILD_TYPE Release CACHE STRING "Build type" FORCE)
|
|
endif()
|
|
|
|
option(XRSIM_BUILD_COMPOSITOR "Build the GLFW + Dear ImGui display window" ON)
|
|
|
|
find_package(Vulkan REQUIRED)
|
|
|
|
include(FetchContent)
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# GLFW
|
|
# ---------------------------------------------------------------------------
|
|
set(GLFW_BUILD_DOCS OFF CACHE BOOL "" FORCE)
|
|
set(GLFW_BUILD_TESTS OFF CACHE BOOL "" FORCE)
|
|
set(GLFW_BUILD_EXAMPLES OFF CACHE BOOL "" FORCE)
|
|
set(GLFW_INSTALL OFF CACHE BOOL "" FORCE)
|
|
FetchContent_Declare(
|
|
glfw
|
|
GIT_REPOSITORY https://github.com/glfw/glfw.git
|
|
GIT_TAG 3.4
|
|
)
|
|
FetchContent_MakeAvailable(glfw)
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# Dear ImGui (docking branch, matches the engine's 1.91.4-docking)
|
|
# ---------------------------------------------------------------------------
|
|
FetchContent_Declare(
|
|
imgui
|
|
GIT_REPOSITORY https://github.com/ocornut/imgui.git
|
|
GIT_TAG v1.91.4-docking
|
|
)
|
|
# imgui has no CMakeLists.txt, so this only downloads it.
|
|
FetchContent_MakeAvailable(imgui)
|
|
|
|
add_library(imgui STATIC
|
|
${imgui_SOURCE_DIR}/imgui.cpp
|
|
${imgui_SOURCE_DIR}/imgui_draw.cpp
|
|
${imgui_SOURCE_DIR}/imgui_tables.cpp
|
|
${imgui_SOURCE_DIR}/imgui_widgets.cpp
|
|
${imgui_SOURCE_DIR}/imgui_demo.cpp
|
|
${imgui_SOURCE_DIR}/backends/imgui_impl_glfw.cpp
|
|
${imgui_SOURCE_DIR}/backends/imgui_impl_vulkan.cpp
|
|
${imgui_SOURCE_DIR}/backends/imgui_impl_opengl3.cpp
|
|
)
|
|
target_include_directories(imgui SYSTEM PUBLIC
|
|
${imgui_SOURCE_DIR}
|
|
${imgui_SOURCE_DIR}/backends
|
|
)
|
|
target_link_libraries(imgui PUBLIC glfw Vulkan::Vulkan)
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# JSON dependency + shared runtime config
|
|
# ---------------------------------------------------------------------------
|
|
FetchContent_Declare(
|
|
json
|
|
GIT_REPOSITORY https://github.com/nlohmann/json.git
|
|
GIT_TAG v3.11.3
|
|
)
|
|
FetchContent_MakeAvailable(json)
|
|
|
|
add_library(xrsim_config STATIC src/Config.cpp)
|
|
target_include_directories(xrsim_config PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/src)
|
|
target_link_libraries(xrsim_config PUBLIC nlohmann_json::nlohmann_json)
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# OpenXR simulator runtime
|
|
# ---------------------------------------------------------------------------
|
|
add_library(openxr_simulator SHARED
|
|
src/Negotiation.cpp
|
|
src/Runtime.cpp
|
|
)
|
|
|
|
if(XRSIM_BUILD_COMPOSITOR)
|
|
target_sources(openxr_simulator PRIVATE src/Compositor.cpp)
|
|
target_link_libraries(openxr_simulator PRIVATE imgui)
|
|
else()
|
|
target_sources(openxr_simulator PRIVATE src/CompositorStub.cpp)
|
|
endif()
|
|
|
|
target_include_directories(openxr_simulator
|
|
PRIVATE
|
|
${CMAKE_CURRENT_SOURCE_DIR}/src
|
|
${CMAKE_CURRENT_SOURCE_DIR}/third_party
|
|
)
|
|
|
|
target_compile_definitions(openxr_simulator
|
|
PRIVATE
|
|
XR_USE_PLATFORM_WIN32
|
|
XR_USE_GRAPHICS_API_VULKAN
|
|
XR_NO_PROTOTYPES
|
|
)
|
|
|
|
target_link_libraries(openxr_simulator PRIVATE Vulkan::Vulkan xrsim_config)
|
|
|
|
if(MINGW)
|
|
# Statically link the GCC runtime (libstdc++/libgcc/libwinpthread) into the DLL so the OpenXR
|
|
# loader can load it when the app is launched from Explorer (no MinGW bin on PATH).
|
|
target_link_options(openxr_simulator PRIVATE -static-libgcc -static-libstdc++ -static)
|
|
endif()
|
|
|
|
if(MSVC)
|
|
target_compile_options(openxr_simulator PRIVATE /W4)
|
|
else()
|
|
# Vulkan structs are routinely zero-initialized with `{ VK_STRUCTURE_TYPE_... }`.
|
|
target_compile_options(openxr_simulator PRIVATE -Wall -Wextra -Wno-missing-field-initializers)
|
|
endif()
|
|
|
|
set_target_properties(openxr_simulator PROPERTIES
|
|
PREFIX ""
|
|
OUTPUT_NAME "openxr_simulator"
|
|
)
|
|
|
|
# Runtime manifest consumed by the OpenXR loader (via XR_RUNTIME_JSON or registry).
|
|
set(SIM_RUNTIME_NAME "OpenXR Simulator")
|
|
configure_file(
|
|
${CMAKE_CURRENT_SOURCE_DIR}/manifest/openxr_simulator.json.in
|
|
${CMAKE_CURRENT_BINARY_DIR}/openxr_simulator.json
|
|
@ONLY
|
|
)
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# Configurator application (edits openxr_simulator_config.json)
|
|
# ---------------------------------------------------------------------------
|
|
if(XRSIM_BUILD_COMPOSITOR)
|
|
find_package(OpenGL REQUIRED)
|
|
|
|
add_executable(openxr_simulator_configurator WIN32 tools/configurator/ConfiguratorMain.cpp)
|
|
target_link_libraries(openxr_simulator_configurator PRIVATE xrsim_config imgui glfw OpenGL::GL)
|
|
|
|
if(MINGW)
|
|
target_link_options(
|
|
openxr_simulator_configurator PRIVATE -static-libgcc -static-libstdc++ -static
|
|
)
|
|
endif()
|
|
endif()
|