xref: /aosp_15_r20/build/bazel/rules/cc/versioned_cc_common.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 Worker"""A macro to handle build number stamping."""
16*7594170eSAndroid Build Coastguard Worker
17*7594170eSAndroid Build Coastguard Workerdef stamp_build_number(ctx, prefix = "", extension = ""):
18*7594170eSAndroid Build Coastguard Worker    if len(ctx.files.src) != 1:
19*7594170eSAndroid Build Coastguard Worker        fail("Expected only one input file for build number stamping")
20*7594170eSAndroid Build Coastguard Worker
21*7594170eSAndroid Build Coastguard Worker    out_file = ctx.actions.declare_file(prefix + ctx.attr.name + extension)
22*7594170eSAndroid Build Coastguard Worker    android_constraint = ctx.attr._android_constraint[platform_common.ConstraintValueInfo]
23*7594170eSAndroid Build Coastguard Worker
24*7594170eSAndroid Build Coastguard Worker    # TODO(b/228461735): We need to dist the output for device target.
25*7594170eSAndroid Build Coastguard Worker    if ctx.target_platform_has_constraint(android_constraint) or not ctx.attr.stamp_build_number:
26*7594170eSAndroid Build Coastguard Worker        ctx.actions.symlink(
27*7594170eSAndroid Build Coastguard Worker            output = out_file,
28*7594170eSAndroid Build Coastguard Worker            target_file = ctx.files.src[0],
29*7594170eSAndroid Build Coastguard Worker        )
30*7594170eSAndroid Build Coastguard Worker        return out_file
31*7594170eSAndroid Build Coastguard Worker
32*7594170eSAndroid Build Coastguard Worker    ctx.actions.run_shell(
33*7594170eSAndroid Build Coastguard Worker        inputs = ctx.files.src + [ctx.version_file],
34*7594170eSAndroid Build Coastguard Worker        outputs = [out_file],
35*7594170eSAndroid Build Coastguard Worker        command = """
36*7594170eSAndroid Build Coastguard Worker            build_number=$(cat {file} | grep "BUILD_NUMBER" | cut -f2 -d' ');
37*7594170eSAndroid Build Coastguard Worker            {build_number_stamper} -i {input} -o {output} -s soong_build_number -v $build_number
38*7594170eSAndroid Build Coastguard Worker        """.format(
39*7594170eSAndroid Build Coastguard Worker            file = ctx.version_file.path,
40*7594170eSAndroid Build Coastguard Worker            input = ctx.files.src[0].path,
41*7594170eSAndroid Build Coastguard Worker            output = out_file.path,
42*7594170eSAndroid Build Coastguard Worker            build_number_stamper = ctx.executable._build_number_stamper.path,
43*7594170eSAndroid Build Coastguard Worker        ),
44*7594170eSAndroid Build Coastguard Worker        tools = [ctx.executable._build_number_stamper],
45*7594170eSAndroid Build Coastguard Worker        mnemonic = "StampBuildNumber",
46*7594170eSAndroid Build Coastguard Worker    )
47*7594170eSAndroid Build Coastguard Worker
48*7594170eSAndroid Build Coastguard Worker    return out_file
49*7594170eSAndroid Build Coastguard Worker
50*7594170eSAndroid Build Coastguard Workercommon_attrs = {
51*7594170eSAndroid Build Coastguard Worker    "stamp_build_number": attr.bool(
52*7594170eSAndroid Build Coastguard Worker        default = False,
53*7594170eSAndroid Build Coastguard Worker        doc = "Whether to stamp the build number",
54*7594170eSAndroid Build Coastguard Worker    ),
55*7594170eSAndroid Build Coastguard Worker    "_build_number_stamper": attr.label(
56*7594170eSAndroid Build Coastguard Worker        cfg = "exec",
57*7594170eSAndroid Build Coastguard Worker        doc = "The build number stamp tool.",
58*7594170eSAndroid Build Coastguard Worker        executable = True,
59*7594170eSAndroid Build Coastguard Worker        default = "//build/soong/symbol_inject/cmd:symbol_inject",
60*7594170eSAndroid Build Coastguard Worker        allow_single_file = True,
61*7594170eSAndroid Build Coastguard Worker    ),
62*7594170eSAndroid Build Coastguard Worker    "_android_constraint": attr.label(
63*7594170eSAndroid Build Coastguard Worker        default = Label("//build/bazel_common_rules/platforms/os:android"),
64*7594170eSAndroid Build Coastguard Worker    ),
65*7594170eSAndroid Build Coastguard Worker}
66*7594170eSAndroid Build Coastguard Worker
67*7594170eSAndroid Build Coastguard Workerdef _versioned_binary_impl(ctx):
68*7594170eSAndroid Build Coastguard Worker    common_providers = [
69*7594170eSAndroid Build Coastguard Worker        ctx.attr.src[CcInfo],
70*7594170eSAndroid Build Coastguard Worker        ctx.attr.src[InstrumentedFilesInfo],
71*7594170eSAndroid Build Coastguard Worker        ctx.attr.src[DebugPackageInfo],
72*7594170eSAndroid Build Coastguard Worker        ctx.attr.src[OutputGroupInfo],
73*7594170eSAndroid Build Coastguard Worker    ]
74*7594170eSAndroid Build Coastguard Worker
75*7594170eSAndroid Build Coastguard Worker    out_file = stamp_build_number(ctx)
76*7594170eSAndroid Build Coastguard Worker
77*7594170eSAndroid Build Coastguard Worker    return [
78*7594170eSAndroid Build Coastguard Worker        DefaultInfo(
79*7594170eSAndroid Build Coastguard Worker            files = depset([out_file]),
80*7594170eSAndroid Build Coastguard Worker            executable = out_file,
81*7594170eSAndroid Build Coastguard Worker            runfiles = ctx.attr.src[DefaultInfo].default_runfiles,
82*7594170eSAndroid Build Coastguard Worker        ),
83*7594170eSAndroid Build Coastguard Worker    ] + common_providers
84*7594170eSAndroid Build Coastguard Worker
85*7594170eSAndroid Build Coastguard Workerversioned_binary = rule(
86*7594170eSAndroid Build Coastguard Worker    implementation = _versioned_binary_impl,
87*7594170eSAndroid Build Coastguard Worker    attrs = dict(
88*7594170eSAndroid Build Coastguard Worker        common_attrs,
89*7594170eSAndroid Build Coastguard Worker        src = attr.label(mandatory = True, allow_single_file = True, providers = [CcInfo]),
90*7594170eSAndroid Build Coastguard Worker    ),
91*7594170eSAndroid Build Coastguard Worker)
92*7594170eSAndroid Build Coastguard Worker
93*7594170eSAndroid Build Coastguard Workerdef _versioned_shared_library_impl(ctx):
94*7594170eSAndroid Build Coastguard Worker    out_file = stamp_build_number(ctx, "lib", ".so")
95*7594170eSAndroid Build Coastguard Worker
96*7594170eSAndroid Build Coastguard Worker    return [
97*7594170eSAndroid Build Coastguard Worker        DefaultInfo(files = depset([out_file])),
98*7594170eSAndroid Build Coastguard Worker        ctx.attr.src[CcSharedLibraryInfo],
99*7594170eSAndroid Build Coastguard Worker        ctx.attr.src[OutputGroupInfo],
100*7594170eSAndroid Build Coastguard Worker    ]
101*7594170eSAndroid Build Coastguard Worker
102*7594170eSAndroid Build Coastguard Workerversioned_shared_library = rule(
103*7594170eSAndroid Build Coastguard Worker    implementation = _versioned_shared_library_impl,
104*7594170eSAndroid Build Coastguard Worker    attrs = dict(
105*7594170eSAndroid Build Coastguard Worker        common_attrs,
106*7594170eSAndroid Build Coastguard Worker        src = attr.label(
107*7594170eSAndroid Build Coastguard Worker            mandatory = True,
108*7594170eSAndroid Build Coastguard Worker            providers = [CcSharedLibraryInfo],
109*7594170eSAndroid Build Coastguard Worker        ),
110*7594170eSAndroid Build Coastguard Worker    ),
111*7594170eSAndroid Build Coastguard Worker)
112