Skip to content

Commit dd2982d

Browse files
committed
MDEV-30831 Cannot compile AWS KMS Plugin
Fix AWS SDK build, it has changed substantionally since the plugin was introduced. There is now a bunch of intermediate C libraries, aws-cpp-crt and others, and for static linking, the link dependency must be declared. Also support AWS C++ SDK in vcpkg package manager.
1 parent 5729d89 commit dd2982d

File tree

4 files changed

+125
-67
lines changed

4 files changed

+125
-67
lines changed

cmake/aws_sdk.cmake

Lines changed: 30 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,27 @@ MACRO (SKIP_AWS_SDK MSG)
44
RETURN()
55
ENDMACRO()
66

7-
FUNCTION (CHECK_AWS_SDK RETVAL REASON)
7+
FUNCTION (CHECK_AWS_SDK COMPONENTS RETVAL REASON)
88
# AWS_SDK_EXTERNAL_PROJECT must be ON
99
IF(NOT AWS_SDK_EXTERNAL_PROJECT)
10-
SKIP_AWS_SDK("AWS_SDK_EXTERNAL_PROJECT is not ON")
10+
FOREACH(comp ${COMPONENTS})
11+
FIND_PACKAGE(aws-cpp-sdk-${comp} CONFIG QUIET)
12+
IF (NOT aws-cpp-sdk-${comp}_FOUND)
13+
SKIP_AWS_SDK("AWS_SDK_EXTERNAL_PROJECT is not ON and aws-cpp-sdk-${comp} not found")
14+
ENDIF()
15+
ENDFOREACH()
16+
SET(${RETVAL} ON PARENT_SCOPE)
1117
ENDIF()
1218
IF(NOT NOT_FOR_DISTRIBUTION)
1319
SKIP_AWS_SDK("AWS SDK has Apache 2.0 License which is not compatible with GPLv2. Set -DNOT_FOR_DISTRIBUTION=ON if you need it")
1420
ENDIF()
21+
IF(CMAKE_VERSION VERSION_LESS "3.15")
22+
SKIP_AWS_SDK("CMake too old")
23+
ENDIF()
1524
# Check compiler support
1625
IF(CMAKE_CXX_COMPILER_ID MATCHES "GNU")
17-
EXECUTE_PROCESS(COMMAND ${CMAKE_CXX_COMPILER} -dumpversion OUTPUT_VARIABLE GCC_VERSION)
18-
IF (GCC_VERSION VERSION_LESS 4.8)
19-
SKIP_AWS_SDK("GCC VERSION too old (${GCC_VERSION}, required is 4.8 or later")
26+
IF (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.9)
27+
SKIP_AWS_SDK("GCC VERSION too old (${GCC_VERSION}, required is 4.9 or later")
2028
ENDIF()
2129
ELSEIF (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
2230
IF ((CMAKE_CXX_COMPILER_VERSION AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 3.3) OR
@@ -36,35 +44,27 @@ FUNCTION (CHECK_AWS_SDK RETVAL REASON)
3644
SKIP_AWS_SDK("OS unsupported by AWS SDK")
3745
ENDIF()
3846

39-
# Build from source, using ExternalProject_Add
40-
# AWS C++ SDK requires cmake 2.8.12
41-
IF(CMAKE_VERSION VERSION_LESS "2.8.12")
42-
SKIP_AWS_SDK("CMake is too old")
43-
ENDIF()
44-
4547
IF(UNIX)
46-
# Check librairies required for building SDK
47-
FIND_PACKAGE(CURL)
48-
SET_PACKAGE_PROPERTIES(CURL PROPERTIES TYPE REQUIRED)
49-
IF(NOT CURL_FOUND)
50-
SKIP_AWS_SDK("AWS C++ SDK requires libcurl development package")
48+
IF("${WITH_ZLIB}" STREQUAL "bundled")
49+
# Breaks FIND_PACKAGE(ZLIB)
50+
SKIP_AWS_SDK("Incompatible with WITH_ZLIB=bundled")
5151
ENDIF()
52-
FIND_PATH(UUID_INCLUDE_DIR uuid/uuid.h)
53-
IF(NOT UUID_INCLUDE_DIR)
54-
SKIP_AWS_SDK("AWS C++ SDK requires uuid development package")
55-
ENDIF()
56-
IF(NOT APPLE)
57-
FIND_LIBRARY(UUID_LIBRARIES uuid)
58-
SET_PACKAGE_PROPERTIES(UUID_LIBRARIES PROPERTIES TYPE REQUIRED)
59-
IF(NOT UUID_LIBRARIES)
60-
SKIP_AWS_SDK("AWS C++ SDK requires uuid development package")
52+
# Check libraries required for building SDK
53+
FOREACH(pkg CURL ZLIB OpenSSL)
54+
FIND_PACKAGE(${pkg})
55+
IF(NOT ${pkg}_FOUND)
56+
SKIP_AWS_SDK("AWS C++ SDK requires ${pkg}")
6157
ENDIF()
62-
FIND_PACKAGE(OpenSSL)
63-
SET_PACKAGE_PROPERTIES(OpenSSL PROPERTIES TYPE REQUIRED)
64-
IF(NOT OPENSSL_FOUND)
65-
SKIP_AWS_SDK("AWS C++ SDK requires openssl development package")
58+
SET_PACKAGE_PROPERTIES(${pkg} PROPERTIES TYPE REQUIRED)
59+
ENDFOREACH()
60+
# Also check for required libraries explicitely - they might be
61+
# missing, even if check above succeeds, e.g when using own copy
62+
# of zlib
63+
FOREACH(lib OpenSSL::Crypto ZLIB::ZLIB CURL::libcurl)
64+
IF(NOT TARGET ${lib})
65+
SKIP_AWS_SDK("AWS C++ SDK requires ${lib}")
6666
ENDIF()
67-
ENDIF()
67+
ENDFOREACH()
6868
ENDIF()
6969
SET(${RETVAL} ON PARENT_SCOPE)
7070
ENDFUNCTION()
@@ -85,14 +85,4 @@ FUNCTION(USE_AWS_SDK_LIBS)
8585
SET_PROPERTY(GLOBAL PROPERTY AWS_SDK_LIBS ${comp} APPEND)
8686
TARGET_LINK_LIBRARIES(${target} aws-cpp-sdk-${comp})
8787
ENDFOREACH()
88-
TARGET_LINK_LIBRARIES(${target} aws-cpp-sdk-core)
89-
TARGET_INCLUDE_DIRECTORIES(${target} PRIVATE ${PROJECT_BINARY_DIR}/extra/aws_sdk/aws_sdk_cpp/include)
90-
# Link OS libraries that AWS SDK depends on
91-
IF(WIN32)
92-
TARGET_LINK_LIBRARIES(${target} bcrypt winhttp wininet userenv version)
93-
ELSE()
94-
FIND_PACKAGE(CURL REQUIRED)
95-
FIND_PACKAGE(OpenSSL REQUIRED)
96-
TARGET_LINK_LIBRARIES(${target} ${OPENSSL_LIBRARIES} ${CURL_LIBRARIES} ${UUID_LIBRARIES})
97-
ENDIF()
9888
ENDFUNCTION()

extra/aws_sdk/CMakeLists.txt

Lines changed: 88 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -8,67 +8,132 @@ IF(SDK_LIBS_COUNT EQUAL 0)
88
RETURN()
99
ENDIF()
1010

11-
CHECK_AWS_SDK(RETVAL REASON)
11+
CHECK_AWS_SDK("${SDK_LIBS}" RETVAL REASON)
1212
IF(NOT RETVAL)
1313
MESSAGE(FATAL_ERROR
1414
"AWS C++ will not be built (${REASON}), but dependency on following components is found ${SDK_LIBS}.
1515
Use CHECK_AWS_SDK() function before trying to build with SDK components")
1616
ENDIF()
1717

18+
IF(NOT AWS_SDK_EXTERNAL_PROJECT)
19+
# System aws sdk libraries found
20+
RETURN()
21+
ENDIF()
1822

19-
SET(byproducts)
23+
SET(all_libs
24+
aws-crt-cpp
25+
aws-c-event-stream
26+
aws-c-common
27+
aws-c-http
28+
aws-c-mqtt
29+
aws-c-cal
30+
aws-c-auth
31+
aws-c-io
32+
aws-checksums
33+
aws-c-s3
34+
aws-c-sdkutils
35+
aws-c-compression
36+
aws-cpp-sdk-core
37+
)
38+
IF(CMAKE_SYSTEM_NAME STREQUAL "Linux")
39+
LIST(APPEND all_libs s2n)
40+
ENDIF()
2041

21-
FOREACH(lib ${SDK_LIBS} core)
22-
SET(lib aws-cpp-sdk-${lib})
23-
ADD_LIBRARY(${lib} STATIC IMPORTED GLOBAL)
42+
FOREACH(lib ${SDK_LIBS})
43+
LIST(APPEND all_libs aws-cpp-sdk-${lib})
44+
ENDFOREACH()
45+
LIST(REMOVE_DUPLICATES all_libs)
46+
47+
SET(byproducts)
48+
MAKE_DIRECTORY(${PROJECT_BINARY_DIR}/extra/aws_sdk/aws_sdk_cpp/include)
49+
FOREACH(lib ${all_libs})
50+
ADD_LIBRARY(${lib} UNKNOWN IMPORTED GLOBAL)
2451
ADD_DEPENDENCIES(${lib} aws_sdk_cpp)
2552

2653
SET (loc "${CMAKE_CURRENT_BINARY_DIR}/aws_sdk_cpp/lib/${CMAKE_STATIC_LIBRARY_PREFIX}${lib}${CMAKE_STATIC_LIBRARY_SUFFIX}")
2754
IF(CMAKE_VERSION VERSION_GREATER "3.1")
2855
SET(byproducts ${byproducts} BUILD_BYPRODUCTS ${loc})
2956
ENDIF()
3057
SET_TARGET_PROPERTIES(${lib} PROPERTIES IMPORTED_LOCATION ${loc})
58+
TARGET_INCLUDE_DIRECTORIES(${lib} INTERFACE ${PROJECT_BINARY_DIR}/extra/aws_sdk/aws_sdk_cpp/include)
3159
ENDFOREACH()
3260

33-
# To be compatible with older cmake, we use older version of the SDK
34-
IF(CMAKE_VERSION LESS "3.0")
35-
SET(GIT_TAG "1.0.8")
36-
ELSE()
37-
SET(GIT_TAG "1.8.29")
38-
ENDIF()
61+
# Define link dependencies between AWS C libs
62+
TARGET_LINK_LIBRARIES(aws-cpp-sdk-core INTERFACE aws-crt-cpp aws-c-event-stream aws-c-common)
63+
TARGET_LINK_LIBRARIES(aws-crt-cpp INTERFACE aws-c-http aws-c-mqtt aws-c-cal aws-c-auth aws-c-common aws-c-io
64+
aws-checksums aws-c-event-stream aws-c-s3 aws-c-sdkutils)
65+
TARGET_LINK_LIBRARIES(aws-c-event-stream INTERFACE aws-c-io aws-c-common aws-checksums)
66+
TARGET_LINK_LIBRARIES(aws-c-http INTERFACE aws-c-io aws-c-compression aws-c-cal aws-c-common)
67+
TARGET_LINK_LIBRARIES(aws-c-mqtt INTERFACE aws-c-http aws-c-io aws-c-common aws-c-cal aws-c-common)
68+
TARGET_LINK_LIBRARIES(aws-c-auth INTERFACE aws-c-sdkutils aws-c-cal aws-c-http aws-c-io aws-c-common)
69+
TARGET_LINK_LIBRARIES(aws-c-io INTERFACE aws-c-common aws-c-cal)
70+
TARGET_LINK_LIBRARIES(aws-checksums INTERFACE aws-c-common)
71+
TARGET_LINK_LIBRARIES(aws-c-compression INTERFACE aws-c-common)
72+
TARGET_LINK_LIBRARIES(aws-c-s3 INTERFACE aws-c-auth aws-checksums aws-c-http aws-c-io aws-c-cal aws-c-common aws-c-sdkutils aws-c-common)
73+
TARGET_LINK_LIBRARIES(aws-c-sdkutils INTERFACE aws-c-common)
3974

40-
IF(MSVC_CRT_TYPE MATCHES "/MD")
41-
SET(FORCE_SHARED_CRT ON)
75+
IF(WIN32)
76+
TARGET_LINK_LIBRARIES(aws-c-io INTERFACE bcrypt crypt32 secur32 ncrypt ws2_32)
77+
TARGET_LINK_LIBRARIES(aws-c-common INTERFACE shlwapi)
78+
TARGET_LINK_LIBRARIES(aws-cpp-sdk-core INTERFACE winhttp wininet version userenv)
4279
ELSE()
43-
SET(FORCE_SHARED_CRT OFF)
80+
TARGET_LINK_LIBRARIES(aws-c-cal INTERFACE OpenSSL::Crypto)
81+
TARGET_LINK_LIBRARIES(aws-cpp-sdk-core INTERFACE ZLIB::ZLIB CURL::libcurl)
82+
83+
# Dependencies below are from CMakeLists.txt for aws-c-common
84+
SET(THREADS_PREFER_PTHREAD_FLAG ON)
85+
FIND_PACKAGE(Threads REQUIRED)
86+
TARGET_LINK_LIBRARIES(aws-c-common INTERFACE ${CMAKE_DL_LIBS} Threads::Threads)
87+
IF(CMAKE_SYSTEM_NAME STREQUAL "Linux")
88+
TARGET_LINK_LIBRARIES(aws-c-common INTERFACE s2n m rt)
89+
ELSEIF(APPLE)
90+
TARGET_LINK_LIBRARIES(aws-c-common INTERFACE "-framework CoreFoundation")
91+
TARGET_LINK_LIBRARIES(aws-c-io INTERFACE "-framework Security" "-framework Network")
92+
ENDIF()
4493
ENDIF()
4594

95+
FOREACH(lib ${SDK_LIBS})
96+
TARGET_LINK_LIBRARIES(aws-cpp-sdk-${lib} INTERFACE aws-cpp-sdk-core)
97+
ENDFOREACH()
98+
99+
SET(GIT_TAG "1.11.582")
100+
46101
LIST(REMOVE_DUPLICATES SDK_LIBS)
47102
STRING( REPLACE ";" "!" SDK_LIBS_STR "${SDK_LIBS}")
48-
#MESSAGE("SDK_LIBS_STR=${SDK_LIBS_STR}")
103+
104+
IF(MSVC)
105+
SET(BUILD_AND_INSTALL_COMMANDS
106+
BUILD_COMMAND ${CMAKE_COMMAND} --build <BINARY_DIR> --config RelWithDebInfo --verbose --parallel
107+
INSTALL_COMMAND ${CMAKE_COMMAND} --install <BINARY_DIR> --config RelWithDebInfo)
108+
SET(BUILD_TYPE -DCMAKE_BUILD_TYPE=RelWithDebInfo)
109+
ELSE()
110+
SET(BUILD_AND_INSTALL_COMMANDS)
111+
SET(BUILD_TYPE)
112+
ENDIF()
49113

50114
ExternalProject_Add(
51115
aws_sdk_cpp
52116
GIT_REPOSITORY "https://github.com/awslabs/aws-sdk-cpp.git"
53117
GIT_TAG ${GIT_TAG}
118+
GIT_SHALLOW TRUE
54119
UPDATE_COMMAND ""
55120
SOURCE_DIR "${CMAKE_CURRENT_BINARY_DIR}/aws-sdk-cpp"
56121
LIST_SEPARATOR !
57122
${byproducts}
58123
CMAKE_ARGS
124+
${BUILD_TYPE}
125+
-DCMAKE_BUILD_TYPE=RelWithDebInfo
126+
-DCMAKE_POSITION_INDEPENDENT_CODE=ON
59127
-DBUILD_ONLY=${SDK_LIBS_STR}
60128
-DBUILD_SHARED_LIBS=OFF
61-
-DFORCE_SHARED_CRT=${FORCE_SHARED_CRT}
129+
-DFORCE_SHARED_CRT=ON
62130
-DENABLE_TESTING=OFF
63-
"-DCMAKE_CXX_FLAGS_DEBUG=${CMAKE_CXX_FLAGS_DEBUG} ${PIC_FLAG}"
64-
"-DCMAKE_CXX_FLAGS_RELWITHDEBINFO=${CMAKE_CXX_FLAGS_RELWITHDEBINFO} ${PIC_FLAG}"
65-
"-DCMAKE_CXX_FLAGS_RELEASE=${CMAKE_CXX_FLAGS_RELEASE} ${PIC_FLAG}"
66-
"-DCMAKE_CXX_FLAGS_MINSIZEREL=${CMAKE_CXX_FLAGS_MINSIZEREL} ${PIC_FLAG}"
67-
"-DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}"
68-
"-DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}"
131+
-DAWS_WARNINGS_ARE_ERRORS=OFF
69132
${EXTRA_SDK_CMAKE_FLAGS}
70133
-DCMAKE_INSTALL_PREFIX=${CMAKE_CURRENT_BINARY_DIR}/aws_sdk_cpp
71134
-DCMAKE_INSTALL_LIBDIR=lib
72-
TEST_COMMAND ""
135+
TEST_COMMAND ""
136+
${BUILD_AND_INSTALL_COMMANDS}
73137
)
138+
74139
SET_TARGET_PROPERTIES(aws_sdk_cpp PROPERTIES EXCLUDE_FROM_ALL TRUE)

plugin/aws_key_management/CMakeLists.txt

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
INCLUDE(aws_sdk)
2-
CHECK_AWS_SDK(HAVE_AWS_SDK REASON)
2+
CHECK_AWS_SDK("kms;core" HAVE_AWS_SDK REASON)
33
IF(NOT HAVE_AWS_SDK)
44
MESSAGE_ONCE(AWS_KEY_MANAGEMENT_NO_AWS_SDK "Can't build aws_key_management - AWS SDK not available (${REASON})")
5+
IF(PLUGIN_AWS_KEY_MANAGEMENT MATCHES "^(STATIC|DYNAMIC)$")
6+
MESSAGE(FATAL_ERROR "Can't build reqired plugin aws_key_management: ${REASON}")
7+
ENDIF()
58
ADD_FEATURE_INFO(AWS_KEY_MANAGEMENT "OFF" "AWS Encryption Key Management Plugin")
69
RETURN()
710
ENDIF()
@@ -11,7 +14,7 @@ MYSQL_ADD_PLUGIN(aws_key_management
1114
COMPONENT aws-key-management)
1215

1316
IF(TARGET aws_key_management)
14-
USE_AWS_SDK_LIBS(aws_key_management kms)
17+
USE_AWS_SDK_LIBS(aws_key_management kms core)
18+
ADD_FEATURE_INFO(AWS_KEY_MANAGEMENT "ON" "AWS Encryption Key Management Plugin")
1519
ENDIF()
1620

17-
ADD_FEATURE_INFO(AWS_KEY_MANAGEMENT "ON" "AWS Encryption Key Management Plugin")

plugin/aws_key_management/aws_key_management_plugin.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -540,7 +540,7 @@ static int generate_and_save_datakey(uint keyid, uint version)
540540
return(-1);
541541
}
542542
unsigned int len= (unsigned int)byteBuffer.GetLength();
543-
if (write(fd, byteBuffer.GetUnderlyingData(), len) != len)
543+
if ((unsigned int)write(fd, byteBuffer.GetUnderlyingData(), len) != len)
544544
{
545545
my_printf_error(ER_UNKNOWN_ERROR, "AWS KMS plugin: can't write to %s", ME_ERROR_LOG_ONLY, filename);
546546
close(fd);

0 commit comments

Comments
 (0)