Use latest Android SDK toolchain

This commit is contained in:
2026-06-05 12:28:47 +02:00
parent ac4fef8346
commit c761cd39fd
11 changed files with 319 additions and 15 deletions

View File

@@ -0,0 +1,103 @@
[CmdletBinding()]
param(
[string[]]$Packages = @("standard"),
[switch]$ConfigureOnly
)
$ErrorActionPreference = "Stop"
. "$PSScriptRoot\android-sdk-env.ps1"
function Expand-ArgumentList {
param([string[]]$Values)
$expanded = @()
foreach ($value in $Values) {
foreach ($part in ($value -split ",")) {
$trimmed = $part.Trim()
if ($trimmed.Length -gt 0) {
$expanded += $trimmed
}
}
}
return $expanded
}
$Packages = @(Expand-ArgumentList -Values $Packages)
$toolchain = Set-AndroidSdkToolchainEnvironment
$packageMap = @{
standard = "android/android"
quest = "android/quest"
focus = "android/focus"
}
$started = Get-Date
$results = @()
$overallExitCode = 0
foreach ($package in $Packages) {
if (!$packageMap.ContainsKey($package)) {
throw "Unknown Android package '$package'. Expected one of: standard, quest, focus."
}
$sourceDir = $packageMap[$package]
$buildDir = "out/build/android-legacy-$package-arm64"
$toolchainFile = Join-Path $toolchain.ndkPath "build\cmake\android.toolchain.cmake"
$configureArgs = @(
"-S", $sourceDir,
"-B", $buildDir,
"-G", "Ninja",
"-DCMAKE_TOOLCHAIN_FILE=$toolchainFile",
"-DANDROID_ABI=arm64-v8a",
"-DANDROID_PLATFORM=android-23"
)
& $toolchain.cmakeCommand @configureArgs
$configureExitCode = $LASTEXITCODE
if ($configureExitCode -ne 0) {
if ($overallExitCode -eq 0) {
$overallExitCode = $configureExitCode
}
$results += [ordered]@{
package = $package
stage = "configure"
exitCode = $configureExitCode
}
continue
}
if ($ConfigureOnly) {
$results += [ordered]@{
package = $package
stage = "configure"
exitCode = 0
}
continue
}
& $toolchain.cmakeCommand --build $buildDir --target native-lib
$buildExitCode = $LASTEXITCODE
if ($buildExitCode -ne 0 -and $overallExitCode -eq 0) {
$overallExitCode = $buildExitCode
}
$results += [ordered]@{
package = $package
stage = "build"
target = "native-lib"
exitCode = $buildExitCode
}
}
$elapsed = [int]((Get-Date) - $started).TotalMilliseconds
[ordered]@{
command = "android-legacy-package-build"
exitCode = $overallExitCode
elapsedMs = $elapsed
androidToolchain = $toolchain
results = $results
} | ConvertTo-Json -Compress -Depth 6
exit $overallExitCode

View File

@@ -0,0 +1,66 @@
[CmdletBinding()]
param()
$ErrorActionPreference = "Stop"
function Get-AndroidSdkRoot {
$candidates = @(
$env:ANDROID_SDK_ROOT,
$env:ANDROID_HOME,
(Join-Path $env:LOCALAPPDATA "Android\Sdk")
)
foreach ($candidate in $candidates) {
if ($candidate -and (Test-Path -LiteralPath $candidate -PathType Container)) {
return (Resolve-Path -LiteralPath $candidate).Path
}
}
throw "Android SDK root was not found. Install command-line tools or set ANDROID_SDK_ROOT."
}
function Get-LatestAndroidSdkPackageDirectory {
param(
[Parameter(Mandatory=$true)][string]$SdkRoot,
[Parameter(Mandatory=$true)][string]$PackageName
)
$packageRoot = Join-Path $SdkRoot $PackageName
if (!(Test-Path -LiteralPath $packageRoot -PathType Container)) {
throw "Android SDK package directory not found: $packageRoot"
}
$packages = @(Get-ChildItem -LiteralPath $packageRoot -Directory |
Where-Object { $_.Name -match '^\d+(\.\d+)*$' } |
Sort-Object { [version]$_.Name } -Descending)
if ($packages.Count -eq 0) {
throw "No installed Android SDK package versions found under $packageRoot"
}
return $packages[0]
}
function Set-AndroidSdkToolchainEnvironment {
$sdkRoot = Get-AndroidSdkRoot
$ndk = Get-LatestAndroidSdkPackageDirectory -SdkRoot $sdkRoot -PackageName "ndk"
$cmake = Get-LatestAndroidSdkPackageDirectory -SdkRoot $sdkRoot -PackageName "cmake"
$cmakeCommand = Join-Path $cmake.FullName "bin\cmake.exe"
if (!(Test-Path -LiteralPath $cmakeCommand -PathType Leaf)) {
throw "Android SDK CMake executable not found: $cmakeCommand"
}
$env:ANDROID_HOME = $sdkRoot
$env:ANDROID_SDK_ROOT = $sdkRoot
$env:ANDROID_NDK_HOME = $ndk.FullName
$env:ANDROID_NDK_ROOT = $ndk.FullName
return [ordered]@{
sdkRoot = $sdkRoot
ndkVersion = $ndk.Name
ndkPath = $ndk.FullName
cmakeVersion = $cmake.Name
cmakeCommand = $cmakeCommand
}
}

