-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Fix API clamping in the new CMake toolchain.
Test: added test Bug: android/ndk#1560 Change-Id: If5fbba07e1c3630ef1b2766c684288ca07294ff6 (cherry picked from commit 29519e9)
- Loading branch information
Showing
8 changed files
with
136 additions
and
28 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,63 @@ | ||
include(${CMAKE_ANDROID_NDK}/build/cmake/platforms.cmake) | ||
|
||
function(adjust_api_level api_level result_name) | ||
# If no platform version was chosen by the user, default to the minimum | ||
# version supported by this NDK. | ||
if(NOT api_level) | ||
message(STATUS | ||
"ANDROID_PLATFORM not set. Defaulting to minimum supported version " | ||
"${NDK_MIN_PLATFORM_LEVEL}.") | ||
|
||
set(api_level "android-${NDK_MIN_PLATFORM_LEVEL}") | ||
endif() | ||
|
||
if(api_level STREQUAL "latest") | ||
message(STATUS | ||
"Using latest available ANDROID_PLATFORM: ${NDK_MAX_PLATFORM_LEVEL}.") | ||
set(api_level "android-${NDK_MAX_PLATFORM_LEVEL}") | ||
endif() | ||
|
||
string(REPLACE "android-" "" result ${api_level}) | ||
|
||
# Aliases defined by meta/platforms.json include codename aliases for platform | ||
# API levels as well as cover any gaps in platforms that may not have had NDK | ||
# APIs. | ||
if(NOT "${NDK_PLATFORM_ALIAS_${result}}" STREQUAL "") | ||
message(STATUS | ||
"${api_level} is an alias for ${NDK_PLATFORM_ALIAS_${result}}. Adjusting " | ||
"ANDROID_PLATFORM to match.") | ||
set(api_level "${NDK_PLATFORM_ALIAS_${result}}") | ||
string(REPLACE "android-" "" result ${api_level}) | ||
endif() | ||
|
||
# Pull up to the minimum supported version if an old API level was requested. | ||
if(result LESS NDK_MIN_PLATFORM_LEVEL) | ||
message(STATUS | ||
"${api_level} is unsupported. Using minimum supported version " | ||
"${NDK_MIN_PLATFORM_LEVEL}.") | ||
set(api_level "android-${NDK_MIN_PLATFORM_LEVEL}") | ||
string(REPLACE "android-" "" result ${api_level}) | ||
endif() | ||
|
||
# And for LP64 we need to pull up to 21. No diagnostic is provided here | ||
# because minSdkVersion < 21 is valid for the project even though it may not | ||
# be for this ABI. | ||
if(ANDROID_ABI MATCHES "64(-v8a)?$" AND result LESS 21) | ||
message(STATUS | ||
"android-${result} is not supported for ${ANDROID_ABI}. Using minimum " | ||
"supported LP64 version 21.") | ||
set(api_level android-21) | ||
set(result 21) | ||
endif() | ||
|
||
# ANDROID_PLATFORM beyond the maximum is an error. The correct way to specify | ||
# the latest version is ANDROID_PLATFORM=latest. | ||
if(result GREATER NDK_MAX_PLATFORM_LEVEL) | ||
message(SEND_ERROR | ||
"${api_level} is above the maximum supported version " | ||
"${NDK_MAX_PLATFORM_LEVEL}. Choose a supported API level or set " | ||
"ANDROID_PLATFORM to \"latest\".") | ||
endif() | ||
|
||
set(${result_name} ${result} PARENT_SCOPE) | ||
endfunction() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Empty file.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,4 @@ | ||
cmake_minimum_required(VERSION 3.6) | ||
project(ApiLevelPullUpTest CXX) | ||
|
||
add_library(foo SHARED foo.cpp) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
#if __ANDROID_API__ != 21 | ||
#error API level was not pulled up to 21 | ||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,48 @@ | ||
# | ||
# Copyright (C) 2021 The Android Open Source Project | ||
# | ||
# Licensed 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. | ||
# | ||
"""Check that pre-LP64 API levels are correctly pulled-up for CMake.""" | ||
from pathlib import Path | ||
import subprocess | ||
|
||
from ndk.cmake import find_cmake, find_ninja | ||
from ndk.test.spec import BuildConfiguration, CMakeToolchainFile | ||
|
||
|
||
def run_test(ndk_path: str, config: BuildConfiguration) -> tuple[bool, str]: | ||
"""Check that pre-LP64 API levels are correctly pulled-up for CMake.""" | ||
cmake = find_cmake() | ||
ninja = find_ninja() | ||
toolchain_path = Path(ndk_path) / 'build/cmake/android.toolchain.cmake' | ||
project_path = 'project' | ||
if config.toolchain_file is CMakeToolchainFile.Legacy: | ||
toolchain_mode = 'ON' | ||
else: | ||
toolchain_mode = 'OFF' | ||
cmake_cmd = [ | ||
str(cmake), | ||
f'-DCMAKE_TOOLCHAIN_FILE={toolchain_path}', | ||
f'-DANDROID_ABI={config.abi}', | ||
'-DANDROID_PLATFORM=android-19', | ||
f'-DCMAKE_MAKE_PROGRAM={ninja}', | ||
f'-DANDROID_USE_LEGACY_TOOLCHAIN_FILE={toolchain_mode}', | ||
'-GNinja', | ||
] | ||
result = subprocess.run(cmake_cmd, | ||
check=False, | ||
cwd=project_path, | ||
capture_output=True, | ||
text=True) | ||
return result.returncode == 0, result.stdout |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
from typing import Optional | ||
|
||
from ndk.abis import LP32_ABIS | ||
from ndk.test.types import Test | ||
|
||
|
||
def build_unsupported(test: Test) -> Optional[str]: | ||
if test.config.abi in LP32_ABIS: | ||
return test.config.abi | ||
return None |