The open source OpenXR runtime
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

t/service: Add ability to generate, link, install systemd unit files

+114
+2
CMakeLists.txt
··· 74 74 cmake_dependent_option(BUILD_COMPOSITOR_MAIN "Build main compositor host" ON "BUILD_WITH_WAYLAND OR BUILD_WITH_XCB" OFF) 75 75 cmake_dependent_option(XRT_BUILD_IPC "Build OpenXR runtime target" ON "BUILD_COMPOSITOR_MAIN" OFF) 76 76 cmake_dependent_option(XRT_HAVE_SYSTEMD "Enable systemd support (for socket activation of service)" ON "Systemd_FOUND AND XRT_BUILD_IPC" OFF) 77 + cmake_dependent_option(XRT_INSTALL_SYSTEMD_UNIT_FILES "Install user unit files for systemd socket activation on installation" ON "XRT_HAVE_SYSTEMD" OFF) 78 + cmake_dependent_option(XRT_INSTALL_ABSOLUTE_SYSTEMD_UNIT_FILES "Use an absolute path to monado-system in installed user unit files for systemd socket activation" ON "XRT_INSTALL_SYSTEMD_UNIT_FILES" OFF) 77 79 cmake_dependent_option(BUILD_TARGET_OPENXR "Build OpenXR runtime target" ON "BUILD_COMPOSITOR_MAIN OR XRT_BUILD_IPC" OFF) 78 80 79 81 # Most users won't touch these.
+1
doc/changes/big/mr.306.md
··· 1 + Support optional systemd socket-activation: if not disabled at configure time, `monado-service` can be launched by systemd as a service with an associated socket. If the service is launched this way, it will use the systemd-created domain socket instead of creating its own. (If launched manually, it will still create its own as normal.) This allows optional auto-launching of the service when running a client (OpenXR) application. Associated systemd unit files are also included.
+60
src/xrt/targets/service/CMakeLists.txt
··· 18 18 install(TARGETS monado-service 19 19 RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} 20 20 ) 21 + 22 + if(XRT_HAVE_SYSTEMD) 23 + set(SERVICE_INPUT ${CMAKE_CURRENT_SOURCE_DIR}/monado.in.service) 24 + set(SOCKET_INPUT ${CMAKE_CURRENT_SOURCE_DIR}/monado.in.socket) 25 + ### 26 + # Generate systemd unit files with absolute path to service intended for development without installing 27 + set(UNIT_NAME monado-dev) 28 + set(service_path $<TARGET_FILE:monado-service>) 29 + set(conflicts monado) 30 + set(exit_on_disconnect ON) 31 + set(extra_desc "in build tree") 32 + configure_file(${SOCKET_INPUT} ${CMAKE_CURRENT_BINARY_DIR}/${UNIT_NAME}.socket) 33 + # Need this step because file(GENERATE) only evaluates generator expressions, and not what configure_file does. 34 + configure_file(${SERVICE_INPUT} ${CMAKE_CURRENT_BINARY_DIR}/${UNIT_NAME}-intermediate.service) 35 + file(GENERATE 36 + OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${UNIT_NAME}.service" 37 + INPUT ${CMAKE_CURRENT_BINARY_DIR}/${UNIT_NAME}-intermediate.service) 38 + 39 + configure_file(${SOCKET_INPUT} ${CMAKE_CURRENT_BINARY_DIR}/${UNIT_NAME}.socket @ONLY) 40 + 41 + # Make a custom target to link those in. 42 + add_custom_target(link-systemd-dev-units 43 + COMMAND systemctl --user link ${CMAKE_CURRENT_BINARY_DIR}/${UNIT_NAME}.socket 44 + COMMAND systemctl --user link ${CMAKE_CURRENT_BINARY_DIR}/${UNIT_NAME}.service 45 + COMMAND systemctl --user daemon-reload 46 + VERBATIM 47 + COMMENT "Linking monado-dev.{socket,service} into your local systemd unit directory." 48 + ) 49 + endif() 50 + 51 + if(XRT_INSTALL_SYSTEMD_UNIT_FILES) 52 + set(UNIT_NAME monado) 53 + set(conflicts monado-dev) 54 + set(exit_on_disconnect OFF) 55 + 56 + # Try to ask where to install it 57 + pkg_get_variable(PC_SYSTEMD_USERUNITDIR systemd systemduserunitdir) 58 + pkg_get_variable(PC_SYSTEMD_PREFIX systemd prefix) 59 + if(NOT DEFINED XRT_SYSTEMD_UNIT_INSTALL_DIR) 60 + # Fallback dest 61 + set(XRT_SYSTEMD_UNIT_INSTALL_DIR lib/systemd/user) 62 + if(PC_SYSTEMD_USERUNITDIR AND PC_SYSTEMD_PREFIX) 63 + # Strip prefix 64 + string(REGEX REPLACE "^${PC_SYSTEMD_PREFIX}/" "" XRT_SYSTEMD_UNIT_INSTALL_DIR "${PC_SYSTEMD_USERUNITDIR}") 65 + endif() 66 + set(XRT_SYSTEMD_UNIT_INSTALL_DIR "${XRT_SYSTEMD_UNIT_INSTALL_DIR}" CACHE STRING "The (absolute, or CMAKE_INSTALL_PREFIX-relative) path to install the systemd user unit files.") 67 + mark_as_advanced(XRT_SYSTEMD_UNIT_INSTALL_DIR) 68 + endif() 69 + if(XRT_SYSTEMD_UNIT_INSTALL_DIR MATCHES "^/") 70 + # Destination is absolute: prepend only destdir at install time 71 + set(UNIT_DIR "\$ENV{DESTDIR}${XRT_SYSTEMD_UNIT_INSTALL_DIR}") 72 + else() 73 + # Destination is relative: prepend destdir and install prefix at install time 74 + set(UNIT_DIR "\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${XRT_SYSTEMD_UNIT_INSTALL_DIR}") 75 + endif() 76 + configure_file(configure_and_install_units.cmake ${CMAKE_CURRENT_BINARY_DIR}/configure_and_install_units.cmake @ONLY) 77 + 78 + # This script will configure the units and install them at install time. 79 + install(SCRIPT ${CMAKE_CURRENT_BINARY_DIR}/configure_and_install_units.cmake) 80 + endif()
+26
src/xrt/targets/service/configure_and_install_units.cmake
··· 1 + # Copyright 2020, Collabora, Ltd. 2 + # SPDX-License-Identifier: BSL-1.0 3 + 4 + set(XRT_INSTALL_ABSOLUTE_SYSTEMD_UNIT_FILES @XRT_INSTALL_ABSOLUTE_SYSTEMD_UNIT_FILES@) 5 + 6 + # Set up variables to use when configuring files 7 + set(conflicts @conflicts@) 8 + set(exit_on_disconnect @exit_on_disconnect@) 9 + set(service_path "monado-service") 10 + if(XRT_INSTALL_ABSOLUTE_SYSTEMD_UNIT_FILES) 11 + set(service_path 12 + "${CMAKE_INSTALL_PREFIX}/@CMAKE_INSTALL_BINDIR@/${service_path}") 13 + endif() 14 + 15 + # Create unit files 16 + configure_file(@SOCKET_INPUT@ "@CMAKE_CURRENT_BINARY_DIR@/@UNIT_NAME@.socket") 17 + configure_file(@SERVICE_INPUT@ "@CMAKE_CURRENT_BINARY_DIR@/@UNIT_NAME@.service") 18 + 19 + # Install them 20 + file( 21 + INSTALL 22 + DESTINATION "@UNIT_DIR@" 23 + TYPE FILE 24 + FILES 25 + "@CMAKE_CURRENT_BINARY_DIR@/@UNIT_NAME@.socket" 26 + "@CMAKE_CURRENT_BINARY_DIR@/@UNIT_NAME@.service")
+15
src/xrt/targets/service/monado.in.service
··· 1 + [Unit] 2 + Description=Monado XR runtime service module @extra_desc@ 3 + Requires=%N.socket 4 + ConditionUser=!root 5 + Conflicts=@conflicts@.service 6 + 7 + [Service] 8 + ExecStart=@service_path@ 9 + Environment="XRT_COMPOSITOR_PRINT_DEBUG=on" "XRT_PRINT_OPTIONS=on" "IPC_EXIT_ON_DISCONNECT=@exit_on_disconnect@" 10 + # MemoryDenyWriteExecute=yes 11 + # NoNewPrivileges=yes 12 + Restart=no 13 + 14 + [Install] 15 + Also=%N.socket
+10
src/xrt/targets/service/monado.in.socket
··· 1 + [Unit] 2 + Description=Monado XR service module connection socket @extra_desc@ 3 + ConditionUser=!root 4 + Conflicts=@conflicts@.socket 5 + 6 + [Socket] 7 + ListenStream=/tmp/monado_comp_ipc 8 + 9 + [Install] 10 + WantedBy=sockets.target