forked from aws/aws-sdk-cpp
-
Notifications
You must be signed in to change notification settings - Fork 0
/
AWSSDKConfig.cmake
316 lines (267 loc) · 14.5 KB
/
AWSSDKConfig.cmake
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
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
# SPDX-License-Identifier: Apache-2.0.
#
# When using AWSSDK package, users need to tell the installation root dir
# by setting up variable as set(AWSSDK_ROOT_DIR, "<path/to/dir>")
# In Windows the dir is like C:/Progra~1/AWSSDK/
# In Unix like system the dir is like /usr/local/
# if AWSSDK_ROOT_DIR doesn't appear, this module will identify it automatically
# By default:
# The cmake files will all be in <prefix>/lib/cmake dir
# The headers will all be in <prefix>/include dir
# The libraries will all be in <prefix>/lib/<platform_prefix> dir
# The binaries will all be in <prefix>/bin/<platform_prefix> dir
# The archives will all be in <prefix>/lib/<platform_prefix> dir if target is shared,
# otherwise will be in <prefix>/bin/<platform_prefix> dir.
# Platform_prefix is determined on compile time nbu option SIMPLE_INSTALL
# such as "<linux/intel64>"
if(AWSSDK_FOUND)
return()
endif()
include(${CMAKE_CURRENT_LIST_DIR}/sdksCommon.cmake)
include(${CMAKE_CURRENT_LIST_DIR}/platformDeps.cmake)
include(${CMAKE_CURRENT_LIST_DIR}/compiler_settings.cmake)
if (NOT AWSSDK_INSTALL_LIBDIR)
set(AWSSDK_INSTALL_LIBDIR "lib")
endif()
if (NOT AWSSDK_INSTALL_BINDIR)
set(AWSSDK_INSTALL_BINDIR "bin")
endif()
if (NOT AWSSDK_INSTALL_INCLUDEDIR)
set(AWSSDK_INSTALL_INCLUDEDIR "include")
endif()
if (DEFINED CMAKE_PREFIX_PATH)
file(TO_CMAKE_PATH "${CMAKE_PREFIX_PATH}" CMAKE_PREFIX_PATH)
endif()
if (DEFINED CMAKE_INSTALL_PREFIX)
file(TO_CMAKE_PATH "${CMAKE_INSTALL_PREFIX}" CMAKE_INSTALL_PREFIX)
endif()
set(AWS_MODULE_DIR "/${AWSSDK_INSTALL_LIBDIR}/cmake")
string(REPLACE ";" "${AWS_MODULE_DIR};" AWS_MODULE_PATH "${CMAKE_PREFIX_PATH}${AWS_MODULE_DIR}")
string(REPLACE ";" "${AWS_MODULE_DIR};" SYSTEM_MODULE_PATH "${CMAKE_SYSTEM_PREFIX_PATH}${AWS_MODULE_DIR}")
list(APPEND CMAKE_MODULE_PATH ${AWS_MODULE_PATH} ${SYSTEM_MODULE_PATH})
# On Windows, dlls are treated as runtime target and installed in bindir
if (WIN32 AND AWSSDK_INSTALL_AS_SHARED_LIBS)
set(AWSSDK_INSTALL_LIBDIR "${AWSSDK_INSTALL_BINDIR}")
# If installed CMake scripts are associated with dll library, define USE_IMPORT_EXPORT for customers
add_definitions(-DUSE_IMPORT_EXPORT)
endif()
# Compute the default installation root relative to this file.
# from prefix/lib/cmake/AWSSDK/xx.cmake to prefix
get_filename_component(AWSSDK_DEFAULT_ROOT_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH)
get_filename_component(AWSSDK_DEFAULT_ROOT_DIR "${AWSSDK_DEFAULT_ROOT_DIR}" PATH)
get_filename_component(AWSSDK_DEFAULT_ROOT_DIR "${AWSSDK_DEFAULT_ROOT_DIR}" PATH)
get_filename_component(AWSSDK_DEFAULT_ROOT_DIR "${AWSSDK_DEFAULT_ROOT_DIR}" PATH)
get_filename_component(AWS_NATIVE_SDK_ROOT "${CMAKE_CURRENT_SOURCE_DIR}" ABSOLUTE)
set(CPP_STANDARD "11" CACHE STRING "Flag to upgrade the C++ standard used. The default is 11. The minimum is 11.")
if(AWSSDK_DEFAULT_ROOT_DIR STREQUAL "/")
set(AWSSDK_DEFAULT_ROOT_DIR "")
endif()
# currently AWSSDK_ROOT_DIR is either empty or user specified
if (AWSSDK_ROOT_DIR)
find_file(AWSSDK_CORE_HEADER_FILE Aws.h
"${AWSSDK_ROOT_DIR}/${AWSSDK_INSTALL_INCLUDEDIR}/aws/core"
"${AWSSDK_DEFAULT_ROOT_DIR}/${AWSSDK_INSTALL_INCLUDEDIR}/aws/core"
)
else()
find_file(AWSSDK_CORE_HEADER_FILE Aws.h
"${AWSSDK_DEFAULT_ROOT_DIR}/${AWSSDK_INSTALL_INCLUDEDIR}/aws/core"
"/usr/${AWSSDK_INSTALL_INCLUDEDIR}/aws/core"
"/usr/local/${AWSSDK_INSTALL_INCLUDEDIR}/aws/core"
"C:/Progra~1/AWSSDK/${AWSSDK_INSTALL_INCLUDEDIR}/aws/core"
"C:/Program Files/AWSSDK/${AWSSDK_INSTALL_INCLUDEDIR}/aws/core"
"C:/Program Files/aws-cpp-sdk-all/${AWSSDK_INSTALL_INCLUDEDIR}/aws/core"
"C:/Program Files (x86)/aws-cpp-sdk-all/${AWSSDK_INSTALL_INCLUDEDIR}/aws/core"
"C:/AWSSDK/${AWSSDK_INSTALL_INCLUDEDIR}/aws/core"
)
endif()
if (NOT AWSSDK_CORE_HEADER_FILE)
message(FATAL_ERROR "AWS SDK for C++ is missing, please install it first")
endif()
if (IS_ABSOLUTE ${AWSSDK_INSTALL_LIBDIR})
set(AWSSDK_ROOT_DIR "")
else()
# based on core header file path, inspects the actual AWSSDK_ROOT_DIR
get_filename_component(AWSSDK_ROOT_DIR "${AWSSDK_CORE_HEADER_FILE}" PATH)
get_filename_component(AWSSDK_ROOT_DIR "${AWSSDK_ROOT_DIR}" PATH)
get_filename_component(AWSSDK_ROOT_DIR "${AWSSDK_ROOT_DIR}" PATH)
get_filename_component(AWSSDK_ROOT_DIR "${AWSSDK_ROOT_DIR}" PATH)
if (NOT AWSSDK_ROOT_DIR)
message(FATAL_ERROR "AWSSDK_ROOT_DIR is not set or can't be calculated from the path of core header file")
endif()
endif()
find_library(AWSSDK_CORE_LIB_FILE aws-cpp-sdk-core
"${AWSSDK_ROOT_DIR}/${AWSSDK_INSTALL_LIBDIR}/${AWSSDK_PLATFORM_PREFIX}"
"${AWSSDK_ROOT_DIR}/${AWSSDK_INSTALL_LIBDIR}/${AWSSDK_PLATFORM_PREFIX}/Debug"
"${AWSSDK_ROOT_DIR}/${AWSSDK_INSTALL_LIBDIR}/${AWSSDK_PLATFORM_PREFIX}/DebugOpt"
"${AWSSDK_ROOT_DIR}/${AWSSDK_INSTALL_LIBDIR}/${AWSSDK_PLATFORM_PREFIX}/Release"
"${AWSSDK_ROOT_DIR}/${AWSSDK_INSTALL_LIBDIR}/${AWSSDK_PLATFORM_PREFIX}/RelWithDebInfo"
"${AWSSDK_ROOT_DIR}/${AWSSDK_INSTALL_LIBDIR}/${AWSSDK_PLATFORM_PREFIX}/MinSizeRel"
NO_DEFAULT_PATH)
if (NOT AWSSDK_CORE_LIB_FILE)
message(FATAL_ERROR "AWS SDK for C++ headers found, but we were unable to locate the binaries. Have you deleted or moved it?
Please make sure header files and binaries are located in INSTALL_ROOT_DIR/INCLUDE_DIR/ and INSTALL_ROOT_DIR/LIB_DIR/[PLATFORM_PREFIX]/[Debug|Config|OtherConfigs]")
endif()
# based on AWSSDK_CORE_LIB_FILE path, inspects the actual AWSSDK_PLATFORM_PREFIX
get_filename_component(TEMP_PATH "${AWSSDK_CORE_LIB_FILE}" PATH)
get_filename_component(TEMP_NAME "${TEMP_PATH}" NAME)
if (LIB_SEARCH_PREFIX)
while (NOT TEMP_NAME STREQUAL "${LIB_SEARCH_PREFIX}")
set(TEMP_PLATFORM_PREFIX "${TEMP_NAME}/${TEMP_PLATFORM_PREFIX}")
get_filename_component(TEMP_PATH "${TEMP_PATH}" PATH)
get_filename_component(TEMP_NAME "${TEMP_PATH}" NAME)
endwhile()
endif()
set(AWSSDK_PLATFORM_PREFIX "${TEMP_PLATFORM_PREFIX}")
set(AWSSDK_FOUND TRUE)
set(AWSSDK_INCLUDE_DIR "${AWSSDK_ROOT_DIR}/${AWSSDK_INSTALL_INCLUDEDIR}")
set(AWSSDK_CMAKE_DIR "${AWSSDK_ROOT_DIR}/${AWSSDK_INSTALL_LIBDIR}/cmake")
set(AWSSDK_LIB_DIR "${AWSSDK_ROOT_DIR}/${AWSSDK_INSTALL_LIBDIR}/${AWSSDK_PLATFORM_PREFIX}")
set(AWSSDK_BIN_DIR "${AWSSDK_ROOT_DIR}/${AWSSDK_INSTALL_BINDIR}/${AWSSDK_PLATFORM_PREFIX}")
if (AWSSDK_PLATFORM_DEPS_LIBS)
set(AWSSDK_PLATFORM_DEPS "${AWSSDK_PLATFORM_DEPS_LIBS}")
endif()
if (AWSSDK_CRYPTO_LIBS)
set(AWSSDK_PLATFORM_DEPS "${AWSSDK_PLATFORM_DEPS}" "${AWSSDK_CRYPTO_LIBS}")
endif()
if (AWSSDK_CLIENT_LIBS)
set(AWSSDK_PLATFORM_DEPS "${AWSSDK_PLATFORM_DEPS}" "${AWSSDK_CLIENT_LIBS}")
endif()
if (AWSSDK_ADDITIONAL_LIBS)
set(AWSSDK_PLATFORM_DEPS "${AWSSDK_PLATFORM_DEPS}" "${AWSSDK_ADDITIONAL_LIBS}")
endif()
message(STATUS "Found AWS SDK for C++, Version: ${AWSSDK_VERSION}, Install Root:${AWSSDK_ROOT_DIR}, Platform Prefix:${AWSSDK_PLATFORM_PREFIX}, Platform Dependent Libraries: ${AWSSDK_PLATFORM_DEPS}")
# copy libs of services in SERVICE_LIST and all there dependent libs to DEST_DIR
# CONFIG denote copy release or debug version
macro(AWSSDK_CPY_DYN_LIBS SERVICE_LIST CONFIG DEST_DIR)
set(ALL_SERVICES "core" ${AWSSDK_COMMON_RUNTIME_LIBS})
foreach(SVC IN LISTS ${SERVICE_LIST})
list(APPEND ALL_SERVICES ${SVC})
get_dependencies_for_sdk(${SVC} DEPENDENCY_LIST)
if (DEPENDENCY_LIST)
string(REPLACE "," ";" LIST_RESULT ${DEPENDENCY_LIST})
list(APPEND ALL_SERVICES ${LIST_RESULT})
endif()
unset(DEPENDENCY_LIST CACHE)
endforeach()
list(REMOVE_DUPLICATES ALL_SERVICES)
foreach(SVC IN LISTS ALL_SERVICES)
if (WIN32)
set(CMAKE_FIND_LIBRARY_SUFFIXES_TEMP ${CMAKE_FIND_LIBRARY_SUFFIXES})
set(CMAKE_FIND_LIBRARY_SUFFIXES ".dll")
endif()
find_library(LIB_PATH "aws-cpp-sdk-${SVC}" "${AWSSDK_LIB_DIR}/${CONFIG}" NO_DEFAULT_PATH)
if (NOT LIB_PATH)
find_library(LIB_PATH "${SVC}" "${AWSSDK_LIB_DIR}/${CONFIG}" NO_DEFAULT_PATH)
if (NOT LIB_PATH)
message(FATAL_ERROR "Couldn't find library aws-cpp-sdk-${SVC} or ${SVC}")
endif()
endif()
file(COPY ${LIB_PATH} DESTINATION ${DEST_DIR})
unset(LIB_PATH CACHE)
if (WIN32)
set(CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES_TEMP})
endif()
endforeach()
endmacro(AWSSDK_CPY_DYN_LIBS)
# output link libs command to OUTPUT_VAR which required by all services from SERVCE_LIST
macro(AWSSDK_DETERMINE_LIBS_TO_LINK SERVICE_LIST OUTPUT_VAR)
foreach(SVC IN LISTS ${SERVICE_LIST})
list(APPEND ALL_SERVICES ${SVC})
get_dependencies_for_sdk(${SVC} DEPENDENCY_LIST)
if (DEPENDENCY_LIST)
string(REPLACE "," ";" LIST_RESULT ${DEPENDENCY_LIST})
list(APPEND ALL_SERVICES ${LIST_RESULT})
endif()
unset(DEPENDENCY_LIST CACHE)
endforeach()
list(REMOVE_DUPLICATES ALL_SERVICES)
# Order the dependencies correctly
# Change order from e.g. "core;transfer;s3;s3-encryption;kms" to "transfer;s3-encryption;kms;s3;core".
# This is important for static linked user application.
# They way of doing this is to keep checking libs after current lib till the end, if current lib is a dependency of checking lib,
# then move current lib to the end of list, after moving, current index stay and start another round of checking. If no libs after
# current lib is a dependency of current lib, move current index to next and start another round of checking.
# Example: "s3;core;transfer"
#-> s3(cur);core(checking);transfer s3 is not a dependency of core
#-> s3(cur);core;transfer(checking) s3 is a dependency of transfer
#-> core(cur);transfer(checking);s3 core is a dependency of transfer
#-> transfer(cur);s3(checking);core transfer is not a dependency of s3
#-> transfer(cur);s3;core(checking) transfer is not a dependency of core
#-> transfer;s3(cur);core(checking) s3 is not a dependency of core
#-> transfer;s3;core(cur) end of checking
list(LENGTH ALL_SERVICES length)
math(EXPR length ${length}-1) # Get index of last element.
if (length GREATER 0) # If more than 1 element.
set(i 0)
while (i LESS length) # No need to process last element
list(GET ALL_SERVICES ${i} SVC)
math(EXPR j ${i}+1)
math(EXPR jEnd ${length}+1)
while (j LESS jEnd)
list(GET ALL_SERVICES ${j} NEXT_SVC)
get_dependencies_for_sdk(${NEXT_SVC} DEPENDING_SDKS)
if (DEPENDING_SDKS)
string(REPLACE "," ";" DEPENDING_SDKS ${DEPENDING_SDKS})
endif()
list(FIND DEPENDING_SDKS ${SVC} index)
if (NOT ${index} EQUAL -1) # NEXT_SVC depend on SVC
list(REMOVE_AT ALL_SERVICES ${i}) # Move SVC to end
list(APPEND ALL_SERVICES ${SVC})
math(EXPR i ${i}-1) # make index point to new element but with the same index.
break() # as long as we moved SVC to end, the inner loop can be broke.
endif()
math(EXPR j ${j}+1)
endwhile()
if (i LESS 0) #CMake with some older versions (at least 3.6.0) do not support negative numbers in math expr e.g.: math(EXPR i -1+1)
set(i 0)
else()
math(EXPR i ${i}+1)
endif()
endwhile()
endif()
set(${OUTPUT_VAR} "")
foreach(DEP IN LISTS ALL_SERVICES)
list(APPEND ${OUTPUT_VAR} "aws-cpp-sdk-${DEP}")
endforeach()
if (NOT AWSSDK_INSTALL_AS_SHARED_LIBS)
list(APPEND ${OUTPUT_VAR} ${AWSSDK_COMMON_RUNTIME_LIBS} ${AWSSDK_PLATFORM_DEPS})
endif()
endmacro(AWSSDK_DETERMINE_LIBS_TO_LINK)
# output high level lib dependencies such as for transfer; sqs; dynamodb etc.
macro(AWSSDK_LIB_DEPS HIGH_LEVEL_LIB_NAME OUTPUT_VAR)
get_dependencies_for_sdk(${HIGH_LEVEL_LIB_NAME} DEPENDENCY_LIST)
if (DEPENDENCY_LIST)
string(REPLACE "," ";" ${OUTPUT_VAR} ${DEPENDENCY_LIST})
list(APPEND ALL_SERVICES ${LIST_RESULT})
endif()
list(APPEND ${OUTPUT_VAR} "core")
list(REMOVE_DUPLICATES ${OUTPUT_VAR})
endmacro(AWSSDK_LIB_DEPS)
if (AWSSDK_FIND_COMPONENTS)
#AWSSDK_LINK_LIBRARIES includes all the libraries (including dependencies) used by SDK and needed by customer application when doing linking.
#It only comes with COMPONENTS when doing find_package in customer application. e.g. find_package(AWSSDK REQUIRED COMPONENTS s3 ec2)
#While SDK will resolve all the dependencies for customer application by doing find_package when COMPONENTS are specified,
#there is no need to add those dependencies into AWSSDK_LINK_LIBRARIES. Dependencies in AWSSDK_LINK_LIBRARIES will also become a problem when
#customer specified CMAKE_PREFIX_PATH and set it with non-default CMake search directories for dependencies when building SDK. In this case, when building customer
#application, target_link_libraries(target ${AWSSDK_LINK_LIBRARIES}) will fail to find the dependencies even when you specify CMAKE_PREFIX_PATH to the same directories.
#See https://github.com/aws/aws-sdk-cpp/issues/1279
#Because CMAKE_PREFIX_PATH is used for find_package, find_dependency, find_library, etc, but not target_link_libraries.
#Well, you could still solve it by adding an additional target_link_directories call before target_link_libraries, whereas remove those dependencies from
#AWSSDK_LINK_LIBRARIES will be more convenient and less confusing.
AWSSDK_DETERMINE_LIBS_TO_LINK(AWSSDK_FIND_COMPONENTS AWSSDK_LINK_LIBRARIES)
message(STATUS "Components specified for AWSSDK: ${AWSSDK_FIND_COMPONENTS}, application will be depending on libs: ${AWSSDK_LINK_LIBRARIES}")
# platform dependencies will be resolved automatically when doing find_package(aws-cpp-sdk-core).
list(REMOVE_ITEM AWSSDK_LINK_LIBRARIES ${AWSSDK_PLATFORM_DEPS})
# AWS common runtime dependencies will be resolved automatically when doing find_package(aws-cpp-sdk-core) as well.
list(REMOVE_ITEM AWSSDK_LINK_LIBRARIES ${AWSSDK_COMMON_RUNTIME_LIBS})
set(AWSSDK_TARGETS ${AWSSDK_LINK_LIBRARIES})
list(REVERSE AWSSDK_TARGETS)
foreach(TARGET IN LISTS AWSSDK_TARGETS)
message(STATUS "Try finding ${TARGET}")
find_package(${TARGET} REQUIRED)
message(STATUS "Found ${TARGET}")
endforeach()
endif()
set(AWSSDK_INCLUDE_DIRS ${AWSSDK_INCLUDE_DIR})
set(AWSSDK_LIBRARIES ${AWSSDK_LINK_LIBRARIES})