0001-src-CMakeLists.txt-don-t-build-shared-libraries-when.patch 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255
  1. From 2ae2137d724d5f3a70d5d2856cb979d389c4cbd8 Mon Sep 17 00:00:00 2001
  2. From: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
  3. Date: Fri, 12 Jul 2024 21:30:43 +0200
  4. Subject: [PATCH] src/CMakeLists.txt: don't build shared libraries when not
  5. enabled
  6. BUILD_SHARED_LIBS is a standard CMake option [1] that specifies
  7. whether shared libraries should be built or not. This commit adjusts
  8. src/CMakeLists.txt to observe this variable to decide whether the
  9. shared library variant should be built or not. This allows check to
  10. only build a static library in environments where only a static
  11. library can be compiled.
  12. This needs a bit of refactoring to avoid duplication:
  13. - Additional source files from libcompat are directly added to the
  14. ${SOURCES} variable as needed
  15. - Additional libraries are collected into ${ADDITIONAL_LIBS} before
  16. being associated to the static library and shared library (if enabled)
  17. [1] https://cmake.org/cmake/help/latest/variable/BUILD_SHARED_LIBS.html
  18. Fixes:
  19. __uClibc_main.c:(.text+0x12c): undefined reference to `__fini_array_end'
  20. /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'
  21. /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'
  22. Upstream: https://github.com/libcheck/check/pull/355
  23. Signed-off-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
  24. ---
  25. src/CMakeLists.txt | 137 ++++++++++++++++++++++-----------------------
  26. 1 file changed, 67 insertions(+), 70 deletions(-)
  27. diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
  28. index 4a02dbe..e0cf32b 100644
  29. --- a/src/CMakeLists.txt
  30. +++ b/src/CMakeLists.txt
  31. @@ -31,117 +31,106 @@ set(SOURCES
  32. check_run.c
  33. check_str.c)
  34. -set(HEADERS
  35. - ${CONFIG_HEADER}
  36. - ${CMAKE_CURRENT_BINARY_DIR}/check.h
  37. - check.h.in
  38. - check_error.h
  39. - check_impl.h
  40. - check_list.h
  41. - check_log.h
  42. - check_msg.h
  43. - check_pack.h
  44. - check_print.h
  45. - check_str.h)
  46. -
  47. -configure_file(check.h.in check.h @ONLY)
  48. -
  49. -# To maintain compatibility with the Autotools installation
  50. -# we specifically create both shared and static libraries
  51. -# as that is what Autotools script has been doing.
  52. -# Normally CMake would create the system's native default library type.
  53. -
  54. -add_library(check STATIC ${SOURCES} ${HEADERS})
  55. -add_library(Check::check ALIAS check)
  56. -
  57. -
  58. -# We would like to create an OBJECT library but currently they are
  59. -# too unreliable and cumbersome,
  60. -# especially with target_link_libraries and install(EXPORT...
  61. -# https://stackoverflow.com/questions/38832528/transitive-target-include-directories-on-object-libraries
  62. -# So we instead do the work twice.
  63. -add_library(checkShared SHARED ${SOURCES} ${HEADERS})
  64. -add_library(Check::checkShared ALIAS checkShared)
  65. -
  66. # Add parts of libcompat as required
  67. -target_sources(check PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../lib/fpclassify.c)
  68. -target_sources(checkShared PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../lib/fpclassify.c)
  69. +list(APPEND SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/../lib/fpclassify.c)
  70. if (NOT HAVE_LIBRT)
  71. - target_sources(check PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../lib/clock_gettime.c)
  72. - target_sources(check PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../lib/timer_create.c)
  73. - target_sources(check PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../lib/timer_delete.c)
  74. - target_sources(check PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../lib/timer_settime.c)
  75. - target_sources(checkShared PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../lib/clock_gettime.c)
  76. - target_sources(checkShared PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../lib/timer_create.c)
  77. - target_sources(checkShared PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../lib/timer_delete.c)
  78. - target_sources(checkShared PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../lib/timer_settime.c)
  79. + list(APPEND SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/../lib/clock_gettime.c)
  80. + list(APPEND SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/../lib/timer_create.c)
  81. + list(APPEND SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/../lib/timer_delete.c)
  82. + list(APPEND SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/../lib/timer_settime.c)
  83. endif(NOT HAVE_LIBRT)
  84. if(NOT HAVE_GETLINE)
  85. - target_sources(check PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../lib/getline.c)
  86. - target_sources(checkShared PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../lib/getline.c)
  87. + list(APPEND SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/../lib/getline.c)
  88. endif(NOT HAVE_GETLINE)
  89. if(NOT HAVE_GETTIMEOFDAY)
  90. - target_sources(check PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../lib/gettimeofday.c)
  91. - target_sources(checkShared PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../lib/gettimeofday.c)
  92. + list(APPEND SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/../lib/gettimeofday.c)
  93. endif(NOT HAVE_GETTIMEOFDAY)
  94. if(NOT HAVE_DECL_LOCALTIME_R)
  95. - target_sources(check PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../lib/localtime_r.c)
  96. - target_sources(checkShared PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../lib/localtime_r.c)
  97. + list(APPEND SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/../lib/localtime_r.c)
  98. endif(NOT HAVE_DECL_LOCALTIME_R)
  99. if(NOT HAVE_MALLOC)
  100. - target_sources(check PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../lib/malloc.c)
  101. - target_sources(checkShared PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../lib/malloc.c)
  102. + list(APPEND SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/../lib/malloc.c)
  103. endif(NOT HAVE_MALLOC)
  104. if(NOT HAVE_REALLOC)
  105. - target_sources(check PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../lib/realloc.c)
  106. - target_sources(checkShared PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../lib/realloc.c)
  107. + list(APPEND SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/../lib/realloc.c)
  108. endif(NOT HAVE_REALLOC)
  109. if(NOT HAVE_SNPRINTF)
  110. - target_sources(check PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../lib/snprintf.c)
  111. - target_sources(checkShared PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../lib/snprintf.c)
  112. + list(APPEND SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/../lib/snprintf.c)
  113. endif(NOT HAVE_SNPRINTF)
  114. if(NOT HAVE_DECL_STRDUP AND NOT HAVE__STRDUP)
  115. - target_sources(check PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../lib/strdup.c)
  116. - target_sources(checkShared PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../lib/snprintf.c)
  117. + list(APPEND SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/../lib/strdup.c)
  118. endif(NOT HAVE_DECL_STRDUP AND NOT HAVE__STRDUP)
  119. if(NOT HAVE_DECL_STRSIGNAL)
  120. - target_sources(check PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../lib/strsignal.c)
  121. - target_sources(checkShared PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../lib/strsignal.c)
  122. + list(APPEND SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/../lib/strsignal.c)
  123. endif(NOT HAVE_DECL_STRSIGNAL)
  124. if(NOT HAVE_DECL_ALARM)
  125. - target_sources(check PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../lib/alarm.c)
  126. - target_sources(checkShared PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../lib/alarm.c)
  127. + list(APPEND SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/../lib/alarm.c)
  128. endif(NOT HAVE_DECL_ALARM)
  129. if(NOT HAVE_PTHREAD)
  130. - target_sources(check PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../lib/pthread_mutex.c)
  131. - target_sources(checkShared PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../lib/pthread_mutex.c)
  132. + list(APPEND SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/../lib/pthread_mutex.c)
  133. endif()
  134. +set(HEADERS
  135. + ${CONFIG_HEADER}
  136. + ${CMAKE_CURRENT_BINARY_DIR}/check.h
  137. + check.h.in
  138. + check_error.h
  139. + check_impl.h
  140. + check_list.h
  141. + check_log.h
  142. + check_msg.h
  143. + check_pack.h
  144. + check_print.h
  145. + check_str.h)
  146. +
  147. +configure_file(check.h.in check.h @ONLY)
  148. +
  149. +# To maintain compatibility with the Autotools installation
  150. +# we specifically create both shared and static libraries
  151. +# as that is what Autotools script has been doing.
  152. +# Normally CMake would create the system's native default library type.
  153. +
  154. +add_library(check STATIC ${SOURCES} ${HEADERS})
  155. +add_library(Check::check ALIAS check)
  156. +
  157. +# We would like to create an OBJECT library but currently they are
  158. +# too unreliable and cumbersome,
  159. +# especially with target_link_libraries and install(EXPORT...
  160. +# https://stackoverflow.com/questions/38832528/transitive-target-include-directories-on-object-libraries
  161. +# So we instead do the work twice.
  162. +if (BUILD_SHARED_LIBS)
  163. + add_library(checkShared SHARED ${SOURCES} ${HEADERS})
  164. + add_library(Check::checkShared ALIAS checkShared)
  165. +endif (BUILD_SHARED_LIBS)
  166. +
  167. # Include libraries if available
  168. if (HAVE_LIBM)
  169. - target_link_libraries(check PUBLIC m)
  170. - target_link_libraries(checkShared PUBLIC m)
  171. + list(APPEND ADDITIONAL_LIBS m)
  172. endif (HAVE_LIBM)
  173. if (HAVE_LIBRT)
  174. - target_link_libraries(check PUBLIC rt)
  175. - target_link_libraries(checkShared PUBLIC rt)
  176. + list(APPEND ADDITIONAL_LIBS rt)
  177. endif (HAVE_LIBRT)
  178. if (HAVE_SUBUNIT)
  179. - target_link_libraries(check PUBLIC subunit)
  180. - target_link_libraries(checkShared PUBLIC subunit)
  181. + list(APPEND ADDITIONAL_LIBS subunit)
  182. endif (HAVE_SUBUNIT)
  183. +target_link_libraries(check PUBLIC ${ADDITIONAL_LIBS})
  184. +if (BUILD_SHARED_LIBS)
  185. + target_link_libraries(checkShared PUBLIC m)
  186. +endif (BUILD_SHARED_LIBS)
  187. +
  188. +
  189. if(MSVC)
  190. target_compile_definitions(checkShared
  191. PRIVATE "CK_DLL_EXP=_declspec(dllexport)"
  192. @@ -168,27 +157,35 @@ if (MSVC)
  193. # So we call it this:
  194. set(LIBRARY_OUTPUT_NAME "checkDynamic")
  195. endif (MSVC)
  196. +if (BUILD_SHARED_LIBS)
  197. set_target_properties(checkShared PROPERTIES
  198. OUTPUT_NAME ${LIBRARY_OUTPUT_NAME}
  199. VERSION ${PROJECT_VERSION}
  200. SOVERSION ${PROJECT_VERSION_MAJOR}
  201. PUBLIC_HEADER "${public_headers}"
  202. )
  203. +endif (BUILD_SHARED_LIBS)
  204. target_include_directories(check
  205. PUBLIC
  206. $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>
  207. $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/..>
  208. $<INSTALL_INTERFACE:include>
  209. )
  210. +if (BUILD_SHARED_LIBS)
  211. target_include_directories(checkShared
  212. PUBLIC
  213. $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>
  214. $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/..>
  215. $<INSTALL_INTERFACE:include>
  216. -)
  217. + )
  218. +endif (BUILD_SHARED_LIBS)
  219. if(NOT THIS_IS_SUBPROJECT)
  220. - install(TARGETS check checkShared
  221. + if (BUILD_SHARED_LIBS)
  222. + set(SHARED_LIBNAME checkShared)
  223. + endif ()
  224. +
  225. + install(TARGETS check ${SHARED_LIBNAME}
  226. EXPORT check-targets
  227. ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
  228. LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
  229. --
  230. 2.45.2