-
Notifications
You must be signed in to change notification settings - Fork 25
Expand file tree
/
Copy pathcomponent.cmake
More file actions
174 lines (150 loc) · 6.29 KB
/
Copy pathcomponent.cmake
File metadata and controls
174 lines (150 loc) · 6.29 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
# Copyright (c) 2013, 2024, Oracle and/or its affiliates.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License, version 2.0,
# as published by the Free Software Foundation.
#
# This program is designed to work with certain software (including
# but not limited to OpenSSL) that is licensed under separate terms,
# as designated in a particular file or component or in included license
# documentation. The authors of MySQL hereby grant you an additional
# permission to link the program and your derivative works with the
# separately licensed software that they have either included with
# the program or referenced in the documentation.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License, version 2.0, for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
# MYSQL_ADD_COMPONENT(component sources... options/keywords...)
MACRO(MYSQL_ADD_COMPONENT component_arg)
SET(COMPONENT_OPTIONS
MODULE_ONLY # generate dynamic library
SKIP_INSTALL
STATIC # generate new static library
TEST_ONLY # include library only with test distribution
)
SET(COMPONENT_ONE_VALUE_KW
)
SET(COMPONENT_MULTI_VALUE_KW
LINK_LIBRARIES # lib1 ... libN
)
CMAKE_PARSE_ARGUMENTS(ARG
"${COMPONENT_OPTIONS}"
"${COMPONENT_ONE_VALUE_KW}"
"${COMPONENT_MULTI_VALUE_KW}"
${ARGN}
)
SET(component ${component_arg})
SET(SOURCES ${ARG_UNPARSED_ARGUMENTS})
STRING(TOUPPER ${component} component)
STRING(TOLOWER ${component} component_lower)
STRING(TOLOWER component_${component} target)
GET_PROPERTY(CWD_DEFINITIONS DIRECTORY PROPERTY COMPILE_DEFINITIONS)
LIST(FIND CWD_DEFINITIONS "MYSQL_SERVER" FOUND_DEFINITION)
IF(NOT FOUND_DEFINITION EQUAL -1)
MESSAGE(FATAL_ERROR
"component ${component} has -DMYSQL_SERVER")
ENDIF()
# If not dynamic component, add it to list of built-ins
IF (ARG_STATIC)
IF (NOT "${component}" STREQUAL "MYSQL_SERVER")
MESSAGE(FATAL_ERROR "Only one server built-in component is expected.")
ENDIF()
ENDIF()
# Build either static library or module
IF (ARG_STATIC)
SET(kind STATIC)
ELSEIF(ARG_MODULE_ONLY)
SET(kind MODULE)
ELSE()
MESSAGE(FATAL_ERROR "Unknown component type ${target}")
ENDIF()
ADD_VERSION_INFO(${kind} SOURCES "")
ADD_LIBRARY(${target} ${kind} ${SOURCES})
TARGET_COMPILE_DEFINITIONS(${target} PUBLIC MYSQL_COMPONENT)
IF(COMPRESS_DEBUG_SECTIONS)
MY_TARGET_LINK_OPTIONS(${target}
"LINKER:--compress-debug-sections=zlib")
ENDIF()
IF(ARG_LINK_LIBRARIES)
TARGET_LINK_LIBRARIES(${target} ${ARG_LINK_LIBRARIES})
ENDIF()
SET_TARGET_PROPERTIES(${target} PROPERTIES PREFIX "")
ADD_DEPENDENCIES(${target} GenError)
IF (ARG_MODULE_ONLY)
SET_TARGET_PROPERTIES(${target} PROPERTIES OUTPUT_NAME "${target}")
# Store all components in the same directory, for easier testing.
SET_TARGET_PROPERTIES(${target} PROPERTIES
LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/plugin_output_directory
)
# For APPLE: adjust path dependecy for SSL shared libraries.
SET_PATH_TO_CUSTOM_SSL_FOR_APPLE(${target})
IF(APPLE)
TARGET_LINK_OPTIONS(${target} PRIVATE LINKER:-no_warn_duplicate_libraries)
ENDIF()
IF(WIN32_CLANG AND WITH_ASAN)
TARGET_LINK_LIBRARIES(${target}
"${ASAN_LIB_DIR}/clang_rt.asan_dll_thunk-x86_64.lib")
ENDIF()
# To hide the component symbols in the shared object
IF(UNIX)
# Use this also for component libraries and tests.
SET(COMPONENT_COMPILE_VISIBILITY
"-fvisibility=hidden" CACHE INTERNAL
"Use -fvisibility=hidden for components" FORCE)
# By default gcc / clang toolchain, when creating a shared library,
# marks all symbols as 'exported' - __attribute__((visibility("default"))).
# This includes not only the symbols declared explicitly in the library
# source code but also those linked from the dependent static libraries
# as well as symbols instantiated from the standard library templated code.
# This is not a desired behavior for UDF shared objects, MySQL plugins /
# components that rely on dynamic symbol lookups ('dlsym()' calls).
# The exported symbols namespace may be extremely polluted in this case,
# which may lead to slower symbols lookups as well as raising security
# concerns of being able to load symbols not intended originally to be
# loadable.
# The solution is to switch to __attribute__((visibility("hidden"))) by
# default and mark 'exported' only those sybbols that are marked with
# __attribute__((visibility("default"))) explicitly.
# Here, for gcc for instance, CXX_VISIBILITY_PRESET CMake target property
# will be translated into '-fvisibility=hidden' compiler option.
# VISIBILITY_INLINES_HIDDEN as an addition to the previous one will also
# add '-fvisibility-inlines-hidden' (helps a lot with STL code).
SET_TARGET_PROPERTIES(${target} PROPERTIES
CXX_VISIBILITY_PRESET hidden
VISIBILITY_INLINES_HIDDEN YES
)
ENDIF()
IF(NOT ARG_SKIP_INSTALL)
# Install dynamic library.
IF(ARG_TEST_ONLY)
SET(INSTALL_COMPONENT Test)
ELSE()
SET(INSTALL_COMPONENT Server)
ENDIF()
ADD_INSTALL_RPATH_FOR_OPENSSL(${target})
MYSQL_INSTALL_TARGET(${target}
DESTINATION ${INSTALL_PLUGINDIR}
COMPONENT ${INSTALL_COMPONENT})
INSTALL_DEBUG_TARGET(${target}
DESTINATION ${INSTALL_PLUGINDIR}/debug
COMPONENT ${INSTALL_COMPONENT})
ENDIF()
ENDIF()
ADD_DEPENDENCIES(component_all ${target})
ENDMACRO(MYSQL_ADD_COMPONENT)
# Add all CMake projects under components
MACRO(CONFIGURE_COMPONENTS)
FILE(GLOB dirs_components ${CMAKE_SOURCE_DIR}/components/*)
FILE(GLOB dirs_components_test ${CMAKE_SOURCE_DIR}/components/test/*)
FOREACH(dir ${dirs_components} ${dirs_components_test})
IF (EXISTS ${dir}/CMakeLists.txt)
ADD_SUBDIRECTORY(${dir})
ENDIF()
ENDFOREACH()
ENDMACRO()