Skip to content

Commit 2eb4200

Browse files
author
Tor Didriksen
committed
Bug#29337090 CMAKE CLEANUP: USE OBJECT LIBRARIES FOR "CONVENIENCE" LIBRARIES
Create OBJECT libraries for all "convenience" libraries. Merge object libraries using the cmake TARGET_SOURCES construct. One exception for Windows: add extra linker flags for link.exe in order to merge OpenSSL libs into mysqlclient One exception for MacOS: merging of OBJECT libraries does not work with Xcode, so we use libtool directly to merge STATIC libraries. This patch raises cmake minimum required version to 3.5.1 Change-Id: I3ece5e1c2c9f6402dc620ae798716c72a09f57e0
1 parent cc49ec7 commit 2eb4200

File tree

12 files changed

+155
-335
lines changed

12 files changed

+155
-335
lines changed

CMakeLists.txt

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ ELSEIF(APPLE)
3737
ENDIF()
3838
ELSEIF(UNIX)
3939
# This is currently minimum version on all supported platforms.
40-
IF(CMAKE_VERSION VERSION_LESS 3.4.3)
40+
IF(CMAKE_VERSION VERSION_LESS 3.5.1)
4141
# Default cmake is 2.8.12.2 on RedHat
4242
IF(EXISTS "/etc/redhat-release")
4343
MESSAGE(WARNING "Please use cmake3 rather than cmake on this platform")
@@ -47,19 +47,40 @@ ELSEIF(UNIX)
4747
ELSE()
4848
MESSAGE(STATUS "Please install cmake3 (yum install cmake3)")
4949
ENDIF()
50+
ELSE()
51+
# On SunOS /opt/csw/bin/cmake is (most likely) too old.
52+
FIND_PROGRAM(MY_UNAME uname /bin /usr/bin /usr/local/bin /sbin)
53+
IF(MY_UNAME)
54+
EXEC_PROGRAM(uname ARGS -s OUTPUT_VARIABLE MY_HOST_SYSTEM_NAME)
55+
IF(MY_HOST_SYSTEM_NAME MATCHES "SunOS")
56+
FIND_PROGRAM(MY_CMAKE cmake /usr/bin
57+
NO_CMAKE_ENVIRONMENT_PATH
58+
NO_SYSTEM_ENVIRONMENT_PATH
59+
)
60+
IF(MY_CMAKE)
61+
MESSAGE(STATUS "Found ${MY_CMAKE}")
62+
EXEC_PROGRAM(${MY_CMAKE} ARGS --version)
63+
ELSE()
64+
MESSAGE(STATUS "Please install /usr/bin/cmake ")
65+
ENDIF()
66+
ENDIF()
67+
ENDIF()
5068
ENDIF()
5169
ENDIF()
5270
ENDIF()
53-
# CMake 3.4.3 is needed for Solaris due to CMake bug 15673.
54-
# 3.4.3 as minimum unless higher is checked above.
55-
CMAKE_MINIMUM_REQUIRED(VERSION 3.4.3)
71+
72+
# CMake 3.5 is needed for TARGET_SOURCES(... $<TARGET_OBJECTS:${LIB}_objlib>)
73+
CMAKE_MINIMUM_REQUIRED(VERSION 3.5.1)
5674

5775
# Explicitly set CMP0018 and CMP0022 = NEW since newer versions of
5876
# CMake has OLD as default even if OLD is deprecated.
5977
# See cmake --help-policy CMP0018 / CMP0022
6078
CMAKE_POLICY(SET CMP0018 NEW)
6179
CMAKE_POLICY(SET CMP0022 NEW)
6280

81+
# Include TARGET_OBJECTS expressions.
82+
CMAKE_POLICY(SET CMP0051 NEW)
83+
6384
# Disallow use of the LOCATION property for build targets.
6485
IF(POLICY CMP0026)
6586
CMAKE_POLICY(SET CMP0026 NEW)

cmake/libutils.cmake

Lines changed: 94 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -62,47 +62,82 @@ ENDMACRO()
6262

6363

