| # 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"}, | |
| ) |