aboutsummaryrefslogtreecommitdiff
path: root/pkgs/development/libraries/yder
diff options
context:
space:
mode:
authorDaniel Schaefer <git@danielschaefer.me>2019-07-04 20:49:49 +0200
committerDaniel Schaefer <git@danielschaefer.me>2019-07-04 22:48:11 +0200
commit890c64aef4bcfd7bed3b5cc9139dbd25696c57aa (patch)
tree51dca302f87b3a0bbca64595dbbceddfc85b1cd4 /pkgs/development/libraries/yder
parentd80ea6aa4d6ab52d9854d83baa8acdf1b9b1b598 (diff)
yder: Fix darwin build
Diffstat (limited to 'pkgs/development/libraries/yder')
-rw-r--r--pkgs/development/libraries/yder/default.nix9
-rw-r--r--pkgs/development/libraries/yder/fix-darwin.patch159
2 files changed, 168 insertions, 0 deletions
diff --git a/pkgs/development/libraries/yder/default.nix b/pkgs/development/libraries/yder/default.nix
index f6a9633a633f..ffa326ccc538 100644
--- a/pkgs/development/libraries/yder/default.nix
+++ b/pkgs/development/libraries/yder/default.nix
@@ -17,6 +17,15 @@ stdenv.mkDerivation rec {
# We set CMAKE_INSTALL_LIBDIR to the absolute path in $out, so
# prefix and exec_prefix cannot be $out, too
./fix-pkgconfig.patch
+
+ # - ORCANIA_LIBRARIES must be set before target_link_libraries is called
+ # - librt is not available, nor needed on Darwin
+ # - The test binary is not linked against all necessary libraries
+ # - Test for journald logging is not systemd specific and fails on darwin
+ # - If the working directory is different from the build directory, the
+ # dynamic linker can't find libyder
+ # - Return correct error code from y_init_logs when journald is disabled
+ ./fix-darwin.patch
];
nativeBuildInputs = [ cmake ];
diff --git a/pkgs/development/libraries/yder/fix-darwin.patch b/pkgs/development/libraries/yder/fix-darwin.patch
new file mode 100644
index 000000000000..dedde22d9271
--- /dev/null
+++ b/pkgs/development/libraries/yder/fix-darwin.patch
@@ -0,0 +1,159 @@
+diff --git i/CMakeLists.txt w/CMakeLists.txt
+index 036ab73..0bab8c7 100644
+--- i/CMakeLists.txt
++++ w/CMakeLists.txt
+@@ -87,33 +87,6 @@ else()
+ set(DISABLE_JOURNALD ON)
+ endif ()
+
+-# shared library
+-
+-add_library(yder SHARED ${LIB_SRC})
+-if (NOT MSVC)
+- set_target_properties(yder PROPERTIES
+- COMPILE_OPTIONS -Wextra
+- PUBLIC_HEADER "${INC_DIR}/yder.h;${PROJECT_BINARY_DIR}/yder-cfg.h"
+- VERSION "${LIBRARY_VERSION}"
+- SOVERSION "${LIBRARY_SOVERSION}")
+-endif()
+-if (WIN32)
+- set_target_properties(yder PROPERTIES SUFFIX "-${LIBRARY_VERSION_MAJOR}.dll")
+-endif ()
+-
+-target_link_libraries(yder ${LIBS} ${ORCANIA_LIBRARIES} ${SYSTEMD_LIBRARIES})
+-
+-# static library
+-
+-option(BUILD_STATIC "Build static library." OFF)
+-
+-if (BUILD_STATIC)
+- add_library(yder_static STATIC ${LIB_SRC})
+- target_compile_definitions(yder_static PUBLIC -DO_STATIC_LIBRARY)
+- set_target_properties(yder_static PROPERTIES
+- OUTPUT_NAME yder)
+-endif ()
+-
+ option (SEARCH_ORCANIA "Search for Orcania library" ON)
+ if (SEARCH_ORCANIA)
+ set(Orcania_FIND_QUIETLY ON) # force to find Orcania quietly
+@@ -145,6 +118,33 @@ else ()
+ set(PKGCONF_REQ_PRIVATE "liborcania")
+ endif ()
+
++# shared library
++
++add_library(yder SHARED ${LIB_SRC})
++if (NOT MSVC)
++ set_target_properties(yder PROPERTIES
++ COMPILE_OPTIONS -Wextra
++ PUBLIC_HEADER "${INC_DIR}/yder.h;${PROJECT_BINARY_DIR}/yder-cfg.h"
++ VERSION "${LIBRARY_VERSION}"
++ SOVERSION "${LIBRARY_SOVERSION}")
++endif()
++if (WIN32)
++ set_target_properties(yder PROPERTIES SUFFIX "-${LIBRARY_VERSION_MAJOR}.dll")
++endif ()
++
++target_link_libraries(yder ${LIBS} ${ORCANIA_LIBRARIES} ${SYSTEMD_LIBRARIES})
++
++# static library
++
++option(BUILD_STATIC "Build static library." OFF)
++
++if (BUILD_STATIC)
++ add_library(yder_static STATIC ${LIB_SRC})
++ target_compile_definitions(yder_static PUBLIC -DO_STATIC_LIBRARY)
++ set_target_properties(yder_static PROPERTIES
++ OUTPUT_NAME yder)
++endif ()
++
+ # build yder-cfg.h file
+ configure_file(${INC_DIR}/yder-cfg.h.in ${PROJECT_BINARY_DIR}/yder-cfg.h)
+ set (CMAKE_EXTRA_INCLUDE_FILES ${PROJECT_BINARY_DIR})
+@@ -168,10 +168,9 @@ if (BUILD_YDER_TESTING)
+ set(CMAKE_CTEST_COMMAND ctest -V)
+
+ set(TST_DIR ${CMAKE_CURRENT_SOURCE_DIR}/test)
+- set(LIBS yder ${LIBS} ${CHECK_LIBRARIES})
+ if (NOT WIN32)
+ find_package(Threads REQUIRED)
+- set(LIBS ${LIBS} ${SUBUNIT_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT} m rt)
++ set(LIBS yder ${LIBS} ${SUBUNIT_LIBRARIES} ${ORCANIA_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT} ${CHECK_LIBRARIES} m)
+ endif ()
+
+ set(TESTS yder_test)
+@@ -186,7 +185,6 @@ if (BUILD_YDER_TESTING)
+ target_include_directories(${t} PUBLIC ${TST_DIR})
+ target_link_libraries(${t} PUBLIC ${LIBS})
+ add_test(NAME ${t}
+- WORKING_DIRECTORY ${TST_DIR}
+ COMMAND ${t})
+ endforeach ()
+ endif ()
+diff --git i/src/yder.c w/src/yder.c
+index 3122e3f..79e4e70 100644
+--- i/src/yder.c
++++ w/src/yder.c
+@@ -236,11 +236,12 @@ static int y_write_log(const char * app_name,
+ if (cur_mode & Y_LOG_MODE_SYSLOG) {
+ y_write_log_syslog(cur_app_name, level, message);
+ }
+- #ifndef Y_DISABLE_JOURNALD
++#endif
++
++#if !defined(_WIN32) && !defined(Y_DISABLE_JOURNALD)
+ if (cur_mode & Y_LOG_MODE_JOURNALD) {
+ y_write_log_journald(cur_app_name, level, message);
+ }
+- #endif
+ #endif
+ if (cur_mode & Y_LOG_MODE_FILE) {
+ y_write_log_file(cur_app_name, now, cur_log_file, level, message);
+@@ -266,18 +267,20 @@ static int y_write_log(const char * app_name,
+ */
+ int y_init_logs(const char * app, const unsigned long init_mode, const unsigned long init_level, const char * init_log_file, const char * message) {
+ #ifdef _WIN32
+- if (init_mode & Y_LOG_MODE_SYSLOG) {
+- perror("syslog mode not supported on your architecture");
+- return 0;
+- } else if (init_mode & Y_LOG_MODE_JOURNALD) {
+- perror("journald mode not supported on your architecture");
+- return 0;
+- } else {
+- return y_write_log(app, init_mode, init_level, init_log_file, NULL, NULL, Y_LOG_LEVEL_INFO, message);
+- }
+-#else
+- return y_write_log(app, init_mode, init_level, init_log_file, NULL, NULL, Y_LOG_LEVEL_INFO, message);
++ if (init_mode & Y_LOG_MODE_SYSLOG) {
++ perror("syslog mode not supported on your architecture");
++ return 0;
++ }
+ #endif
++
++#if defined(_WIN32) || defined(Y_DISABLE_JOURNALD)
++ if (init_mode & Y_LOG_MODE_JOURNALD) {
++ perror("journald mode not supported on your architecture");
++ return 0;
++ }
++#endif
++
++ return y_write_log(app, init_mode, init_level, init_log_file, NULL, NULL, Y_LOG_LEVEL_INFO, message);
+ }
+
+ /**
+diff --git i/test/yder_test.c w/test/yder_test.c
+index a10fd9f..b73fb16 100644
+--- i/test/yder_test.c
++++ w/test/yder_test.c
+@@ -27,7 +27,11 @@ START_TEST(test_yder_init)
+ y_close_logs();
+ ck_assert_int_eq(y_init_logs("test_yder_syslog", Y_LOG_MODE_SYSLOG, Y_LOG_LEVEL_DEBUG, NULL, "third test"), 1);
+ y_close_logs();
++#ifndef Y_DISABLE_JOURNALD
+ ck_assert_int_eq(y_init_logs("test_yder_journald", Y_LOG_MODE_JOURNALD, Y_LOG_LEVEL_DEBUG, NULL, "fourth test"), 1);
++#else
++ ck_assert_int_eq(y_init_logs("test_yder_journald", Y_LOG_MODE_JOURNALD, Y_LOG_LEVEL_DEBUG, NULL, "fourth test"), 0);
++#endif
+ y_close_logs();
+ ck_assert_int_eq(y_init_logs("test_yder_file_fail", Y_LOG_MODE_FILE, Y_LOG_LEVEL_DEBUG, "/nope/nope", "second test"), 0);
+ }