6464
# ADD_CONVENIENCE_LIBRARY(name source1...sourceN)
65-
# Create static library that can be merged with other libraries.
65+
# Create an OBJECT library ${name}_objlib containing all object files.
66+
# Create a STATIC library ${name} which can be used for linking.
67+
#
68+
# We use the OBJECT libraries for merging in MERGE_CONVENIENCE_LIBRARIES.
69+
# For APPLE, we create a STATIC library only,
70+
# see comments in MERGE_CONVENIENCE_LIBRARIES for Xcode
71+
#
72+
# Optional arguments:
73+
# [COMPILE_DEFINITIONS ...] for TARGET_COMPILE_DEFINITIONS
74+
# [COMPILE_OPTIONS ...] for TARGET_COMPILE_OPTIONS
75+
# [DEPENDENCIES ...] for ADD_DEPENDENCIES
76+
# [INCLUDE_DIRECTORIES ...] for TARGET_INCLUDE_DIRECTORIES
77+
# [LINK_LIBRARIES ...] for TARGET_LINK_LIBRARIES
6678
MACRO(ADD_CONVENIENCE_LIBRARY)
6779
MYSQL_PARSE_ARGUMENTS(ARG
68-
""
80+
"COMPILE_DEFINITIONS;COMPILE_OPTIONS;DEPENDENCIES;INCLUDE_DIRECTORIES;LINK_LIBRARIES"
6981
"EXCLUDE_FROM_ALL"
7082
${ARGN}
7183
)
7284
LIST(GET ARG_DEFAULT_ARGS 0 TARGET)
7385
SET(SOURCES ${ARG_DEFAULT_ARGS})
7486
LIST(REMOVE_AT SOURCES 0)
75-
ADD_LIBRARY(${TARGET} STATIC ${SOURCES})
87+
88+
# For APPLE, we create a STATIC library only,
89+
IF(APPLE)
90+
SET(TARGET_LIB ${TARGET})
91+
ADD_LIBRARY(${TARGET} STATIC ${SOURCES})
92+
ELSE()
93+
SET(TARGET_LIB ${TARGET}_objlib)
94+
ADD_LIBRARY(${TARGET_LIB} OBJECT ${SOURCES})
95+
ADD_LIBRARY(${TARGET} STATIC $<TARGET_OBJECTS:${TARGET_LIB}>)
96+
ENDIF()
7697

7798
# Collect all static libraries in the same directory
7899
SET_TARGET_PROPERTIES(${TARGET} PROPERTIES
79100
ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/archive_output_directory)
80101

81102
IF(ARG_EXCLUDE_FROM_ALL)
82-
# MESSAGE(STATUS "EXCLUDE_FROM_ALL ${TARGET}")
83103
SET_PROPERTY(TARGET ${TARGET} PROPERTY EXCLUDE_FROM_ALL TRUE)
84104
IF(WIN32)
85105
SET_PROPERTY(TARGET ${TARGET} PROPERTY EXCLUDE_FROM_DEFAULT_BUILD TRUE)
86106
ENDIF()
87107
ENDIF()
88108

109+
# Add COMPILE_DEFINITIONS to _objlib
110+
IF(ARG_COMPILE_DEFINITIONS)
111+
TARGET_COMPILE_DEFINITIONS(${TARGET_LIB} PRIVATE
112+
${ARG_COMPILE_DEFINITIONS})
113+
ENDIF()
114+
115+
# Add COMPILE_OPTIONS to _objlib
116+
IF(ARG_COMPILE_OPTIONS)
117+
TARGET_COMPILE_OPTIONS(${TARGET_LIB} PRIVATE
118+
${ARG_COMPILE_OPTIONS})
119+
ENDIF()
120+
121+
# Add DEPENDENCIES to _objlib
122+
IF(ARG_DEPENDENCIES)
123+
ADD_DEPENDENCIES(${TARGET_LIB} ${ARG_DEPENDENCIES})
124+
ENDIF()
125+
126+
# Add INCLUDE_DIRECTORIES to _objlib
127+
IF(ARG_INCLUDE_DIRECTORIES)
128+
TARGET_INCLUDE_DIRECTORIES(${TARGET_LIB} PRIVATE
129+
${ARG_INCLUDE_DIRECTORIES})
130+
ENDIF()
131+
132+
# Add LINK_LIBRARIES to static lib
133+
IF(ARG_LINK_LIBRARIES)
134+
TARGET_LINK_LIBRARIES(${TARGET} ${ARG_LINK_LIBRARIES})
135+
ENDIF()
89136

90137
# Keep track of known convenience libraries, in a global scope.
91138
SET(KNOWN_CONVENIENCE_LIBRARIES
92139
${KNOWN_CONVENIENCE_LIBRARIES} ${TARGET} CACHE INTERNAL "" FORCE)
93140

