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