|
@@ -0,0 +1,255 @@
|
|
|
+From 2ae2137d724d5f3a70d5d2856cb979d389c4cbd8 Mon Sep 17 00:00:00 2001
|
|
|
+From: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
|
|
|
+Date: Fri, 12 Jul 2024 21:30:43 +0200
|
|
|
+Subject: [PATCH] src/CMakeLists.txt: don't build shared libraries when not
|
|
|
+ enabled
|
|
|
+
|
|
|
+BUILD_SHARED_LIBS is a standard CMake option [1] that specifies
|
|
|
+whether shared libraries should be built or not. This commit adjusts
|
|
|
+src/CMakeLists.txt to observe this variable to decide whether the
|
|
|
+shared library variant should be built or not. This allows check to
|
|
|
+only build a static library in environments where only a static
|
|
|
+library can be compiled.
|
|
|
+
|
|
|
+This needs a bit of refactoring to avoid duplication:
|
|
|
+
|
|
|
+- Additional source files from libcompat are directly added to the
|
|
|
+ ${SOURCES} variable as needed
|
|
|
+
|
|
|
+- Additional libraries are collected into ${ADDITIONAL_LIBS} before
|
|
|
+ being associated to the static library and shared library (if enabled)
|
|
|
+
|
|
|
+[1] https://cmake.org/cmake/help/latest/variable/BUILD_SHARED_LIBS.html
|
|
|
+
|
|
|
+Fixes:
|
|
|
+
|
|
|
+__uClibc_main.c:(.text+0x12c): undefined reference to `__fini_array_end'
|
|
|
+/home/autobuild/autobuild/instance-20/output-1/host/lib/gcc/sparc-buildroot-linux-uclibc/13.3.0/../../../../sparc-buildroot-linux-uclibc/bin/ld: __uClibc_main.c:(.text+0x130): undefined reference to `__fini_array_start'
|
|
|
+/home/autobuild/autobuild/instance-20/output-1/host/lib/gcc/sparc-buildroot-linux-uclibc/13.3.0/../../../../sparc-buildroot-linux-uclibc/bin/ld: __uClibc_main.c:(.text+0x134): undefined reference to `__fini_array_end'
|
|
|
+
|
|
|
+Upstream: https://github.com/libcheck/check/pull/355
|
|
|
+Signed-off-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
|
|
|
+---
|
|
|
+ src/CMakeLists.txt | 137 ++++++++++++++++++++++-----------------------
|
|
|
+ 1 file changed, 67 insertions(+), 70 deletions(-)
|
|
|
+
|
|
|
+diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
|
|
|
+index 4a02dbe..e0cf32b 100644
|
|
|
+--- a/src/CMakeLists.txt
|
|
|
++++ b/src/CMakeLists.txt
|
|
|
+@@ -31,117 +31,106 @@ set(SOURCES
|
|
|
+ check_run.c
|
|
|
+ check_str.c)
|
|
|
+
|
|
|
+-set(HEADERS
|
|
|
+- ${CONFIG_HEADER}
|
|
|
+- ${CMAKE_CURRENT_BINARY_DIR}/check.h
|
|
|
+- check.h.in
|
|
|
+- check_error.h
|
|
|
+- check_impl.h
|
|
|
+- check_list.h
|
|
|
+- check_log.h
|
|
|
+- check_msg.h
|
|
|
+- check_pack.h
|
|
|
+- check_print.h
|
|
|
+- check_str.h)
|
|
|
+-
|
|
|
+-configure_file(check.h.in check.h @ONLY)
|
|
|
+-
|
|
|
+-# To maintain compatibility with the Autotools installation
|
|
|
+-# we specifically create both shared and static libraries
|
|
|
+-# as that is what Autotools script has been doing.
|
|
|
+-# Normally CMake would create the system's native default library type.
|
|
|
+-
|
|
|
+-add_library(check STATIC ${SOURCES} ${HEADERS})
|
|
|
+-add_library(Check::check ALIAS check)
|
|
|
+-
|
|
|
+-
|
|
|
+-# We would like to create an OBJECT library but currently they are
|
|
|
+-# too unreliable and cumbersome,
|
|
|
+-# especially with target_link_libraries and install(EXPORT...
|
|
|
+-# https://stackoverflow.com/questions/38832528/transitive-target-include-directories-on-object-libraries
|
|
|
+-# So we instead do the work twice.
|
|
|
+-add_library(checkShared SHARED ${SOURCES} ${HEADERS})
|
|
|
+-add_library(Check::checkShared ALIAS checkShared)
|
|
|
+-
|
|
|
+ # Add parts of libcompat as required
|
|
|
+-target_sources(check PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../lib/fpclassify.c)
|
|
|
+-target_sources(checkShared PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../lib/fpclassify.c)
|
|
|
++list(APPEND SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/../lib/fpclassify.c)
|
|
|
+
|
|
|
+ if (NOT HAVE_LIBRT)
|
|
|
+- target_sources(check PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../lib/clock_gettime.c)
|
|
|
+- target_sources(check PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../lib/timer_create.c)
|
|
|
+- target_sources(check PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../lib/timer_delete.c)
|
|
|
+- target_sources(check PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../lib/timer_settime.c)
|
|
|
+- target_sources(checkShared PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../lib/clock_gettime.c)
|
|
|
+- target_sources(checkShared PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../lib/timer_create.c)
|
|
|
+- target_sources(checkShared PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../lib/timer_delete.c)
|
|
|
+- target_sources(checkShared PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../lib/timer_settime.c)
|
|
|
++ list(APPEND SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/../lib/clock_gettime.c)
|
|
|
++ list(APPEND SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/../lib/timer_create.c)
|
|
|
++ list(APPEND SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/../lib/timer_delete.c)
|
|
|
++ list(APPEND SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/../lib/timer_settime.c)
|
|
|
+ endif(NOT HAVE_LIBRT)
|
|
|
+
|
|
|
+ if(NOT HAVE_GETLINE)
|
|
|
+- target_sources(check PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../lib/getline.c)
|
|
|
+- target_sources(checkShared PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../lib/getline.c)
|
|
|
++ list(APPEND SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/../lib/getline.c)
|
|
|
+ endif(NOT HAVE_GETLINE)
|
|
|
+
|
|
|
+ if(NOT HAVE_GETTIMEOFDAY)
|
|
|
+- target_sources(check PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../lib/gettimeofday.c)
|
|
|
+- target_sources(checkShared PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../lib/gettimeofday.c)
|
|
|
++ list(APPEND SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/../lib/gettimeofday.c)
|
|
|
+ endif(NOT HAVE_GETTIMEOFDAY)
|
|
|
+
|
|
|
+ if(NOT HAVE_DECL_LOCALTIME_R)
|
|
|
+- target_sources(check PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../lib/localtime_r.c)
|
|
|
+- target_sources(checkShared PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../lib/localtime_r.c)
|
|
|
++ list(APPEND SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/../lib/localtime_r.c)
|
|
|
+ endif(NOT HAVE_DECL_LOCALTIME_R)
|
|
|
+
|
|
|
+ if(NOT HAVE_MALLOC)
|
|
|
+- target_sources(check PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../lib/malloc.c)
|
|
|
+- target_sources(checkShared PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../lib/malloc.c)
|
|
|
++ list(APPEND SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/../lib/malloc.c)
|
|
|
+ endif(NOT HAVE_MALLOC)
|
|
|
+
|
|
|
+ if(NOT HAVE_REALLOC)
|
|
|
+- target_sources(check PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../lib/realloc.c)
|
|
|
+- target_sources(checkShared PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../lib/realloc.c)
|
|
|
++ list(APPEND SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/../lib/realloc.c)
|
|
|
+ endif(NOT HAVE_REALLOC)
|
|
|
+
|
|
|
+ if(NOT HAVE_SNPRINTF)
|
|
|
+- target_sources(check PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../lib/snprintf.c)
|
|
|
+- target_sources(checkShared PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../lib/snprintf.c)
|
|
|
++ list(APPEND SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/../lib/snprintf.c)
|
|
|
+ endif(NOT HAVE_SNPRINTF)
|
|
|
+
|
|
|
+ if(NOT HAVE_DECL_STRDUP AND NOT HAVE__STRDUP)
|
|
|
+- target_sources(check PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../lib/strdup.c)
|
|
|
+- target_sources(checkShared PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../lib/snprintf.c)
|
|
|
++ list(APPEND SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/../lib/strdup.c)
|
|
|
+ endif(NOT HAVE_DECL_STRDUP AND NOT HAVE__STRDUP)
|
|
|
+
|
|
|
+ if(NOT HAVE_DECL_STRSIGNAL)
|
|
|
+- target_sources(check PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../lib/strsignal.c)
|
|
|
+- target_sources(checkShared PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../lib/strsignal.c)
|
|
|
++ list(APPEND SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/../lib/strsignal.c)
|
|
|
+ endif(NOT HAVE_DECL_STRSIGNAL)
|
|
|
+
|
|
|
+ if(NOT HAVE_DECL_ALARM)
|
|
|
+- target_sources(check PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../lib/alarm.c)
|
|
|
+- target_sources(checkShared PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../lib/alarm.c)
|
|
|
++ list(APPEND SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/../lib/alarm.c)
|
|
|
+ endif(NOT HAVE_DECL_ALARM)
|
|
|
+
|
|
|
+ if(NOT HAVE_PTHREAD)
|
|
|
+- target_sources(check PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../lib/pthread_mutex.c)
|
|
|
+- target_sources(checkShared PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../lib/pthread_mutex.c)
|
|
|
++ list(APPEND SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/../lib/pthread_mutex.c)
|
|
|
+ endif()
|
|
|
+
|
|
|
++set(HEADERS
|
|
|
++ ${CONFIG_HEADER}
|
|
|
++ ${CMAKE_CURRENT_BINARY_DIR}/check.h
|
|
|
++ check.h.in
|
|
|
++ check_error.h
|
|
|
++ check_impl.h
|
|
|
++ check_list.h
|
|
|
++ check_log.h
|
|
|
++ check_msg.h
|
|
|
++ check_pack.h
|
|
|
++ check_print.h
|
|
|
++ check_str.h)
|
|
|
++
|
|
|
++configure_file(check.h.in check.h @ONLY)
|
|
|
++
|
|
|
++# To maintain compatibility with the Autotools installation
|
|
|
++# we specifically create both shared and static libraries
|
|
|
++# as that is what Autotools script has been doing.
|
|
|
++# Normally CMake would create the system's native default library type.
|
|
|
++
|
|
|
++add_library(check STATIC ${SOURCES} ${HEADERS})
|
|
|
++add_library(Check::check ALIAS check)
|
|
|
++
|
|
|
++# We would like to create an OBJECT library but currently they are
|
|
|
++# too unreliable and cumbersome,
|
|
|
++# especially with target_link_libraries and install(EXPORT...
|
|
|
++# https://stackoverflow.com/questions/38832528/transitive-target-include-directories-on-object-libraries
|
|
|
++# So we instead do the work twice.
|
|
|
++if (BUILD_SHARED_LIBS)
|
|
|
++ add_library(checkShared SHARED ${SOURCES} ${HEADERS})
|
|
|
++ add_library(Check::checkShared ALIAS checkShared)
|
|
|
++endif (BUILD_SHARED_LIBS)
|
|
|
++
|
|
|
+ # Include libraries if available
|
|
|
+ if (HAVE_LIBM)
|
|
|
+- target_link_libraries(check PUBLIC m)
|
|
|
+- target_link_libraries(checkShared PUBLIC m)
|
|
|
++ list(APPEND ADDITIONAL_LIBS m)
|
|
|
+ endif (HAVE_LIBM)
|
|
|
+ if (HAVE_LIBRT)
|
|
|
+- target_link_libraries(check PUBLIC rt)
|
|
|
+- target_link_libraries(checkShared PUBLIC rt)
|
|
|
++ list(APPEND ADDITIONAL_LIBS rt)
|
|
|
+ endif (HAVE_LIBRT)
|
|
|
+ if (HAVE_SUBUNIT)
|
|
|
+- target_link_libraries(check PUBLIC subunit)
|
|
|
+- target_link_libraries(checkShared PUBLIC subunit)
|
|
|
++ list(APPEND ADDITIONAL_LIBS subunit)
|
|
|
+ endif (HAVE_SUBUNIT)
|
|
|
+
|
|
|
++target_link_libraries(check PUBLIC ${ADDITIONAL_LIBS})
|
|
|
++if (BUILD_SHARED_LIBS)
|
|
|
++ target_link_libraries(checkShared PUBLIC m)
|
|
|
++endif (BUILD_SHARED_LIBS)
|
|
|
++
|
|
|
++
|
|
|
+ if(MSVC)
|
|
|
+ target_compile_definitions(checkShared
|
|
|
+ PRIVATE "CK_DLL_EXP=_declspec(dllexport)"
|
|
|
+@@ -168,27 +157,35 @@ if (MSVC)
|
|
|
+ # So we call it this:
|
|
|
+ set(LIBRARY_OUTPUT_NAME "checkDynamic")
|
|
|
+ endif (MSVC)
|
|
|
++if (BUILD_SHARED_LIBS)
|
|
|
+ set_target_properties(checkShared PROPERTIES
|
|
|
+ OUTPUT_NAME ${LIBRARY_OUTPUT_NAME}
|
|
|
+ VERSION ${PROJECT_VERSION}
|
|
|
+ SOVERSION ${PROJECT_VERSION_MAJOR}
|
|
|
+ PUBLIC_HEADER "${public_headers}"
|
|
|
+ )
|
|
|
++endif (BUILD_SHARED_LIBS)
|
|
|
+ target_include_directories(check
|
|
|
+ PUBLIC
|
|
|
+ $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>
|
|
|
+ $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/..>
|
|
|
+ $<INSTALL_INTERFACE:include>
|
|
|
+ )
|
|
|
++if (BUILD_SHARED_LIBS)
|
|
|
+ target_include_directories(checkShared
|
|
|
+ PUBLIC
|
|
|
+ $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>
|
|
|
+ $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/..>
|
|
|
+ $<INSTALL_INTERFACE:include>
|
|
|
+-)
|
|
|
++ )
|
|
|
++endif (BUILD_SHARED_LIBS)
|
|
|
+
|
|
|
+ if(NOT THIS_IS_SUBPROJECT)
|
|
|
+- install(TARGETS check checkShared
|
|
|
++ if (BUILD_SHARED_LIBS)
|
|
|
++ set(SHARED_LIBNAME checkShared)
|
|
|
++ endif ()
|
|
|
++
|
|
|
++ install(TARGETS check ${SHARED_LIBNAME}
|
|
|
+ EXPORT check-targets
|
|
|
+ ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
|
|
+ LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
|
|
+--
|
|
|
+2.45.2
|
|
|
+
|