1
Fork 0
Go to file
Motiejus Jakštys ac719cecca fix link 2021-12-09 10:41:17 +02:00
bin wip: go repositories 2021-07-21 14:59:33 +03:00
ci [shellcheck] ci/test 2021-10-21 11:39:46 +03: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 2021-12-09 10:22:26 +02:00
.bazelrc remove non-required options from .bazelrc 2021-06-30 16:00:42 +03: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
LICENSE add license 2021-06-11 06:16:23 +03:00
README.md fix link 2021-12-09 10:41:17 +02:00
WORKSPACE unregister default toolchains; update README 2021-08-11 09:37:54 +03: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
release fix release script template 2021-12-06 08:19:43 +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

README.md

builds.sr.ht status

Bazel zig cc toolchain

This is a C/C++ toolchain that can (cross-)compile C/C++ programs. It contains clang-12, musl, glibc (versions 2-2.33, 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.3.3"

http_archive(
    name = "bazel-zig-cc",
    sha256 = "0bf4ea0ceaa3a2e3be6e891e6c0035d4c86e4cc69ccc1d7ddf701d4c1e4c45a3",
    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",
])

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 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'

Compiling OS X executables

MacOS SDK (--sysroot) may be necessary. Read Jakub's comment about it. This section will be expanded once yours truly understands more about the requirements and limitations of linking on OSX.

Known Issues

relocation error with glibc < 2.32

Severity: High

Task: ziglang/zig relocation error: symbol pthread_sigmask version GLIBC_2.2.5 not defined in file libc.so.6 with link time reference #7667

Background: one of our internal shared libraries (which we must build with glibc 2.19) does not load on an older system:

id: relocation error: /lib/x86_64-linux-gnu/libnss_uber.so.2: symbol pthread_sigmask, version GLIBC_2.2.5 not defined in file libc.so.6 with link time reference

Severity is high, because there is no known workaround: the shared library, when built with this toolchain, will not work on our target system.

newer zig fails darwin tests

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).

incorrect glibc version autodetection

Severity: Low

Task: ziglang/zig zig detects wrong libc version #6469

Background: zig detects an incorrect glibc version when not specified. Therefore, until the task is resolved, registering a GNU toolchain without a version suffix (e.g. linux_amd64_gnu) is not recommended. We recommend specifying the suffix to the oldest system that is mean to run the compiled binaries. This is safe, because glibc is backwards-compatible. Alternatively, use musl.

Closed issues

Testing

linux cgo + glibc 2.19

$ 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.

Future & Roadmap

This section lists things that I think will happen at some point: either by myself, or my colleagues, or outside contributors.

  • Move Zig cache path to bazel root, so bazel clean --expunge clears the zig cache.
  • Provide a way to specify alternative URLs for the zig toolchain (currently zig is downloaded from jakstys.lt, which is nuts).
  • Rename @zig_sdk//:<toolchain>_toolchain to @zig_sdk//toolchain:<toolchain> or similar; so the user-facing targets are in their own namespace.
  • Provide a way to specify sysroot for Darwin (OSX). See #Compiling OS X executables for an ongoing discussion.

Contribution guidelines

Contributions are accepted via patches to the mailing list ~motiejus/bazel-zig-cc@lists.sr.ht. A few ways to send patches:

  1. git send-email(1). More info at git-send-email.io.
  2. Sourcehut web UI. See video by sourcehut's creator Drew DeVault.

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.