View File

@@ -0,0 +1,78 @@
#!/usr/bin/env sh
android_sdk_root() {
if [ -n "${ANDROID_SDK_ROOT:-}" ] && [ -d "$ANDROID_SDK_ROOT" ]; then
printf '%s\n' "$ANDROID_SDK_ROOT"
return 0
fi
if [ -n "${ANDROID_HOME:-}" ] && [ -d "$ANDROID_HOME" ]; then
printf '%s\n' "$ANDROID_HOME"
return 0
fi
if [ -n "${LOCALAPPDATA:-}" ]; then
local_sdk="$LOCALAPPDATA/Android/Sdk"
if command -v cygpath >/dev/null 2>&1; then
local_sdk="$(cygpath -u "$local_sdk")"
fi
if [ -d "$local_sdk" ]; then
printf '%s\n' "$local_sdk"
return 0
fi
fi
if [ -d "$HOME/Android/Sdk" ]; then
printf '%s\n' "$HOME/Android/Sdk"
return 0
fi
return 1
}
latest_android_package_dir() {
root="$1"
package="$2"
package_root="$root/$package"
[ -d "$package_root" ] || return 1
latest="$(
for dir in "$package_root"/*; do
[ -d "$dir" ] || continue
version="${dir##*/}"
printf '%s\n' "$version"
done | grep -E '^[0-9]+(\.[0-9]+)*$' | sort -t . -k 1,1n -k 2,2n -k 3,3n -k 4,4n | tail -n 1
)"
[ -n "$latest" ] || return 1
printf '%s/%s\n' "$package_root" "$latest"
}
set_android_sdk_toolchain_environment() {
sdk_root="$(android_sdk_root)" || {
printf '%s\n' "Android SDK root was not found. Install command-line tools or set ANDROID_SDK_ROOT." >&2
return 1
}
ndk_dir="$(latest_android_package_dir "$sdk_root" ndk)" || {
printf '%s\n' "No installed Android NDK package was found under $sdk_root/ndk." >&2
return 1
}
cmake_dir="$(latest_android_package_dir "$sdk_root" cmake)" || {
printf '%s\n' "No installed Android CMake package was found under $sdk_root/cmake." >&2
return 1
}
cmake_command="$cmake_dir/bin/cmake"
[ -x "$cmake_command" ] || {
printf '%s\n' "Android SDK CMake executable not found: $cmake_command" >&2
return 1
}
export ANDROID_HOME="$sdk_root"
export ANDROID_SDK_ROOT="$sdk_root"
export ANDROID_NDK_HOME="$ndk_dir"
export ANDROID_NDK_ROOT="$ndk_dir"
export ANDROID_CMAKE_COMMAND="$cmake_command"
export ANDROID_NDK_VERSION="${ndk_dir##*/}"
export ANDROID_CMAKE_VERSION="${cmake_dir##*/}"
}

View File

