Bug 1504147 - Build compiler-rt libs for android on arm. r=froydnj

This patch is based on the cmake cache files for Android checked in to the
clang repo.

Differential Revision: https://phabricator.services.mozilla.com/D14004

--HG--
extra : moz-landing-system : lando
This commit is contained in:
Chris Manchester 2018-12-13 22:02:01 +00:00
parent 53a7fef91f
commit 5292ba5641
5 changed files with 156 additions and 7 deletions

View File

@ -186,7 +186,7 @@ def build_one_stage(cc, cxx, asm, ld, ar, ranlib, libtool,
src_dir, stage_dir, package_name, build_libcxx,
osx_cross_compile, build_type, assertions,
python_path, gcc_dir, libcxx_include_dir,
is_final_stage=False):
is_final_stage=False, android_targets=None):
if not os.path.exists(stage_dir):
os.mkdir(stage_dir)
@ -251,7 +251,55 @@ def build_one_stage(cc, cxx, asm, ld, ar, ranlib, libtool,
]
return cmake_args
cmake_args = cmake_base_args(
cmake_args = []
if is_final_stage and android_targets:
cmake_args += [
"-DCOMPILER_RT_DEFAULT_TARGET_TRIPLE=%s" % android_targets.keys()[0],
"-DLLVM_BUILTIN_TARGETS=%s" % ";".join(android_targets),
"-DLLVM_DEFAULT_TARGET_TRIPLE=%s" % android_targets.keys()[0],
"-DLLVM_ENABLE_LIBCXX=ON",
"-DLLVM_LIBDIR_SUFFIX=64",
"-DLLVM_RUNTIME_TARGETS=%s" % ";".join(android_targets),
]
android_link_flags = "-fuse-ld=lld"
for target, cfg in android_targets.iteritems():
sysroot_dir = cfg["ndk_sysroot"]
android_gcc_dir = cfg["ndk_toolchain"]
android_include_dirs = cfg["ndk_includes"]
android_flags = ["-isystem %s" % d for d in android_include_dirs]
android_flags += ["--gcc-toolchain=%s" % android_gcc_dir]
android_flags += ["-D__ANDROID_API__=16"]
rt_c_flags = " ".join(android_flags + cc[1:])
rt_cxx_flags = " ".join(android_flags + cxx[1:])
rt_asm_flags = " ".join(android_flags + asm[1:])
cmake_args += [
"-DBUILTINS_%s_ANDROID=1" % target,
"-DBUILTINS_%s_CMAKE_ASM_FLAGS=%s" % (target, rt_asm_flags),
"-DBUILTINS_%s_CMAKE_CXX_FLAGS=%s" % (target, rt_cxx_flags),
"-DBUILTINS_%s_CMAKE_C_FLAGS=%s" % (target, rt_c_flags),
"-DBUILTINS_%s_CMAKE_EXE_LINKER_FLAGS=%s" % (target, android_link_flags),
"-DBUILTINS_%s_CMAKE_SHARED_LINKER_FLAGS=%s" % (target, android_link_flags),
"-DBUILTINS_%s_CMAKE_SYSROOT=%s" % (target, sysroot_dir),
"-DRUNTIMES_%s_CMAKE_ASM_FLAGS=%s" % (target, rt_asm_flags),
"-DRUNTIMES_%s_CMAKE_CXX_FLAGS=%s" % (target, rt_cxx_flags),
"-DRUNTIMES_%s_CMAKE_C_FLAGS=%s" % (target, rt_c_flags),
"-DRUNTIMES_%s_CMAKE_EXE_LINKER_FLAGS=%s" % (target, android_link_flags),
"-DRUNTIMES_%s_CMAKE_SHARED_LINKER_FLAGS=%s" % (target, android_link_flags),
"-DRUNTIMES_%s_CMAKE_SYSROOT=%s" % (target, sysroot_dir),
"-DRUNTIMES_%s_COMPILER_RT_BUILD_PROFILE=ON" % target,
"-DRUNTIMES_%s_COMPILER_RT_BUILD_SANITIZERS=OFF" % target,
"-DRUNTIMES_%s_COMPILER_RT_INCLUDE_TESTS=OFF" % target,
"-DRUNTIMES_%s_LLVM_ENABLE_PER_TARGET_RUNTIME_DIR=OFF" % target,
"-DRUNTIMES_%s_LLVM_INCLUDE_TESTS=OFF" % target,
"-DRUNTIMES_%s_ANDROID_NATIVE_API_LEVEL=16" % target,
]
cmake_args += cmake_base_args(
cc, cxx, asm, ld, ar, ranlib, libtool, inst_dir)
cmake_args += [
src_dir
@ -534,6 +582,15 @@ if __name__ == "__main__":
gcc_dir = config["gcc_dir"]
if not os.path.exists(gcc_dir):
raise ValueError("gcc_dir must point to an existing path")
ndk_dir = None
android_targets = None
if "android_targets" in config:
android_targets = config["android_targets"]
for attr in ("ndk_toolchain", "ndk_sysroot", "ndk_includes"):
for target, cfg in android_targets.iteritems():
if attr not in cfg:
raise ValueError("must specify '%s' as a key for android target: %s" %
(attr, target))
if is_linux() and gcc_dir is None:
raise ValueError("Config file needs to set gcc_dir")
cc = get_tool(config, "cc")
@ -570,14 +627,15 @@ if __name__ == "__main__":
for p in config.get("patches", []):
patch(p, source_dir)
compiler_rt_source_link = llvm_source_dir + "/projects/compiler-rt"
symlinks = [(clang_source_dir,
llvm_source_dir + "/tools/clang"),
(extra_source_dir,
llvm_source_dir + "/tools/clang/tools/extra"),
(lld_source_dir,
llvm_source_dir + "/tools/lld"),
(compiler_rt_source_dir,
llvm_source_dir + "/projects/compiler-rt"),
(compiler_rt_source_dir, compiler_rt_source_link),
(libcxx_source_dir,
llvm_source_dir + "/projects/libcxx"),
(libcxxabi_source_dir,
@ -670,6 +728,15 @@ if __name__ == "__main__":
llvm_source_dir, stage1_dir, package_name, build_libcxx, osx_cross_compile,
build_type, assertions, python_path, gcc_dir, libcxx_include_dir)
if android_targets:
# Linking compiler-rt under "runtimes" activates LLVM_RUNTIME_TARGETS
# and related arguments.
symlink(compiler_rt_source_dir, llvm_source_dir + "/runtimes/compiler-rt")
try:
os.unlink(compiler_rt_source_link)
except Exception:
pass
if stages > 1:
stage2_dir = build_dir + '/stage2'
stage2_inst_dir = stage2_dir + '/' + package_name
@ -685,7 +752,7 @@ if __name__ == "__main__":
ar, ranlib, libtool,
llvm_source_dir, stage2_dir, package_name, build_libcxx, osx_cross_compile,
build_type, assertions, python_path, gcc_dir, libcxx_include_dir,
stages == 2)
is_final_stage=(stages == 2), android_targets=android_targets)
if stages > 2:
stage3_dir = build_dir + '/stage3'
@ -701,7 +768,7 @@ if __name__ == "__main__":
ar, ranlib, libtool,
llvm_source_dir, stage3_dir, package_name, build_libcxx, osx_cross_compile,
build_type, assertions, python_path, gcc_dir, libcxx_include_dir,
stages == 3)
(stages == 3))
if build_clang_tidy:
prune_final_dir_for_clang_tidy(os.path.join(final_stage_dir, package_name),

View File

@ -0,0 +1,33 @@
{
"llvm_revision": "342383",
"stages": "2",
"build_libcxx": true,
"build_type": "Release",
"assertions": false,
"llvm_repo": "https://llvm.org/svn/llvm-project/llvm/tags/RELEASE_700/final",
"clang_repo": "https://llvm.org/svn/llvm-project/cfe/tags/RELEASE_700/final",
"lld_repo": "https://llvm.org/svn/llvm-project/lld/tags/RELEASE_700/final",
"compiler_repo": "https://llvm.org/svn/llvm-project/compiler-rt/tags/RELEASE_700/final",
"libcxx_repo": "https://llvm.org/svn/llvm-project/libcxx/tags/RELEASE_700/final",
"libcxxabi_repo": "https://llvm.org/svn/llvm-project/libcxxabi/tags/RELEASE_700/final",
"python_path": "/usr/bin/python2.7",
"gcc_dir": "/builds/worker/workspace/build/src/gcc",
"cc": "/builds/worker/workspace/build/src/gcc/bin/gcc",
"cxx": "/builds/worker/workspace/build/src/gcc/bin/g++",
"as": "/builds/worker/workspace/build/src/gcc/bin/gcc",
"android_targets": {
"armv7-linux-android": {
"ndk_toolchain": "/builds/worker/workspace/build/src/android-ndk/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64",
"ndk_sysroot": "/builds/worker/workspace/build/src/android-ndk/platforms/android-16/arch-arm",
"ndk_includes": [
"/builds/worker/workspace/build/src/android-ndk/sysroot/usr/include/arm-linux-androideabi",
"/builds/worker/workspace/build/src/android-ndk/sysroot/usr/include"
]
}
},
"patches": [
"static-llvm-symbolizer.patch",
"find_symbolizer_linux.patch",
"rename_gcov_flush_.patch"
]
}

View File

@ -322,7 +322,7 @@ android-api-16/opt:
- android-gradle-dependencies
- android-ndk-linux
- android-sdk-linux
- linux64-clang
- linux64-clang-android-cross
- linux64-rust-android
- linux64-rust-size
- linux64-cbindgen

View File

@ -97,6 +97,29 @@ linux64-clang-trunk-mingw-x64:
toolchains:
- linux64-gcc-4.9
linux64-clang-7-android-cross:
description: "Clang 7 toolchain build"
treeherder:
kind: build
platform: toolchains/opt
symbol: TL(clang7-android)
tier: 1
worker-type: aws-provisioner-v1/gecko-{level}-b-linux-xlarge
worker:
max-run-time: 7200
run:
using: toolchain-script
script: build-clang-7-android.sh
resources:
- 'build/build-clang/build-clang.py'
- 'build/build-clang/clang-7-android.json'
- 'taskcluster/scripts/misc/tooltool-download.sh'
toolchain-alias: linux64-clang-android-cross
toolchain-artifact: public/build/clang.tar.xz
toolchains:
- linux64-gcc-4.9
- linux64-android-ndk-linux-repack
linux64-clang-7-macosx-cross:
description: "Clang 7 toolchain build with MacOS Compiler RT libs"
treeherder:

View File

@ -0,0 +1,26 @@
#!/bin/bash
set -x -e -v
# This script is for building clang on a Linux host with android compiler rt
# libs.
WORKSPACE=$HOME/workspace
HOME_DIR=$WORKSPACE/build
UPLOAD_DIR=$HOME/artifacts
cd $HOME_DIR/src
. taskcluster/scripts/misc/tooltool-download.sh
# gets a bit too verbose here
set +x
cd build/build-clang
# |mach python| sets up a virtualenv for us!
../../mach python ./build-clang.py -c clang-7-android.json
set -x
# Put a tarball in the artifacts dir
mkdir -p $UPLOAD_DIR
cp clang.tar.* $UPLOAD_DIR