mirror of
https://github.com/chromium/crashpad.git
synced 2024-12-27 07:14:10 +08:00
f8ef834ef5
Previously, the __ANDROID_API__ macro was provided by <android/api-level.h>. With unified headers (expected to become the default in the next NDK release and the sole option in the subsequent release), this macro is not set properly by headers. When building with Clang, the standalone toolchain’s clang and clang++ wrappers set the macro properly. GCC isn’t accounted for in this way, so the build system must assume the responsibility of setting it. This change fishes the value of __ANDROID_API__ out of the standalone toolchain’s clang wrapper and sets the android_api_level GYP variable appropriately. From there, it will be picked up by common.gypi in mini_chromium and used to define __ANDROID_API__. This updates mini_chromium to 62e6015f633dd4acb1610db15a064889315cadaa which understands this new GYP variable. 62e6015f633d android: Support “unified headers” with GCC build https://android.googlesource.com/platform/ndk/+/master/docs/UnifiedHeaders.md https://android.googlesource.com/platform/ndk/+/ndk-r14/CHANGELOG.md Bug: crashpad:30 Change-Id: I33e66eba8394e32ced8dca80c8226b85e0e786f3 Reviewed-on: https://chromium-review.googlesource.com/458021 Commit-Queue: Mark Mentovai <mark@chromium.org> Reviewed-by: Scott Graham <scottmg@chromium.org>
108 lines
4.0 KiB
Python
Executable File
108 lines
4.0 KiB
Python
Executable File
#!/usr/bin/env python
|
||
# coding: utf-8
|
||
|
||
# Copyright 2017 The Crashpad Authors. All rights reserved.
|
||
#
|
||
# 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.
|
||
|
||
import argparse
|
||
import glob
|
||
import gyp_crashpad
|
||
import os
|
||
import re
|
||
import subprocess
|
||
import sys
|
||
|
||
|
||
def main(args):
|
||
parser = argparse.ArgumentParser(
|
||
description='Set up an Android cross build',
|
||
epilog='Additional arguments will be passed to gyp_crashpad.py.')
|
||
parser.add_argument('--ndk', required=True, help='Standalone NDK toolchain')
|
||
parser.add_argument('--compiler',
|
||
default='clang',
|
||
choices=('clang', 'gcc'),
|
||
help='The compiler to use, clang by default')
|
||
(parsed, extra_command_line_args) = parser.parse_known_args(args)
|
||
|
||
NDK_ERROR=(
|
||
'NDK must be a valid standalone NDK toolchain.\n' +
|
||
'See https://developer.android.com/ndk/guides/standalone_toolchain.html')
|
||
arch_dirs = glob.glob(os.path.join(parsed.ndk, '*-linux-android*'))
|
||
if len(arch_dirs) != 1:
|
||
parser.error(NDK_ERROR)
|
||
|
||
arch_triplet = os.path.basename(arch_dirs[0])
|
||
ARCH_TRIPLET_TO_ARCH = {
|
||
'arm-linux-androideabi': 'arm',
|
||
'aarch64-linux-android': 'arm64',
|
||
'i686-linux-android': 'x86',
|
||
'x86_64-linux-android': 'x86_64',
|
||
'mipsel-linux-android': 'mips',
|
||
'mips64el-linux-android': 'mips64',
|
||
}
|
||
if arch_triplet not in ARCH_TRIPLET_TO_ARCH:
|
||
parser.error(NDK_ERROR)
|
||
arch = ARCH_TRIPLET_TO_ARCH[arch_triplet]
|
||
|
||
ndk_bin_dir = os.path.join(parsed.ndk, 'bin')
|
||
|
||
clang_path = os.path.join(ndk_bin_dir, 'clang')
|
||
extra_args = []
|
||
|
||
if parsed.compiler == 'clang':
|
||
os.environ['CC_target'] = clang_path
|
||
os.environ['CXX_target'] = os.path.join(ndk_bin_dir, 'clang++')
|
||
elif parsed.compiler == 'gcc':
|
||
os.environ['CC_target'] = os.path.join(ndk_bin_dir,
|
||
'%s-gcc' % arch_triplet)
|
||
os.environ['CXX_target'] = os.path.join(ndk_bin_dir,
|
||
'%s-g++' % arch_triplet)
|
||
|
||
# Unlike the Clang build, when using GCC with “unified headers,”
|
||
# __ANDROID_API__ isn’t set automatically and must be pushed in to the
|
||
# build. Fish the correct value out of the Clang wrapper script. If unified
|
||
# headers are not being used, the Clang wrapper won’t mention
|
||
# __ANDROID_API__, but the standalone toolchain’s <android/api-level.h> will
|
||
# #define it for both Clang and GCC.
|
||
#
|
||
# Unified headers are the way of the future, according to
|
||
# https://android.googlesource.com/platform/ndk/+/ndk-r14/CHANGELOG.md and
|
||
# https://android.googlesource.com/platform/ndk/+/master/docs/UnifiedHeaders.md.
|
||
with open(clang_path, 'r') as file:
|
||
clang_script_contents = file.read()
|
||
matches = re.finditer(r'\s-D__ANDROID_API__=([\d]+)\s',
|
||
clang_script_contents)
|
||
match = next(matches, None)
|
||
if match:
|
||
android_api = int(match.group(1))
|
||
extra_args.extend(['-D', 'android_api_level=%d' % android_api])
|
||
if next(matches, None):
|
||
raise AssertionError('__ANDROID_API__ defined too many times')
|
||
|
||
for tool in ('ar', 'nm', 'readelf'):
|
||
os.environ['%s_target' % tool.upper()] = (
|
||
os.path.join(ndk_bin_dir, '%s-%s' % (arch_triplet, tool)))
|
||
|
||
return gyp_crashpad.main(
|
||
['-D', 'OS=android',
|
||
'-D', 'target_arch=%s' % arch,
|
||
'-D', 'clang=%d' % (1 if parsed.compiler == 'clang' else 0),
|
||
'-f', 'ninja-android'] +
|
||
extra_args +
|
||
extra_command_line_args)
|
||
|
||
|
||
if __name__ == '__main__':
|
||
sys.exit(main(sys.argv[1:]))
|