Add C++ toolchain configuration for OpenBSD.
In my limited testing, these changes appear to work. When I built Bazel on OpenBSD incorporating these changes, the resulting `bazel` binary could build C++ libraries and binaries. Likewise on FreeBSD.
This change, split out of the larger PR https://github.com/bazelbuild/bazel/pull/10274, is part of the OpenBSD port in https://github.com/bazelbuild/bazel/issues/10250.
Closes #10436.
PiperOrigin-RevId: 289091510
diff --git a/tools/cpp/BUILD.static.freebsd b/tools/cpp/BUILD.static.bsd
similarity index 75%
rename from tools/cpp/BUILD.static.freebsd
rename to tools/cpp/BUILD.static.bsd
index d9a3b5c..2e02dbf 100644
--- a/tools/cpp/BUILD.static.freebsd
+++ b/tools/cpp/BUILD.static.bsd
@@ -12,7 +12,7 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-# This becomes the BUILD file for @local_config_cc// under FreeBSD.
+# This becomes the BUILD file for @local_config_cc// under FreeBSD and OpenBSD.
package(default_visibility = ["//visibility:public"])
@@ -34,8 +34,10 @@
toolchains = {
"armeabi-v7a|compiler": ":cc-compiler-armeabi-v7a",
"freebsd|compiler": ":cc-compiler-freebsd",
+ "openbsd|compiler": ":cc-compiler-openbsd",
"armeabi-v7a": ":cc-compiler-armeabi-v7a",
"freebsd": ":cc-compiler-freebsd",
+ "openbsd": ":cc-compiler-openbsd",
},
)
@@ -74,6 +76,40 @@
)
cc_toolchain(
+ name = "cc-compiler-openbsd",
+ all_files = ":empty",
+ ar_files = ":empty",
+ as_files = ":empty",
+ compiler_files = ":empty",
+ dwp_files = ":empty",
+ linker_files = ":empty",
+ objcopy_files = ":empty",
+ strip_files = ":empty",
+ supports_param_files = 0,
+ toolchain_config = ":local_openbsd",
+ toolchain_identifier = "local_openbsd",
+)
+
+cc_toolchain_config(
+ name = "local_openbsd",
+ cpu = "openbsd",
+)
+
+toolchain(
+ name = "cc-toolchain-openbsd",
+ exec_compatible_with = [
+ "@platforms//cpu:x86_64",
+ "@platforms//os:openbsd",
+ ],
+ target_compatible_with = [
+ "@platforms//cpu:x86_64",
+ "@platforms//os:openbsd",
+ ],
+ toolchain = ":cc-compiler-openbsd",
+ toolchain_type = "@bazel_tools//tools/cpp:toolchain_type",
+)
+
+cc_toolchain(
name = "cc-compiler-armeabi-v7a",
all_files = ":empty",
ar_files = ":empty",
diff --git a/tools/cpp/BUILD.tpl b/tools/cpp/BUILD.tpl
index 9241326..730224f 100644
--- a/tools/cpp/BUILD.tpl
+++ b/tools/cpp/BUILD.tpl
@@ -12,7 +12,7 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-# This becomes the BUILD file for @local_config_cc// under non-FreeBSD unixes.
+# This becomes the BUILD file for @local_config_cc// under non-BSD unixes.
package(default_visibility = ["//visibility:public"])
diff --git a/tools/cpp/freebsd_cc_toolchain_config.bzl b/tools/cpp/bsd_cc_toolchain_config.bzl
similarity index 93%
rename from tools/cpp/freebsd_cc_toolchain_config.bzl
rename to tools/cpp/bsd_cc_toolchain_config.bzl
index d8818d4..dc45e85 100644
--- a/tools/cpp/freebsd_cc_toolchain_config.bzl
+++ b/tools/cpp/bsd_cc_toolchain_config.bzl
@@ -12,7 +12,7 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-"""A Starlark cc_toolchain configuration rule for freebsd."""
+"""A Starlark cc_toolchain configuration rule for FreeBSD and OpenBSD."""
load(
"@bazel_tools//tools/cpp:cc_toolchain_config_lib.bzl",
@@ -56,13 +56,14 @@
def _impl(ctx):
cpu = ctx.attr.cpu
+ is_bsd = cpu == "freebsd" or cpu == "openbsd"
compiler = "compiler"
- toolchain_identifier = "local_freebsd" if cpu == "freebsd" else "stub_armeabi-v7a"
- host_system_name = "local" if cpu == "freebsd" else "armeabi-v7a"
- target_system_name = "local" if cpu == "freebsd" else "armeabi-v7a"
- target_libc = "local" if cpu == "freebsd" else "armeabi-v7a"
- abi_version = "local" if cpu == "freebsd" else "armeabi-v7a"
- abi_libc_version = "local" if cpu == "freebsd" else "armeabi-v7a"
+ 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",
@@ -70,7 +71,7 @@
tools = [tool(path = "/usr/bin/objcopy")],
)
- action_configs = [objcopy_embed_data_action] if cpu == "freebsd" else []
+ action_configs = [objcopy_embed_data_action] if is_bsd else []
default_link_flags_feature = feature(
name = "default_link_flags",
@@ -224,7 +225,7 @@
],
)
- if cpu == "freebsd":
+ if is_bsd:
features = [
default_compile_flags_feature,
default_link_flags_feature,
@@ -240,12 +241,12 @@
else:
features = [supports_dynamic_linker_feature, supports_pic_feature]
- if (cpu == "freebsd"):
+ if (is_bsd):
cxx_builtin_include_directories = ["/usr/lib/clang", "/usr/local/include", "/usr/include"]
else:
cxx_builtin_include_directories = []
- if cpu == "freebsd":
+ if is_bsd:
tool_paths = [
tool_path(name = "ar", path = "/usr/bin/ar"),
tool_path(name = "compat-ld", path = "/usr/bin/ld"),
diff --git a/tools/cpp/cc_configure.bzl b/tools/cpp/cc_configure.bzl
index 0120ebd..82d41b9 100644
--- a/tools/cpp/cc_configure.bzl
+++ b/tools/cpp/cc_configure.bzl
@@ -102,18 +102,18 @@
])
repository_ctx.symlink(paths["@bazel_tools//tools/cpp:empty_cc_toolchain_config.bzl"], "cc_toolchain_config.bzl")
repository_ctx.symlink(paths["@bazel_tools//tools/cpp:BUILD.empty"], "BUILD")
- elif cpu_value == "freebsd":
+ elif cpu_value == "freebsd" or cpu_value == "openbsd":
paths = resolve_labels(repository_ctx, [
- "@bazel_tools//tools/cpp:BUILD.static.freebsd",
- "@bazel_tools//tools/cpp:freebsd_cc_toolchain_config.bzl",
+ "@bazel_tools//tools/cpp:BUILD.static.bsd",
+ "@bazel_tools//tools/cpp:bsd_cc_toolchain_config.bzl",
])
- # This is defaulting to a static crosstool, we should eventually
- # autoconfigure this platform too. Theorically, FreeBSD should be
- # straightforward to add but we cannot run it in a docker container so
- # skipping until we have proper tests for FreeBSD.
- repository_ctx.symlink(paths["@bazel_tools//tools/cpp:freebsd_cc_toolchain_config.bzl"], "cc_toolchain_config.bzl")
- repository_ctx.symlink(paths["@bazel_tools//tools/cpp:BUILD.static.freebsd"], "BUILD")
+ # This is defaulting to a static crosstool. We should eventually
+ # autoconfigure this platform too. Theorically, FreeBSD and OpenBSD
+ # should be straightforward to add but we cannot run them in a Docker
+ # container so skipping until we have proper tests for these platforms.
+ repository_ctx.symlink(paths["@bazel_tools//tools/cpp:bsd_cc_toolchain_config.bzl"], "cc_toolchain_config.bzl")
+ repository_ctx.symlink(paths["@bazel_tools//tools/cpp:BUILD.static.bsd"], "BUILD")
elif cpu_value == "x64_windows":
# TODO(ibiryukov): overriden_tools are only supported in configure_unix_toolchain.
# We might want to add that to Windows too(at least for msys toolchain).
diff --git a/tools/cpp/cc_toolchain_config.bzl b/tools/cpp/cc_toolchain_config.bzl
index fcd3d11..358a449 100644
--- a/tools/cpp/cc_toolchain_config.bzl
+++ b/tools/cpp/cc_toolchain_config.bzl
@@ -98,6 +98,8 @@
toolchain_identifier = "local_darwin"
elif (ctx.attr.cpu == "freebsd"):
toolchain_identifier = "local_freebsd"
+ elif (ctx.attr.cpu == "openbsd"):
+ toolchain_identifier = "local_openbsd"
elif (ctx.attr.cpu == "local"):
toolchain_identifier = "local_linux"
elif (ctx.attr.cpu == "x64_windows" and ctx.attr.compiler == "windows_clang"):
@@ -119,6 +121,7 @@
host_system_name = "armeabi-v7a"
elif (ctx.attr.cpu == "darwin" or
ctx.attr.cpu == "freebsd" or
+ ctx.attr.cpu == "openbsd" or
ctx.attr.cpu == "local" or
ctx.attr.cpu == "x64_windows" or
ctx.attr.cpu == "x64_windows_msvc"):
@@ -130,6 +133,7 @@
target_system_name = "armeabi-v7a"
elif (ctx.attr.cpu == "darwin" or
ctx.attr.cpu == "freebsd" or
+ ctx.attr.cpu == "openbsd" or
ctx.attr.cpu == "local" or
ctx.attr.cpu == "x64_windows" or
ctx.attr.cpu == "x64_windows_msvc"):
@@ -143,6 +147,8 @@
target_cpu = "darwin"
elif (ctx.attr.cpu == "freebsd"):
target_cpu = "freebsd"
+ elif (ctx.attr.cpu == "openbsd"):
+ target_cpu = "openbsd"
elif (ctx.attr.cpu == "local"):
target_cpu = "local"
elif (ctx.attr.cpu == "x64_windows"):
@@ -155,6 +161,7 @@
if (ctx.attr.cpu == "armeabi-v7a"):
target_libc = "armeabi-v7a"
elif (ctx.attr.cpu == "freebsd" or
+ ctx.attr.cpu == "openbsd" or
ctx.attr.cpu == "local" or
ctx.attr.cpu == "x64_windows"):
target_libc = "local"
@@ -170,6 +177,7 @@
elif (ctx.attr.cpu == "armeabi-v7a" or
ctx.attr.cpu == "darwin" or
ctx.attr.cpu == "freebsd" or
+ ctx.attr.cpu == "openbsd" or
ctx.attr.cpu == "local"):
compiler = "compiler"
elif (ctx.attr.cpu == "x64_windows" and ctx.attr.compiler == "windows_clang"):
@@ -187,6 +195,7 @@
abi_version = "armeabi-v7a"
elif (ctx.attr.cpu == "darwin" or
ctx.attr.cpu == "freebsd" or
+ ctx.attr.cpu == "openbsd" or
ctx.attr.cpu == "local" or
ctx.attr.cpu == "x64_windows" or
ctx.attr.cpu == "x64_windows_msvc"):
@@ -198,6 +207,7 @@
abi_libc_version = "armeabi-v7a"
elif (ctx.attr.cpu == "darwin" or
ctx.attr.cpu == "freebsd" or
+ ctx.attr.cpu == "openbsd" or
ctx.attr.cpu == "local" or
ctx.attr.cpu == "x64_windows" or
ctx.attr.cpu == "x64_windows_msvc"):
@@ -211,6 +221,7 @@
if (ctx.attr.cpu == "darwin" or
ctx.attr.cpu == "freebsd" or
+ ctx.attr.cpu == "openbsd" or
ctx.attr.cpu == "local"):
objcopy_embed_data_action = action_config(
action_name = "objcopy_embed_data",
@@ -274,6 +285,7 @@
action_configs = [c_compile_action, cpp_compile_action]
elif (ctx.attr.cpu == "darwin" or
ctx.attr.cpu == "freebsd" or
+ ctx.attr.cpu == "openbsd" or
ctx.attr.cpu == "local" or
ctx.attr.cpu == "x64_windows"):
action_configs = [objcopy_embed_data_action]
@@ -348,7 +360,8 @@
),
],
)
- elif (ctx.attr.cpu == "freebsd"):
+ elif (ctx.attr.cpu == "freebsd" or
+ ctx.atr.cpu == "openbsd"):
default_link_flags_feature = feature(
name = "default_link_flags",
enabled = True,
@@ -417,7 +430,8 @@
)
if (ctx.attr.cpu == "darwin" or
- ctx.attr.cpu == "freebsd"):
+ ctx.attr.cpu == "freebsd" or
+ ctx.attr.cpu == "openbsd"):
unfiltered_compile_flags_feature = feature(
name = "unfiltered_compile_flags",
enabled = True,
@@ -685,7 +699,8 @@
),
],
)
- elif (ctx.attr.cpu == "freebsd"):
+ elif (ctx.attr.cpu == "freebsd" or
+ ctx.attr.cpu == "openbsd"):
default_compile_flags_feature = feature(
name = "default_compile_flags",
enabled = True,
@@ -941,6 +956,7 @@
if (ctx.attr.cpu == "darwin" or
ctx.attr.cpu == "freebsd" or
+ ctx.attr.cpu == "openbsd" or
ctx.attr.cpu == "local"):
user_compile_flags_feature = feature(
name = "user_compile_flags",
@@ -996,6 +1012,7 @@
if (ctx.attr.cpu == "darwin" or
ctx.attr.cpu == "freebsd" or
+ ctx.attr.cpu == "openbsd" or
ctx.attr.cpu == "local"):
sysroot_feature = feature(
name = "sysroot",
@@ -1152,6 +1169,7 @@
unfiltered_compile_flags_feature,
]
elif (ctx.attr.cpu == "freebsd" or
+ ctx.attr.cpu == "openbsd" or
ctx.attr.cpu == "local"):
features = [
default_compile_flags_feature,
@@ -1196,7 +1214,8 @@
cxx_builtin_include_directories = []
elif (ctx.attr.cpu == "darwin"):
cxx_builtin_include_directories = ["/"]
- elif (ctx.attr.cpu == "freebsd"):
+ elif (ctx.attr.cpu == "freebsd" or
+ ctx.attr.cpu == "openbsd"):
cxx_builtin_include_directories = ["/usr/lib/clang", "/usr/local/include", "/usr/include"]
elif (ctx.attr.cpu == "local" or
ctx.attr.cpu == "x64_windows" and ctx.attr.compiler == "windows_clang"):
@@ -1297,6 +1316,20 @@
tool_path(name = "objdump", path = "/usr/bin/objdump"),
tool_path(name = "strip", path = "/usr/bin/strip"),
]
+ elif (ctx.attr.cpu == "openbsd"):
+ tool_paths = [
+ tool_path(name = "ar", path = "/usr/bin/ar"),
+ tool_path(name = "compat-ld", path = "/usr/bin/ld"),
+ tool_path(name = "cpp", path = "/usr/bin/cpp"),
+ tool_path(name = "dwp", path = "/usr/bin/false"),
+ 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"),
+ ]
elif (ctx.attr.cpu == "local"):
tool_paths = [
tool_path(name = "ar", path = "/usr/bin/ar"),
diff --git a/tools/cpp/lib_cc_configure.bzl b/tools/cpp/lib_cc_configure.bzl
index fbce23b7..773e913 100644
--- a/tools/cpp/lib_cc_configure.bzl
+++ b/tools/cpp/lib_cc_configure.bzl
@@ -184,6 +184,8 @@
return "darwin"
if os_name.find("freebsd") != -1:
return "freebsd"
+ if os_name.find("openbsd") != -1:
+ return "openbsd"
if os_name.find("windows") != -1:
return "x64_windows"