@@ -96,12 +96,25 @@ function Expand-ArgumentList {
$Presets = @(Expand-ArgumentList -Values $Presets)
$Targets = @(Expand-ArgumentList -Values $Targets)
$cmakeCommand = "cmake"
$androidToolchain = $null
if ($Presets | Where-Object { $_ -like "android-*" }) {
. "$PSScriptRoot\android-sdk-env.ps1"
$androidToolchain = Set-AndroidSdkToolchainEnvironment
$cmakeCommand = $androidToolchain.cmakeCommand
}
$started = Get-Date
$results = @()
$overallExitCode = 0
foreach ($preset in $Presets) {
& cmake --preset $preset
$presetCmakeCommand = $cmakeCommand
if ($androidToolchain -and $preset -notlike "android-*") {
$presetCmakeCommand = "cmake"
}
& $presetCmakeCommand --preset $preset
$configureExitCode = $LASTEXITCODE
if ($configureExitCode -ne 0) {
$overallExitCode = $configureExitCode
@@ -118,7 +131,7 @@ foreach ($preset in $Presets) {
$buildArgs += @("--target", $target)
}
& cmake @buildArgs
& $presetCmakeCommand @buildArgs
$buildExitCode = $LASTEXITCODE
if ($buildExitCode -ne 0 -and $overallExitCode -eq 0) {
$overallExitCode = $buildExitCode
@@ -137,6 +150,7 @@ $elapsed = [int]((Get-Date) - $started).TotalMilliseconds
command = "platform-build"
exitCode = $overallExitCode
elapsedMs = $elapsed
androidToolchain = $androidToolchain
results = $results
} | ConvertTo-Json -Compress -Depth 6

View File

@@ -6,6 +6,16 @@ shift || true
targets="${*:-pp_foundation pp_assets pp_paint pp_document pp_renderer_api pp_renderer_gl pp_paint_renderer pp_ui_core pp_platform_api pp_app_core pano_cli pp_foundation_binary_stream_tests pp_foundation_event_tests pp_foundation_log_tests pp_foundation_parse_tests pp_foundation_task_queue_tests pp_foundation_trace_tests pp_assets_brush_package_tests pp_assets_image_format_tests pp_assets_image_metadata_tests pp_assets_image_pixels_tests pp_assets_ppi_header_tests pp_assets_settings_document_tests pp_paint_brush_tests pp_paint_blend_tests pp_paint_stroke_tests pp_paint_stroke_script_tests pp_document_tests pp_document_ppi_import_tests pp_document_ppi_export_tests pp_renderer_api_tests pp_renderer_gl_capabilities_tests pp_renderer_gl_command_plan_tests pp_paint_renderer_compositor_tests pp_platform_api_tests pp_ui_core_color_tests pp_ui_core_layout_value_tests pp_ui_core_layout_xml_tests pp_app_core_about_menu_tests pp_app_core_app_preferences_tests pp_app_core_app_frame_tests pp_app_core_app_thread_tests pp_app_core_app_input_tests pp_app_core_app_shutdown_tests pp_app_core_app_startup_tests pp_app_core_app_status_tests pp_app_core_command_convert_tests pp_app_core_brush_package_export_tests pp_app_core_brush_package_import_tests pp_app_core_brush_ui_tests pp_app_core_canvas_hotkey_tests pp_app_core_canvas_tool_ui_tests pp_app_core_canvas_view_tests pp_app_core_document_animation_tests pp_app_core_document_canvas_tests pp_app_core_document_cloud_tests pp_app_core_document_export_tests pp_app_core_document_import_tests pp_app_core_document_layer_tests pp_app_core_document_platform_io_tests pp_app_core_document_recording_tests pp_app_core_document_resize_tests pp_app_core_document_route_tests pp_app_core_document_sharing_tests pp_app_core_document_session_tests pp_app_core_file_menu_tests pp_app_core_grid_ui_tests pp_app_core_history_ui_tests pp_app_core_main_toolbar_tests pp_app_core_quick_ui_tests pp_app_core_tools_menu_tests}"
start="$(date +%s)"
android_cmake_cmd=""
case " $presets " in
*" android-"*)
# shellcheck disable=SC1091
. "$(dirname "$0")/android-sdk-env.sh"
set_android_sdk_toolchain_environment || exit 1
android_cmake_cmd="$ANDROID_CMAKE_COMMAND"
;;
esac
overall_exit=0
results=""
first_result=1
@@ -17,14 +27,21 @@ done
normalized_presets="$(printf '%s' "$presets" | tr ',' ' ')"
for preset in $normalized_presets; do
cmake --preset "$preset"
cmake_cmd="cmake"
case "$preset" in
android-*)
cmake_cmd="$android_cmake_cmd"
;;
esac
"$cmake_cmd" --preset "$preset"
configure_exit="$?"
if [ "$configure_exit" -ne 0 ]; then
[ "$overall_exit" -eq 0 ] && overall_exit="$configure_exit"
result="$(printf '{"preset":"%s","stage":"configure","exitCode":%s}' "$preset" "$configure_exit")"
else
# shellcheck disable=SC2086
cmake --build --preset "$preset" $build_args
"$cmake_cmd" --build --preset "$preset" $build_args
build_exit="$?"
[ "$build_exit" -ne 0 ] && [ "$overall_exit" -eq 0 ] && overall_exit="$build_exit"
result="$(printf '{"preset":"%s","stage":"build","targets":"%s","exitCode":%s}' "$preset" "$targets" "$build_exit")"
@@ -40,5 +57,9 @@ done
end="$(date +%s)"
elapsed_ms="$(( (end - start) * 1000 ))"
printf '{"command":"platform-build","exitCode":%s,"elapsedMs":%s,"results":[%s]}\n' "$overall_exit" "$elapsed_ms" "$results"
if [ -n "${ANDROID_NDK_HOME:-}" ] && [ -n "${ANDROID_CMAKE_COMMAND:-}" ]; then
printf '{"command":"platform-build","exitCode":%s,"elapsedMs":%s,"androidToolchain":{"sdkRoot":"%s","ndkVersion":"%s","ndkPath":"%s","cmakeVersion":"%s","cmakeCommand":"%s"},"results":[%s]}\n' "$overall_exit" "$elapsed_ms" "$ANDROID_SDK_ROOT" "$ANDROID_NDK_VERSION" "$ANDROID_NDK_HOME" "$ANDROID_CMAKE_VERSION" "$ANDROID_CMAKE_COMMAND" "$results"
else
printf '{"command":"platform-build","exitCode":%s,"elapsedMs":%s,"results":[%s]}\n' "$overall_exit" "$elapsed_ms" "$results"
fi
exit "$overall_exit"