108 lines
3.9 KiB
CMake
108 lines
3.9 KiB
CMake
cmake_minimum_required(VERSION 3.3.0 FATAL_ERROR)
|
|
|
|
# prevent multiple inclusion
|
|
if (DEFINED SYSTEMD_SERVICE_LOADED)
|
|
return()
|
|
endif ()
|
|
set(SYSTEMD_SERVICE_LOADED YES)
|
|
|
|
include(CMakeParseArguments)
|
|
include(TemplateFinder)
|
|
include(ListToString)
|
|
|
|
function (add_systemd_service)
|
|
# parse arguments
|
|
set(OPTIONAL_ARGS
|
|
SERVICE_NAME
|
|
SERVICE_DESCRIPTION
|
|
USER_NAME
|
|
USER_ID
|
|
USER_DISPLAY_NAME
|
|
EXECUTABLE
|
|
SERVICE_TEMPLATE
|
|
SYSUSERS_TEMPLATE
|
|
TMPFILES_TEMPLATE)
|
|
set(ONE_VALUE_ARGS)
|
|
set(MULTI_VALUE_ARGS ARGUMENTS)
|
|
cmake_parse_arguments(ARGS "${OPTIONAL_ARGS}" "${ONE_VALUE_ARGS}" "${MULTI_VALUE_ARGS}" ${ARGN})
|
|
if (NOT ARGS_SERVICE_NAME)
|
|
set(ARGS_SERVICE_NAME "${META_PROJECT_NAME}${META_CONFIG_SUFFIX}")
|
|
endif ()
|
|
if (NOT ARGS_SERVICE_DESCRIPTION)
|
|
if (META_APP_DESCRIPTION)
|
|
set(ARGS_SERVICE_DESCRIPTION "${META_APP_DESCRIPTION}")
|
|
else ()
|
|
set(ARGS_SERVICE_DESCRIPTION "${ARGS_SERVICE_NAME} service")
|
|
endif ()
|
|
endif ()
|
|
if (NOT ARGS_USER_NAME)
|
|
set(ARGS_USER_NAME "${ARGS_SERVICE_NAME}")
|
|
endif ()
|
|
if (NOT ARGS_USER_ID)
|
|
set(ARGS_USER_ID "-")
|
|
endif ()
|
|
if (NOT ARGS_USER_DISPLAY_NAME)
|
|
if (META_APP_NAME)
|
|
set(ARGS_USER_DISPLAY_NAME "${META_APP_NAME}")
|
|
else ()
|
|
set(ARGS_USER_DISPLAY_NAME "${ARGS_SERVICE_NAME} user")
|
|
endif ()
|
|
endif ()
|
|
if (NOT ARGS_EXECUTABLE)
|
|
set(ARGS_EXECUTABLE "${TARGET_EXECUTABLE}")
|
|
endif ()
|
|
if (NOT ARGS_SERVICE_TEMPLATE)
|
|
set(ARGS_SERVICE_TEMPLATE "systemd.service")
|
|
endif ()
|
|
if (NOT ARGS_SYSUSERS_TEMPLATE)
|
|
set(ARGS_SYSUSERS_TEMPLATE "sysusers.conf")
|
|
endif ()
|
|
if (NOT ARGS_TMPFILES_TEMPLATE)
|
|
set(ARGS_TMPFILES_TEMPLATE "tmpfiles.conf")
|
|
endif ()
|
|
|
|
# find templates, make paths for outputs
|
|
find_template_file("${ARGS_SERVICE_TEMPLATE}" ${META_PROJECT_VARNAME} SERVICE_TEMPLATE_FILE)
|
|
find_template_file("${ARGS_SYSUSERS_TEMPLATE}" ${META_PROJECT_VARNAME} SYSUSERS_TEMPLATE_FILE)
|
|
find_template_file("${ARGS_TMPFILES_TEMPLATE}" ${META_PROJECT_VARNAME} TMPFILES_TEMPLATE_FILE)
|
|
set(SERVICE_TARGET_FILE "${CMAKE_CURRENT_BINARY_DIR}/resources/systemd/system/${ARGS_SERVICE_NAME}.service")
|
|
set(SYSUSERS_TARGET_FILE "${CMAKE_CURRENT_BINARY_DIR}/resources/sysusers.d/${ARGS_SERVICE_NAME}.conf")
|
|
set(TMPFILES_TARGET_FILE "${CMAKE_CURRENT_BINARY_DIR}/resources/tmpfiles.d/${ARGS_SERVICE_NAME}.conf")
|
|
|
|
# set variables used in templates
|
|
set(SYSTEMD_SERVICE_NAME "${ARGS_SERVICE_NAME}")
|
|
set(SYSTEMD_SERVICE_DESCRIPTION "${ARGS_SERVICE_DESCRIPTION}")
|
|
set(SYSTEMD_SERVICE_USER_NAME "${ARGS_USER_NAME}")
|
|
set(SYSTEMD_SERVICE_USER_ID "${ARGS_USER_ID}")
|
|
set(SYSTEMD_SERVICE_USER_DISPLAY_NAME "${ARGS_USER_DISPLAY_NAME}")
|
|
if (ARGS_ARGUMENTS)
|
|
list_to_string(" " "" "" "${ARGS_ARGUMENTS}" SYSTEMD_SERVICE_EXEC)
|
|
set(SYSTEMD_SERVICE_EXEC "${ARGS_EXECUTABLE} ${SYSTEMD_SERVICE_EXEC}")
|
|
else ()
|
|
set(SYSTEMD_SERVICE_EXEC "${ARGS_EXECUTABLE}")
|
|
endif ()
|
|
|
|
# configure files
|
|
configure_file("${SERVICE_TEMPLATE_FILE}" "${SERVICE_TARGET_FILE}")
|
|
configure_file("${SYSUSERS_TEMPLATE_FILE}" "${SYSUSERS_TARGET_FILE}")
|
|
configure_file("${TMPFILES_TEMPLATE_FILE}" "${TMPFILES_TARGET_FILE}")
|
|
|
|
# add installs
|
|
install(
|
|
FILES "${SERVICE_TARGET_FILE}"
|
|
DESTINATION lib/systemd/system
|
|
COMPONENT service)
|
|
install(
|
|
FILES "${SYSUSERS_TARGET_FILE}"
|
|
DESTINATION lib/sysusers.d
|
|
COMPONENT service)
|
|
install(
|
|
FILES "${TMPFILES_TARGET_FILE}"
|
|
DESTINATION lib/tmpfiles.d
|
|
COMPONENT service)
|
|
if (NOT TARGET install-service)
|
|
add_custom_target(install-service COMMAND "${CMAKE_COMMAND}" -DCMAKE_INSTALL_COMPONENT=service -P
|
|
"${CMAKE_BINARY_DIR}/cmake_install.cmake")
|
|
endif ()
|
|
endfunction ()
|