mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2024-11-22 15:40:19 +00:00
1d0de0b450
This ensures that vcpkg downloads and builds all dependencies for Android. We add it as a CMAKE_TOOLCHAIN_FILE that then chainloads the Android NDK's toolchain file, as per the vcpkg documentation.
96 lines
4.1 KiB
CMake
96 lines
4.1 KiB
CMake
# This file is based on the vcpkg Android example from here https://github.com/microsoft/vcpkg-docs/blob/06b496c3f24dbe651fb593a26bee50537eeaf4e5/vcpkg/examples/vcpkg_android_example_cmake_script/cmake/vcpkg_android.cmake
|
|
# It was modified to use CMake variables instead of environment variables, because it's not possible to set environment variables in the Android Gradle plugin.
|
|
#
|
|
# vcpkg_android.cmake
|
|
#
|
|
# Helper script when using vcpkg with cmake. It should be triggered via the variable VCPKG_TARGET_ANDROID
|
|
#
|
|
# For example:
|
|
# if (VCPKG_TARGET_ANDROID)
|
|
# include("cmake/vcpkg_android.cmake")
|
|
# endif()
|
|
#
|
|
# This script will:
|
|
# 1 & 2. check the presence of needed env variables: ANDROID_NDK and VCPKG_ROOT
|
|
# 3. set VCPKG_TARGET_TRIPLET according to ANDROID_ABI
|
|
# 4. Combine vcpkg and Android toolchains by setting CMAKE_TOOLCHAIN_FILE
|
|
# and VCPKG_CHAINLOAD_TOOLCHAIN_FILE
|
|
|
|
# Note: VCPKG_TARGET_ANDROID is not an official vcpkg variable.
|
|
# it is introduced for the need of this script
|
|
|
|
if (VCPKG_TARGET_ANDROID)
|
|
|
|
#
|
|
# 1. Check the presence of variable ANDROID_NDK
|
|
#
|
|
if (NOT DEFINED ANDROID_NDK)
|
|
message(FATAL_ERROR "Please set CMake variable ANDROID_NDK")
|
|
endif()
|
|
|
|
#
|
|
# 2. Check the presence of environment variable VCPKG_ROOT
|
|
#
|
|
if (NOT DEFINED VCPKG_ROOT)
|
|
message(FATAL_ERROR "Please set a CMake variable VCPKG_ROOT")
|
|
endif()
|
|
|
|
#
|
|
# 3. Set VCPKG_TARGET_TRIPLET according to ANDROID_ABI
|
|
#
|
|
# There are four different Android ABI, each of which maps to
|
|
# a vcpkg triplet. The following table outlines the mapping from vcpkg architectures to android architectures
|
|
#
|
|
# |VCPKG_TARGET_TRIPLET | ANDROID_ABI |
|
|
# |---------------------------|----------------------|
|
|
# |arm64-android | arm64-v8a |
|
|
# |arm-android | armeabi-v7a |
|
|
# |x64-android | x86_64 |
|
|
# |x86-android | x86 |
|
|
#
|
|
# The variable must be stored in the cache in order to successfully the two toolchains.
|
|
#
|
|
if (ANDROID_ABI MATCHES "arm64-v8a")
|
|
set(VCPKG_TARGET_TRIPLET "arm64-android" CACHE STRING "" FORCE)
|
|
elseif(ANDROID_ABI MATCHES "armeabi-v7a")
|
|
set(VCPKG_TARGET_TRIPLET "arm-android" CACHE STRING "" FORCE)
|
|
elseif(ANDROID_ABI MATCHES "x86_64")
|
|
set(VCPKG_TARGET_TRIPLET "x64-android" CACHE STRING "" FORCE)
|
|
elseif(ANDROID_ABI MATCHES "x86")
|
|
set(VCPKG_TARGET_TRIPLET "x86-android" CACHE STRING "" FORCE)
|
|
else()
|
|
message(FATAL_ERROR "
|
|
Please specify ANDROID_ABI
|
|
For example
|
|
cmake ... -DANDROID_ABI=armeabi-v7a
|
|
|
|
Possible ABIs are: arm64-v8a, armeabi-v7a, x64-android, x86-android
|
|
")
|
|
endif()
|
|
message("vcpkg_android.cmake: VCPKG_TARGET_TRIPLET was set to ${VCPKG_TARGET_TRIPLET}")
|
|
|
|
#
|
|
# 4. Combine vcpkg and Android toolchains
|
|
#
|
|
|
|
# vcpkg and android both provide dedicated toolchains:
|
|
#
|
|
# vcpkg_toolchain_file=$VCPKG_ROOT/scripts/buildsystems/vcpkg.cmake
|
|
# android_toolchain_file=$ANDROID_NDK/build/cmake/android.toolchain.cmake
|
|
#
|
|
# When using vcpkg, the vcpkg toolchain shall be specified first.
|
|
# However, vcpkg provides a way to preload and additional toolchain,
|
|
# with the VCPKG_CHAINLOAD_TOOLCHAIN_FILE option.
|
|
set(VCPKG_CHAINLOAD_TOOLCHAIN_FILE ${ANDROID_NDK}/build/cmake/android.toolchain.cmake)
|
|
set(CMAKE_TOOLCHAIN_FILE ${VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake)
|
|
message("vcpkg_android.cmake: CMAKE_TOOLCHAIN_FILE was set to ${CMAKE_TOOLCHAIN_FILE}")
|
|
message("vcpkg_android.cmake: VCPKG_CHAINLOAD_TOOLCHAIN_FILE was set to ${VCPKG_CHAINLOAD_TOOLCHAIN_FILE}")
|
|
|
|
# vcpkg depends on the environment variables ANDROID_NDK_HOME and VCPKG_ROOT being set.
|
|
# However, we cannot set those through the Android Gradle plugin (we can only set CMake variables).
|
|
# Therefore, we forward our CMake variables to environment variables.
|
|
# FIXME: would be nice if vcpkg's android toolchain did not require this...
|
|
set(ENV{ANDROID_NDK_HOME} ${ANDROID_NDK})
|
|
set(ENV{VCPKG_ROOT} ${VCPKG_ROOT})
|
|
|
|
endif(VCPKG_TARGET_ANDROID)
|