""" This file is copied from the SkCMS repository. Original file: https://skia.googlesource.com/skcms/+/ba39d81f9797aa973bdf01aa6b0363b280352fba/toolchain/ndk_linux_arm64_toolchain_config.bzl This module defines the ndk_cc_toolchain_config rule. This file is based on the `external/androidndk/cc_toolchain_config.bzl` file produced by the built-in `android_ndk_repository` Bazel rule[1], which was used to build the SkCMS repository up until this revision[2]. The paths in this file point to locations inside the expanded Android NDK ZIP file (found at external/ndk_linux_amd64), and must be updated every time we upgrade to a new Android NDK version. [1] https://github.com/bazelbuild/bazel/blob/4710ef82ce34572878e07c52e83a0144d707f140/src/main/java/com/google/devtools/build/lib/bazel/rules/android/AndroidNdkRepositoryFunction.java#L422 [2] https://skia.googlesource.com/skcms/+/30c8e303800c256febb03a09fdcda7f75d119b1b/WORKSPACE#22 """ load("@bazel_tools//tools/build_defs/cc:action_names.bzl", "ACTION_NAMES") load( "@bazel_tools//tools/cpp:cc_toolchain_config_lib.bzl", "feature", "flag_group", "flag_set", "tool_path", "with_feature_set", ) load(":download_ndk_linux_amd64_toolchain.bzl", "NDK_PATH") # Supported CPUs. _ARMEABI_V7A = "armeabi-v7a" _ARM64_V8A = "arm64-v8a" _all_compile_actions = [ ACTION_NAMES.c_compile, ACTION_NAMES.cpp_compile, ACTION_NAMES.linkstamp_compile, ACTION_NAMES.assemble, ACTION_NAMES.preprocess_assemble, ACTION_NAMES.cpp_header_parsing, ACTION_NAMES.cpp_module_compile, ACTION_NAMES.cpp_module_codegen, ACTION_NAMES.clif_match, ACTION_NAMES.lto_backend, ] _all_link_actions = [ ACTION_NAMES.cpp_link_executable, ACTION_NAMES.cpp_link_dynamic_library, ACTION_NAMES.cpp_link_nodeps_dynamic_library, ] def _get_default_compile_flags(cpu): if cpu == _ARMEABI_V7A: return [ "-D__ANDROID_API__=29", "-isystem", NDK_PATH + "/sysroot/usr/include/arm-linux-androideabi", "-target", "armv7-none-linux-androideabi", "-march=armv7-a", "-mfloat-abi=softfp", "-mfpu=vfpv3-d16", "-gcc-toolchain", NDK_PATH + "/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64", "-fpic", "-no-canonical-prefixes", "-Wno-invalid-command-line-argument", "-Wno-unused-command-line-argument", "-funwind-tables", "-fstack-protector-strong", "-fno-addrsig", ] if cpu == _ARM64_V8A: return [ "-gcc-toolchain", NDK_PATH + "/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64", "-target", "aarch64-none-linux-android", "-fpic", "-isystem", NDK_PATH + "/sysroot/usr/include/aarch64-linux-android", "-D__ANDROID_API__=29", "-no-canonical-prefixes", "-Wno-invalid-command-line-argument", "-Wno-unused-command-line-argument", "-funwind-tables", "-fstack-protector-strong", "-fno-addrsig", ] fail("Unknown CPU: " + cpu) def _get_default_link_flags(cpu): if cpu == _ARMEABI_V7A: return [ "-target", "armv7-none-linux-androideabi", "-gcc-toolchain", NDK_PATH + "/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64", "-L", NDK_PATH + "/sources/cxx-stl/llvm-libc++/libs/armeabi-v7a", "-no-canonical-prefixes", "-Wl,-z,relro", "-lm", ] if cpu == _ARM64_V8A: return [ "-gcc-toolchain", NDK_PATH + "/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64", "-target", "aarch64-none-linux-android", "-L", NDK_PATH + "/sources/cxx-stl/llvm-libc++/libs/arm64-v8a", "-no-canonical-prefixes", "-Wl,-z,relro", "-lm", ] fail("Unknown CPU: " + cpu) def _get_default_dbg_flags(cpu): if cpu == _ARMEABI_V7A: return ["-g", "-fno-strict-aliasing", "-O0", "-UNDEBUG"] if cpu == _ARM64_V8A: return ["-O0", "-g", "-UNDEBUG"] fail("Unknown CPU: " + cpu) def _get_default_opt_flags(cpu): if cpu == _ARMEABI_V7A: return ["-mthumb", "-Os", "-g", "-DNDEBUG"] if cpu == _ARM64_V8A: return ["-O2", "-g", "-DNDEBUG"] fail("Unknown CPU: " + cpu) def _get_toolchain_identifier(cpu): if cpu == _ARMEABI_V7A: return "ndk-armeabi-v7a-toolchain" if cpu == _ARM64_V8A: return "ndk-arm64-v8a-toolchain" fail("Unknown CPU: " + cpu) def _get_target_system_name(cpu): if cpu == _ARMEABI_V7A: return "arm-linux-androideabi" if cpu == _ARM64_V8A: return "aarch64-linux-android" fail("Unknown CPU: " + cpu) def _get_builtin_sysroot(cpu): if cpu == _ARMEABI_V7A: return NDK_PATH + "/platforms/android-29/arch-arm" if cpu == _ARM64_V8A: return NDK_PATH + "/platforms/android-29/arch-arm64" fail("Unknown CPU: " + cpu) def _get_tool_paths(cpu): # The cc_common.create_cc_toolchain_config_info function expects tool paths to point to files # under the directory in which it is invoked. This means we cannot directly reference tools # under external/android_ndk. The solution is to use "trampoline" scripts that pass through # any command-line arguments to the NDK binaries under external/android_sdk. if cpu == _ARMEABI_V7A: return [ tool_path( name = "ar", path = "android_trampolines/arm-linux-androideabi-ar.sh", ), tool_path( name = "cpp", path = "android_trampolines/clang.sh", ), tool_path( name = "dwp", path = "android_trampolines/arm-linux-androideabi-dwp.sh", ), tool_path( name = "gcc", path = "android_trampolines/clang.sh", ), tool_path( name = "gcov", path = "/bin/false", ), tool_path( name = "ld", path = "android_trampolines/arm-linux-androideabi-ld.sh", ), tool_path( name = "nm", path = "android_trampolines/arm-linux-androideabi-nm.sh", ), tool_path( name = "objcopy", path = "android_trampolines/arm-linux-androideabi-objcopy.sh", ), tool_path( name = "objdump", path = "android_trampolines/arm-linux-androideabi-objdump.sh", ), tool_path( name = "strip", path = "android_trampolines/arm-linux-androideabi-strip.sh", ), ] if cpu == _ARM64_V8A: return [ tool_path( name = "ar", path = "android_trampolines/aarch64-linux-android-ar.sh", ), tool_path( name = "cpp", path = "android_trampolines/clang.sh", ), tool_path( name = "dwp", path = "android_trampolines/aarch64-linux-android-dwp.sh", ), tool_path( name = "gcc", path = "android_trampolines/clang.sh", ), tool_path( name = "gcov", path = "/bin/false", ), tool_path( name = "ld", path = "android_trampolines/aarch64-linux-android-ld.sh", ), tool_path( name = "nm", path = "android_trampolines/aarch64-linux-android-nm.sh", ), tool_path( name = "objcopy", path = "android_trampolines/aarch64-linux-android-objcopy.sh", ), tool_path( name = "objdump", path = "android_trampolines/aarch64-linux-android-objdump.sh", ), tool_path( name = "strip", path = "android_trampolines/aarch64-linux-android-strip.sh", ), ] fail("Unknown CPU: " + cpu) def _ndk_cc_toolchain_config_impl(ctx): default_compile_flags = _get_default_compile_flags(ctx.attr.cpu) unfiltered_compile_flags = [ "-isystem", NDK_PATH + "/sources/cxx-stl/llvm-libc++/include", "-isystem", NDK_PATH + "/sources/cxx-stl/llvm-libc++abi/include", "-isystem", NDK_PATH + "/sources/android/support/include", "-isystem", NDK_PATH + "/sysroot/usr/include", ] default_link_flags = _get_default_link_flags(ctx.attr.cpu) default_fastbuild_flags = [""] default_dbg_flags = _get_default_dbg_flags(ctx.attr.cpu) default_opt_flags = _get_default_opt_flags(ctx.attr.cpu) opt_feature = feature(name = "opt") fastbuild_feature = feature(name = "fastbuild") dbg_feature = feature(name = "dbg") supports_dynamic_linker_feature = feature(name = "supports_dynamic_linker", enabled = True) supports_pic_feature = feature(name = "supports_pic", enabled = True) static_link_cpp_runtimes_feature = feature(name = "static_link_cpp_runtimes", enabled = True) default_compile_flags_feature = feature( name = "default_compile_flags", enabled = True, flag_sets = [ flag_set( actions = _all_compile_actions, flag_groups = [flag_group(flags = default_compile_flags)], ), flag_set( actions = _all_compile_actions, flag_groups = [flag_group(flags = default_fastbuild_flags)], with_features = [with_feature_set(features = ["fastbuild"])], ), flag_set( actions = _all_compile_actions, flag_groups = [flag_group(flags = default_dbg_flags)], with_features = [with_feature_set(features = ["dbg"])], ), flag_set( actions = _all_compile_actions, flag_groups = [flag_group(flags = default_opt_flags)], with_features = [with_feature_set(features = ["opt"])], ), flag_set( actions = [ACTION_NAMES.cpp_compile], flag_groups = [flag_group(flags = ["-std=c++17"])], ), ], ) default_link_flags_feature = feature( name = "default_link_flags", enabled = True, flag_sets = [ flag_set( actions = _all_link_actions, flag_groups = [flag_group(flags = default_link_flags)], ), ], ) user_compile_flags_feature = feature( name = "user_compile_flags", enabled = True, flag_sets = [ flag_set( actions = _all_compile_actions, flag_groups = [ flag_group( flags = ["%{user_compile_flags}"], iterate_over = "user_compile_flags", expand_if_available = "user_compile_flags", ), ], ), ], ) sysroot_feature = feature( name = "sysroot", enabled = True, flag_sets = [ flag_set( actions = _all_compile_actions + _all_link_actions, flag_groups = [ flag_group( flags = ["--sysroot=%{sysroot}"], expand_if_available = "sysroot", ), ], ), ], ) unfiltered_compile_flags_feature = feature( name = "unfiltered_compile_flags", enabled = True, flag_sets = [ flag_set( actions = _all_compile_actions, flag_groups = [flag_group(flags = unfiltered_compile_flags)], ), ], ) features = [ default_compile_flags_feature, default_link_flags_feature, supports_dynamic_linker_feature, supports_pic_feature, static_link_cpp_runtimes_feature, fastbuild_feature, dbg_feature, opt_feature, user_compile_flags_feature, sysroot_feature, unfiltered_compile_flags_feature, ] cxx_builtin_include_directories = [ NDK_PATH + "/toolchains/llvm/prebuilt/linux-x86_64/lib64/clang/9.0.9/include", "%sysroot%/usr/include", NDK_PATH + "/sysroot/usr/include", ] # https://bazel.build/rules/lib/cc_common#create_cc_toolchain_config_info return cc_common.create_cc_toolchain_config_info( ctx = ctx, toolchain_identifier = _get_toolchain_identifier(ctx.attr.cpu), host_system_name = "local", target_system_name = _get_target_system_name(ctx.attr.cpu), target_cpu = ctx.attr.cpu, target_libc = "local", compiler = "clang9.0.9", abi_version = ctx.attr.cpu, abi_libc_version = "local", features = features, tool_paths = _get_tool_paths(ctx.attr.cpu), cxx_builtin_include_directories = cxx_builtin_include_directories, builtin_sysroot = _get_builtin_sysroot(ctx.attr.cpu), ) ndk_cc_toolchain_config = rule( implementation = _ndk_cc_toolchain_config_impl, attrs = { "cpu": attr.string( mandatory = True, values = [_ARMEABI_V7A, _ARM64_V8A], doc = "Target CPU.", ), }, provides = [CcToolchainConfigInfo], )