Merge pull request #2563 from corco/update-flex-bison-toolchain-for-bazel-8
Updated flex/bison toolchain for bazel 8+ compat
diff --git a/.bazelrc b/.bazelrc
index d82019b..7ededf0 100644
--- a/.bazelrc
+++ b/.bazelrc
@@ -22,6 +22,9 @@
# clang-cl before fixing the issues unique to MSVC.
common:windows --extra_toolchains=@local_config_cc//:cc-toolchain-x64_windows-clang-cl --extra_execution_platforms=//:x64_windows-clang-cl
common:windows --compiler=clang-cl --cxxopt=/std:c++20 --host_cxxopt=/std:c++20 --client_env=BAZEL_CXXOPTS=/std:c++20
+# Actions (e.g. the genrules invoking win_flex.exe/win_bison.exe) need the
+# invoking shell's PATH to find tools installed.
+common:windows --action_env=PATH --host_action_env=PATH
build --cxxopt="-Wno-unknown-warning-option" --host_cxxopt="-Wno-unknown-warning-option"
# TODO: this looks like benign where it happens but to be explored further.
diff --git a/bazel/BUILD b/bazel/BUILD
index 6dab72b..ebe6d5b 100644
--- a/bazel/BUILD
+++ b/bazel/BUILD
@@ -4,6 +4,7 @@
load("@bazel_skylib//rules:common_settings.bzl", "bool_flag")
load("@rules_cc//cc:defs.bzl", "cc_library")
+load(":no_toolchain.bzl", "no_toolchain")
package(
default_applicable_licenses = ["//:license"],
@@ -23,6 +24,7 @@
exports_files([
"bison.bzl",
"flex.bzl",
+ "no_toolchain.bzl",
"sh_test_with_runfiles_lib.bzl",
"sh_test_with_runfiles_lib.sh",
])
@@ -37,6 +39,12 @@
flag_values = {":use_local_flex_bison": "true"},
)
+# Placeholder used where a select() would otherwise need to switch a
+# genrule's non-configurable `toolchains` attribute (see flex.bzl/bison.bzl):
+no_toolchain(
+ name = "no_toolchain",
+)
+
bool_flag(
name = "create_static_linked_executables",
build_setting_default = False,
diff --git a/bazel/bison.bzl b/bazel/bison.bzl
index f191209..9053b03 100644
--- a/bazel/bison.bzl
+++ b/bazel/bison.bzl
@@ -26,6 +26,23 @@
extra_outs = []):
"""Build rule for generating C or C++ sources with Bison.
"""
+
+ native.alias(
+ name = name + "_bison_toolchain",
+ actual = select({
+ "//bazel:use_local_flex_bison_enabled": "//bazel:no_toolchain",
+ "@platforms//os:windows": "//bazel:no_toolchain",
+ "//conditions:default": "@rules_bison//bison:current_bison_toolchain",
+ }),
+ )
+ native.alias(
+ name = name + "_m4_toolchain",
+ actual = select({
+ "//bazel:use_local_flex_bison_enabled": "//bazel:no_toolchain",
+ "@platforms//os:windows": "//bazel:no_toolchain",
+ "//conditions:default": "@rules_m4//m4:current_m4_toolchain",
+ }),
+ )
native.genrule(
name = name,
srcs = [src],
@@ -35,12 +52,8 @@
"@platforms//os:windows": "win_bison.exe --defines=$(location " + header_out + ") --output-file=$(location " + source_out + ") " + " ".join(extra_options) + " $<",
"//conditions:default": "M4=$(M4) $(BISON) --defines=$(location " + header_out + ") --output-file=$(location " + source_out + ") " + " ".join(extra_options) + " $<",
}),
- toolchains = select({
- "//bazel:use_local_flex_bison_enabled": [],
- "@platforms//os:windows": [],
- "//conditions:default": [
- "@rules_bison//bison:current_bison_toolchain",
- "@rules_m4//m4:current_m4_toolchain",
- ],
- }),
+ toolchains = [
+ ":" + name + "_bison_toolchain",
+ ":" + name + "_m4_toolchain",
+ ],
)
diff --git a/bazel/flex.bzl b/bazel/flex.bzl
index a398c6f..98f6c8c 100644
--- a/bazel/flex.bzl
+++ b/bazel/flex.bzl
@@ -20,6 +20,23 @@
def genlex(name, src, out):
"""Generate C/C++ language source from lex file using Flex
"""
+
+ native.alias(
+ name = name + "_flex_toolchain",
+ actual = select({
+ "//bazel:use_local_flex_bison_enabled": "//bazel:no_toolchain",
+ "@platforms//os:windows": "//bazel:no_toolchain",
+ "//conditions:default": "@rules_flex//flex:current_flex_toolchain",
+ }),
+ )
+ native.alias(
+ name = name + "_m4_toolchain",
+ actual = select({
+ "//bazel:use_local_flex_bison_enabled": "//bazel:no_toolchain",
+ "@platforms//os:windows": "//bazel:no_toolchain",
+ "//conditions:default": "@rules_m4//m4:current_m4_toolchain",
+ }),
+ )
native.genrule(
name = name,
srcs = [src],
@@ -29,12 +46,8 @@
"@platforms//os:windows": "win_flex.exe --outfile=$@ $<",
"//conditions:default": "M4=$(M4) $(FLEX) --outfile=$@ $<",
}),
- toolchains = select({
- "//bazel:use_local_flex_bison_enabled": [],
- "@platforms//os:windows": [],
- "//conditions:default": [
- "@rules_flex//flex:current_flex_toolchain",
- "@rules_m4//m4:current_m4_toolchain",
- ],
- }),
+ toolchains = [
+ ":" + name + "_flex_toolchain",
+ ":" + name + "_m4_toolchain",
+ ],
)
diff --git a/bazel/no_toolchain.bzl b/bazel/no_toolchain.bzl
new file mode 100644
index 0000000..07d4225
--- /dev/null
+++ b/bazel/no_toolchain.bzl
@@ -0,0 +1,28 @@
+# -*- Python -*-
+# Copyright 2017-2026 The Verible Authors.
+#
+# 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 placeholder target for genrule's `toolchains` attribute.
+
+genrule's `toolchains` attribute requires each entry to provide
+TemplateVariableInfo (or ToolchainTypeInfo). Used where a platform (e.g.
+Windows) needs no real toolchain there, like for using local winflexbison.
+"""
+
+def _no_toolchain_impl(ctx):
+ return [platform_common.TemplateVariableInfo({})]
+
+no_toolchain = rule(
+ implementation = _no_toolchain_impl,
+)