From 1e2d13a04a988afac00929d837354bd4bcc2a450 Mon Sep 17 00:00:00 2001 From: Jan Beich Date: Sat, 16 Sep 2023 14:28:58 +0000 Subject: [PATCH] feat: add FreeBSD support (#358) * chore: don't use systemd headers with elogind In file included from src/VTableUtils.c:27: src/VTableUtils.h:30:10: fatal error: 'systemd/sd-bus.h' file not found #include ^~~~~~~~~~~~~~~~~~ * chore: add basu support Similar to elogind but also supported on non-Linux. * chore(tests): permit /var/lib/machine-id on non-systemd https://github.com/elogind/elogind/commit/84fdc0fc61c1 https://git.sr.ht/~emersion/basu/commit/8324e6729231 * chore(ci): add simple freebsd job Mainly to cover libc++ and basu. * chore(ci): explicitly pass CMAKE_INSTALL_PREFIX Some sdbus-cpp tests require configuring system bus. However, Linux testing relies on writing outside of prefix in order to affect current system bus instance instead of launching a dedicated one. * chore(tests): respect CMAKE_INSTALL_PREFIX for system bus config DBus isn't part of base system on BSDs, so may not use /etc for configs. Also, testing installation failed as non-root: $ cmake -DBUILD_TESTS=1 -DCMAKE_INSTALL_PREFIX=/tmp/sdbus-cpp_prefix -DTESTS_INSTALL_PATH=/tmp/sdbus-cpp_prefix/tests $ cmake --build . $ cmake --install . [...] CMake Error at tests/cmake_install.cmake:105 (file): file cannot create directory: /etc/dbus-1/system.d. Maybe need administrative privileges. * chore(tests): temporarily skip 1 test on FreeBSD to keep CI happy * chore(ci): run tests in freebsd job --- .github/workflows/ci.yml | 25 ++++++++++++++++--- CMakeLists.txt | 16 +++++++++--- src/Connection.cpp | 2 +- src/Connection.h | 2 +- src/Error.cpp | 2 +- src/Flags.cpp | 2 +- src/IConnection.h | 2 +- src/ISdBus.h | 2 +- src/Message.cpp | 2 +- src/Object.cpp | 2 +- src/Object.h | 2 +- src/Proxy.cpp | 2 +- src/Proxy.h | 2 +- src/SdBus.cpp | 5 ++++ src/Types.cpp | 2 +- src/Utils.h | 2 +- src/VTableUtils.c | 2 +- src/VTableUtils.h | 2 +- tests/CMakeLists.txt | 11 +++++--- tests/integrationtests/DBusMethodsTests.cpp | 4 +++ .../DBusStandardInterfacesTests.cpp | 9 +++---- 21 files changed, 69 insertions(+), 31 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index da1ab7b..1e56976 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -48,19 +48,19 @@ jobs: run: | mkdir build cd build - cmake -DCMAKE_BUILD_TYPE=Debug -DCMAKE_CXX_FLAGS="-O0 -g -W -Wextra -Wall -Wnon-virtual-dtor -Werror" -DCMAKE_VERBOSE_MAKEFILE=ON -DBUILD_TESTS=ON -DENABLE_PERF_TESTS=ON -DENABLE_STRESS_TESTS=ON -DBUILD_CODE_GEN=ON .. + cmake -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX:PATH=/usr -DCMAKE_CXX_FLAGS="-O0 -g -W -Wextra -Wall -Wnon-virtual-dtor -Werror" -DCMAKE_VERBOSE_MAKEFILE=ON -DBUILD_TESTS=ON -DENABLE_PERF_TESTS=ON -DENABLE_STRESS_TESTS=ON -DBUILD_CODE_GEN=ON .. - name: configure-release if: matrix.build == 'shared-libsystemd' && matrix.os == 'ubuntu-22.04' run: | mkdir build cd build - cmake -DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_CXX_FLAGS="-O3 -DNDEBUG -W -Wextra -Wall -Wnon-virtual-dtor -Werror" -DCMAKE_VERBOSE_MAKEFILE=ON -DBUILD_TESTS=ON -DENABLE_PERF_TESTS=ON -DENABLE_STRESS_TESTS=ON -DBUILD_CODE_GEN=ON .. + cmake -DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_INSTALL_PREFIX:PATH=/usr -DCMAKE_CXX_FLAGS="-O3 -DNDEBUG -W -Wextra -Wall -Wnon-virtual-dtor -Werror" -DCMAKE_VERBOSE_MAKEFILE=ON -DBUILD_TESTS=ON -DENABLE_PERF_TESTS=ON -DENABLE_STRESS_TESTS=ON -DBUILD_CODE_GEN=ON .. - name: configure-with-embedded-libsystemd if: matrix.build == 'embedded-static-libsystemd' run: | mkdir build cd build - cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_VERBOSE_MAKEFILE=ON -DBUILD_TESTS=ON -DENABLE_PERF_TESTS=ON -DENABLE_STRESS_TESTS=ON -DBUILD_CODE_GEN=ON -DBUILD_LIBSYSTEMD=ON -DLIBSYSTEMD_VERSION=244 .. + cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX:PATH=/usr -DCMAKE_VERBOSE_MAKEFILE=ON -DBUILD_TESTS=ON -DENABLE_PERF_TESTS=ON -DENABLE_STRESS_TESTS=ON -DBUILD_CODE_GEN=ON -DBUILD_LIBSYSTEMD=ON -DLIBSYSTEMD_VERSION=244 .. - name: make run: | cd build @@ -84,3 +84,22 @@ jobs: build/sdbus-c++*.deb build/sdbus-c++*.ddeb retention-days: 10 + freebsd-build: + name: build (freebsd, clang/libc++, basu) + runs-on: macos-12 # until https://github.com/actions/runner/issues/385 + steps: + - uses: actions/checkout@v2 + - name: Test in FreeBSD VM + uses: vmactions/freebsd-vm@v0 + with: + copyback: false + usesh: true + prepare: | + pkg install -y cmake ninja pkgconf basu expat googletest + run: | + cmake -B _build -G Ninja -DBUILD_CODE_GEN=ON -DBUILD_TESTS=ON -DENABLE_PERF_TESTS=ON -DENABLE_STRESS_TESTS=ON + cmake --build _build + cmake --install _build + pkg install -y dbus + service dbus onestart + ctest --output-on-failure --test-dir _build diff --git a/CMakeLists.txt b/CMakeLists.txt index bbe61b9..7332b23 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -12,7 +12,7 @@ include(GNUInstallDirs) # Installation directories for `install` command and pkg # PERFORMING CHECKS & PREPARING THE DEPENDENCIES #------------------------------- -set(LIBSYSTEMD "libsystemd") +set(LIBSYSTEMD "systemd") option(BUILD_LIBSYSTEMD "Build libsystemd static library and incorporate it into libsdbus-c++" OFF) @@ -23,9 +23,15 @@ if(NOT BUILD_LIBSYSTEMD) message(WARNING "libsystemd not found, checking for libelogind instead") pkg_check_modules(Systemd IMPORTED_TARGET GLOBAL libelogind>=236) if(TARGET PkgConfig::Systemd) - set(LIBSYSTEMD "libelogind") + set(LIBSYSTEMD "elogind") string(REPLACE "." ";" VERSION_LIST ${Systemd_VERSION}) list(GET VERSION_LIST 0 Systemd_VERSION) + else() + message(WARNING "libelogind not found, checking for basu instead") + pkg_check_modules(Systemd IMPORTED_TARGET GLOBAL basu) + set(LIBSYSTEMD "basu") + # https://git.sr.ht/~emersion/basu/commit/d4d185d29a26 + set(Systemd_VERSION "240") endif() endif() if(NOT TARGET PkgConfig::Systemd) @@ -116,7 +122,11 @@ endif() # Having an object target allows unit tests to reuse already built sources without re-building add_library(sdbus-c++-objlib OBJECT ${SDBUSCPP_SRCS}) -target_compile_definitions(sdbus-c++-objlib PRIVATE BUILD_LIB=1 LIBSYSTEMD_VERSION=${LIBSYSTEMD_VERSION}) +target_compile_definitions(sdbus-c++-objlib PRIVATE + BUILD_LIB=1 + LIBSYSTEMD_VERSION=${LIBSYSTEMD_VERSION} + SDBUS_${LIBSYSTEMD} + SDBUS_HEADER=<${LIBSYSTEMD}/sd-bus.h>) target_include_directories(sdbus-c++-objlib PUBLIC $ $) if(DEFINED BUILD_SHARED_LIBS) diff --git a/src/Connection.cpp b/src/Connection.cpp index d235ed1..dea217c 100644 --- a/src/Connection.cpp +++ b/src/Connection.cpp @@ -31,7 +31,7 @@ #include #include #include "ScopeGuard.h" -#include +#include SDBUS_HEADER #include #include #include diff --git a/src/Connection.h b/src/Connection.h index 445c915..c69627b 100644 --- a/src/Connection.h +++ b/src/Connection.h @@ -32,7 +32,7 @@ #include "IConnection.h" #include "ScopeGuard.h" #include "ISdBus.h" -#include +#include SDBUS_HEADER #include #include #include diff --git a/src/Error.cpp b/src/Error.cpp index e4a1f14..11625cb 100644 --- a/src/Error.cpp +++ b/src/Error.cpp @@ -25,7 +25,7 @@ */ #include -#include +#include SDBUS_HEADER #include "ScopeGuard.h" namespace sdbus diff --git a/src/Flags.cpp b/src/Flags.cpp index 3b7b8d6..ca20d5c 100644 --- a/src/Flags.cpp +++ b/src/Flags.cpp @@ -25,7 +25,7 @@ */ #include -#include +#include SDBUS_HEADER namespace sdbus { diff --git a/src/IConnection.h b/src/IConnection.h index 74b7832..1c23bbe 100644 --- a/src/IConnection.h +++ b/src/IConnection.h @@ -28,7 +28,7 @@ #define SDBUS_CXX_INTERNAL_ICONNECTION_H_ #include -#include +#include SDBUS_HEADER #include #include #include diff --git a/src/ISdBus.h b/src/ISdBus.h index 5fdd352..9ca8f3f 100644 --- a/src/ISdBus.h +++ b/src/ISdBus.h @@ -28,7 +28,7 @@ #ifndef SDBUS_CXX_ISDBUS_H #define SDBUS_CXX_ISDBUS_H -#include +#include SDBUS_HEADER namespace sdbus::internal { diff --git a/src/Message.cpp b/src/Message.cpp index b68801d..c45493e 100644 --- a/src/Message.cpp +++ b/src/Message.cpp @@ -31,7 +31,7 @@ #include "ISdBus.h" #include "IConnection.h" #include "ScopeGuard.h" -#include +#include SDBUS_HEADER #include namespace sdbus { diff --git a/src/Object.cpp b/src/Object.cpp index 6b6b3be..c6df821 100644 --- a/src/Object.cpp +++ b/src/Object.cpp @@ -35,7 +35,7 @@ #include "IConnection.h" #include "Utils.h" #include "VTableUtils.h" -#include +#include SDBUS_HEADER #include #include diff --git a/src/Object.h b/src/Object.h index aad5c4c..c22abe2 100644 --- a/src/Object.h +++ b/src/Object.h @@ -29,7 +29,7 @@ #include #include "IConnection.h" -#include +#include SDBUS_HEADER #include #include #include diff --git a/src/Proxy.cpp b/src/Proxy.cpp index 061b620..8a760ca 100644 --- a/src/Proxy.cpp +++ b/src/Proxy.cpp @@ -32,7 +32,7 @@ #include "sdbus-c++/IConnection.h" #include "sdbus-c++/Error.h" #include "ScopeGuard.h" -#include +#include SDBUS_HEADER #include #include #include diff --git a/src/Proxy.h b/src/Proxy.h index b0c4fac..f11f059 100644 --- a/src/Proxy.h +++ b/src/Proxy.h @@ -29,7 +29,7 @@ #include #include "IConnection.h" -#include +#include SDBUS_HEADER #include #include #include diff --git a/src/SdBus.cpp b/src/SdBus.cpp index b523b79..f99849a 100644 --- a/src/SdBus.cpp +++ b/src/SdBus.cpp @@ -224,7 +224,12 @@ int SdBus::sd_bus_open_user_with_address(sd_bus **ret, const char* address) int SdBus::sd_bus_open_system_remote(sd_bus **ret, const char *host) { +#ifdef SDBUS_basu + // https://git.sr.ht/~emersion/basu/commit/01d33b244eb6 + return -EOPNOTSUPP; +#else return ::sd_bus_open_system_remote(ret, host); +#endif } int SdBus::sd_bus_request_name(sd_bus *bus, const char *name, uint64_t flags) diff --git a/src/Types.cpp b/src/Types.cpp index ca8f4a2..5e4cc65 100644 --- a/src/Types.cpp +++ b/src/Types.cpp @@ -27,7 +27,7 @@ #include #include #include "MessageUtils.h" -#include +#include SDBUS_HEADER #include namespace sdbus { diff --git a/src/Utils.h b/src/Utils.h index 7c044e3..277ca91 100644 --- a/src/Utils.h +++ b/src/Utils.h @@ -28,7 +28,7 @@ #define SDBUS_CXX_INTERNAL_UTILS_H_ #include -#include +#include SDBUS_HEADER #if LIBSYSTEMD_VERSION>=246 #define SDBUS_CHECK_OBJECT_PATH(_PATH) \ diff --git a/src/VTableUtils.c b/src/VTableUtils.c index a10f027..e848faf 100644 --- a/src/VTableUtils.c +++ b/src/VTableUtils.c @@ -25,7 +25,7 @@ */ #include "VTableUtils.h" -#include +#include SDBUS_HEADER sd_bus_vtable createVTableStartItem(uint64_t flags) { diff --git a/src/VTableUtils.h b/src/VTableUtils.h index bf34666..03bdf31 100644 --- a/src/VTableUtils.h +++ b/src/VTableUtils.h @@ -27,7 +27,7 @@ #ifndef SDBUS_CXX_INTERNAL_VTABLEUTILS_H_ #define SDBUS_CXX_INTERNAL_VTABLEUTILS_H_ -#include +#include SDBUS_HEADER #include #ifdef __cplusplus diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 25ed6cd..56c4852 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -104,7 +104,9 @@ include_directories(${CMAKE_CURRENT_SOURCE_DIR}) #---------------------------------- add_executable(sdbus-c++-unit-tests ${UNITTESTS_SRCS}) -target_compile_definitions(sdbus-c++-unit-tests PRIVATE LIBSYSTEMD_VERSION=${LIBSYSTEMD_VERSION}) +target_compile_definitions(sdbus-c++-unit-tests PRIVATE + LIBSYSTEMD_VERSION=${LIBSYSTEMD_VERSION} + SDBUS_HEADER=<${LIBSYSTEMD}/sd-bus.h>) target_link_libraries(sdbus-c++-unit-tests sdbus-c++-objlib GTest::gmock) add_executable(sdbus-c++-integration-tests ${INTEGRATIONTESTS_SRCS}) @@ -138,21 +140,22 @@ endif() # INSTALLATION #---------------------------------- +include(GNUInstallDirs) set(TESTS_INSTALL_PATH "/opt/test/bin" CACHE STRING "Specifies where the test binaries will be installed") install(TARGETS sdbus-c++-unit-tests DESTINATION ${TESTS_INSTALL_PATH} COMPONENT test) install(TARGETS sdbus-c++-integration-tests DESTINATION ${TESTS_INSTALL_PATH} COMPONENT test) -install(FILES ${INTEGRATIONTESTS_SOURCE_DIR}/files/org.sdbuscpp.integrationtests.conf DESTINATION /etc/dbus-1/system.d COMPONENT test) +install(FILES ${INTEGRATIONTESTS_SOURCE_DIR}/files/org.sdbuscpp.integrationtests.conf DESTINATION ${CMAKE_INSTALL_FULL_SYSCONFDIR}/dbus-1/system.d COMPONENT test) if(ENABLE_PERF_TESTS) install(TARGETS sdbus-c++-perf-tests-client DESTINATION ${TESTS_INSTALL_PATH} COMPONENT test) install(TARGETS sdbus-c++-perf-tests-server DESTINATION ${TESTS_INSTALL_PATH} COMPONENT test) - install(FILES ${PERFTESTS_SOURCE_DIR}/files/org.sdbuscpp.perftests.conf DESTINATION /etc/dbus-1/system.d COMPONENT test) + install(FILES ${PERFTESTS_SOURCE_DIR}/files/org.sdbuscpp.perftests.conf DESTINATION ${CMAKE_INSTALL_FULL_SYSCONFDIR}/dbus-1/system.d COMPONENT test) endif() if(ENABLE_STRESS_TESTS) install(TARGETS sdbus-c++-stress-tests DESTINATION ${TESTS_INSTALL_PATH} COMPONENT test) - install(FILES ${STRESSTESTS_SOURCE_DIR}/files/org.sdbuscpp.stresstests.conf DESTINATION /etc/dbus-1/system.d COMPONENT test) + install(FILES ${STRESSTESTS_SOURCE_DIR}/files/org.sdbuscpp.stresstests.conf DESTINATION ${CMAKE_INSTALL_FULL_SYSCONFDIR}/dbus-1/system.d COMPONENT test) endif() #---------------------------------- diff --git a/tests/integrationtests/DBusMethodsTests.cpp b/tests/integrationtests/DBusMethodsTests.cpp index 2d777b8..43871d5 100644 --- a/tests/integrationtests/DBusMethodsTests.cpp +++ b/tests/integrationtests/DBusMethodsTests.cpp @@ -277,6 +277,10 @@ TEST_F(SdbusTestObject, CannotSetGeneralMethodTimeoutWithLibsystemdVersionLessTh TEST_F(SdbusTestObject, CanCallMethodSynchronouslyWithoutAnEventLoopThread) { +#if defined(__clang__) && defined(__FreeBSD__) + GTEST_SKIP() << "https://github.com/Kistler-Group/sdbus-cpp/issues/359"; +#endif + auto proxy = std::make_unique(BUS_NAME, OBJECT_PATH, sdbus::dont_run_event_loop_thread); auto multiplyRes = proxy->multiply(INT64_VALUE, DOUBLE_VALUE); diff --git a/tests/integrationtests/DBusStandardInterfacesTests.cpp b/tests/integrationtests/DBusStandardInterfacesTests.cpp index cc85cdd..e648fac 100644 --- a/tests/integrationtests/DBusStandardInterfacesTests.cpp +++ b/tests/integrationtests/DBusStandardInterfacesTests.cpp @@ -61,12 +61,9 @@ TEST_F(SdbusTestObject, PingsViaPeerInterface) TEST_F(SdbusTestObject, AnswersMachineUuidViaPeerInterface) { - // If /etc/machine-id does not exist in your system (which is very likely because you have - // a non-systemd Linux), org.freedesktop.DBus.Peer.GetMachineId() will not work. To solve - // this, you can create /etc/machine-id yourself as symlink to /var/lib/dbus/machine-id, - // and then org.freedesktop.DBus.Peer.GetMachineId() will start to work. - if (::access("/etc/machine-id", F_OK) == -1) - GTEST_SKIP() << "/etc/machine-id file does not exist, GetMachineId() will not work"; + if (::access("/etc/machine-id", F_OK) == -1 && + ::access("/var/lib/dbus/machine-id", F_OK) == -1) + GTEST_SKIP() << "/etc/machine-id and /var/lib/dbus/machine-id files do not exist, GetMachineId() will not work"; ASSERT_NO_THROW(m_proxy->GetMachineId()); }