···7474cmake_dependent_option(BUILD_COMPOSITOR_MAIN "Build main compositor host" ON "BUILD_WITH_WAYLAND OR BUILD_WITH_XCB" OFF)
7575cmake_dependent_option(XRT_BUILD_IPC "Build OpenXR runtime target" ON "BUILD_COMPOSITOR_MAIN" OFF)
7676cmake_dependent_option(XRT_HAVE_SYSTEMD "Enable systemd support (for socket activation of service)" ON "Systemd_FOUND AND XRT_BUILD_IPC" OFF)
7777+cmake_dependent_option(XRT_INSTALL_SYSTEMD_UNIT_FILES "Install user unit files for systemd socket activation on installation" ON "XRT_HAVE_SYSTEMD" OFF)
7878+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)
7779cmake_dependent_option(BUILD_TARGET_OPENXR "Build OpenXR runtime target" ON "BUILD_COMPOSITOR_MAIN OR XRT_BUILD_IPC" OFF)
78807981# Most users won't touch these.
+1
doc/changes/big/mr.306.md
···11+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
···1818install(TARGETS monado-service
1919 RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
2020 )
2121+2222+if(XRT_HAVE_SYSTEMD)
2323+ set(SERVICE_INPUT ${CMAKE_CURRENT_SOURCE_DIR}/monado.in.service)
2424+ set(SOCKET_INPUT ${CMAKE_CURRENT_SOURCE_DIR}/monado.in.socket)
2525+ ###
2626+ # Generate systemd unit files with absolute path to service intended for development without installing
2727+ set(UNIT_NAME monado-dev)
2828+ set(service_path $<TARGET_FILE:monado-service>)
2929+ set(conflicts monado)
3030+ set(exit_on_disconnect ON)
3131+ set(extra_desc "in build tree")
3232+ configure_file(${SOCKET_INPUT} ${CMAKE_CURRENT_BINARY_DIR}/${UNIT_NAME}.socket)
3333+ # Need this step because file(GENERATE) only evaluates generator expressions, and not what configure_file does.
3434+ configure_file(${SERVICE_INPUT} ${CMAKE_CURRENT_BINARY_DIR}/${UNIT_NAME}-intermediate.service)
3535+ file(GENERATE
3636+ OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${UNIT_NAME}.service"
3737+ INPUT ${CMAKE_CURRENT_BINARY_DIR}/${UNIT_NAME}-intermediate.service)
3838+3939+ configure_file(${SOCKET_INPUT} ${CMAKE_CURRENT_BINARY_DIR}/${UNIT_NAME}.socket @ONLY)
4040+4141+ # Make a custom target to link those in.
4242+ add_custom_target(link-systemd-dev-units
4343+ COMMAND systemctl --user link ${CMAKE_CURRENT_BINARY_DIR}/${UNIT_NAME}.socket
4444+ COMMAND systemctl --user link ${CMAKE_CURRENT_BINARY_DIR}/${UNIT_NAME}.service
4545+ COMMAND systemctl --user daemon-reload
4646+ VERBATIM
4747+ COMMENT "Linking monado-dev.{socket,service} into your local systemd unit directory."
4848+ )
4949+endif()
5050+5151+if(XRT_INSTALL_SYSTEMD_UNIT_FILES)
5252+ set(UNIT_NAME monado)
5353+ set(conflicts monado-dev)
5454+ set(exit_on_disconnect OFF)
5555+5656+ # Try to ask where to install it
5757+ pkg_get_variable(PC_SYSTEMD_USERUNITDIR systemd systemduserunitdir)
5858+ pkg_get_variable(PC_SYSTEMD_PREFIX systemd prefix)
5959+ if(NOT DEFINED XRT_SYSTEMD_UNIT_INSTALL_DIR)
6060+ # Fallback dest
6161+ set(XRT_SYSTEMD_UNIT_INSTALL_DIR lib/systemd/user)
6262+ if(PC_SYSTEMD_USERUNITDIR AND PC_SYSTEMD_PREFIX)
6363+ # Strip prefix
6464+ string(REGEX REPLACE "^${PC_SYSTEMD_PREFIX}/" "" XRT_SYSTEMD_UNIT_INSTALL_DIR "${PC_SYSTEMD_USERUNITDIR}")
6565+ endif()
6666+ 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.")
6767+ mark_as_advanced(XRT_SYSTEMD_UNIT_INSTALL_DIR)
6868+ endif()
6969+ if(XRT_SYSTEMD_UNIT_INSTALL_DIR MATCHES "^/")
7070+ # Destination is absolute: prepend only destdir at install time
7171+ set(UNIT_DIR "\$ENV{DESTDIR}${XRT_SYSTEMD_UNIT_INSTALL_DIR}")
7272+ else()
7373+ # Destination is relative: prepend destdir and install prefix at install time
7474+ set(UNIT_DIR "\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${XRT_SYSTEMD_UNIT_INSTALL_DIR}")
7575+ endif()
7676+ configure_file(configure_and_install_units.cmake ${CMAKE_CURRENT_BINARY_DIR}/configure_and_install_units.cmake @ONLY)
7777+7878+ # This script will configure the units and install them at install time.
7979+ install(SCRIPT ${CMAKE_CURRENT_BINARY_DIR}/configure_and_install_units.cmake)
8080+endif()