| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302 |
- # Part of the Carbon Language project, under the Apache License v2.0 with LLVM
- # Exceptions. See /LICENSE for license information.
- # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
- """Definitions of general C++ `cc_toolchain_config` features."""
- load("@rules_cc//cc:action_names.bzl", "ACTION_NAMES", "ACTION_NAME_GROUPS")
- load(
- "@rules_cc//cc:cc_toolchain_config_lib.bzl",
- "feature",
- "flag_group",
- "flag_set",
- "with_feature_set",
- )
- load(
- ":cc_toolchain_actions.bzl",
- "preprocessor_compile_actions",
- )
- clang_feature = feature(
- name = "clang",
- enabled = True,
- flag_sets = [
- flag_set(
- actions = ACTION_NAME_GROUPS.all_cc_compile_actions + ACTION_NAME_GROUPS.all_cc_link_actions,
- flag_groups = [
- flag_group(flags = [
- "-no-canonical-prefixes",
- "-fcolor-diagnostics",
- ]),
- flag_group(
- expand_if_available = "sysroot",
- flags = ["--sysroot=%{sysroot}"],
- ),
- ],
- ),
- flag_set(
- actions = ACTION_NAME_GROUPS.all_cc_compile_actions,
- flag_groups = [
- flag_group(flags = [
- # Compile actions shouldn't link anything.
- "-c",
- ]),
- # Flags controlling the production of specific outputs from
- # compile actions.
- flag_group(
- expand_if_available = "output_assembly_file",
- flags = ["-S"],
- ),
- flag_group(
- expand_if_available = "output_preprocess_file",
- flags = ["-E"],
- ),
- flag_group(
- expand_if_available = "dependency_file",
- flags = ["-MD", "-MF", "%{dependency_file}"],
- ),
- flag_group(
- expand_if_available = "output_file",
- flags = ["-frandom-seed=%{output_file}"],
- ),
- ],
- ),
- flag_set(
- # Flags specific to compiling C++ sources.
- actions = ACTION_NAME_GROUPS.all_cpp_compile_actions,
- flag_groups = [flag_group(flags = [
- "-std=c++20",
- ])],
- ),
- flag_set(
- actions = ACTION_NAME_GROUPS.all_cc_compile_actions,
- flag_groups = [flag_group(flags = [
- "-ffunction-sections",
- "-fdata-sections",
- ])],
- ),
- flag_set(
- actions = ACTION_NAME_GROUPS.all_cc_compile_actions,
- flag_groups = [flag_group(
- expand_if_available = "pic",
- flags = ["-fPIC"],
- )],
- ),
- flag_set(
- actions = preprocessor_compile_actions,
- flag_groups = [
- flag_group(flags = [
- # Disable a warning and override builtin macros to
- # ensure a hermetic build.
- "-Wno-builtin-macro-redefined",
- "-D__DATE__=\"redacted\"",
- "-D__TIMESTAMP__=\"redacted\"",
- "-D__TIME__=\"redacted\"",
- ]),
- flag_group(
- flags = ["-D%{preprocessor_defines}"],
- iterate_over = "preprocessor_defines",
- ),
- flag_group(
- expand_if_available = "includes",
- flags = ["-include", "%{includes}"],
- iterate_over = "includes",
- ),
- flag_group(
- flags = ["-iquote", "%{quote_include_paths}"],
- iterate_over = "quote_include_paths",
- ),
- flag_group(
- flags = ["-I%{include_paths}"],
- iterate_over = "include_paths",
- ),
- flag_group(
- flags = ["-isystem", "%{system_include_paths}"],
- iterate_over = "system_include_paths",
- ),
- ],
- ),
- flag_set(
- actions = [
- ACTION_NAMES.cpp_link_dynamic_library,
- ACTION_NAMES.cpp_link_nodeps_dynamic_library,
- ],
- flag_groups = [flag_group(flags = ["-shared"])],
- ),
- flag_set(
- actions = ACTION_NAME_GROUPS.all_cc_link_actions,
- flag_groups = [
- flag_group(
- expand_if_available = "strip_debug_symbols",
- flags = ["-Wl,-S"],
- ),
- flag_group(
- expand_if_available = "library_search_directories",
- flags = ["-L%{library_search_directories}"],
- iterate_over = "library_search_directories",
- ),
- flag_group(
- expand_if_available =
- "runtime_library_search_directories",
- iterate_over = "runtime_library_search_directories",
- flags = [
- "-Wl,-rpath,$ORIGIN/%{runtime_library_search_directories}",
- ],
- ),
- ],
- ),
- flag_set(
- actions = ACTION_NAME_GROUPS.all_cc_link_actions,
- flag_groups = [
- flag_group(
- flags = [
- "-fuse-ld=lld",
- # Force the C++ standard library and runtime libraries
- # to be statically linked. This works even with libc++
- # and libunwind despite the names, provided libc++ is
- # built with the CMake option:
- # - `-DCMAKE_POSITION_INDEPENDENT_CODE=ON`
- "-static-libstdc++",
- "-static-libgcc",
- # Link with Clang's runtime library. This is always
- # linked statically.
- "-rtlib=compiler-rt",
- # Link with pthread.
- "-lpthread",
- ],
- ),
- ],
- with_features = [with_feature_set(["linux_target"])],
- ),
- flag_set(
- actions = [ACTION_NAMES.cpp_link_executable],
- flag_groups = [flag_group(
- expand_if_available = "force_pic",
- flags = ["-pie"],
- )],
- with_features = [with_feature_set([
- "linux_target",
- "freebsd_target",
- ])],
- ),
- flag_set(
- actions = [ACTION_NAMES.cpp_link_executable],
- flag_groups = [flag_group(
- expand_if_available = "force_pic",
- flags = ["-fpie"],
- )],
- with_features = [with_feature_set(["macos_target"])],
- ),
- ],
- )
- clang_warnings_feature = feature(
- name = "clang_warnings",
- enabled = True,
- flag_sets = [flag_set(
- actions = ACTION_NAME_GROUPS.all_cc_compile_actions,
- flag_groups = [flag_group(flags = [
- "-Werror",
- "-Wall",
- "-Wextra",
- "-Wthread-safety",
- "-Wself-assign",
- "-Wimplicit-fallthrough",
- "-Wctad-maybe-unsupported",
- "-Wextra-semi",
- "-Wmissing-prototypes",
- "-Wzero-as-null-pointer-constant",
- "-Wdelete-non-virtual-dtor",
- # TODO: Regression that warns on anonymous unions; remove depending
- # on fix.
- "-Wno-missing-designated-field-initializers",
- ])],
- )],
- )
- # Libc++ HARDENING_MODE has 4 possible values:
- # https://libcxx.llvm.org/Hardening.html#notes-for-users
- #
- # Do not enable DEBUG hardening mode, even for -c dbg, because its performance
- # impact on llvm-symbolizer is too severe -- this flag results in symbolization
- # becoming quadratic in the number of debug symbols, in practice meaning it
- # never completes.
- _libcpp_debug_flags = [
- "-D_LIBCPP_HARDENING_MODE=_LIBCPP_HARDENING_MODE_EXTENSIVE",
- ]
- _libcpp_release_flags = [
- "-D_LIBCPP_HARDENING_MODE=_LIBCPP_HARDENING_MODE_FAST",
- ]
- def libcxx_feature(llvm_bindir = None, clang_bindir = None):
- """Builds a libc++ feature.
- Returns:
- The feature for use with `cc_toolchain_config`.
- Args:
- llvm_bindir: Optional LLVM installation `bin` directory, causes the
- feature to look for adjacent installed libraries.
- clang_bindir: Optional Clang installation `bin` directory, causes the
- feature to look for adjacent installed libraries if different from
- `llvm_bindir`.
- """
- # Explicitly add LLVM libs to the search path to preempt the
- # detected GCC installation's library paths. Those might have a
- # system installed libc++ and we want to find the one next to
- # our Clang.
- extra_link_flags = []
- if llvm_bindir:
- extra_link_flags.append("-L" + llvm_bindir + "/../lib")
- if clang_bindir and clang_bindir != llvm_bindir:
- extra_link_flags.append("-L" + clang_bindir + "/../lib")
- return feature(
- name = "libcxx",
- enabled = True,
- flag_sets = [
- flag_set(
- actions = ACTION_NAME_GROUPS.all_cpp_compile_actions + ACTION_NAME_GROUPS.all_cc_link_actions,
- flag_groups = [flag_group(flags = [
- "-stdlib=libc++",
- ])],
- with_features = [
- # libc++ is only used on non-Windows platforms.
- with_feature_set(not_features = ["windows_target"]),
- ],
- ),
- flag_set(
- actions = ACTION_NAME_GROUPS.all_cpp_compile_actions,
- flag_groups = [flag_group(flags = _libcpp_debug_flags)],
- with_features = [with_feature_set(not_features = ["opt"])],
- ),
- flag_set(
- actions = ACTION_NAME_GROUPS.all_cpp_compile_actions,
- flag_groups = [flag_group(flags = _libcpp_release_flags)],
- with_features = [with_feature_set(features = ["opt"])],
- ),
- flag_set(
- actions = ACTION_NAME_GROUPS.all_cc_link_actions,
- flag_groups = [flag_group(flags = [
- "-unwindlib=libunwind",
- ])],
- with_features = [
- # libc++ is only used on non-Windows platforms.
- with_feature_set(not_features = ["windows_target"]),
- ],
- ),
- flag_set(
- actions = ACTION_NAME_GROUPS.all_cc_link_actions,
- flag_groups = [flag_group(flags = extra_link_flags + [
- # Force linking the static libc++abi archive here. This
- # *should* be linked automatically, but not every release of
- # LLVM correctly sets the CMake flags to do so.
- "-l:libc++abi.a",
- ])],
- with_features = [with_feature_set(["linux_target"])],
- ),
- ],
- )
|