From 34984c8f7538102e07b73c3d8be20dc5515d5031 Mon Sep 17 00:00:00 2001 From: Juha Alanen Date: Mon, 2 Mar 2020 09:10:58 +0200 Subject: [build] Add steps to build curl for Android Add steps to build curl with openssl for Android. Prebuilt libraries will be used by default. --- test/android/app/build.gradle | 2 +- vendor/curl.cmake | 218 ++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 212 insertions(+), 8 deletions(-) diff --git a/test/android/app/build.gradle b/test/android/app/build.gradle index 5c118d4853..aaa405b1b1 100644 --- a/test/android/app/build.gradle +++ b/test/android/app/build.gradle @@ -5,7 +5,7 @@ android { defaultConfig { applicationId = 'com.mapbox.mapboxsdk.maps.test_runner' - minSdkVersion 24 + minSdkVersion 28 targetSdkVersion 28 def abi = 'all' if (project.hasProperty('mapbox.abis')) { diff --git a/vendor/curl.cmake b/vendor/curl.cmake index fde112b9ec..97ee9d4e73 100644 --- a/vendor/curl.cmake +++ b/vendor/curl.cmake @@ -2,16 +2,220 @@ if(TARGET mbgl-vendor-curl) return() endif() +# Use prebuilt libraries by dedault +if(NOT BUILD_ANDROID_CURL) + add_library( + mbgl-vendor-curl INTERFACE + ) + + set(CURL_BIN_DIR ${CMAKE_CURRENT_LIST_DIR}/mapbox-gl-native-curl/prebuilt/android) + set(CURL_STATIC_LIB ${CURL_BIN_DIR}/${ANDROID_ABI}/libcurl.a) + set(SSL_STATIC_LIB ${CURL_BIN_DIR}/${ANDROID_ABI}/libssl.a) + set(CRYPTO_STATIC_LIB ${CURL_BIN_DIR}/${ANDROID_ABI}/libcrypto.a) + + target_link_libraries( + mbgl-vendor-curl + INTERFACE + $<$:${CURL_STATIC_LIB}> $<$:${SSL_STATIC_LIB}> + $<$:${CRYPTO_STATIC_LIB}> + ) + + target_include_directories( + mbgl-vendor-curl SYSTEM + INTERFACE ${CMAKE_CURRENT_LIST_DIR}/mapbox-gl-native-curl/include + ) + return() +endif() + +# Build Curl with OpenSSL support + +include(ExternalProject) + +include(ProcessorCount) +processorcount(NPROC) + +# Check if Android NDK path is defined in the environment +if(DEFINED ENV{ANDROID_HOME}) + set(ANDROID_NDK_HOME $ENV{ANDROID_HOME}/ndk-bundle) +elseif(DEFINED ENV{ANDROID_SDK_ROOT}) + set(ANDROID_NDK_HOME $ENV{ANDROID_SDK_ROOT}/ndk-bundle) +elseif(DEFINED ANDROID_HOME) + set(ANDROID_NDK_HOME ${ANDROID_HOME}/ndk-bundle) +elseif(DEFINED ANDROID_SDK_ROOT) + set(ANDROID_NDK_HOME ${ANDROID_SDK_ROOT}/ndk-bundle) +else() + message(FATAL_ERROR "Must set either ANDROID_HOME or ANDROID_SDK_ROOT variable") +endif() + +if(CMAKE_HOST_SYSTEM_NAME STREQUAL Linux) + set(HOST_TAG linux-x86_64) +elseif(CMAKE_HOST_SYSTEM_NAME STREQUAL Darwin) + set(HOST_TAG darwin-x86_64) +else() + message(FATAL_ERROR "Unsupported host: " ${CMAKE_SYSTEM_NAME}) +endif() + +if(${ANDROID_ABI} STREQUAL arm64-v8a) + set(TRIPLE aarch64-linux-android) + set(SSL_TARGET_ARCH android-arm64) +elseif(${ANDROID_ABI} STREQUAL x86_64) + set(TRIPLE x86_64-linux-android) + set(SSL_TARGET_ARCH android-x86_64) +else() + message(FATAL_ERROR "-- Unsupported Android ABI: " ${ANDROID_ABI}) +endif() + +set(TOOLCHAIN ${ANDROID_NDK_HOME}/toolchains/llvm/prebuilt/${HOST_TAG}) +set(PATH ${TOOLCHAIN}/bin:$ENV{PATH}) + +set(CC ${TOOLCHAIN}/bin/${TRIPLE}${ANDROID_NATIVE_API_LEVEL}-clang) +set(CXX ${TOOLCHAIN}/bin/${TRIPLE}${ANDROID_NATIVE_API_LEVEL}-clang++) +set(AR ${TOOLCHAIN}/bin/${TRIPLE}-ar) +set(RANLIB ${TOOLCHAIN}/bin/${TRIPLE}-ranlib) + +# Build OpenSSL +set(SSL_SRC_DIR ${CMAKE_CURRENT_LIST_DIR}/mapbox-gl-native-curl/openssl) +set(SSL_BIN_DIR ${CMAKE_CURRENT_BINARY_DIR}) +set(SSL_INCLUDES ${SSL_BIN_DIR}/include) +file(MAKE_DIRECTORY ${SSL_INCLUDES}) + +set(SSL_STATIC_LIB ${SSL_BIN_DIR}/lib/libssl.a) +set(CRYPTO_STATIC_LIB ${SSL_BIN_DIR}/lib/libcrypto.a) + +ExternalProject_Add( + libssl + PREFIX ${SSL_BIN_DIR} + SOURCE_DIR ${SSL_SRC_DIR} + DOWNLOAD_COMMAND + GIT_REPOSITORY https://github.com/openssl/openssl.git + GIT_TAG OpenSSL_1_1_1d + GIT_SHALLOW true + GIT_PROGRESS true + CONFIGURE_COMMAND + echo + "Configuring openssl $-${ANDROID_ABI}" + && + ${CMAKE_COMMAND} + -E + env + ANDROID_NDK_HOME=${ANDROID_NDK_HOME} + PATH=${PATH} + ${SSL_SRC_DIR}/Configure + ${SSL_TARGET_ARCH} + no-asm + no-shared + no-tests + no-unit-test + zlib + -static + --prefix=${SSL_BIN_DIR} + BUILD_COMMAND + echo + "Building openssl $-${ANDROID_ABI}" + && + ${CMAKE_COMMAND} + -E + env + ANDROID_NDK_HOME=${ANDROID_NDK_HOME} + PATH=${PATH} + make + -j${NPROC} + INSTALL_COMMAND + echo + "Installing openssl $-${ANDROID_ABI}" + && + make + install + BUILD_BYPRODUCTS ${SSL_STATIC_LIB} ${CRYPTO_STATIC_LIB} +) + add_library( - mbgl-vendor-curl INTERFACE + android-ssl STATIC IMPORTED ) +add_dependencies(android-ssl libssl) +set_target_properties(android-ssl PROPERTIES IMPORTED_LOCATION ${SSL_STATIC_LIB}) +set_target_properties(android-ssl PROPERTIES INTERFACE_INCLUDE_DIRECTORIES ${SSL_INCLUDES}) -target_link_libraries( - mbgl-vendor-curl - INTERFACE $<$:${CMAKE_CURRENT_LIST_DIR}/curl-android-ios/prebuilt-with-ssl/android/${ANDROID_ABI}/libcurl.a> +add_library( + android-crypto STATIC IMPORTED +) +add_dependencies(android-crypto libssl) +set_target_properties(android-crypto PROPERTIES IMPORTED_LOCATION ${CRYPTO_STATIC_LIB}) +set_target_properties(android-crypto PROPERTIES INTERFACE_INCLUDE_DIRECTORIES ${SSL_INCLUDES}) + +# Build CURL +set(CURL_DIR ${CMAKE_CURRENT_LIST_DIR}/mapbox-gl-native-curl/curl) +set(CURL_BIN_DIR ${CMAKE_CURRENT_BINARY_DIR}) +set(CURL_INCLUDES ${CURL_BIN_DIR}/include) +file(MAKE_DIRECTORY ${CURL_INCLUDES}) +set(CURL_STATIC_LIB ${CURL_BIN_DIR}/lib/libcurl.a) + +ExternalProject_Add( + libcurl + PREFIX ${CURL_BIN_DIR} + DEPENDS libssl + SOURCE_DIR ${CURL_DIR} + DOWNLOAD_COMMAND + GIT_REPOSITORY https://github.com/curl/curl.git + GIT_TAG curl-7_69_0 + GIT_SHALLOW true + GIT_PROGRESS true + UPDATE_COMMAND + cd + ${CURL_DIR} + && + echo + "Starting curl $-${ANDROID_ABI} build" + && + ${CURL_DIR}/buildconf + CONFIGURE_COMMAND + echo + "Configuring curl $-${ANDROID_ABI}" + && + CC=${CC} + CXX=${CXX} + AR=${AR} + RANLIB=${RANLIB} + ${CURL_DIR}/configure + --host=${TRIPLE} + --target=${TRIPLE} + --with-sysroot=${TOOLCHAIN}/sysroot + --with-ssl=${SSL_BIN_DIR} + --enable-static + --disable-shared + --disable-verbose + --enable-threaded-resolver + --enable-libgcc + --enable-ipv6 + --disable-manual + --with-pic + --prefix=${CURL_BIN_DIR} + BUILD_COMMAND + echo + "Building curl $-${ANDROID_ABI}" + && + make + -j${NPROC} + INSTALL_COMMAND + echo + "Installing curl $-${ANDROID_ABI}" + && + make + install + BUILD_BYPRODUCTS ${CURL_STATIC_LIB} ) -target_include_directories( - mbgl-vendor-curl SYSTEM - INTERFACE ${CMAKE_CURRENT_LIST_DIR}/curl-android-ios/curl/include +add_library( + mbgl-vendor-curl STATIC IMPORTED +) +add_dependencies(libcurl libssl) +add_dependencies( + mbgl-vendor-curl + libcurl + android-ssl + android-crypto ) +set_target_properties(mbgl-vendor-curl PROPERTIES IMPORTED_LOCATION ${CURL_STATIC_LIB}) +set_target_properties(mbgl-vendor-curl PROPERTIES INTERFACE_INCLUDE_DIRECTORIES ${CURL_INCLUDES}) +set_target_properties(mbgl-vendor-curl PROPERTIES INTERFACE_COMPILE_DEFINITIONS CURL_STATICLIB) +set_target_properties(mbgl-vendor-curl PROPERTIES INTERFACE_LINK_LIBRARIES "-l${SSL_STATIC_LIB} -l${CRYPTO_STATIC_LIB}") -- cgit v1.2.1