diff --git a/build/build-clang/build-clang.py b/build/build-clang/build-clang.py index 44cb9f733a6c..21f95fa0875b 100755 --- a/build/build-clang/build-clang.py +++ b/build/build-clang/build-clang.py @@ -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), diff --git a/build/build-clang/clang-7-android.json b/build/build-clang/clang-7-android.json new file mode 100644 index 000000000000..a75290bbb1b8 --- /dev/null +++ b/build/build-clang/clang-7-android.json @@ -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" + ] +} diff --git a/taskcluster/ci/build/android.yml b/taskcluster/ci/build/android.yml index e857ac0f2f3f..0bc0b4c0df96 100644 --- a/taskcluster/ci/build/android.yml +++ b/taskcluster/ci/build/android.yml @@ -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 diff --git a/taskcluster/ci/toolchain/linux.yml b/taskcluster/ci/toolchain/linux.yml index 6387a25f12e7..52743c75613d 100755 --- a/taskcluster/ci/toolchain/linux.yml +++ b/taskcluster/ci/toolchain/linux.yml @@ -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: diff --git a/taskcluster/scripts/misc/build-clang-7-android.sh b/taskcluster/scripts/misc/build-clang-7-android.sh new file mode 100755 index 000000000000..0d28b5215137 --- /dev/null +++ b/taskcluster/scripts/misc/build-clang-7-android.sh @@ -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