1
Go to file
2022-01-26 06:17:04 +02:00
bin wip: go repositories 2021-07-21 14:59:33 +03:00
ci disable darwin/arm64 test 2021-12-13 03:33:24 +02:00
rules move go_binary_override to rules_go 2021-11-07 12:39:34 +02:00
test [test] remove DataDog/zstd 2021-11-07 12:39:34 +02:00
toolchain upgrade zig to 0.10.0-dev.399+366c76744 2022-01-26 05:41:21 +02:00
.bazelrc [bazelrc] build --compilation_mode=opt 2021-12-15 15:05:12 +02:00
.bazelversion bump bazel version 2021-12-09 10:23:46 +02:00
.build.yml move to debian/stable 2021-11-22 17:25:02 +02:00
.envrc update .envrc 2021-09-13 09:12:09 +03:00
.gitignore download a verified version of bazelisk 2021-09-06 17:02:17 +03:00
BUILD move go_binary_override to rules_go 2021-11-07 12:39:34 +02:00
go.mod [test] remove DataDog/zstd 2021-11-07 12:39:34 +02:00
go.sum [test] remove DataDog/zstd 2021-11-07 12:39:34 +02:00
LICENSE add license 2021-06-11 06:16:23 +03:00
README.md Update release notes for v0.4.1 2022-01-26 06:17:04 +02:00
release [release] update version regexp to allow -rc 2021-12-13 03:29:10 +02:00
relnotes.awk add release note updater 2021-10-18 15:46:05 +03:00
repositories.bzl [test] remove DataDog/zstd 2021-11-07 12:39:34 +02:00
WORKSPACE updating dependencies 2021-12-22 11:16:01 +02:00

builds.sr.ht status

Bazel zig cc toolchain

This is a C/C++ toolchain that can (cross-)compile C/C++ programs. It contains clang-13, musl, glibc (versions 2-2.34, selectable), all in a ~40MB package. Read here about zig-cc; the rest of the README will present how to use this toolchain from Bazel.

Usage

Add this to your WORKSPACE:

BAZEL_ZIG_CC_VERSION = "v0.4.1"

http_archive(
    name = "bazel-zig-cc",
    sha256 = "613773ccacab23a789d1b1e92dadb3945be8ad08498829c7a9c28f09a2833db1",
    strip_prefix = "bazel-zig-cc-{}".format(BAZEL_ZIG_CC_VERSION),
    urls = ["https://git.sr.ht/~motiejus/bazel-zig-cc/archive/{}.tar.gz".format(BAZEL_ZIG_CC_VERSION)],
)

load("@bazel-zig-cc//toolchain:defs.bzl", zig_register_toolchains = "register_toolchains")

zig_register_toolchains(register = [
    "x86_64-linux-gnu.2.28",
    "x86_64-macos-gnu",
])

And this to .bazelrc:

build --incompatible_enable_cc_toolchain_resolution

The snippet above will download the zig toolchain and register it for the following platforms:

  • x86_64-linux-gnu.2.28 for ["@platforms//os:linux", "@platforms//cpu:x86_64"].
  • x86_64-macos-gnu for ["@platforms//os:macos", "@platforms//cpu:x86_64"].

Note that both Go and Bazel naming schemes are accepted. For convenience with Go, the following Go-style toolchain aliases are created:

Bazel (zig) name Go name
x86_64 amd64
aarch64 arm64
macos darwin

For example, the toolchain linux_amd64_gnu.2.28 is aliased to x86_64-linux-gnu.2.28. To find out which toolchains can be registered or used, run:

$ bazel query @zig_sdk//... | sed -En '/.*_toolchain$/ s/.*:(.*)_toolchain$/\1/p'

UBSAN and "SIGILL: Illegal Instruction"

zig cc differs from "mainstream" compilers by enabling UBSAN by default. Which means your program may compile successfully and crash with:

SIGILL: illegal instruction

This is by design: it encourages program authors to fix the undefined behavior. There are many ways to find the undefined behavior.

Known Issues In bazel-zig-cc

