From 4e72e665a3fff45e43fffdd3e8287753caf98f10 Mon Sep 17 00:00:00 2001 From: Fabian Meumertzheim Date: Mon, 9 Jan 2023 12:02:38 +0100 Subject: [PATCH] Add well-known compiler `config_setting`s As of Bazel 6.0.0, all Bazel-provided toolchains report consistent compiler names that can be matched on with `select`. Having a central place for `config_setting`s that can be used for this purpose makes it so that rulesets don't have to define them themselves and moving the compiler flag out of `@bazel_tools` becomes easier as it is no longer referenced directly. Also includes minor fixes to `//tests/...` so that it can be enabled in CI. --- cc/compiler/BUILD | 71 +++++++++++++++++++++++++++++++++ tests/compiler_settings/BUILD | 32 +++++++++++++++ tests/compiler_settings/main.cc | 22 ++++++++++ 3 files changed, 125 insertions(+) create mode 100644 cc/compiler/BUILD create mode 100644 tests/compiler_settings/BUILD create mode 100644 tests/compiler_settings/main.cc diff --git a/cc/compiler/BUILD b/cc/compiler/BUILD new file mode 100644 index 0000000..fade580 --- /dev/null +++ b/cc/compiler/BUILD @@ -0,0 +1,71 @@ +# Copyright 2023 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. + +"""Config settings for compilers identified by Bazel. + +Targets that require compiler-specific flags can use the config_settings defined +in this package in their select() statements. + +*Note*: Before Bazel 6, gcc on Linux and clang on macOS would not match their +specific config_setting, but only the fallback case of a select expression. + +Toolchains not shipped with Bazel are encouraged to use the same names to +identify compilers as used below, but this is not enforced. + +Example: + + cc_binary( + name = "foo", + srcs = ["foo.cc"], + copts = select({ + "@rules_cc//cc/compiler:gcc": [...], + "@rules_cc//cc/compiler:clang": [...], + "@rules_cc//cc/compiler:msvc-cl": [...], + # Fallback case for an undetected compiler. + "//conditions:default": [...], + }), + ) + +If multiple targets use the same set of conditionally enabled flags, this can be +simplified by extracting the select expression into a Starlark constant. +""" + +package(default_visibility = ["//visibility:public"]) + +licenses(["notice"]) # Apache 2.0 + +config_setting( + name = "clang", + flag_values = {"@bazel_tools//tools/cpp:compiler": "clang"}, +) + +config_setting( + name = "clang-cl", + flag_values = {"@bazel_tools//tools/cpp:compiler": "clang-cl"}, +) + +config_setting( + name = "gcc", + flag_values = {"@bazel_tools//tools/cpp:compiler": "gcc"}, +) + +config_setting( + name = "mingw-gcc", + flag_values = {"@bazel_tools//tools/cpp:compiler": "mingw-gcc"}, +) + +config_setting( + name = "msvc-cl", + flag_values = {"@bazel_tools//tools/cpp:compiler": "msvc-cl"}, +) diff --git a/tests/compiler_settings/BUILD b/tests/compiler_settings/BUILD new file mode 100644 index 0000000..bb5ed83 --- /dev/null +++ b/tests/compiler_settings/BUILD @@ -0,0 +1,32 @@ +# Copyright 2023 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. + +load("//cc:defs.bzl", "cc_binary") + +licenses(["notice"]) + +cc_binary( + name = "main", + srcs = ["main.cc"], + local_defines = select( + { + "//cc/compiler:clang": ["COMPILER=clang"], + "//cc/compiler:clang-cl": ["COMPILER=clang-cl"], + "//cc/compiler:gcc": ["COMPILER=gcc"], + "//cc/compiler:mingw-gcc": ["COMPILER=mingw-gcc"], + "//cc/compiler:msvc-cl": ["COMPILER=msvc-cl"], + }, + no_match_error = "Compiler not detected by Bazel", + ), +) diff --git a/tests/compiler_settings/main.cc b/tests/compiler_settings/main.cc new file mode 100644 index 0000000..35b088c --- /dev/null +++ b/tests/compiler_settings/main.cc @@ -0,0 +1,22 @@ +// Copyright 2023 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. + +#include + +#define STRINGIFY(x) #x +#define TO_STRING(x) STRINGIFY(x) + +int main() { + std::cout << "Hello, " << TO_STRING(COMPILER) << "!" << std::endl; +}