123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255 |
- 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
|