1*7594170eSAndroid Build Coastguard Worker# Copyright (C) 2021 The Android Open Source Project 2*7594170eSAndroid Build Coastguard Worker# 3*7594170eSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License"); 4*7594170eSAndroid Build Coastguard Worker# you may not use this file except in compliance with the License. 5*7594170eSAndroid Build Coastguard Worker# You may obtain a copy of the License at 6*7594170eSAndroid Build Coastguard Worker# 7*7594170eSAndroid Build Coastguard Worker# http://www.apache.org/licenses/LICENSE-2.0 8*7594170eSAndroid Build Coastguard Worker# 9*7594170eSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software 10*7594170eSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS, 11*7594170eSAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*7594170eSAndroid Build Coastguard Worker# See the License for the specific language governing permissions and 13*7594170eSAndroid Build Coastguard Worker# limitations under the License. 14*7594170eSAndroid Build Coastguard Worker 15*7594170eSAndroid Build Coastguard Worker# Rules and macros to define a cc toolchain with a static libc. 16*7594170eSAndroid Build Coastguard Worker# Used to bootstrap cc development using the bionic lib build by Soong. 17*7594170eSAndroid Build Coastguard Worker# Rule: _libc_config 18*7594170eSAndroid Build Coastguard Worker# Provides information needed by CcToolchainConfigInfo to configure the cc_toolchain properly. 19*7594170eSAndroid Build Coastguard Worker# Macro: static_libc 20*7594170eSAndroid Build Coastguard Worker# Creates the libc_config target and filegroups needed by cc_toolchain. 21*7594170eSAndroid Build Coastguard WorkerLibcConfigInfo = provider(fields = ["include_dirs", "system_libraries"]) 22*7594170eSAndroid Build Coastguard Worker 23*7594170eSAndroid Build Coastguard Workerdef _libc_config_impl(ctx): 24*7594170eSAndroid Build Coastguard Worker include_dirs = ctx.attr.include_dirs 25*7594170eSAndroid Build Coastguard Worker system_libraries = [file.path for file in ctx.files.system_libraries] 26*7594170eSAndroid Build Coastguard Worker provider = LibcConfigInfo( 27*7594170eSAndroid Build Coastguard Worker include_dirs = include_dirs, 28*7594170eSAndroid Build Coastguard Worker system_libraries = system_libraries, 29*7594170eSAndroid Build Coastguard Worker ) 30*7594170eSAndroid Build Coastguard Worker return [provider] 31*7594170eSAndroid Build Coastguard Worker 32*7594170eSAndroid Build Coastguard Worker_libc_config = rule( 33*7594170eSAndroid Build Coastguard Worker implementation = _libc_config_impl, 34*7594170eSAndroid Build Coastguard Worker attrs = { 35*7594170eSAndroid Build Coastguard Worker "include_dirs": attr.string_list(default = []), 36*7594170eSAndroid Build Coastguard Worker "system_libraries": attr.label_list(default = [], allow_files = True), 37*7594170eSAndroid Build Coastguard Worker }, 38*7594170eSAndroid Build Coastguard Worker) 39*7594170eSAndroid Build Coastguard Worker 40*7594170eSAndroid Build Coastguard Workerdef static_libc( 41*7594170eSAndroid Build Coastguard Worker name, 42*7594170eSAndroid Build Coastguard Worker include_dirs = {}, 43*7594170eSAndroid Build Coastguard Worker system_libraries = []): 44*7594170eSAndroid Build Coastguard Worker # Create the filegroups 45*7594170eSAndroid Build Coastguard Worker include_srcs = [] 46*7594170eSAndroid Build Coastguard Worker include_globs = [] 47*7594170eSAndroid Build Coastguard Worker for value in include_dirs.values(): 48*7594170eSAndroid Build Coastguard Worker if "*" in value: 49*7594170eSAndroid Build Coastguard Worker # It must be a glob. 50*7594170eSAndroid Build Coastguard Worker include_globs.append(value) 51*7594170eSAndroid Build Coastguard Worker else: 52*7594170eSAndroid Build Coastguard Worker # Assume it's a label. 53*7594170eSAndroid Build Coastguard Worker include_srcs.append(value) 54*7594170eSAndroid Build Coastguard Worker native.filegroup( 55*7594170eSAndroid Build Coastguard Worker name = "%s_includes" % name, 56*7594170eSAndroid Build Coastguard Worker srcs = include_srcs + native.glob(include_globs), 57*7594170eSAndroid Build Coastguard Worker ) 58*7594170eSAndroid Build Coastguard Worker native.filegroup( 59*7594170eSAndroid Build Coastguard Worker name = "%s_system_libraries" % name, 60*7594170eSAndroid Build Coastguard Worker srcs = system_libraries, 61*7594170eSAndroid Build Coastguard Worker ) 62*7594170eSAndroid Build Coastguard Worker 63*7594170eSAndroid Build Coastguard Worker # Create the libc config. 64*7594170eSAndroid Build Coastguard Worker include_paths = [path for path in include_dirs.keys()] 65*7594170eSAndroid Build Coastguard Worker _libc_config( 66*7594170eSAndroid Build Coastguard Worker name = name, 67*7594170eSAndroid Build Coastguard Worker include_dirs = include_paths, 68*7594170eSAndroid Build Coastguard Worker system_libraries = system_libraries, 69*7594170eSAndroid Build Coastguard Worker ) 70*7594170eSAndroid Build Coastguard Worker 71*7594170eSAndroid Build Coastguard Worker # Also create cc_library target for direct dependencies. 72*7594170eSAndroid Build Coastguard Worker native.cc_library( 73*7594170eSAndroid Build Coastguard Worker name = "%s_library" % name, 74*7594170eSAndroid Build Coastguard Worker hdrs = [ 75*7594170eSAndroid Build Coastguard Worker ":%s_includes" % name, 76*7594170eSAndroid Build Coastguard Worker ], 77*7594170eSAndroid Build Coastguard Worker includes = include_paths, 78*7594170eSAndroid Build Coastguard Worker srcs = [ 79*7594170eSAndroid Build Coastguard Worker ":%s_system_libraries" % name, 80*7594170eSAndroid Build Coastguard Worker ], 81*7594170eSAndroid Build Coastguard Worker ) 82