Initial commit with minimal examples
This commit is contained in:
commit
2195fb6941
15
.bazelrc
Normal file
15
.bazelrc
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
build --symlink_prefix=dist/
|
||||||
|
test --test_output=errors
|
||||||
|
test:debug --test_output=streamed --test_strategy=exclusive --test_timeout=9999 --nocache_test_results --define=VERBOSE_LOGS=1
|
||||||
|
run:debug --define=VERBOSE_LOGS=1 -- --node_options=--inspect-brk
|
||||||
|
build:debug --compilation_mode=dbg
|
||||||
|
build --nolegacy_external_runfiles
|
||||||
|
build --incompatible_strict_action_env
|
||||||
|
run --incompatible_strict_action_env
|
||||||
|
try-import %workspace%/.bazelrc.user
|
||||||
|
build --worker_sandboxing
|
||||||
|
build --incompatible_enable_cc_toolchain_resolution
|
||||||
|
build --incompatible_use_cc_configure_from_rules_cc
|
||||||
|
build --incompatible_use_platforms_repo_for_constraints
|
||||||
|
|
||||||
|
build --javabase=@bazel_tools//tools/jdk:remote_jdk11
|
1
.bazelversion
Normal file
1
.bazelversion
Normal file
@ -0,0 +1 @@
|
|||||||
|
4.0.0
|
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
bazel-out
|
||||||
|
dist
|
0
BUILD.bazel
Normal file
0
BUILD.bazel
Normal file
37
README.md
Normal file
37
README.md
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
To run the example locally, first make sure `bazelisk` is on your PATH. Then
|
||||||
|
|
||||||
|
Test that things work at all:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ bazelisk run //test:hello
|
||||||
|
...
|
||||||
|
Hello World!
|
||||||
|
```
|
||||||
|
|
||||||
|
Then test that you can run docker images:
|
||||||
|
```
|
||||||
|
$ bazelisk run //test:hello_image
|
||||||
|
...
|
||||||
|
Hello World!
|
||||||
|
```
|
||||||
|
|
||||||
|
Now we can check if C++ exceptions work locally:
|
||||||
|
```
|
||||||
|
$ bazelisk run //test:exception
|
||||||
|
...
|
||||||
|
will throw and expect to catch an error...
|
||||||
|
caught: error
|
||||||
|
done
|
||||||
|
```
|
||||||
|
|
||||||
|
And whether or not they work in a docker container:
|
||||||
|
```
|
||||||
|
$ bazelisk run //test:exception_image
|
||||||
|
```
|
||||||
|
|
||||||
|
If they *work*, then you'll see the same output as above. If not, you'll see:
|
||||||
|
|
||||||
|
```
|
||||||
|
will throw and expect to catch an error...
|
||||||
|
libc++abi: terminating with uncaught exception of type char const*
|
||||||
|
```
|
103
WORKSPACE.bazel
Normal file
103
WORKSPACE.bazel
Normal file
@ -0,0 +1,103 @@
|
|||||||
|
workspace(
|
||||||
|
name = "zig-cc-bazel-exceptions",
|
||||||
|
)
|
||||||
|
|
||||||
|
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
|
||||||
|
|
||||||
|
|
||||||
|
rules_python_version = "812c48356881b34f3df68301b839a879c4d5ddf9"
|
||||||
|
http_archive(
|
||||||
|
name = "rules_python",
|
||||||
|
sha256 = "f8a50280b9034b3933c4a41c61d0cf2309d473e3da39d92b38dac37d54bd4f82",
|
||||||
|
strip_prefix = "rules_python-{}".format(rules_python_version),
|
||||||
|
url = "https://github.com/bazelbuild/rules_python/archive/{}.zip".format(rules_python_version),
|
||||||
|
)
|
||||||
|
|
||||||
|
http_archive(
|
||||||
|
name = "io_bazel_rules_go",
|
||||||
|
sha256 = "7c10271940c6bce577d51a075ae77728964db285dac0a46614a7934dc34303e6",
|
||||||
|
urls = [
|
||||||
|
"https://mirror.bazel.build/github.com/bazelbuild/rules_go/releases/download/v0.26.0/rules_go-v0.26.0.tar.gz",
|
||||||
|
"https://github.com/bazelbuild/rules_go/releases/download/v0.26.0/rules_go-v0.26.0.tar.gz",
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
|
http_archive(
|
||||||
|
name = "bazel_gazelle",
|
||||||
|
sha256 = "62ca106be173579c0a167deb23358fdfe71ffa1e4cfdddf5582af26520f1c66f",
|
||||||
|
urls = [
|
||||||
|
"https://mirror.bazel.build/github.com/bazelbuild/bazel-gazelle/releases/download/v0.23.0/bazel-gazelle-v0.23.0.tar.gz",
|
||||||
|
"https://github.com/bazelbuild/bazel-gazelle/releases/download/v0.23.0/bazel-gazelle-v0.23.0.tar.gz",
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
|
load("@io_bazel_rules_go//go:deps.bzl", "go_register_toolchains", "go_rules_dependencies")
|
||||||
|
load("@bazel_gazelle//:deps.bzl", "gazelle_dependencies", "go_repository")
|
||||||
|
|
||||||
|
go_rules_dependencies()
|
||||||
|
|
||||||
|
go_register_toolchains(version = "1.16")
|
||||||
|
|
||||||
|
gazelle_dependencies(go_repository_default_config = "@//:WORKSPACE.bazel")
|
||||||
|
|
||||||
|
http_archive(
|
||||||
|
name = "com_google_protobuf",
|
||||||
|
sha256 = "bf0e5070b4b99240183b29df78155eee335885e53a8af8683964579c214ad301",
|
||||||
|
strip_prefix = "protobuf-3.14.0",
|
||||||
|
urls = ["https://github.com/protocolbuffers/protobuf/archive/v3.14.0.zip"],
|
||||||
|
)
|
||||||
|
|
||||||
|
load("@com_google_protobuf//:protobuf_deps.bzl", "protobuf_deps")
|
||||||
|
protobuf_deps()
|
||||||
|
|
||||||
|
http_archive(
|
||||||
|
name = "com_github_bazelbuild_buildtools",
|
||||||
|
strip_prefix = "buildtools-master",
|
||||||
|
url = "https://github.com/bazelbuild/buildtools/archive/master.zip",
|
||||||
|
)
|
||||||
|
|
||||||
|
http_archive(
|
||||||
|
name = "rules_pkg",
|
||||||
|
sha256 = "6b5969a7acd7b60c02f816773b06fcf32fbe8ba0c7919ccdc2df4f8fb923804a",
|
||||||
|
urls = [
|
||||||
|
"https://mirror.bazel.build/github.com/bazelbuild/rules_pkg/releases/download/0.3.0/rules_pkg-0.3.0.tar.gz",
|
||||||
|
"https://github.com/bazelbuild/rules_pkg/releases/download/0.3.0/rules_pkg-0.3.0.tar.gz",
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
|
load("@rules_pkg//:deps.bzl", "rules_pkg_dependencies")
|
||||||
|
rules_pkg_dependencies()
|
||||||
|
|
||||||
|
|
||||||
|
http_archive(
|
||||||
|
name = "io_bazel_rules_docker",
|
||||||
|
patches = ["//:patches/rules_docker/transitions.patch"],
|
||||||
|
patch_args = ["-p1"],
|
||||||
|
sha256 = "95d39fd84ff4474babaf190450ee034d958202043e366b9fc38f438c9e6c3334",
|
||||||
|
strip_prefix = "rules_docker-0.16.0",
|
||||||
|
urls = ["https://github.com/bazelbuild/rules_docker/releases/download/v0.16.0/rules_docker-v0.16.0.tar.gz"],
|
||||||
|
)
|
||||||
|
|
||||||
|
load("@io_bazel_rules_docker//repositories:repositories.bzl", container_repositories = "repositories")
|
||||||
|
container_repositories()
|
||||||
|
|
||||||
|
|
||||||
|
load("@io_bazel_rules_docker//cc:image.bzl", _cc_image_repos = "repositories")
|
||||||
|
_cc_image_repos()
|
||||||
|
|
||||||
|
load("@io_bazel_rules_docker//repositories:deps.bzl", container_deps = "deps")
|
||||||
|
container_deps()
|
||||||
|
|
||||||
|
load("@bazel_tools//tools/build_defs/repo:git.bzl", "git_repository")
|
||||||
|
git_repository(
|
||||||
|
name = "com_github_nelhage_rules_boost",
|
||||||
|
commit = "c13a880269cc044c4b5e90046625339836771d77",
|
||||||
|
remote = "https://github.com/nelhage/rules_boost",
|
||||||
|
shallow_since = "1591047380 -0700",
|
||||||
|
)
|
||||||
|
load("@com_github_nelhage_rules_boost//:boost/boost.bzl", "boost_deps")
|
||||||
|
boost_deps()
|
||||||
|
|
||||||
|
load("//zig-toolchains:defs.bzl", zig_register_all_toolchains = "register_all_toolchains", zig_toolchain_repositories = "toolchain_repositories")
|
||||||
|
zig_toolchain_repositories()
|
||||||
|
zig_register_all_toolchains()
|
149
patches/rules_docker/transitions.patch
Normal file
149
patches/rules_docker/transitions.patch
Normal file
@ -0,0 +1,149 @@
|
|||||||
|
diff --git a/lang/image.bzl b/lang/image.bzl
|
||||||
|
index c2db8f4..16a1f57 100644
|
||||||
|
--- a/lang/image.bzl
|
||||||
|
+++ b/lang/image.bzl
|
||||||
|
@@ -34,8 +34,8 @@ def _binary_name(ctx):
|
||||||
|
# /app/foo/bar/baz/blah
|
||||||
|
return "/".join([
|
||||||
|
ctx.attr.directory,
|
||||||
|
- ctx.attr.binary.label.package,
|
||||||
|
- ctx.attr.binary.label.name,
|
||||||
|
+ ctx.attr.binary[0].label.package,
|
||||||
|
+ ctx.attr.binary[0].label.name,
|
||||||
|
])
|
||||||
|
|
||||||
|
def _runfiles_dir(ctx):
|
||||||
|
@@ -148,7 +148,7 @@ def _app_layer_impl(ctx, runfiles = None, emptyfiles = None):
|
||||||
|
parent_parts = _get_layers(ctx, ctx.attr.name, ctx.attr.base)
|
||||||
|
filepath = _final_file_path if ctx.attr.binary else layer_file_path
|
||||||
|
emptyfilepath = _final_emptyfile_path if ctx.attr.binary else _layer_emptyfile_path
|
||||||
|
- dep = ctx.attr.dep or ctx.attr.binary
|
||||||
|
+ dep = (ctx.attr.dep or ctx.attr.binary)[0]
|
||||||
|
top_layer = ctx.attr.binary and not ctx.attr.dep
|
||||||
|
|
||||||
|
if ctx.attr.create_empty_workspace_dir:
|
||||||
|
@@ -239,6 +239,18 @@ def _app_layer_impl(ctx, runfiles = None, emptyfiles = None):
|
||||||
|
null_cmd = args == [],
|
||||||
|
)
|
||||||
|
|
||||||
|
+def _container_transition_impl(settings, attr):
|
||||||
|
+ _ignore = (settings, attr)
|
||||||
|
+ return {
|
||||||
|
+ "//command_line_option:platforms": "@io_bazel_rules_docker//platforms:linux_amd64",
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+container_transition = transition(
|
||||||
|
+ implementation = _container_transition_impl,
|
||||||
|
+ inputs = [],
|
||||||
|
+ outputs = ["//command_line_option:platforms"],
|
||||||
|
+)
|
||||||
|
+
|
||||||
|
image = struct(
|
||||||
|
attrs = dicts.add(_container.image.attrs, {
|
||||||
|
# The base image on which to overlay the dependency layers.
|
||||||
|
@@ -250,7 +262,7 @@ image = struct(
|
||||||
|
# the runfiles dir.
|
||||||
|
"binary": attr.label(
|
||||||
|
executable = True,
|
||||||
|
- cfg = "target",
|
||||||
|
+ cfg = container_transition,
|
||||||
|
),
|
||||||
|
# Set this to true to create an empty workspace directory under the
|
||||||
|
# app directory specified as the 'directory' attribute.
|
||||||
|
@@ -263,11 +275,14 @@ image = struct(
|
||||||
|
# The dependency whose runfiles we're appending.
|
||||||
|
# If not specified, then the layer will be treated as the top layer,
|
||||||
|
# and all remaining deps of "binary" will be added under runfiles.
|
||||||
|
- "dep": attr.label(),
|
||||||
|
+ "dep": attr.label(cfg = container_transition),
|
||||||
|
"directory": attr.string(default = "/app"),
|
||||||
|
"entrypoint": attr.string_list(default = []),
|
||||||
|
"legacy_run_behavior": attr.bool(default = False),
|
||||||
|
"workdir": attr.string(default = ""),
|
||||||
|
+ "_whitelist_function_transition": attr.label(
|
||||||
|
+ default = "//tools/whitelists/function_transition_whitelist",
|
||||||
|
+ ),
|
||||||
|
}),
|
||||||
|
outputs = _container.image.outputs,
|
||||||
|
toolchains = ["@io_bazel_rules_docker//toolchains/docker:toolchain_type"],
|
||||||
|
diff --git a/platforms/BUILD b/platforms/BUILD
|
||||||
|
index 50b8593..b4f25c9 100644
|
||||||
|
--- a/platforms/BUILD
|
||||||
|
+++ b/platforms/BUILD
|
||||||
|
@@ -56,3 +56,11 @@ platform(
|
||||||
|
],
|
||||||
|
parents = ["@buildkite_config//config:platform"],
|
||||||
|
)
|
||||||
|
+
|
||||||
|
+platform(
|
||||||
|
+ name = "linux_amd64",
|
||||||
|
+ constraint_values = [
|
||||||
|
+ "@platforms//os:linux",
|
||||||
|
+ "@platforms//cpu:x86_64",
|
||||||
|
+ ],
|
||||||
|
+)
|
||||||
|
diff --git a/toolchains/BUILD b/toolchains/BUILD
|
||||||
|
index 55f7560..bf56cd0 100644
|
||||||
|
--- a/toolchains/BUILD
|
||||||
|
+++ b/toolchains/BUILD
|
||||||
|
@@ -56,13 +56,13 @@ toolchain(
|
||||||
|
name = "rbe_container_cc_toolchain",
|
||||||
|
exec_compatible_with = [
|
||||||
|
"@io_bazel_rules_docker//platforms:run_in_container",
|
||||||
|
- "@bazel_tools//platforms:x86_64",
|
||||||
|
- "@bazel_tools//platforms:linux",
|
||||||
|
+ "@platforms//cpu:x86_64",
|
||||||
|
+ "@platforms//os:linux",
|
||||||
|
"@bazel_tools//tools/cpp:clang",
|
||||||
|
],
|
||||||
|
target_compatible_with = [
|
||||||
|
- "@bazel_tools//platforms:linux",
|
||||||
|
- "@bazel_tools//platforms:x86_64",
|
||||||
|
+ "@platforms//os:linux",
|
||||||
|
+ "@platforms//cpu:x86_64",
|
||||||
|
],
|
||||||
|
toolchain = "@buildkite_config//cc:cc-compiler-k8",
|
||||||
|
toolchain_type = "@bazel_tools//tools/cpp:toolchain_type",
|
||||||
|
diff --git a/toolchains/docker/BUILD b/toolchains/docker/BUILD
|
||||||
|
index 42e83e1..b7c9c5f 100644
|
||||||
|
--- a/toolchains/docker/BUILD
|
||||||
|
+++ b/toolchains/docker/BUILD
|
||||||
|
@@ -42,7 +42,7 @@ docker_toolchain(
|
||||||
|
toolchain(
|
||||||
|
name = "default_linux_toolchain",
|
||||||
|
target_compatible_with = [
|
||||||
|
- "@bazel_tools//platforms:linux",
|
||||||
|
+ "@platforms//os:linux",
|
||||||
|
],
|
||||||
|
toolchain = "@docker_config//:toolchain",
|
||||||
|
toolchain_type = ":toolchain_type",
|
||||||
|
@@ -51,7 +51,7 @@ toolchain(
|
||||||
|
toolchain(
|
||||||
|
name = "default_windows_toolchain",
|
||||||
|
target_compatible_with = [
|
||||||
|
- "@bazel_tools//platforms:windows",
|
||||||
|
+ "@platforms//os:windows",
|
||||||
|
],
|
||||||
|
toolchain = "@docker_config//:toolchain",
|
||||||
|
toolchain_type = ":toolchain_type",
|
||||||
|
@@ -60,7 +60,7 @@ toolchain(
|
||||||
|
toolchain(
|
||||||
|
name = "default_osx_toolchain",
|
||||||
|
target_compatible_with = [
|
||||||
|
- "@bazel_tools//platforms:osx",
|
||||||
|
+ "@platforms//os:osx",
|
||||||
|
],
|
||||||
|
toolchain = "@docker_config//:toolchain",
|
||||||
|
toolchain_type = ":toolchain_type",
|
||||||
|
diff --git a/tools/whitelists/function_transition_whitelist/BUILD b/tools/whitelists/function_transition_whitelist/BUILD
|
||||||
|
new file mode 100644
|
||||||
|
index 0000000..640d44f
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/tools/whitelists/function_transition_whitelist/BUILD
|
||||||
|
@@ -0,0 +1,6 @@
|
||||||
|
+package_group(
|
||||||
|
+ name = "function_transition_whitelist",
|
||||||
|
+ packages = [
|
||||||
|
+ "//lang/...",
|
||||||
|
+ ],
|
||||||
|
+)
|
35
test/BUILD.bazel
Normal file
35
test/BUILD.bazel
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
load("@io_bazel_rules_docker//cc:image.bzl", "cc_image")
|
||||||
|
|
||||||
|
cc_binary(
|
||||||
|
name = "hello",
|
||||||
|
srcs = ["hello.cpp"],
|
||||||
|
)
|
||||||
|
|
||||||
|
cc_image(
|
||||||
|
name = "hello_image",
|
||||||
|
binary = ":hello",
|
||||||
|
)
|
||||||
|
|
||||||
|
cc_binary(
|
||||||
|
name = "boost_exception",
|
||||||
|
srcs = ["boost_exception.cpp"],
|
||||||
|
copts = ["-fexceptions", "-frtti"],
|
||||||
|
deps = [
|
||||||
|
"@boost//:lexical_cast",
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
|
cc_image(
|
||||||
|
name = "boost_exception_image",
|
||||||
|
binary = ":boost_exception",
|
||||||
|
)
|
||||||
|
|
||||||
|
cc_binary(
|
||||||
|
name = "exception",
|
||||||
|
srcs = ["exception.cpp"],
|
||||||
|
)
|
||||||
|
|
||||||
|
cc_image(
|
||||||
|
name = "exception_image",
|
||||||
|
binary = ":exception",
|
||||||
|
)
|
20
test/boost_exception.cpp
Normal file
20
test/boost_exception.cpp
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
#include <boost/lexical_cast.hpp>
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
std::cout << "about to cast \"1\" to double!" << std::endl;
|
||||||
|
std::cout << boost::lexical_cast<double>("1") << std::endl;
|
||||||
|
|
||||||
|
std::cout << "about to cast \"z\" to double, but expecting to catch bad_lexical_cast" << std::endl;
|
||||||
|
try {
|
||||||
|
std::cout << boost::lexical_cast<double>("z");
|
||||||
|
std::cout << "uh-oh, should have thrown an exception before here." << std::endl;
|
||||||
|
} catch (const boost::bad_lexical_cast &e) {
|
||||||
|
std::cout << "caught bad_lexical_cast" << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::cout << "about to cast \"z\" to double, should see an uncaught exception." << std::endl;
|
||||||
|
std::cout << boost::lexical_cast<double>("z");
|
||||||
|
std::cout << "uh-oh, should have thrown an exception before here." << std::endl;
|
||||||
|
}
|
12
test/exception.cpp
Normal file
12
test/exception.cpp
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
std::cerr << "will throw and expect to catch an error..." << std::endl;
|
||||||
|
|
||||||
|
try {
|
||||||
|
throw "error";
|
||||||
|
} catch (const char* msg) {
|
||||||
|
std::cerr << "caught: " << msg << std::endl;
|
||||||
|
}
|
||||||
|
std::cerr << "done" << std::endl;
|
||||||
|
}
|
5
test/hello.cpp
Normal file
5
test/hello.cpp
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
std::cout << "Hello World!" << std::endl;
|
||||||
|
}
|
0
zig-toolchains/BUILD.bazel
Normal file
0
zig-toolchains/BUILD.bazel
Normal file
266
zig-toolchains/defs.bzl
Normal file
266
zig-toolchains/defs.bzl
Normal file
@ -0,0 +1,266 @@
|
|||||||
|
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
|
||||||
|
load(":zig_toolchain.bzl", "zig_cc_toolchain_config")
|
||||||
|
|
||||||
|
DEFAULT_TOOL_PATHS = {
|
||||||
|
"ar": "llvm-ar", # TODO this should be "build-lib", see https://github.com/ziglang/zig/issues/7915
|
||||||
|
"cpp": "c++",
|
||||||
|
"gcc": "cc",
|
||||||
|
|
||||||
|
# TODO See https://github.com/ziglang/zig/issues/7917 for zig issue to implement these other tools.
|
||||||
|
"gcov": "/usr/bin/false",
|
||||||
|
"nm": "/usr/bin/false",
|
||||||
|
"objdump": "/usr/bin/false",
|
||||||
|
"strip": "/usr/bin/false",
|
||||||
|
}.items()
|
||||||
|
|
||||||
|
DEFAULT_INCLUDE_DIRECTORIES = [
|
||||||
|
"lib/zig/include",
|
||||||
|
# "lib/zig/libcxx/include",
|
||||||
|
# "lib/zig/libcxxabi/include",
|
||||||
|
# "lib/zig/libunwind/include",
|
||||||
|
]
|
||||||
|
|
||||||
|
# https://github.com/ziglang/zig/blob/0cfa39304b18c6a04689bd789f5dc4d035ec43b0/src/main.zig#L2962-L2966
|
||||||
|
TARGET_CONFIGS = [
|
||||||
|
struct(
|
||||||
|
target="x86_64-linux-gnu.2.28",
|
||||||
|
includes=[
|
||||||
|
"lib/zig/libcxx/include",
|
||||||
|
"lib/zig/libcxxabi/include",
|
||||||
|
"lib/zig/libunwind/include",
|
||||||
|
"lib/zig/libc/include/generic-glibc",
|
||||||
|
"lib/zig/libc/include/any-linux-any",
|
||||||
|
"lib/zig/libc/include/x86_64-linux-gnu",
|
||||||
|
"lib/zig/libc/include/x86_64-linux-any",
|
||||||
|
],
|
||||||
|
linkopts=["-lc++", "-lc++abi"],
|
||||||
|
copts=[],
|
||||||
|
constraint_values=["@platforms//os:linux", "@platforms//cpu:x86_64"],
|
||||||
|
tool_paths={"ld": "ld.lld"},
|
||||||
|
),
|
||||||
|
# struct(
|
||||||
|
# target="x86_64-linux-musl",
|
||||||
|
# includes=[
|
||||||
|
# "lib/zig/libcxx/include",
|
||||||
|
# "lib/zig/libcxxabi/include",
|
||||||
|
# "lib/zig/libc/include/generic-musl",
|
||||||
|
# "lib/zig/libc/include/any-linux-any",
|
||||||
|
# "lib/zig/libc/include/x86_64-linux-musl",
|
||||||
|
# "lib/zig/libc/include/x86_64-linux-any",
|
||||||
|
# ],
|
||||||
|
# linkopts=[],
|
||||||
|
# # linkopts=["-lc++", "-lc++abi"],
|
||||||
|
# copts=["-D_LIBCPP_HAS_MUSL_LIBC", "-D_LIBCPP_HAS_THREAD_API_PTHREAD"],
|
||||||
|
# constraint_values=["@platforms//os:linux", "@platforms//cpu:x86_64"],
|
||||||
|
# tool_paths={"ld": "ld.lld"},
|
||||||
|
# ),
|
||||||
|
]
|
||||||
|
|
||||||
|
ZIG_TOOL_PATH = "tools/{zig_tool}"
|
||||||
|
ZIG_TOOL_WRAPPER = """#!/bin/bash
|
||||||
|
export HOME=$TMPDIR
|
||||||
|
exec "{zig}" "{zig_tool}" "$@"
|
||||||
|
"""
|
||||||
|
|
||||||
|
ZIG_TOOLS = [
|
||||||
|
"c++",
|
||||||
|
"cc",
|
||||||
|
"build-lib", # https://github.com/ziglang/zig/issues/7915
|
||||||
|
# List of ld tools: https://github.com/ziglang/zig/blob/0cfa39304b18c6a04689bd789f5dc4d035ec43b0/src/main.zig#L2962-L2966
|
||||||
|
# and also: https://github.com/ziglang/zig/issues/3257
|
||||||
|
"ld.lld", # ELF
|
||||||
|
"ld64.lld", # Mach-O
|
||||||
|
"lld-link", # COFF
|
||||||
|
"wasm-ld", # WebAssembly
|
||||||
|
]
|
||||||
|
|
||||||
|
TOOLS = ZIG_TOOLS + [
|
||||||
|
"llvm-ar",
|
||||||
|
]
|
||||||
|
|
||||||
|
BUILD = """
|
||||||
|
load("@zig-cc-bazel-exceptions//zig-toolchains:defs.bzl", "zig_build_macro")
|
||||||
|
load("@{llvm_tools_repo}//:noop.bzl", "noop")
|
||||||
|
noop()
|
||||||
|
package(default_visibility = ["//visibility:public"])
|
||||||
|
zig_build_macro(absolute_path={absolute_path})
|
||||||
|
"""
|
||||||
|
|
||||||
|
def toolchain_repositories():
|
||||||
|
# We need llvm-ar for now, so get it.
|
||||||
|
llvm_patch_cmds = [
|
||||||
|
"mv bin/llvm-ar .",
|
||||||
|
"rm -r include lib libexec share bin",
|
||||||
|
"echo 'def noop(): pass' > noop.bzl",
|
||||||
|
]
|
||||||
|
|
||||||
|
llvm_build_file_content = """
|
||||||
|
package(default_visibility = ["//visibility:public"])
|
||||||
|
exports_files(glob["**"])
|
||||||
|
"""
|
||||||
|
http_archive(
|
||||||
|
name = "com_github_ziglang_zig_llvm_tools_macos_x86_64",
|
||||||
|
# sha256 = "",
|
||||||
|
patch_cmds = llvm_patch_cmds,
|
||||||
|
build_file_content = llvm_build_file_content,
|
||||||
|
strip_prefix = "clang+llvm-11.0.0-x86_64-apple-darwin",
|
||||||
|
urls = [
|
||||||
|
"https://github.com/llvm/llvm-project/releases/download/llvmorg-11.0.0/clang+llvm-11.0.0-x86_64-apple-darwin.tar.xz",
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
|
http_archive(
|
||||||
|
name = "com_github_ziglang_zig_llvm_tools_linux_x86_64",
|
||||||
|
# sha256 = "",
|
||||||
|
patch_cmds = llvm_patch_cmds,
|
||||||
|
build_file_content = llvm_build_file_content,
|
||||||
|
strip_prefix = "clang+llvm-11.0.0-x86_64-linux-gnu-ubuntu-20.04",
|
||||||
|
urls = [
|
||||||
|
"https://github.com/llvm/llvm-project/releases/download/llvmorg-11.0.0/clang+llvm-11.0.0-x86_64-linux-gnu-ubuntu-20.04.tar.xz",
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
|
zig_repository(
|
||||||
|
name = "com_github_ziglang_zig",
|
||||||
|
version = "0.7.1",
|
||||||
|
sha256 = "845cb17562978af0cf67e3993f4e33330525eaf01ead9386df9105111e3bc519",
|
||||||
|
)
|
||||||
|
|
||||||
|
def register_all_toolchains():
|
||||||
|
for target_config in TARGET_CONFIGS:
|
||||||
|
native.register_toolchains(
|
||||||
|
"@com_github_ziglang_zig//:%s_toolchain" % target_config.target,
|
||||||
|
)
|
||||||
|
|
||||||
|
def _zig_repository_impl(repository_ctx):
|
||||||
|
if repository_ctx.os.name.lower().startswith("mac os"):
|
||||||
|
llvm_tools_repo = "com_github_ziglang_zig_llvm_tools_macos_x86_64"
|
||||||
|
host_platform = "macos-x86_64"
|
||||||
|
else:
|
||||||
|
host_platform = "linux-x86_64"
|
||||||
|
llvm_tools_repo = "com_github_ziglang_zig_llvm_tools_linux_x86_64"
|
||||||
|
|
||||||
|
format_vars = {
|
||||||
|
"version" : repository_ctx.attr.version,
|
||||||
|
"host_platform" : host_platform,
|
||||||
|
}
|
||||||
|
|
||||||
|
repository_ctx.download_and_extract(
|
||||||
|
url = "https://ziglang.org/download/{version}/zig-{host_platform}-{version}.tar.xz".format(**format_vars),
|
||||||
|
stripPrefix = "zig-{host_platform}-{version}/".format(**format_vars),
|
||||||
|
sha256 = repository_ctx.attr.sha256,
|
||||||
|
)
|
||||||
|
|
||||||
|
# TODO Use llvm-ar for host platform until we have https://github.com/ziglang/zig/issues/7915
|
||||||
|
llvm_tools_dir = str(repository_ctx.path("")) + "/../" + llvm_tools_repo + "/llvm-ar"
|
||||||
|
repository_ctx.symlink(llvm_tools_dir, ZIG_TOOL_PATH.format(zig_tool="llvm-ar"))
|
||||||
|
|
||||||
|
for zig_tool in ZIG_TOOLS:
|
||||||
|
repository_ctx.file(
|
||||||
|
ZIG_TOOL_PATH.format(zig_tool=zig_tool),
|
||||||
|
ZIG_TOOL_WRAPPER.format(zig=str(repository_ctx.path("zig")), zig_tool=zig_tool),
|
||||||
|
)
|
||||||
|
|
||||||
|
absolute_path = json.encode(str(repository_ctx.path("")))
|
||||||
|
repository_ctx.file(
|
||||||
|
"BUILD",
|
||||||
|
BUILD.format(absolute_path=absolute_path, llvm_tools_repo=llvm_tools_repo),
|
||||||
|
)
|
||||||
|
|
||||||
|
zig_repository = repository_rule(
|
||||||
|
attrs = {
|
||||||
|
"url": attr.string(),
|
||||||
|
"version": attr.string(),
|
||||||
|
"sha256": attr.string(),
|
||||||
|
},
|
||||||
|
implementation = _zig_repository_impl,
|
||||||
|
)
|
||||||
|
|
||||||
|
def filegroup(name, **kwargs):
|
||||||
|
native.filegroup(name = name, **kwargs)
|
||||||
|
return ":" + name
|
||||||
|
|
||||||
|
def zig_build_macro(absolute_path):
|
||||||
|
filegroup(name="empty")
|
||||||
|
filegroup(name="zig_compiler", srcs=["zig"])
|
||||||
|
filegroup(name="lib/std", srcs=native.glob(["lib/std/**"]))
|
||||||
|
|
||||||
|
lazy_filegroups = {}
|
||||||
|
|
||||||
|
for target_config in TARGET_CONFIGS:
|
||||||
|
target = target_config.target
|
||||||
|
native.platform(name = target, constraint_values = target_config.constraint_values)
|
||||||
|
|
||||||
|
all_srcs = []
|
||||||
|
ar_srcs = [":zig_compiler"]
|
||||||
|
linker_srcs = [":zig_compiler"]
|
||||||
|
compiler_srcs = [":zig_compiler"]
|
||||||
|
tool_srcs = {"gcc": compiler_srcs, "cpp": compiler_srcs, "ld": linker_srcs, "ar": ar_srcs}
|
||||||
|
|
||||||
|
cxx_builtin_include_directories = []
|
||||||
|
for d in DEFAULT_INCLUDE_DIRECTORIES + target_config.includes:
|
||||||
|
if d not in lazy_filegroups:
|
||||||
|
lazy_filegroups[d] = filegroup(name=d, srcs=native.glob([d + "/**"]))
|
||||||
|
compiler_srcs.append(lazy_filegroups[d])
|
||||||
|
cxx_builtin_include_directories.append(absolute_path + "/" + d)
|
||||||
|
|
||||||
|
absolute_tool_paths = {}
|
||||||
|
for name, path in target_config.tool_paths.items() + DEFAULT_TOOL_PATHS:
|
||||||
|
if path[0] == "/":
|
||||||
|
absolute_tool_paths[name] = path
|
||||||
|
continue
|
||||||
|
tool_path = ZIG_TOOL_PATH.format(zig_tool=path)
|
||||||
|
absolute_tool_paths[name] = "%s/%s" % (absolute_path, tool_path)
|
||||||
|
tool_srcs[name].append(tool_path)
|
||||||
|
|
||||||
|
ar_files = filegroup(name=target + "_ar_files", srcs=ar_srcs)
|
||||||
|
linker_files = filegroup(name=target + "_linker_files", srcs=linker_srcs)
|
||||||
|
compiler_files = filegroup(name=target + "_compiler_files", srcs=compiler_srcs)
|
||||||
|
all_files = filegroup(name=target + "_all_files", srcs=all_srcs + [ar_files, linker_files, compiler_files])
|
||||||
|
|
||||||
|
zig_cc_toolchain_config(
|
||||||
|
name = target + "_cc_toolchain_config",
|
||||||
|
target = target,
|
||||||
|
tool_paths = absolute_tool_paths,
|
||||||
|
cxx_builtin_include_directories = cxx_builtin_include_directories,
|
||||||
|
copts = target_config.copts,
|
||||||
|
linkopts = target_config.linkopts,
|
||||||
|
target_system_name = "unknown",
|
||||||
|
# TODO don't hardcode this to k8
|
||||||
|
target_cpu = "k8",
|
||||||
|
target_libc = "unknown",
|
||||||
|
compiler = "clang",
|
||||||
|
abi_version = "unknown",
|
||||||
|
abi_libc_version = "unknown",
|
||||||
|
)
|
||||||
|
|
||||||
|
native.cc_toolchain(
|
||||||
|
name = target + "_cc_toolchain",
|
||||||
|
toolchain_identifier = target + "-toolchain",
|
||||||
|
toolchain_config = ":%s_cc_toolchain_config" % target,
|
||||||
|
all_files = all_files,
|
||||||
|
ar_files = ar_files,
|
||||||
|
compiler_files = compiler_files,
|
||||||
|
linker_files = linker_files,
|
||||||
|
dwp_files = ":empty",
|
||||||
|
objcopy_files = ":empty",
|
||||||
|
strip_files = ":empty",
|
||||||
|
supports_param_files = 0,
|
||||||
|
)
|
||||||
|
|
||||||
|
native.cc_toolchain_suite(
|
||||||
|
name = target + "_cc_toolchain_suite",
|
||||||
|
toolchains = {
|
||||||
|
# TODO don't hardcode this to k8
|
||||||
|
"k8": ":%s_cc_toolchain" % target,
|
||||||
|
},
|
||||||
|
tags = ["manual"]
|
||||||
|
)
|
||||||
|
|
||||||
|
native.toolchain(
|
||||||
|
name = target + "_toolchain",
|
||||||
|
exec_compatible_with = None,
|
||||||
|
target_compatible_with = target_config.constraint_values,
|
||||||
|
toolchain = ":%s_cc_toolchain" % target,
|
||||||
|
toolchain_type = "@bazel_tools//tools/cpp:toolchain_type",
|
||||||
|
)
|
112
zig-toolchains/zig_toolchain.bzl
Normal file
112
zig-toolchains/zig_toolchain.bzl
Normal file
@ -0,0 +1,112 @@
|
|||||||
|
load("@bazel_tools//tools/build_defs/cc:action_names.bzl", "ACTION_NAMES")
|
||||||
|
load("@bazel_tools//tools/cpp:cc_toolchain_config_lib.bzl",
|
||||||
|
"feature",
|
||||||
|
"flag_group",
|
||||||
|
"flag_set",
|
||||||
|
"tool_path",
|
||||||
|
"tool",
|
||||||
|
)
|
||||||
|
|
||||||
|
all_link_actions = [
|
||||||
|
ACTION_NAMES.cpp_link_executable,
|
||||||
|
ACTION_NAMES.cpp_link_dynamic_library,
|
||||||
|
ACTION_NAMES.cpp_link_nodeps_dynamic_library,
|
||||||
|
]
|
||||||
|
|
||||||
|
all_compile_actions = [
|
||||||
|
ACTION_NAMES.assemble,
|
||||||
|
ACTION_NAMES.c_compile,
|
||||||
|
ACTION_NAMES.cc_flags_make_variable,
|
||||||
|
ACTION_NAMES.clif_match,
|
||||||
|
ACTION_NAMES.cpp_compile,
|
||||||
|
ACTION_NAMES.cpp_header_parsing,
|
||||||
|
ACTION_NAMES.cpp_module_codegen,
|
||||||
|
ACTION_NAMES.cpp_module_compile,
|
||||||
|
ACTION_NAMES.linkstamp_compile,
|
||||||
|
ACTION_NAMES.lto_backend,
|
||||||
|
ACTION_NAMES.preprocess_assemble,
|
||||||
|
]
|
||||||
|
|
||||||
|
def _zig_cc_toolchain_config_impl(ctx):
|
||||||
|
default_compiler_flags = feature(
|
||||||
|
name = "default_compiler_flags",
|
||||||
|
enabled = True,
|
||||||
|
flag_sets = [
|
||||||
|
flag_set(
|
||||||
|
actions = all_compile_actions,
|
||||||
|
flag_groups = [
|
||||||
|
flag_group(
|
||||||
|
flags = [
|
||||||
|
"-I" + d
|
||||||
|
for d in ctx.attr.cxx_builtin_include_directories
|
||||||
|
] + [
|
||||||
|
"-target", ctx.attr.target,
|
||||||
|
"-no-canonical-prefixes",
|
||||||
|
"-Wno-builtin-macro-redefined",
|
||||||
|
"-D__DATE__=\"redacted\"",
|
||||||
|
"-D__TIMESTAMP__=\"redacted\"",
|
||||||
|
"-D__TIME__=\"redacted\"",
|
||||||
|
] + ctx.attr.copts,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
|
default_linker_flags = feature(
|
||||||
|
name = "default_linker_flags",
|
||||||
|
enabled = True,
|
||||||
|
flag_sets = [
|
||||||
|
flag_set(
|
||||||
|
actions = all_link_actions,
|
||||||
|
flag_groups = ([
|
||||||
|
flag_group(
|
||||||
|
flags = [
|
||||||
|
"-target", ctx.attr.target,
|
||||||
|
] + ctx.attr.linkopts,
|
||||||
|
),
|
||||||
|
]),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
|
features = [
|
||||||
|
default_compiler_flags,
|
||||||
|
default_linker_flags,
|
||||||
|
]
|
||||||
|
|
||||||
|
return cc_common.create_cc_toolchain_config_info(
|
||||||
|
ctx = ctx,
|
||||||
|
features = features,
|
||||||
|
toolchain_identifier = "%s-toolchain" % ctx.attr.target,
|
||||||
|
host_system_name = "local",
|
||||||
|
target_system_name = ctx.attr.target_system_name,
|
||||||
|
target_cpu = ctx.attr.target_cpu,
|
||||||
|
target_libc = ctx.attr.target_libc,
|
||||||
|
compiler = ctx.attr.compiler,
|
||||||
|
abi_version = ctx.attr.abi_version,
|
||||||
|
abi_libc_version = ctx.attr.abi_libc_version,
|
||||||
|
tool_paths = [
|
||||||
|
tool_path(name=name, path=path)
|
||||||
|
for name, path in ctx.attr.tool_paths.items()
|
||||||
|
],
|
||||||
|
cxx_builtin_include_directories = ctx.attr.cxx_builtin_include_directories,
|
||||||
|
)
|
||||||
|
|
||||||
|
zig_cc_toolchain_config = rule(
|
||||||
|
implementation = _zig_cc_toolchain_config_impl,
|
||||||
|
attrs = {
|
||||||
|
"cxx_builtin_include_directories": attr.string_list(),
|
||||||
|
"linkopts": attr.string_list(),
|
||||||
|
"copts": attr.string_list(),
|
||||||
|
"tool_paths": attr.string_dict(),
|
||||||
|
"target": attr.string(),
|
||||||
|
"target_system_name": attr.string(),
|
||||||
|
"target_cpu": attr.string(),
|
||||||
|
"target_libc": attr.string(),
|
||||||
|
"compiler": attr.string(),
|
||||||
|
"abi_version": attr.string(),
|
||||||
|
"abi_libc_version": attr.string(),
|
||||||
|
},
|
||||||
|
provides = [CcToolchainConfigInfo],
|
||||||
|
)
|
Loading…
Reference in New Issue
Block a user