|  | # Copyright 2019 The Bazel 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. | 
|  |  | 
|  | """A Starlark cc_toolchain configuration rule for FreeBSD and OpenBSD.""" | 
|  |  | 
|  | load( | 
|  | "@bazel_tools//tools/cpp:cc_toolchain_config_lib.bzl", | 
|  | "action_config", | 
|  | "feature", | 
|  | "flag_group", | 
|  | "flag_set", | 
|  | "tool", | 
|  | "tool_path", | 
|  | "with_feature_set", | 
|  | ) | 
|  | load("@bazel_tools//tools/build_defs/cc:action_names.bzl", "ACTION_NAMES") | 
|  |  | 
|  | 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_cpp_compile_actions = [ | 
|  | ACTION_NAMES.cpp_compile, | 
|  | ACTION_NAMES.linkstamp_compile, | 
|  | ACTION_NAMES.cpp_header_parsing, | 
|  | ACTION_NAMES.cpp_module_compile, | 
|  | ACTION_NAMES.cpp_module_codegen, | 
|  | ACTION_NAMES.clif_match, | 
|  | ] | 
|  |  | 
|  | all_link_actions = [ | 
|  | ACTION_NAMES.cpp_link_executable, | 
|  | ACTION_NAMES.cpp_link_dynamic_library, | 
|  | ACTION_NAMES.cpp_link_nodeps_dynamic_library, | 
|  | ] | 
|  |  | 
|  | def _impl(ctx): | 
|  | cpu = ctx.attr.cpu | 
|  | is_bsd = cpu == "freebsd" or cpu == "openbsd" | 
|  | compiler = "compiler" | 
|  | toolchain_identifier = "local_{}".format(cpu) if is_bsd else "stub_armeabi-v7a" | 
|  | host_system_name = "local" if is_bsd else "armeabi-v7a" | 
|  | target_system_name = "local" if is_bsd else "armeabi-v7a" | 
|  | target_libc = "local" if is_bsd else "armeabi-v7a" | 
|  | abi_version = "local" if is_bsd else "armeabi-v7a" | 
|  | abi_libc_version = "local" if is_bsd else "armeabi-v7a" | 
|  |  | 
|  | objcopy_embed_data_action = action_config( | 
|  | action_name = "objcopy_embed_data", | 
|  | enabled = True, | 
|  | tools = [tool(path = "/usr/bin/objcopy")], | 
|  | ) | 
|  |  | 
|  | action_configs = [objcopy_embed_data_action] if is_bsd else [] | 
|  |  | 
|  | default_link_flags_feature = feature( | 
|  | name = "default_link_flags", | 
|  | enabled = True, | 
|  | flag_sets = [ | 
|  | flag_set( | 
|  | actions = all_link_actions, | 
|  | flag_groups = [ | 
|  | flag_group( | 
|  | flags = [ | 
|  | "-lstdc++", | 
|  | "-Wl,-z,relro,-z,now", | 
|  | "-no-canonical-prefixes", | 
|  | ], | 
|  | ), | 
|  | ], | 
|  | ), | 
|  | flag_set( | 
|  | actions = all_link_actions, | 
|  | flag_groups = [flag_group(flags = ["-Wl,--gc-sections"])], | 
|  | with_features = [with_feature_set(features = ["opt"])], | 
|  | ), | 
|  | ], | 
|  | ) | 
|  |  | 
|  | unfiltered_compile_flags_feature = feature( | 
|  | name = "unfiltered_compile_flags", | 
|  | enabled = True, | 
|  | flag_sets = [ | 
|  | flag_set( | 
|  | actions = all_compile_actions, | 
|  | flag_groups = [ | 
|  | flag_group( | 
|  | flags = [ | 
|  | "-no-canonical-prefixes", | 
|  | "-Wno-builtin-macro-redefined", | 
|  | "-D__DATE__=\"redacted\"", | 
|  | "-D__TIMESTAMP__=\"redacted\"", | 
|  | "-D__TIME__=\"redacted\"", | 
|  | ], | 
|  | ), | 
|  | ], | 
|  | ), | 
|  | ], | 
|  | ) | 
|  |  | 
|  | supports_pic_feature = feature(name = "supports_pic", 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 = [ | 
|  | "-U_FORTIFY_SOURCE", | 
|  | "-D_FORTIFY_SOURCE=1", | 
|  | "-fstack-protector", | 
|  | "-Wall", | 
|  | "-fno-omit-frame-pointer", | 
|  | ], | 
|  | ), | 
|  | ], | 
|  | ), | 
|  | flag_set( | 
|  | actions = all_compile_actions, | 
|  | flag_groups = [flag_group(flags = ["-g"])], | 
|  | with_features = [with_feature_set(features = ["dbg"])], | 
|  | ), | 
|  | flag_set( | 
|  | actions = all_compile_actions, | 
|  | flag_groups = [ | 
|  | flag_group( | 
|  | flags = [ | 
|  | "-g0", | 
|  | "-O2", | 
|  | "-DNDEBUG", | 
|  | "-ffunction-sections", | 
|  | "-fdata-sections", | 
|  | ], | 
|  | ), | 
|  | ], | 
|  | with_features = [with_feature_set(features = ["opt"])], | 
|  | ), | 
|  | flag_set( | 
|  | actions = all_cpp_compile_actions + [ACTION_NAMES.lto_backend], | 
|  | flag_groups = [flag_group(flags = ["-std=c++0x"])], | 
|  | ), | 
|  | ], | 
|  | ) | 
|  |  | 
|  | opt_feature = feature(name = "opt") | 
|  |  | 
|  | supports_dynamic_linker_feature = feature(name = "supports_dynamic_linker", enabled = True) | 
|  |  | 
|  | objcopy_embed_flags_feature = feature( | 
|  | name = "objcopy_embed_flags", | 
|  | enabled = True, | 
|  | flag_sets = [ | 
|  | flag_set( | 
|  | actions = ["objcopy_embed_data"], | 
|  | flag_groups = [flag_group(flags = ["-I", "binary"])], | 
|  | ), | 
|  | ], | 
|  | ) | 
|  |  | 
|  | dbg_feature = feature(name = "dbg") | 
|  |  | 
|  | 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 = [ | 
|  | ACTION_NAMES.c_compile, | 
|  | ACTION_NAMES.cpp_compile, | 
|  | ACTION_NAMES.linkstamp_compile, | 
|  | 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, | 
|  | flag_groups = [ | 
|  | flag_group( | 
|  | flags = ["--sysroot=%{sysroot}"], | 
|  | expand_if_available = "sysroot", | 
|  | ), | 
|  | ], | 
|  | ), | 
|  | ], | 
|  | ) | 
|  |  | 
|  | if is_bsd: | 
|  | features = [ | 
|  | default_compile_flags_feature, | 
|  | default_link_flags_feature, | 
|  | supports_dynamic_linker_feature, | 
|  | supports_pic_feature, | 
|  | objcopy_embed_flags_feature, | 
|  | opt_feature, | 
|  | dbg_feature, | 
|  | user_compile_flags_feature, | 
|  | sysroot_feature, | 
|  | unfiltered_compile_flags_feature, | 
|  | ] | 
|  | else: | 
|  | features = [supports_dynamic_linker_feature, supports_pic_feature] | 
|  |  | 
|  | if (is_bsd): | 
|  | cxx_builtin_include_directories = ["/usr/lib/clang", "/usr/local/include", "/usr/include"] | 
|  | else: | 
|  | cxx_builtin_include_directories = [] | 
|  |  | 
|  | if is_bsd: | 
|  | tool_paths = [ | 
|  | tool_path(name = "ar", path = "/usr/bin/ar"), | 
|  | tool_path(name = "cpp", path = "/usr/bin/cpp"), | 
|  | tool_path(name = "dwp", path = "/usr/bin/dwp"), | 
|  | tool_path(name = "gcc", path = "/usr/bin/clang"), | 
|  | tool_path(name = "gcov", path = "/usr/bin/gcov"), | 
|  | tool_path(name = "ld", path = "/usr/bin/ld"), | 
|  | tool_path(name = "nm", path = "/usr/bin/nm"), | 
|  | tool_path(name = "objcopy", path = "/usr/bin/objcopy"), | 
|  | tool_path(name = "objdump", path = "/usr/bin/objdump"), | 
|  | tool_path(name = "strip", path = "/usr/bin/strip"), | 
|  | ] | 
|  | else: | 
|  | tool_paths = [ | 
|  | tool_path(name = "ar", path = "/bin/false"), | 
|  | tool_path(name = "cpp", path = "/bin/false"), | 
|  | tool_path(name = "dwp", path = "/bin/false"), | 
|  | tool_path(name = "gcc", path = "/bin/false"), | 
|  | tool_path(name = "gcov", path = "/bin/false"), | 
|  | tool_path(name = "ld", path = "/bin/false"), | 
|  | tool_path(name = "nm", path = "/bin/false"), | 
|  | tool_path(name = "objcopy", path = "/bin/false"), | 
|  | tool_path(name = "objdump", path = "/bin/false"), | 
|  | tool_path(name = "strip", path = "/bin/false"), | 
|  | ] | 
|  |  | 
|  | out = ctx.actions.declare_file(ctx.label.name) | 
|  | ctx.actions.write(out, "Fake executable") | 
|  | return [ | 
|  | cc_common.create_cc_toolchain_config_info( | 
|  | ctx = ctx, | 
|  | features = features, | 
|  | action_configs = action_configs, | 
|  | cxx_builtin_include_directories = cxx_builtin_include_directories, | 
|  | toolchain_identifier = toolchain_identifier, | 
|  | host_system_name = host_system_name, | 
|  | target_system_name = target_system_name, | 
|  | target_cpu = cpu, | 
|  | target_libc = target_libc, | 
|  | compiler = compiler, | 
|  | abi_version = abi_version, | 
|  | abi_libc_version = abi_libc_version, | 
|  | tool_paths = tool_paths, | 
|  | ), | 
|  | DefaultInfo( | 
|  | executable = out, | 
|  | ), | 
|  | ] | 
|  |  | 
|  | cc_toolchain_config = rule( | 
|  | implementation = _impl, | 
|  | attrs = { | 
|  | "cpu": attr.string(mandatory = True), | 
|  | }, | 
|  | provides = [CcToolchainConfigInfo], | 
|  | executable = True, | 
|  | ) |