2
1
Эх сурвалжийг харах

package/check: don't build shared lib when disabled

The build system of check was unconditionally building a shared
library, even when BUILD_SHARED_LIBS=OFF. This commit brings a patch,
submitted upstream, which fixes this issue, and allows to fix the
build in BR2_STATIC_LIBS=y configurations.

Fixes:

  http://autobuild.buildroot.net/results/d4a1c6d49dd15ce6b73cfade2557d49733e9318b/

Signed-off-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
Thomas Petazzoni 1 жил өмнө
parent
commit
526b89b981

+ 255 - 0
package/check/0001-src-CMakeLists.txt-don-t-build-shared-libraries-when.patch

@@ -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
+