blob: 14b1f3ea9be8e9202dd0e804a8db5d173dc2e20f [file]
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
include(ExternalProject)
include(GNUInstallDirs)
function(paimon_add_s2n_project)
if(DEFINED ENV{PAIMON_AWS_S2N_URL})
set(S2N_URL "$ENV{PAIMON_AWS_S2N_URL}")
elseif(EXISTS "${THIRDPARTY_DIR}/${PAIMON_AWS_S2N_PKG_NAME}")
set(S2N_URL "${THIRDPARTY_DIR}/${PAIMON_AWS_S2N_PKG_NAME}")
else()
set(S2N_URL
"${THIRDPARTY_MIRROR_URL}https://github.com/aws/s2n-tls/archive/refs/tags/${PAIMON_AWS_S2N_BUILD_VERSION}.zip"
)
endif()
set(S2N_C_FLAGS "${EP_C_FLAGS}")
set(S2N_CXX_FLAGS "${EP_CXX_FLAGS}")
string(REPLACE "-Wdocumentation" "" S2N_C_FLAGS "${S2N_C_FLAGS}")
string(REPLACE "-Wdocumentation" "" S2N_CXX_FLAGS "${S2N_CXX_FLAGS}")
externalproject_add(s2n_ep
URL ${S2N_URL}
URL_HASH SHA256=${PAIMON_AWS_S2N_BUILD_SHA256_CHECKSUM}
CMAKE_ARGS ${EP_COMMON_CMAKE_ARGS}
-DCMAKE_C_FLAGS=${S2N_C_FLAGS}
-DCMAKE_CXX_FLAGS=${S2N_CXX_FLAGS}
-DCMAKE_INSTALL_PREFIX=${AWS_AUTH_PREFIX}
-DCMAKE_INSTALL_LIBDIR=${AWS_AUTH_INSTALL_LIBDIR}
-DCMAKE_PREFIX_PATH=${AWS_AUTH_PREFIX}
-Dcrypto_INCLUDE_DIR=${OPENSSL_INCLUDE_DIR}
-Dcrypto_LIBRARY=${OPENSSL_CRYPTO_LIBRARY}
-DCMAKE_POSITION_INDEPENDENT_CODE=ON
-DS2N_INTERN_LIBCRYPTO=OFF
BUILD_BYPRODUCTS ${AWS_AUTH_LIB_DIR}/libs2n.a
${THIRDPARTY_LOG_OPTIONS})
endfunction()
function(paimon_add_aws_c_project
NAME
VERSION
CHECKSUM
DEPENDS)
string(REPLACE "aws-c-" "AWS_C_" URL_NAME "${NAME}")
string(TOUPPER "${URL_NAME}" URL_NAME)
set(URL_VAR "PAIMON_${URL_NAME}_URL")
set(PKG_NAME_VAR "PAIMON_${URL_NAME}_PKG_NAME")
if(DEFINED ENV{${URL_VAR}})
set(URL "$ENV{${URL_VAR}}")
elseif(EXISTS "${THIRDPARTY_DIR}/${${PKG_NAME_VAR}}")
set(URL "${THIRDPARTY_DIR}/${${PKG_NAME_VAR}}")
else()
set(URL
"${THIRDPARTY_MIRROR_URL}https://github.com/awslabs/${NAME}/archive/refs/tags/${VERSION}.tar.gz"
)
endif()
set(AWS_PLATFORM_CMAKE_ARGS)
list(APPEND
AWS_PLATFORM_CMAKE_ARGS
-DOPENSSL_INCLUDE_DIR=${OPENSSL_INCLUDE_DIR}
-DOPENSSL_SSL_LIBRARY=${OPENSSL_SSL_LIBRARY}
-DOPENSSL_CRYPTO_LIBRARY=${OPENSSL_CRYPTO_LIBRARY}
-Dcrypto_INCLUDE_DIR=${OPENSSL_INCLUDE_DIR}
-Dcrypto_LIBRARY=${OPENSSL_CRYPTO_LIBRARY})
if(NAME STREQUAL "aws-c-cal")
list(APPEND AWS_PLATFORM_CMAKE_ARGS -DUSE_OPENSSL=ON)
endif()
if(APPLE)
list(APPEND AWS_PLATFORM_CMAKE_ARGS -DAWS_USE_SECITEM=ON)
endif()
# aws-c-io's installed package unconditionally looks for s2n on Unix even
# when it was built with Apple's native TLS backend.
if(APPLE AND (NAME STREQUAL "aws-c-http" OR NAME STREQUAL "aws-c-auth"))
list(APPEND AWS_PLATFORM_CMAKE_ARGS -DBYO_CRYPTO=ON)
endif()
externalproject_add(${NAME}_ep
URL ${URL}
URL_HASH SHA256=${CHECKSUM}
CMAKE_ARGS ${EP_COMMON_CMAKE_ARGS}
-DCMAKE_INSTALL_PREFIX=${AWS_AUTH_PREFIX}
-DCMAKE_INSTALL_LIBDIR=${AWS_AUTH_INSTALL_LIBDIR}
-DCMAKE_PREFIX_PATH=${AWS_AUTH_PREFIX}
-DCMAKE_POSITION_INDEPENDENT_CODE=ON
-DENABLE_TESTING=OFF
${AWS_PLATFORM_CMAKE_ARGS}
DEPENDS ${DEPENDS}
BUILD_BYPRODUCTS ${AWS_AUTH_LIB_DIR}/lib${NAME}.a
${THIRDPARTY_LOG_OPTIONS})
endfunction()
function(build_aws_auth)
set(AWS_AUTH_PREFIX
"${CMAKE_CURRENT_BINARY_DIR}/aws-auth_ep-install"
PARENT_SCOPE)
set(AWS_AUTH_PREFIX "${CMAKE_CURRENT_BINARY_DIR}/aws-auth_ep-install")
set(AWS_AUTH_INSTALL_LIBDIR "${CMAKE_INSTALL_LIBDIR}")
set(AWS_AUTH_LIB_DIR "${AWS_AUTH_PREFIX}/${AWS_AUTH_INSTALL_LIBDIR}")
file(MAKE_DIRECTORY "${AWS_AUTH_PREFIX}/include")
file(MAKE_DIRECTORY "${AWS_AUTH_LIB_DIR}")
find_package(OpenSSL REQUIRED)
set(AWS_IO_DEPENDS "aws-c-common_ep;aws-c-cal_ep")
if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
paimon_add_s2n_project()
list(APPEND AWS_IO_DEPENDS s2n_ep)
endif()
paimon_add_aws_c_project(aws-c-common ${PAIMON_AWS_C_COMMON_BUILD_VERSION}
${PAIMON_AWS_C_COMMON_BUILD_SHA256_CHECKSUM} "")
paimon_add_aws_c_project(aws-c-sdkutils ${PAIMON_AWS_C_SDKUTILS_BUILD_VERSION}
${PAIMON_AWS_C_SDKUTILS_BUILD_SHA256_CHECKSUM}
aws-c-common_ep)
paimon_add_aws_c_project(aws-c-cal ${PAIMON_AWS_C_CAL_BUILD_VERSION}
${PAIMON_AWS_C_CAL_BUILD_SHA256_CHECKSUM} aws-c-common_ep)
paimon_add_aws_c_project(aws-c-compression ${PAIMON_AWS_C_COMPRESSION_BUILD_VERSION}
${PAIMON_AWS_C_COMPRESSION_BUILD_SHA256_CHECKSUM}
aws-c-common_ep)
paimon_add_aws_c_project(aws-c-io ${PAIMON_AWS_C_IO_BUILD_VERSION}
${PAIMON_AWS_C_IO_BUILD_SHA256_CHECKSUM} "${AWS_IO_DEPENDS}")
paimon_add_aws_c_project(aws-c-http ${PAIMON_AWS_C_HTTP_BUILD_VERSION}
${PAIMON_AWS_C_HTTP_BUILD_SHA256_CHECKSUM}
"aws-c-common_ep;aws-c-io_ep;aws-c-compression_ep")
paimon_add_aws_c_project(aws-c-auth
${PAIMON_AWS_C_AUTH_BUILD_VERSION}
${PAIMON_AWS_C_AUTH_BUILD_SHA256_CHECKSUM}
"aws-c-common_ep;aws-c-sdkutils_ep;aws-c-cal_ep;aws-c-io_ep;aws-c-http_ep"
)
find_package(Threads REQUIRED)
set(AWS_AUTH_PLATFORM_LIBS Threads::Threads ${CMAKE_DL_LIBS})
if(APPLE)
list(APPEND
AWS_AUTH_PLATFORM_LIBS
"-framework Security"
"-framework CoreFoundation"
"-framework Network")
endif()
set(AWS_AUTH_TLS_LIBS)
if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
list(APPEND AWS_AUTH_TLS_LIBS "${AWS_AUTH_LIB_DIR}/libs2n.a")
endif()
set(AWS_AUTH_RUNTIME_LIBS
"${AWS_AUTH_LIB_DIR}/libaws-c-http.a"
"${AWS_AUTH_LIB_DIR}/libaws-c-io.a"
"${AWS_AUTH_LIB_DIR}/libaws-c-compression.a"
"${AWS_AUTH_LIB_DIR}/libaws-c-cal.a"
"${AWS_AUTH_LIB_DIR}/libaws-c-sdkutils.a"
"${AWS_AUTH_LIB_DIR}/libaws-c-common.a"
${AWS_AUTH_TLS_LIBS})
if(NOT APPLE)
list(PREPEND AWS_AUTH_RUNTIME_LIBS "-Wl,--start-group")
list(APPEND AWS_AUTH_RUNTIME_LIBS "-Wl,--end-group")
endif()
# Keep OpenSSL after the static AWS archives. In embedded builds CMake can
# resolve these targets to static archives, where link order matters.
list(APPEND AWS_AUTH_RUNTIME_LIBS "${OPENSSL_SSL_LIBRARY}"
"${OPENSSL_CRYPTO_LIBRARY}")
add_library(aws_auth_minimal STATIC IMPORTED GLOBAL)
set_target_properties(aws_auth_minimal
PROPERTIES IMPORTED_LOCATION
"${AWS_AUTH_LIB_DIR}/libaws-c-auth.a"
INTERFACE_INCLUDE_DIRECTORIES
"${AWS_AUTH_PREFIX}/include"
INTERFACE_LINK_LIBRARIES
"${AWS_AUTH_RUNTIME_LIBS};${AWS_AUTH_PLATFORM_LIBS}")
add_dependencies(aws_auth_minimal aws-c-auth_ep)
set(AWS_AUTH_INCLUDE_DIR
"${AWS_AUTH_PREFIX}/include"
PARENT_SCOPE)
set(AWS_AUTH_LIB_DIR
"${AWS_AUTH_LIB_DIR}"
PARENT_SCOPE)
endfunction()