1# Rules and macros to define a cc toolchain with a static libc.
2# Used to bootstrap cc development using the bionic lib build by Soong.
3# Rule: _libc_config
4#   Provides information needed by CcToolchainConfigInfo to configure the cc_toolchain properly.
5# Macro: static_libc
6#   Creates the libc_config target and filegroups needed by cc_toolchain.
7LibcConfigInfo = provider(fields = ["include_dirs", "system_libraries"])
8def _libc_config_impl(ctx):
9    include_dirs = ctx.attr.include_dirs
10    system_libraries = [file.path for file in ctx.files.system_libraries]
11    provider = LibcConfigInfo(
12        include_dirs = include_dirs,
13        system_libraries = system_libraries,
14    )
15    return [provider]
16_libc_config = rule(
17    implementation = _libc_config_impl,
18    attrs = {
19        "include_dirs": attr.string_list(default = []),
20        "system_libraries": attr.label_list(default = [], allow_files = True),
21    },
22)
23def static_libc(
24        name,
25        include_dirs = {},
26        system_libraries = []):
27    # Create the filegroups
28    include_srcs = []
29    include_globs = []
30    for value in include_dirs.values():
31        if "*" in value:
32            # It must be a glob.
33            include_globs.append(value)
34        else:
35            # Assume it's a label.
36            include_srcs.append(value)
37    native.filegroup(
38        name = "%s_includes" % name,
39        srcs = include_srcs + native.glob(include_globs),
40    )
41    native.filegroup(
42        name = "%s_system_libraries" % name,
43        srcs = system_libraries,
44    )
45    # Create the libc config.
46    include_paths = [path for path in include_dirs.keys()]
47    _libc_config(
48        name = name,
49        include_dirs = include_paths,
50        system_libraries = system_libraries,
51    )
52    # Also create cc_library target for direct dependencies.
53    native.cc_library(
54        name = "%s_library" % name,
55        hdrs = [
56            ":%s_includes" % name,
57        ],
58        includes = include_paths,
59        srcs = [
60            ":%s_system_libraries" % name,
61        ],
62    )
63