a0511ca5ee
This linker flag causes undefined symbols to be ignored, which is the default behavior on linux but not macos. This is required when building shared libraries to use as e.g. Python modules. This also matches what Bazel's built-in macos cc toolchain does.
120 lines
3.8 KiB
Python
120 lines
3.8 KiB
Python
DEFAULT_INCLUDE_DIRECTORIES = [
|
|
"include",
|
|
"libcxx/include",
|
|
"libcxxabi/include",
|
|
]
|
|
|
|
ZIG_TOOL_PATH = "tools/{zig_tool}"
|
|
|
|
# Zig supports even older glibcs than defined below, but we have tested only
|
|
# down to 2.17.
|
|
# $ zig targets | jq -r '.glibc[]' | sort -V
|
|
_GLIBCS = [
|
|
"2.17",
|
|
"2.18",
|
|
"2.19",
|
|
"2.22",
|
|
"2.23",
|
|
"2.24",
|
|
"2.25",
|
|
"2.26",
|
|
"2.27",
|
|
"2.28",
|
|
"2.29",
|
|
"2.30",
|
|
"2.31",
|
|
"2.32",
|
|
"2.33",
|
|
"2.34",
|
|
]
|
|
|
|
LIBCS = ["musl"] + ["gnu.{}".format(glibc) for glibc in _GLIBCS]
|
|
|
|
def target_structs():
|
|
ret = []
|
|
for zigcpu, gocpu in (("x86_64", "amd64"), ("aarch64", "arm64")):
|
|
ret.append(_target_darwin(gocpu, zigcpu))
|
|
ret.append(_target_linux_musl(gocpu, zigcpu))
|
|
for glibc in _GLIBCS:
|
|
ret.append(_target_linux_gnu(gocpu, zigcpu, glibc))
|
|
return ret
|
|
|
|
def _target_darwin(gocpu, zigcpu):
|
|
min_os = "10"
|
|
if zigcpu == "aarch64":
|
|
min_os = "11"
|
|
return struct(
|
|
gotarget = "darwin_{}".format(gocpu),
|
|
zigtarget = "{}-macos-gnu".format(zigcpu),
|
|
includes = [
|
|
"libunwind/include",
|
|
# TODO: Define a toolchain for each minimum OS version
|
|
"libc/include/{}-macos.{}-gnu".format(zigcpu, min_os),
|
|
"libc/include/any-macos.{}-any".format(min_os),
|
|
"libc/include/any-macos-any",
|
|
],
|
|
linkopts = [],
|
|
dynamic_library_linkopts = ["-Wl,-undefined=dynamic_lookup"],
|
|
copts = [],
|
|
bazel_target_cpu = "darwin",
|
|
constraint_values = [
|
|
"@platforms//os:macos",
|
|
"@platforms//cpu:{}".format(zigcpu),
|
|
],
|
|
tool_paths = {"ld": "ld64.lld"},
|
|
)
|
|
|
|
def _target_linux_gnu(gocpu, zigcpu, glibc_version):
|
|
glibc_suffix = "gnu.{}".format(glibc_version)
|
|
|
|
# https://github.com/ziglang/zig/issues/5882#issuecomment-888250676
|
|
# fcntl_hack is only required for glibc 2.27 or less.
|
|
fcntl_hack = glibc_version < "2.28"
|
|
|
|
return struct(
|
|
gotarget = "linux_{}_{}".format(gocpu, glibc_suffix),
|
|
zigtarget = "{}-linux-{}".format(zigcpu, glibc_suffix),
|
|
includes = [
|
|
"libunwind/include",
|
|
"libc/include/generic-glibc",
|
|
"libc/include/any-linux-any",
|
|
"libc/include/{}-linux-gnu".format(zigcpu),
|
|
"libc/include/{}-linux-any".format(zigcpu),
|
|
] + (["libc/include/x86-linux-any"] if zigcpu == "x86_64" else []),
|
|
toplevel_include = ["glibc-hacks"] if fcntl_hack else [],
|
|
compiler_extra_includes = ["glibc-hacks/glibchack-fcntl.h"] if fcntl_hack else [],
|
|
linker_version_scripts = ["glibc-hacks/fcntl.map"] if fcntl_hack else [],
|
|
linkopts = ["-lc++", "-lc++abi"],
|
|
dynamic_library_linkopts = [],
|
|
copts = [],
|
|
bazel_target_cpu = "k8",
|
|
constraint_values = [
|
|
"@platforms//os:linux",
|
|
"@platforms//cpu:{}".format(zigcpu),
|
|
],
|
|
libc_constraint = "@zig_sdk//libc:{}".format(glibc_suffix),
|
|
tool_paths = {"ld": "ld.lld"},
|
|
)
|
|
|
|
def _target_linux_musl(gocpu, zigcpu):
|
|
return struct(
|
|
gotarget = "linux_{}_musl".format(gocpu),
|
|
zigtarget = "{}-linux-musl".format(zigcpu),
|
|
includes = [
|
|
"libc/include/generic-musl",
|
|
"libc/include/any-linux-any",
|
|
"libc/include/{}-linux-musl".format(zigcpu),
|
|
"libc/include/{}-linux-any".format(zigcpu),
|
|
] + (["libc/include/x86-linux-any"] if zigcpu == "x86_64" else []),
|
|
linkopts = ["-s", "-w"],
|
|
dynamic_library_linkopts = [],
|
|
copts = ["-D_LIBCPP_HAS_MUSL_LIBC", "-D_LIBCPP_HAS_THREAD_API_PTHREAD"],
|
|
bazel_target_cpu = "k8",
|
|
constraint_values = [
|
|
"@platforms//os:linux",
|
|
"@platforms//cpu:{}".format(zigcpu),
|
|
],
|
|
libc_constraint = "@zig_sdk//libc:musl",
|
|
tool_paths = {"ld": "ld.lld"},
|
|
)
|