diff options
-rw-r--r-- | CMakeLists.txt | 36 | ||||
-rw-r--r-- | README.cmake | 6 | ||||
-rw-r--r-- | bus/CMakeLists.txt | 7 | ||||
-rw-r--r-- | cmake/config.h.cmake | 1 | ||||
-rw-r--r-- | cmake/modules/Macros.cmake | 60 | ||||
-rw-r--r-- | dbus/CMakeLists.txt | 2 |
6 files changed, 110 insertions, 2 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index a0095ebb..48cf9675 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -52,6 +52,10 @@ set(BUILD_TIMESTAMP ${DBUS_BUILD_TIMESTAMP}) ########### basic vars ############### +if(UNIX AND CMAKE_SYSTEM_NAME STREQUAL "Linux") + set(DBUS_LINUX 1) +endif() + include(GNUInstallDirs) if(DBUSDIR) @@ -135,6 +139,35 @@ option(DBUS_DISABLE_ASSERT "Disable assertion checking" OFF) option(DBUS_ENABLE_STATS "enable bus daemon usage statistics" OFF) option(DBUS_ENABLE_CONTAINERS "enable restricted servers for app-containers" OFF) +if(DBUS_LINUX) + add_auto_option(ENABLE_SYSTEMD "build with systemd at_console support" AUTO) + include(FindPkgConfig) + pkg_check_modules(SYSTEMD libsystemd>=209) + if(NOT SYSTEMD_FOUND) + pkg_check_modules(SYSTEMD libsystemd-login>=32 libsystemd-daemon>=32 libsystemd-journal>=32) + endif() + check_auto_option(ENABLE_SYSTEMD "systemd support" SYSTEMD_FOUND "systemd") + if(ENABLE_SYSTEMD AND SYSTEMD_FOUND) + set(DBUS_BUS_ENABLE_SYSTEMD ON) + set(HAVE_SYSTEMD ${SYSTEMD_FOUND}) + endif() + add_path_option(WITH_SYSTEMD_SYSTEMUNITDIR "Directory for systemd service files" "") + # get defaults + pkg_check_modules(_SYSTEMD systemd) + if(_SYSTEMD_FOUND) + pkg_get_variable(_SYSTEMD_PREFIX systemd prefix) + pkg_get_variable(_SYSTEMD_SYSTEMUNITDIR systemd systemdsystemunitdir) + pkg_get_variable(_SYSTEMD_USERUNITDIR systemd systemduserunitdir) + # remove install prefix, which may not match the current prefix + string(REPLACE "${_SYSTEMD_PREFIX}/" "" DBUS_SYSTEMD_SYSTEMUNITDIR ${_SYSTEMD_SYSTEMUNITDIR}) + else() + set(DBUS_SYSTEMD_SYSTEMUNITDIR lib/systemd/system) + endif() + if(WITH_SYSTEMD_SYSTEMUNITDIR) + set(DBUS_SYSTEMD_SYSTEMUNITDIR ${WITH_SYSTEMD_SYSTEMUNITDIR}) + endif() +endif() + if(WIN32) set(FD_SETSIZE "8192" CACHE STRING "The maximum number of connections that can be handled at once") endif() @@ -609,6 +642,8 @@ message(" Building bus stats API: ${DBUS_ENABLE_STATS} " message(" installing system libs: ${DBUS_INSTALL_SYSTEM_LIBS} ") message(" Building inotify support: ${DBUS_BUS_ENABLE_INOTIFY} ") message(" Building kqueue support: ${DBUS_BUS_ENABLE_KQUEUE} ") +message(" Building systemd support: ${DBUS_BUS_ENABLE_SYSTEMD} ") +message(" systemd system install dir:${DBUS_SYSTEMD_SYSTEMUNITDIR} ") message(" Building Doxygen docs: ${DBUS_ENABLE_DOXYGEN_DOCS} ") message(" Building Qt help docs: ${DBUS_ENABLE_QTHELP_DOCS} ") message(" Building XML docs: ${DBUS_ENABLE_XML_DOCS} ") @@ -679,7 +714,6 @@ add_custom_target(help-options # if(DBUS_ENABLE_PKGCONFIG) set(PLATFORM_LIBS pthread ${LIBRT}) - include(FindPkgConfig QUIET) if(PKG_CONFIG_FOUND) # convert lists of link libraries into -lstdc++ -lm etc.. foreach(LIB ${CMAKE_C_IMPLICIT_LINK_LIBRARIES} ${PLATFORM_LIBS}) diff --git a/README.cmake b/README.cmake index e6bc9725..0b32fdca 100644 --- a/README.cmake +++ b/README.cmake @@ -149,6 +149,12 @@ DBUS_ENABLE_STATS:BOOL=OFF // enable restricted servers for app containers DBUS_ENABLE_CONTAINERS:BOOL=OFF +// build with systemd at_console support +ENABLE_SYSTEMD:STRING=AUTO + +// Directory for systemd service files +WITH_SYSTEMD_SYSTEMUNITDIR:STRING= + // support verbose debug mode DBUS_ENABLE_VERBOSE_MODE:BOOL=ON diff --git a/bus/CMakeLists.txt b/bus/CMakeLists.txt index 5d76573d..2aa6068d 100644 --- a/bus/CMakeLists.txt +++ b/bus/CMakeLists.txt @@ -169,6 +169,13 @@ if(NOT WIN32) install_example_file(example-system-hardening-without-traditional-activation.conf) endif() +if(DBUS_BUS_ENABLE_SYSTEMD) + configure_file(dbus.socket.in ${CMAKE_CURRENT_BINARY_DIR}/dbus.socket) + configure_file(dbus.service.in ${CMAKE_CURRENT_BINARY_DIR}/dbus.service) + add_systemd_service(${CMAKE_CURRENT_BINARY_DIR}/dbus.socket PATH ${DBUS_SYSTEMD_SYSTEMUNITDIR} LINKS sockets.target.wants) + add_systemd_service(${CMAKE_CURRENT_BINARY_DIR}/dbus.service PATH ${DBUS_SYSTEMD_SYSTEMUNITDIR} LINKS multi-user.target.wants) +endif() + ## mop up the gcov files #clean-local: # /bin/rm *.bb *.bbg *.da *.gcov || true diff --git a/cmake/config.h.cmake b/cmake/config.h.cmake index 1bc545a9..cbffcfa9 100644 --- a/cmake/config.h.cmake +++ b/cmake/config.h.cmake @@ -227,6 +227,7 @@ #cmakedefine HAVE_RAISE 1 #cmakedefine HAVE_SETRLIMIT 1 #cmakedefine HAVE_UNIX_FD_PASSING 1 +#cmakedefine HAVE_SYSTEMD /* Define to use epoll(4) on Linux */ #cmakedefine DBUS_HAVE_LINUX_EPOLL 1 diff --git a/cmake/modules/Macros.cmake b/cmake/modules/Macros.cmake index 9db3bfb0..caf4372c 100644 --- a/cmake/modules/Macros.cmake +++ b/cmake/modules/Macros.cmake @@ -233,3 +233,63 @@ macro(check_auto_option _name _text _var _vartext) message(FATAL_ERROR "${_text} requested but ${_vartext} not found") endif() endmacro() + +# +# Provide option that takes a path +# +macro(add_path_option _name _text _default) + if(NOT DEFINED ${_name}) + set(${_name} ${_default} CACHE STRING "${_text}" FORCE) + else() + set(${_name} ${_default} CACHE STRING "${_text}") + endif() +endmacro() + +# +# create directory on install +# +macro(install_dir filepath) + install(CODE " + set(_path \"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${filepath}\") + if(NOT EXISTS \"\${_path}\") + execute_process(COMMAND ${CMAKE_COMMAND} -E make_directory \"\${_path}\") + message(\"-- Creating directory: \${_path}\") + else() + message(\"-- Up-to-date: \${_path}\") + endif() + ") +endmacro() + +# +# create symlink on install +# +macro(install_symlink filepath sympath) + install(CODE " + set(_sympath \"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${sympath}\") + file(REMOVE \"\${_sympath}\") + execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink \"${filepath}\" \"\${_sympath}\" RESULT_VARIABLE result) + if(NOT result) + message(\"-- Creating symlink: \${_sympath} -> ${filepath}\") + else() + message(FATAL ERROR \"-- Failed to create symlink: \${_sympath} -> ${filepath}\") + endif() + ") +endmacro() + +# +# add system service <file> PATH <install path> LINKS [multi-user.target.wants [...]] +# +macro(add_systemd_service file) + set(options) + set(oneValueArgs PATH) + set(multiValueArgs LINKS) + cmake_parse_arguments(_ "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) + set(_targetdir ${__PATH}) + install(FILES ${file} DESTINATION ${_targetdir}) + get_filename_component(_name ${file} NAME) + foreach(l ${__LINKS}) + set(_linkdir ${_targetdir}/${l}) + install_dir(${_linkdir}) + install_symlink(../${_name} ${_linkdir}/${_name}) + endforeach() +endmacro() diff --git a/dbus/CMakeLists.txt b/dbus/CMakeLists.txt index 972e05c1..63070b69 100644 --- a/dbus/CMakeLists.txt +++ b/dbus/CMakeLists.txt @@ -281,7 +281,7 @@ else(WIN32) if(DEFINED DBUS_LIBRARY_REVISION) set_target_properties(dbus-1 PROPERTIES VERSION ${DBUS_LIBRARY_MAJOR}.${DBUS_LIBRARY_AGE}.${DBUS_LIBRARY_REVISION} SOVERSION ${DBUS_LIBRARY_MAJOR}) endif() - target_link_libraries(dbus-1 ${CMAKE_THREAD_LIBS_INIT}) + target_link_libraries(dbus-1 ${CMAKE_THREAD_LIBS_INIT} ${SYSTEMD_LIBRARIES}) if(LIBRT) target_link_libraries(dbus-1 ${LIBRT}) endif() |