xref: /aosp_15_r20/build/bazel/rules/cc/cc_sysprop_library.bzl (revision 7594170e27e0732bc44b93d1440d87a54b6ffe7c)
1*7594170eSAndroid Build Coastguard Worker# Copyright (C) 2022 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 Workerload(
16*7594170eSAndroid Build Coastguard Worker    "//build/bazel/rules/sysprop:sysprop_library.bzl",
17*7594170eSAndroid Build Coastguard Worker    "SyspropGenInfo",
18*7594170eSAndroid Build Coastguard Worker)
19*7594170eSAndroid Build Coastguard Workerload(
20*7594170eSAndroid Build Coastguard Worker    ":cc_library_common.bzl",
21*7594170eSAndroid Build Coastguard Worker    "create_ccinfo_for_includes",
22*7594170eSAndroid Build Coastguard Worker)
23*7594170eSAndroid Build Coastguard Workerload(":cc_library_shared.bzl", "cc_library_shared")
24*7594170eSAndroid Build Coastguard Workerload(":cc_library_static.bzl", "cc_library_static")
25*7594170eSAndroid Build Coastguard Worker
26*7594170eSAndroid Build Coastguard Worker# TODO(b/240466571): Implement determination of exported includes
27*7594170eSAndroid Build Coastguard Workerdef _cc_gen_sysprop_impl(ctx):
28*7594170eSAndroid Build Coastguard Worker    outputs = []
29*7594170eSAndroid Build Coastguard Worker    output_headers = []
30*7594170eSAndroid Build Coastguard Worker    all_srcs = []
31*7594170eSAndroid Build Coastguard Worker    [
32*7594170eSAndroid Build Coastguard Worker        all_srcs.extend(src.files.to_list())
33*7594170eSAndroid Build Coastguard Worker        for src in ctx.attr.dep[SyspropGenInfo].srcs
34*7594170eSAndroid Build Coastguard Worker    ]
35*7594170eSAndroid Build Coastguard Worker    for src_file in all_srcs:
36*7594170eSAndroid Build Coastguard Worker        output_subpath = src_file.short_path.replace(
37*7594170eSAndroid Build Coastguard Worker            ctx.label.package + "/",
38*7594170eSAndroid Build Coastguard Worker            "",
39*7594170eSAndroid Build Coastguard Worker            1,
40*7594170eSAndroid Build Coastguard Worker        )
41*7594170eSAndroid Build Coastguard Worker        action_outputs = []
42*7594170eSAndroid Build Coastguard Worker        args = ctx.actions.args()
43*7594170eSAndroid Build Coastguard Worker        output_src_file = ctx.actions.declare_file(
44*7594170eSAndroid Build Coastguard Worker            "sysprop/%s.cpp" % output_subpath,
45*7594170eSAndroid Build Coastguard Worker        )
46*7594170eSAndroid Build Coastguard Worker        action_outputs.append(output_src_file)
47*7594170eSAndroid Build Coastguard Worker
48*7594170eSAndroid Build Coastguard Worker        output_header_file = ctx.actions.declare_file(
49*7594170eSAndroid Build Coastguard Worker            "sysprop/include/%s.h" % output_subpath,
50*7594170eSAndroid Build Coastguard Worker        )
51*7594170eSAndroid Build Coastguard Worker        action_outputs.append(output_header_file)
52*7594170eSAndroid Build Coastguard Worker        output_headers.append(output_header_file)
53*7594170eSAndroid Build Coastguard Worker
54*7594170eSAndroid Build Coastguard Worker        # TODO(b/240466571): This will in some cases be exported with the
55*7594170eSAndroid Build Coastguard Worker        #                    linked bug
56*7594170eSAndroid Build Coastguard Worker        output_public_header_file = ctx.actions.declare_file(
57*7594170eSAndroid Build Coastguard Worker            "sysprop/public/include/%s.h" % output_subpath,
58*7594170eSAndroid Build Coastguard Worker        )
59*7594170eSAndroid Build Coastguard Worker        action_outputs.append(output_public_header_file)
60*7594170eSAndroid Build Coastguard Worker
61*7594170eSAndroid Build Coastguard Worker        args.add("--header-dir", output_header_file.dirname)
62*7594170eSAndroid Build Coastguard Worker        args.add("--public-header-dir", output_public_header_file.dirname)
63*7594170eSAndroid Build Coastguard Worker        args.add("--source-dir", output_src_file.dirname)
64*7594170eSAndroid Build Coastguard Worker        args.add("--include-name", "%s.h" % output_subpath)
65*7594170eSAndroid Build Coastguard Worker        args.add(src_file.path)
66*7594170eSAndroid Build Coastguard Worker        ctx.actions.run(
67*7594170eSAndroid Build Coastguard Worker            executable = ctx.executable._sysprop_cpp,
68*7594170eSAndroid Build Coastguard Worker            arguments = [args],
69*7594170eSAndroid Build Coastguard Worker            inputs = [src_file],
70*7594170eSAndroid Build Coastguard Worker            outputs = action_outputs,
71*7594170eSAndroid Build Coastguard Worker            mnemonic = "syspropcc",
72*7594170eSAndroid Build Coastguard Worker            progress_message = "Generating sources from %s" % (
73*7594170eSAndroid Build Coastguard Worker                src_file.short_path,
74*7594170eSAndroid Build Coastguard Worker            ),
75*7594170eSAndroid Build Coastguard Worker        )
76*7594170eSAndroid Build Coastguard Worker        outputs.extend(action_outputs)
77*7594170eSAndroid Build Coastguard Worker    return [
78*7594170eSAndroid Build Coastguard Worker        DefaultInfo(files = depset(outputs)),
79*7594170eSAndroid Build Coastguard Worker        create_ccinfo_for_includes(
80*7594170eSAndroid Build Coastguard Worker            ctx = ctx,
81*7594170eSAndroid Build Coastguard Worker            hdrs = output_headers,
82*7594170eSAndroid Build Coastguard Worker            # TODO(b/240466571): This will be determined dynamically with the
83*7594170eSAndroid Build Coastguard Worker            #                    linked bug
84*7594170eSAndroid Build Coastguard Worker            includes = ["sysprop/include"],
85*7594170eSAndroid Build Coastguard Worker        ),
86*7594170eSAndroid Build Coastguard Worker    ]
87*7594170eSAndroid Build Coastguard Worker
88*7594170eSAndroid Build Coastguard Worker# Visible For Testing
89*7594170eSAndroid Build Coastguard Workercc_gen_sysprop = rule(
90*7594170eSAndroid Build Coastguard Worker    implementation = _cc_gen_sysprop_impl,
91*7594170eSAndroid Build Coastguard Worker    doc = """compilation of sysprop sources into cpp sources and headers""",
92*7594170eSAndroid Build Coastguard Worker    attrs = {
93*7594170eSAndroid Build Coastguard Worker        "dep": attr.label(
94*7594170eSAndroid Build Coastguard Worker            providers = [SyspropGenInfo],
95*7594170eSAndroid Build Coastguard Worker            mandatory = True,
96*7594170eSAndroid Build Coastguard Worker        ),
97*7594170eSAndroid Build Coastguard Worker        "_sysprop_cpp": attr.label(
98*7594170eSAndroid Build Coastguard Worker            default = "//system/tools/sysprop:sysprop_cpp",
99*7594170eSAndroid Build Coastguard Worker            executable = True,
100*7594170eSAndroid Build Coastguard Worker            cfg = "exec",
101*7594170eSAndroid Build Coastguard Worker        ),
102*7594170eSAndroid Build Coastguard Worker    },
103*7594170eSAndroid Build Coastguard Worker    provides = [CcInfo],
104*7594170eSAndroid Build Coastguard Worker)
105*7594170eSAndroid Build Coastguard Worker
106*7594170eSAndroid Build Coastguard Workerdef _cc_gen_sysprop_common(
107*7594170eSAndroid Build Coastguard Worker        name,
108*7594170eSAndroid Build Coastguard Worker        dep):
109*7594170eSAndroid Build Coastguard Worker    sysprop_gen_name = name + "_sysprop_gen"
110*7594170eSAndroid Build Coastguard Worker    cc_gen_sysprop(
111*7594170eSAndroid Build Coastguard Worker        name = sysprop_gen_name,
112*7594170eSAndroid Build Coastguard Worker        dep = dep,
113*7594170eSAndroid Build Coastguard Worker        tags = ["manual"],
114*7594170eSAndroid Build Coastguard Worker    )
115*7594170eSAndroid Build Coastguard Worker
116*7594170eSAndroid Build Coastguard Worker    return sysprop_gen_name
117*7594170eSAndroid Build Coastguard Worker
118*7594170eSAndroid Build Coastguard Workersysprop_deps = select({
119*7594170eSAndroid Build Coastguard Worker    "//build/bazel_common_rules/platforms/os:android": ["//system/libbase:libbase_headers"],
120*7594170eSAndroid Build Coastguard Worker    "//conditions:default": [
121*7594170eSAndroid Build Coastguard Worker        "//system/libbase:libbase_bp2build_cc_library_static",
122*7594170eSAndroid Build Coastguard Worker        "//system/logging/liblog:liblog_bp2build_cc_library_static",
123*7594170eSAndroid Build Coastguard Worker    ],
124*7594170eSAndroid Build Coastguard Worker})
125*7594170eSAndroid Build Coastguard Worker
126*7594170eSAndroid Build Coastguard Workersysprop_dynamic_deps = select({
127*7594170eSAndroid Build Coastguard Worker    "//build/bazel_common_rules/platforms/os:android": [
128*7594170eSAndroid Build Coastguard Worker        "//system/logging/liblog",
129*7594170eSAndroid Build Coastguard Worker    ],
130*7594170eSAndroid Build Coastguard Worker    "//conditions:default": [],
131*7594170eSAndroid Build Coastguard Worker})
132*7594170eSAndroid Build Coastguard Worker
133*7594170eSAndroid Build Coastguard Workerdef cc_sysprop_library_shared(
134*7594170eSAndroid Build Coastguard Worker        name,
135*7594170eSAndroid Build Coastguard Worker        dep,
136*7594170eSAndroid Build Coastguard Worker        min_sdk_version = "",
137*7594170eSAndroid Build Coastguard Worker        **kwargs):
138*7594170eSAndroid Build Coastguard Worker    sysprop_gen_name = _cc_gen_sysprop_common(name, dep)
139*7594170eSAndroid Build Coastguard Worker
140*7594170eSAndroid Build Coastguard Worker    cc_library_shared(
141*7594170eSAndroid Build Coastguard Worker        name = name,
142*7594170eSAndroid Build Coastguard Worker        srcs = [":" + sysprop_gen_name],
143*7594170eSAndroid Build Coastguard Worker        min_sdk_version = min_sdk_version,
144*7594170eSAndroid Build Coastguard Worker        deps = sysprop_deps + [sysprop_gen_name],
145*7594170eSAndroid Build Coastguard Worker        dynamic_deps = sysprop_dynamic_deps,
146*7594170eSAndroid Build Coastguard Worker        **kwargs
147*7594170eSAndroid Build Coastguard Worker    )
148*7594170eSAndroid Build Coastguard Worker
149*7594170eSAndroid Build Coastguard Workerdef cc_sysprop_library_static(
150*7594170eSAndroid Build Coastguard Worker        name,
151*7594170eSAndroid Build Coastguard Worker        dep,
152*7594170eSAndroid Build Coastguard Worker        min_sdk_version = "",
153*7594170eSAndroid Build Coastguard Worker        **kwargs):
154*7594170eSAndroid Build Coastguard Worker    sysprop_gen_name = _cc_gen_sysprop_common(name, dep)
155*7594170eSAndroid Build Coastguard Worker    cc_library_static(
156*7594170eSAndroid Build Coastguard Worker        name = name,
157*7594170eSAndroid Build Coastguard Worker        srcs = [":" + sysprop_gen_name],
158*7594170eSAndroid Build Coastguard Worker        min_sdk_version = min_sdk_version,
159*7594170eSAndroid Build Coastguard Worker        deps = sysprop_deps + [sysprop_gen_name],
160*7594170eSAndroid Build Coastguard Worker        dynamic_deps = sysprop_dynamic_deps,
161*7594170eSAndroid Build Coastguard Worker        **kwargs
162*7594170eSAndroid Build Coastguard Worker    )
163