94-
# Generate a cmake file which will save the name of the library.
95-
CONFIGURE_FILE(
96-
${MYSQL_CMAKE_SCRIPT_DIR}/save_archive_location.cmake.in
97-
${CMAKE_BINARY_DIR}/archive_output_directory/lib_location_${TARGET}.cmake
98-
@ONLY)
99-
ADD_CUSTOM_COMMAND(TARGET ${TARGET} POST_BUILD
100-
COMMAND ${CMAKE_COMMAND}
101-
-DTARGET_NAME=${TARGET}
102-
-DTARGET_LOC=$<TARGET_FILE:${TARGET}>
103-
-DCFG_INTDIR=${CMAKE_CFG_INTDIR}
104-
-P ${CMAKE_BINARY_DIR}/archive_output_directory/lib_location_${TARGET}.cmake
105-
)
106141
ENDMACRO()
107142

108143

@@ -128,9 +163,9 @@ MACRO(MERGE_LIBRARIES_SHARED)
128163

129164
CREATE_EXPORT_FILE(SRC ${TARGET} "${ARG_EXPORTS}")
130165
IF(UNIX)
131-
# Mark every export as explicitly needed, so that ld won't remove the .a files
132-
# containing them. This has a similar effect as --Wl,--no-whole-archive,
133-
# but is more focused.
166+
# Mark every export as explicitly needed, so that ld won't remove the
167+
# .a files containing them. This has a similar effect as
168+
# --Wl,--no-whole-archive, but is more focused.
134169
FOREACH(SYMBOL ${ARG_EXPORTS})
135170
IF(APPLE)
136171
SET(export_link_flags "${export_link_flags} -Wl,-u,_${SYMBOL}")
@@ -149,7 +184,6 @@ MACRO(MERGE_LIBRARIES_SHARED)
149184
IF(NOT ARG_SKIP_INSTALL)
150185
MESSAGE(FATAL_ERROR "EXCLUDE_FROM_ALL requires SKIP_INSTALL")
151186
ENDIF()
152-
# MESSAGE(STATUS "EXCLUDE_FROM_ALL ${TARGET}")
153187
SET_PROPERTY(TARGET ${TARGET} PROPERTY EXCLUDE_FROM_ALL TRUE)
154188
IF(WIN32)
155189
SET_PROPERTY(TARGET ${TARGET} PROPERTY EXCLUDE_FROM_DEFAULT_BUILD TRUE)
@@ -160,7 +194,8 @@ MACRO(MERGE_LIBRARIES_SHARED)
160194
SET_TARGET_PROPERTIES(${TARGET} PROPERTIES
161195
LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/library_output_directory)
162196
IF(WIN32_CLANG AND WITH_ASAN)
163-
TARGET_LINK_LIBRARIES(${TARGET} PRIVATE "${ASAN_LIB_DIR}/clang_rt.asan_dll_thunk-x86_64.lib")
197+
TARGET_LINK_LIBRARIES(${TARGET} PRIVATE
198+
"${ASAN_LIB_DIR}/clang_rt.asan_dll_thunk-x86_64.lib")
164199
ENDIF()
165200

166201
IF(WIN32)
@@ -249,7 +284,6 @@ MACRO(MERGE_CONVENIENCE_LIBRARIES)
249284
IF(NOT ARG_SKIP_INSTALL)
250285
MESSAGE(FATAL_ERROR "EXCLUDE_FROM_ALL requires SKIP_INSTALL")
251286
ENDIF()
252-
# MESSAGE(STATUS "EXCLUDE_FROM_ALL ${TARGET}")
253287
SET_PROPERTY(TARGET ${TARGET} PROPERTY EXCLUDE_FROM_ALL TRUE)
254288
IF(WIN32)
255289
SET_PROPERTY(TARGET ${TARGET} PROPERTY EXCLUDE_FROM_DEFAULT_BUILD TRUE)
@@ -287,12 +321,6 @@ MACRO(MERGE_CONVENIENCE_LIBRARIES)
287321
# MESSAGE(STATUS "LIB ${LIB} LIB_TYPE ${LIB_TYPE}")
288322
ENDFOREACH()
289323

