cmake_minimum_required(VERSION 3.20) project(beyond_proximity LANGUAGES CXX) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) # Driver name must match manifest "name" field with driver_ prefix # Manifest name: "BeyondProximity" -> DLL: "driver_BeyondProximity.dll" set(DRIVER_NAME "driver_BeyondProximity") set(TARGET_NAME "BeyondProximity") # OpenVR SDK paths (vendored) set(OPENVR_ROOT "${CMAKE_SOURCE_DIR}/extern/openvr") set(OPENVR_INCLUDE_DIR "${OPENVR_ROOT}/headers") # 64-bit only if(CMAKE_SIZEOF_VOID_P EQUAL 8) set(OPENVR_LIB "${OPENVR_ROOT}/lib/win64/openvr_api.lib") set(ARCH_TARGET "win64") else() message(FATAL_ERROR "Only 64-bit builds are supported") endif() # Output directly to driver package structure set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/driver/${TARGET_NAME}/bin/${ARCH_TARGET}") # Flatten per-config output directories (avoid Release/Debug subdirectories) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}") set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}") set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELWITHDEBINFO "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}") # HIDAPI - vendored, built as static library set(BUILD_SHARED_LIBS FALSE CACHE BOOL "" FORCE) add_subdirectory(extern/hidapi) # Driver shared library add_library(${DRIVER_NAME} SHARED src/driver/hmd_driver_factory.cpp src/driver/device_provider.h src/driver/device_provider.cpp src/driver/driverlog.h src/driver/driverlog.cpp src/hid/hid_device.h src/hid/hid_device.cpp src/hid/proximity_algorithm.h src/hid/proximity_algorithm.cpp src/hid/user_signature.h src/hid/user_signature.cpp ) target_include_directories(${DRIVER_NAME} PRIVATE ${OPENVR_INCLUDE_DIR}) target_link_libraries(${DRIVER_NAME} PRIVATE ${OPENVR_LIB} hidapi::hidapi ) # IPD persistence via lighthouse_console (can be disabled if Beyond Utility handles persistence) option(ENABLE_IPD_PERSIST "Enable IPD persistence to lighthouse config on shutdown" ON) if(ENABLE_IPD_PERSIST) target_compile_definitions(${DRIVER_NAME} PRIVATE ENABLE_IPD_PERSIST) endif() # Copy driver assets (manifest, resources) to build output add_custom_command(TARGET ${DRIVER_NAME} POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_SOURCE_DIR}/driver/${TARGET_NAME}" "${CMAKE_BINARY_DIR}/driver/${TARGET_NAME}" ) # Debug control CLI tool (named pipe client) # No OpenVR or HIDAPI dependency -- pure Win32 add_executable(beyond_prox_ctl src/ctl/main.cpp ) # Spike proximity monitor (OpenVR client app for observing proximity state) add_executable(beyond_spike_monitor src/spike/proximity_monitor.cpp ) target_include_directories(beyond_spike_monitor PRIVATE ${OPENVR_INCLUDE_DIR}) target_link_libraries(beyond_spike_monitor PRIVATE ${OPENVR_LIB}) # Client apps need openvr_api.dll at runtime (driver DLL does not -- loaded by vrserver) add_custom_command(TARGET beyond_spike_monitor POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different "${OPENVR_ROOT}/bin/win64/openvr_api.dll" "$" ) # Phase 14.1 spike: pure-function harness (throwaway, remove in 14-02) add_executable(backglow_spike_harness src/spike/backglow_spike/harness.cpp ) # Phase 14.1 spike: hardware CLI (throwaway, remove in 14-02) add_executable(backglow_serial_spike src/spike/backglow_spike/serial_spike.cpp ) target_link_libraries(backglow_serial_spike PRIVATE user32) # --- Git version for installer --- find_package(Git QUIET) if(GIT_FOUND) execute_process( COMMAND ${GIT_EXECUTABLE} describe --tags --always --dirty WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} OUTPUT_VARIABLE GIT_VERSION OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_QUIET ) endif() if(NOT GIT_VERSION) set(GIT_VERSION "v0.0.0-dev") endif() message(STATUS "BeyondProximity version: ${GIT_VERSION}") # --- Installer target (requires Inno Setup 6) --- find_program(ISCC_EXECUTABLE NAMES ISCC PATHS "C:/Program Files (x86)/Inno Setup 6" "C:/Program Files/Inno Setup 6" DOC "Inno Setup command-line compiler" ) if(ISCC_EXECUTABLE) set(INSTALLER_OUTPUT_DIR "${CMAKE_BINARY_DIR}/installer") file(MAKE_DIRECTORY ${INSTALLER_OUTPUT_DIR}) add_custom_target(package COMMAND ${ISCC_EXECUTABLE} "/DMyAppVersion=${GIT_VERSION}" "/DDriverBuildDir=${CMAKE_BINARY_DIR}/driver/${TARGET_NAME}" "/DDriverSourceDir=${CMAKE_SOURCE_DIR}/driver/${TARGET_NAME}" "/O${INSTALLER_OUTPUT_DIR}" "/FBeyondProximity-Setup-${GIT_VERSION}" "${CMAKE_SOURCE_DIR}/installer/BeyondProximity.iss" DEPENDS ${DRIVER_NAME} COMMENT "Building installer: BeyondProximity-Setup-${GIT_VERSION}.exe" VERBATIM ) else() message(WARNING "ISCC.exe not found. Install Inno Setup 6 from https://jrsoftware.org/isdl.php to enable the 'package' target.") endif()