@@ -62,47 +62,82 @@ ENDMACRO()
62
62
63
63
64
64
# 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
66
78
MACRO (ADD_CONVENIENCE_LIBRARY )
67
79
MYSQL_PARSE_ARGUMENTS (ARG
68
- ""
80
+ "COMPILE_DEFINITIONS;COMPILE_OPTIONS;DEPENDENCIES;INCLUDE_DIRECTORIES;LINK_LIBRARIES "
69
81
"EXCLUDE_FROM_ALL"
70
82
${ARGN}
71
83
)
72
84
LIST (GET ARG_DEFAULT_ARGS 0 TARGET )
73
85
SET (SOURCES ${ARG_DEFAULT_ARGS} )
74
86
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 ()
76
97
77
98
# Collect all static libraries in the same directory
78
99
SET_TARGET_PROPERTIES (${TARGET} PROPERTIES
79
100
ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR} /archive_output_directory )
80
101
81
102
IF (ARG_EXCLUDE_FROM_ALL )
82
- # MESSAGE(STATUS "EXCLUDE_FROM_ALL ${TARGET}")
83
103
SET_PROPERTY (TARGET ${TARGET} PROPERTY EXCLUDE_FROM_ALL TRUE )
84
104
IF (WIN32 )
85
105
SET_PROPERTY (TARGET ${TARGET} PROPERTY EXCLUDE_FROM_DEFAULT_BUILD TRUE )
86
106
ENDIF ()
87
107
ENDIF ()
88
108
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 ()
89
136
90
137
# Keep track of known convenience libraries, in a global scope.
91
138
SET (KNOWN_CONVENIENCE_LIBRARIES
92
139
${KNOWN_CONVENIENCE_LIBRARIES} ${TARGET} CACHE INTERNAL "" FORCE )
93
140
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
- )
106
141
ENDMACRO ()
107
142
108
143
@@ -128,9 +163,9 @@ MACRO(MERGE_LIBRARIES_SHARED)
128
163
129
164
CREATE_EXPORT_FILE (SRC ${TARGET} "${ARG_EXPORTS} " )
130
165
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.
134
169
FOREACH (SYMBOL ${ARG_EXPORTS} )
135
170
IF (APPLE )
136
171
SET (export_link_flags "${export_link_flags} -Wl,-u,_${SYMBOL} " )
@@ -149,7 +184,6 @@ MACRO(MERGE_LIBRARIES_SHARED)
149
184
IF (NOT ARG_SKIP_INSTALL )
150
185
MESSAGE (FATAL_ERROR "EXCLUDE_FROM_ALL requires SKIP_INSTALL" )
151
186
ENDIF ()
152
- # MESSAGE(STATUS "EXCLUDE_FROM_ALL ${TARGET}")
153
187
SET_PROPERTY (TARGET ${TARGET} PROPERTY EXCLUDE_FROM_ALL TRUE )
154
188
IF (WIN32 )
155
189
SET_PROPERTY (TARGET ${TARGET} PROPERTY EXCLUDE_FROM_DEFAULT_BUILD TRUE )
@@ -160,7 +194,8 @@ MACRO(MERGE_LIBRARIES_SHARED)
160
194
SET_TARGET_PROPERTIES (${TARGET} PROPERTIES
161
195
LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR} /library_output_directory )
162
196
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" )
164
199
ENDIF ()
165
200
166
201
IF (WIN32 )
@@ -249,7 +284,6 @@ MACRO(MERGE_CONVENIENCE_LIBRARIES)
249
284
IF (NOT ARG_SKIP_INSTALL )
250
285
MESSAGE (FATAL_ERROR "EXCLUDE_FROM_ALL requires SKIP_INSTALL" )
251
286
ENDIF ()
252
- # MESSAGE(STATUS "EXCLUDE_FROM_ALL ${TARGET}")
253
287
SET_PROPERTY (TARGET ${TARGET} PROPERTY EXCLUDE_FROM_ALL TRUE )
254
288
IF (WIN32 )
255
289
SET_PROPERTY (TARGET ${TARGET} PROPERTY EXCLUDE_FROM_DEFAULT_BUILD TRUE )
@@ -287,12 +321,6 @@ MACRO(MERGE_CONVENIENCE_LIBRARIES)
287
321
# MESSAGE(STATUS "LIB ${LIB} LIB_TYPE ${LIB_TYPE}")
288
322
ENDFOREACH ()
289
323
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
-
296
324
# Make the generated dummy source file depended on all static input
297
325
# libs. If input lib changes,the source file is touched
298
326
# which causes the desired effect (relink).
@@ -302,23 +330,46 @@ MACRO(MERGE_CONVENIENCE_LIBRARIES)
302
330
DEPENDS ${MYLIBS}
303
331
)
304
332
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
+
305
371
MESSAGE (STATUS "MERGE_CONVENIENCE_LIBRARIES TARGET ${TARGET} " )
306
372
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
- )
322
373
323
374
IF (NOT ARG_SKIP_INSTALL )
324
375
IF (ARG_COMPONENT )
0 commit comments