Files

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()