These are the things you may stumble into when using bazel-zig-cc. I am unlikely to implement them, but patches implementing those will be accepted. See Questions & Contributions on how to contribute.

OSX: sysroot

For non-trivial programs (and for all darwin/arm64 cgo programs) MacOS SDK may be necessary. Read Jakub's comment about it. Support for OSX sysroot is currently not implemented.

OSX: different OS targets (Catalina -- Monterey)

Zig 0.9.0 may target macos.10 (Catalina), macos.11 (Big Sur) or macos.12 (Monterey). It currently targets the lowest version, without ability to change it.

Zig cache

Currently zig cache is in $HOME, so bazel clean --expunge does not clear the zig cache. Zig's cache should be stored somewhere in the project's path.

Alternative download URLs

Currently zig is downloaded from dl.jakstys.lt/zig, which is nuts. One should provide a way to specify alternative URLs for the zig toolchain.

Bazel toolchain target locations

The path to Bazel toolchains is @zig_sdk//:<toolchain>_toolchain. It should be moved to @zig_sdk//toolchain:<toolchain> or similar; so the user-facing targets are in their own namespace.

Known Issues In Upstream

This section lists issues that I've stumbled into when using zig cc, and is outside of bazel-zig-cc's control.

using glibc 2.27 or older

Severity: Low

Task: ziglang/zig #9485 glibc 2.27 or older: fcntl64 not found, but zig's glibc headers refer it

Background: when glibc 2.27 or older is selected, it may miss fcntl64. A workaround is applied for x86_64, but not for aarch64. The same workaround may apply to aarch64, but the author didn't find a need to test it (yet).

Closed Upstream Issues

Testing

linux cgo + glibc 2.28

$ bazel build --platforms @io_bazel_rules_go//go/toolchain:linux_amd64_cgo //test:hello
$ file bazel-out/k8-fastbuild-ST-d17813c235ce/bin/test/hello_/hello
bazel-out/k8-fastbuild-ST-d17813c235ce/bin/test/hello_/hello: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.0.0, Go BuildID=redacted, with debug_info, not stripped

linux cgo + musl

$ bazel build \
    --platforms @io_bazel_rules_go//go/toolchain:linux_amd64_cgo \
    --extra_toolchains @zig_sdk//:linux_amd64_musl_toolchain //test:hello
...
$ file ../bazel-out/k8-fastbuild-ST-d17813c235ce/bin/test/hello_/hello
../bazel-out/k8-fastbuild-ST-d17813c235ce/bin/test/hello_/hello: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, Go BuildID=redacted, with debug_info, not stripped
$ ../bazel-out/k8-fastbuild-ST-d17813c235ce/bin/test/hello_/hello
hello, world

macos cgo

$ bazel build --platforms @io_bazel_rules_go//go/toolchain:darwin_amd64_cgo //test:hello
...
$ file bazel-bin/test/hello_/hello
bazel-bin/test/hello_/hello: Mach-O 64-bit x86_64 executable, flags:<NOUNDEFS|DYLDLINK|TWOLEVEL|PIE>

Transient docker environment

$ docker run -e CC=/usr/bin/false -ti --rm -v $(pwd):/x -w /x debian:bullseye-slim
# apt update && apt install direnv git -y
# . .envrc

And run the bazel build commands above. Take a look at .build.yml and see how CI does it.

Questions & Contributions

Project's mailing list is ~motiejus/bazel-zig-cc. The mailing list is used for:

  • announcements (I am aiming to send an email with every release).
  • user discussions.
  • raising issues.
  • contributions.

I will generally respond to emails about issues. I may even be able to fix them. However, no promises: you are much more likely (and welcome!) to get it fixed by submitting a patch.

To contribute, send your patches to the mailing list, as described in git-send-email.io or via Sourcehut web UI.

Copyright is retained by the contributors.

Thanks

Many thanks to Adam Bouhenguel and his bazel-zig-cc, the parent of this repository. Also, the Zig team for making this all possible and handling the issues promptly.