blob: 71fdfeed602a2f29c7fd0915e7fb1d411ce876b7 [file] [edit]
# Copyright 2026 The Bazel Authors. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""Config settings for C standard libraries identified by Bazel.
Targets that require libc-specific flags can use the config_settings defined in
this package in their select() statements.
Toolchains not shipped with Bazel are encouraged to use the same names to
identify C standard libraries as used below, but this is not enforced. A
toolchain's `target_libc` value may carry a semantic version suffix in the form
(e.g. "glibc-2.31"), which is ignored when matching the config settings below.
Example:
cc_binary(
name = "foo",
srcs = ["foo.cc"],
copts = select({
"//cc/libc:glibc": [...],
"//cc/libc:musl": [...],
"//cc/libc:ucrt": [...],
# Fallback case for an undetected C standard library.
"//conditions:default": [...],
}),
)
If multiple targets use the same set of conditionally enabled flags, this can be
simplified by extracting the select expression into a Starlark constant.
"""
load("//cc/toolchains:libc_flag.bzl", "libc_flag")
package(default_visibility = ["//visibility:public"])
licenses(["notice"])
libc_flag(name = "libc")
### Linux
# The GNU C Library (https://www.gnu.org/software/libc/).
config_setting(
name = "glibc",
flag_values = {":libc": "glibc"},
)
# musl libc (https://musl.libc.org). Also used by Emscripten and, in the form
# of the derived wasi-libc, by WASI toolchains.
config_setting(
name = "musl",
flag_values = {":libc": "musl"},
)
# uClibc and its successor uClibc-ng (https://uclibc-ng.org).
config_setting(
name = "uclibc",
flag_values = {":libc": "uclibc"},
)
### Android
# Bionic, the C standard library of Android
# (https://android.googlesource.com/platform/bionic/).
config_setting(
name = "bionic",
flag_values = {":libc": "bionic"},
)
### Apple
# On Apple platforms, the C standard library is provided by libSystem. For
# historical reasons, toolchains identify it via the value "macosx" on all
# Apple platforms, not just macOS.
config_setting(
name = "macosx",
flag_values = {":libc": "macosx"},
)
### BSDs
# The C standard libraries developed as part of the respective BSD operating
# system.
config_setting(
name = "freebsd",
flag_values = {":libc": "freebsd"},
)
config_setting(
name = "netbsd",
flag_values = {":libc": "netbsd"},
)
config_setting(
name = "openbsd",
flag_values = {":libc": "openbsd"},
)
### Windows
# The legacy Microsoft Visual C++ Runtime (msvcrt.dll), which is also targeted
# by MinGW-w64 toolchains by default.
config_setting(
name = "msvcrt",
flag_values = {":libc": "msvcrt"},
)
# The Universal C Runtime (ucrtbase.dll), used by MSVC and clang-cl as well as
# the UCRT flavor of MinGW-w64 toolchains.
config_setting(
name = "ucrt",
flag_values = {":libc": "ucrt"},
)
# The MSYS2 runtime (msys-2.0.dll), a Cygwin-derived POSIX emulation layer
# targeted by MSYS2's gcc.
config_setting(
name = "msys",
flag_values = {":libc": "msys"},
)
### Embedded
# Newlib (https://sourceware.org/newlib/), commonly used by bare-metal
# toolchains such as arm-none-eabi-gcc.
config_setting(
name = "newlib",
flag_values = {":libc": "newlib"},
)
# Picolibc (https://github.com/picolibc/picolibc).
config_setting(
name = "picolibc",
flag_values = {":libc": "picolibc"},
)
# LLVM libc (https://libc.llvm.org).
config_setting(
name = "llvm-libc",
flag_values = {":libc": "llvm-libc"},
)
### WebAssembly
# wasi-libc (https://github.com/WebAssembly/wasi-libc), the musl-derived C
# standard library of WASI SDK toolchains.
config_setting(
name = "wasi-libc",
flag_values = {":libc": "wasi-libc"},
)
### Generic
config_setting(
name = "none",
flag_values = {":libc": "none"},
)