| # Copyright (C) 2022 The Android Open Source Project |
| # |
| # 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. |
| |
| load("@bazel_skylib//lib:dicts.bzl", "dicts") |
| load("//build/bazel/platforms:rule_utilities.bzl", "ARCH_CONSTRAINT_ATTRS", "get_arch") |
| |
| # This file contains the implementation for the cc_stub_library rule. |
| # |
| # TODO(b/207812332): |
| # - ndk_api_coverage_parser: https://cs.android.com/android/platform/superproject/+/master:build/soong/cc/coverage.go;l=248-262;drc=master |
| |
| CcStubInfo = provider( |
| fields = { |
| "stub_map": "The .map file containing library symbols for the specific API version.", |
| "version": "The API version of this library.", |
| "abi_symbol_list": "A plain-text list of all symbols of this library for the specific API version." |
| } |
| ) |
| |
| def _cc_stub_gen_impl(ctx): |
| # The name of this target. |
| name = ctx.attr.name |
| |
| # All declared outputs of ndkstubgen. |
| out_stub_c = ctx.actions.declare_file("/".join([name, "stub.c"])) |
| out_stub_map = ctx.actions.declare_file("/".join([name, "stub.map"])) |
| out_abi_symbol_list = ctx.actions.declare_file("/".join([name, "abi_symbol_list.txt"])) |
| |
| outputs = [out_stub_c, out_stub_map, out_abi_symbol_list] |
| |
| arch = get_arch(ctx) |
| |
| ndkstubgen_args = ctx.actions.args() |
| ndkstubgen_args.add_all(["--arch", arch]) |
| ndkstubgen_args.add_all(["--api", ctx.attr.version]) |
| ndkstubgen_args.add_all(["--api-map", ctx.file._api_levels_file]) |
| # TODO(b/207812332): This always parses and builds the stub library as a dependency of an APEX. Parameterize this |
| # for non-APEX use cases. |
| ndkstubgen_args.add_all(["--apex", ctx.file.symbol_file]) |
| ndkstubgen_args.add_all(outputs) |
| ctx.actions.run( |
| executable = ctx.executable._ndkstubgen, |
| inputs = [ |
| ctx.file.symbol_file, |
| ctx.file._api_levels_file, |
| ], |
| outputs = outputs, |
| arguments = [ndkstubgen_args], |
| ) |
| |
| return [ |
| # DefaultInfo.files contains the .stub.c file only so that this target |
| # can be used directly in the srcs of a cc_library. |
| DefaultInfo(files = depset([out_stub_c])), |
| CcStubInfo( |
| stub_map = out_stub_map, |
| abi_symbol_list = out_abi_symbol_list, |
| version = ctx.attr.version, |
| ), |
| ] |
| |
| cc_stub_gen = rule( |
| implementation = _cc_stub_gen_impl, |
| attrs = dicts.add({ |
| # Public attributes |
| "symbol_file": attr.label(mandatory = True, allow_single_file = [".map.txt"]), |
| "version": attr.string(mandatory = True, default = "current"), |
| # Private attributes |
| "_api_levels_file": attr.label(default = "@soong_injection//api_levels:api_levels.json", allow_single_file = True), |
| # TODO(b/199038020): Use //build/soong/cc/ndkstubgen when py_runtime is set up on CI for hermetic python usage. |
| # "_ndkstubgen": attr.label(default = "@make_injection//:host/linux-x86/bin/ndkstubgen", executable = True, cfg = "host", allow_single_file = True), |
| "_ndkstubgen": attr.label(default = "//build/soong/cc/ndkstubgen", executable = True, cfg = "host"), |
| }, ARCH_CONSTRAINT_ATTRS), |
| ) |
| |