290-
IF(OSLIBS)
291-
LIST(REMOVE_DUPLICATES OSLIBS)
292-
TARGET_LINK_LIBRARIES(${TARGET} PRIVATE ${OSLIBS})
293-
MESSAGE(STATUS "Library ${TARGET} depends on OSLIBS ${OSLIBS}")
294-
ENDIF()
295-
296324
# Make the generated dummy source file depended on all static input
297325
# libs. If input lib changes,the source file is touched
298326
# which causes the desired effect (relink).
@@ -302,23 +330,46 @@ MACRO(MERGE_CONVENIENCE_LIBRARIES)
302330
DEPENDS ${MYLIBS}
303331
)
304332

333+
# For Xcode the merging of TARGET_OBJECTS does not work.
334+
# Rather than having a special implementation for Xcode only,
335+
# we always use libtool directly for merging libraries.
336+
IF(APPLE)
337+
SET(STATIC_LIBS_STRING)
338+
FOREACH(LIB ${MYLIBS})
339+
STRING_APPEND(STATIC_LIBS_STRING " $<TARGET_FILE:${LIB}>")
340+
ENDFOREACH()
341+
# Convert string to list
342+
STRING(REGEX REPLACE "[ ]+" ";" STATIC_LIBS_STRING "${STATIC_LIBS_STRING}" )
343+
ADD_CUSTOM_COMMAND(TARGET ${TARGET} POST_BUILD
344+
COMMAND rm $<TARGET_FILE:${TARGET}>
345+
COMMAND /usr/bin/libtool -static -o $<TARGET_FILE:${TARGET}>
346+
${STATIC_LIBS_STRING}
347+
)
348+
ELSE()
349+
FOREACH(LIB ${MYLIBS})
350+
TARGET_SOURCES(${TARGET} PRIVATE $<TARGET_OBJECTS:${LIB}_objlib>)
351+
ENDFOREACH()
352+
ENDIF()
353+
354+
# On Windows, ssleay32.lib/libeay32.lib or libssl.lib/libcrypto.lib
355+
# must be merged into mysqlclient.lib
356+
IF(WIN32 AND ${TARGET} STREQUAL "mysqlclient")
357+
SET(LINKER_EXTRA_FLAGS "")
358+
FOREACH(LIB ${SSL_LIBRARIES})
359+
STRING_APPEND(LINKER_EXTRA_FLAGS " ${LIB}")
360+
ENDFOREACH()
361+
SET_TARGET_PROPERTIES(${TARGET}
362+
PROPERTIES STATIC_LIBRARY_FLAGS "${LINKER_EXTRA_FLAGS}")
363+
ENDIF()
364+
365+
IF(OSLIBS)
366+
LIST(REMOVE_DUPLICATES OSLIBS)
367+
TARGET_LINK_LIBRARIES(${TARGET} PRIVATE ${OSLIBS})
368+
MESSAGE(STATUS "Library ${TARGET} depends on OSLIBS ${OSLIBS}")
369+
ENDIF()
370+
305371
MESSAGE(STATUS "MERGE_CONVENIENCE_LIBRARIES TARGET ${TARGET}")
306372
MESSAGE(STATUS "MERGE_CONVENIENCE_LIBRARIES LIBS ${LIBS}")
307-
MESSAGE(STATUS "MERGE_CONVENIENCE_LIBRARIES MYLIBS ${MYLIBS}")
308-
309-
CONFIGURE_FILE(
310-
${MYSQL_CMAKE_SCRIPT_DIR}/merge_archives.cmake.in
311-
${CMAKE_BINARY_DIR}/archive_output_directory/lib_merge_${TARGET}.cmake
312-
@ONLY)
313-
ADD_CUSTOM_COMMAND(TARGET ${TARGET} POST_BUILD
314-
COMMAND ${CMAKE_COMMAND}
315-
-DTARGET_NAME=${TARGET}
316-
-DTARGET_LOC=$<TARGET_FILE:${TARGET}>
317-
-DTARGET_LINK_FLAGS=$<TARGET_PROPERTY:${TARGET},LINK_FLAGS>
318-
-DCFG_INTDIR=${CMAKE_CFG_INTDIR}
319-
-P ${CMAKE_BINARY_DIR}/archive_output_directory/lib_merge_${TARGET}.cmake
320-
COMMENT "Merging library ${TARGET}"
321-
)
322373

323374
IF(NOT ARG_SKIP_INSTALL)
324375
IF(ARG_COMPONENT)

0 commit comments

Comments
 (0)