xref: /aosp_15_r20/build/bazel/rules/cc/cc_object_test.bzl (revision 7594170e27e0732bc44b93d1440d87a54b6ffe7c)
1*7594170eSAndroid Build Coastguard Worker# Copyright (C) 2023 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("@bazel_skylib//lib:unittest.bzl", "analysistest", "asserts")
16*7594170eSAndroid Build Coastguard Workerload(":cc_object.bzl", "cc_object")
17*7594170eSAndroid Build Coastguard Worker
18*7594170eSAndroid Build Coastguard Workerdef _min_sdk_version_target_flag_test_impl(ctx):
19*7594170eSAndroid Build Coastguard Worker    env = analysistest.begin(ctx)
20*7594170eSAndroid Build Coastguard Worker    actions = analysistest.target_actions(env)
21*7594170eSAndroid Build Coastguard Worker    cpp_link_actions = [a for a in actions if a.mnemonic == "CppLink"]
22*7594170eSAndroid Build Coastguard Worker
23*7594170eSAndroid Build Coastguard Worker    found = False
24*7594170eSAndroid Build Coastguard Worker    for action in cpp_link_actions:
25*7594170eSAndroid Build Coastguard Worker        for arg in action.argv:
26*7594170eSAndroid Build Coastguard Worker            if arg.startswith("--target="):
27*7594170eSAndroid Build Coastguard Worker                found = True
28*7594170eSAndroid Build Coastguard Worker                asserts.true(
29*7594170eSAndroid Build Coastguard Worker                    env,
30*7594170eSAndroid Build Coastguard Worker                    arg.endswith(ctx.attr.expected_min_sdk_version),
31*7594170eSAndroid Build Coastguard Worker                    "Incorrect --target flag %s. Expected sdk_version %s" % (arg, ctx.attr.expected_min_sdk_version),
32*7594170eSAndroid Build Coastguard Worker                )
33*7594170eSAndroid Build Coastguard Worker    asserts.true(
34*7594170eSAndroid Build Coastguard Worker        env,
35*7594170eSAndroid Build Coastguard Worker        found,
36*7594170eSAndroid Build Coastguard Worker        "No --target flag found in CppLink actions: %s" % (
37*7594170eSAndroid Build Coastguard Worker            [a.argv for a in cpp_link_actions],
38*7594170eSAndroid Build Coastguard Worker        ),
39*7594170eSAndroid Build Coastguard Worker    )
40*7594170eSAndroid Build Coastguard Worker
41*7594170eSAndroid Build Coastguard Worker    return analysistest.end(env)
42*7594170eSAndroid Build Coastguard Worker
43*7594170eSAndroid Build Coastguard Workerdef _create_min_sdk_version_target_flag_test(config_settings = {}):
44*7594170eSAndroid Build Coastguard Worker    return analysistest.make(
45*7594170eSAndroid Build Coastguard Worker        _min_sdk_version_target_flag_test_impl,
46*7594170eSAndroid Build Coastguard Worker        attrs = {
47*7594170eSAndroid Build Coastguard Worker            "expected_min_sdk_version": attr.string(mandatory = True),
48*7594170eSAndroid Build Coastguard Worker        },
49*7594170eSAndroid Build Coastguard Worker        config_settings = config_settings,
50*7594170eSAndroid Build Coastguard Worker    )
51*7594170eSAndroid Build Coastguard Worker
52*7594170eSAndroid Build Coastguard Worker_min_sdk_version_target_flag_test = _create_min_sdk_version_target_flag_test()
53*7594170eSAndroid Build Coastguard Worker
54*7594170eSAndroid Build Coastguard Worker_apex_min_sdk_version = "25"
55*7594170eSAndroid Build Coastguard Worker
56*7594170eSAndroid Build Coastguard Worker_min_sdk_version_target_flag_with_apex_test = _create_min_sdk_version_target_flag_test({
57*7594170eSAndroid Build Coastguard Worker    "@//build/bazel/rules/apex:min_sdk_version": _apex_min_sdk_version,
58*7594170eSAndroid Build Coastguard Worker})
59*7594170eSAndroid Build Coastguard Worker
60*7594170eSAndroid Build Coastguard Workerdef _crt_cc_object_min_sdk_version_overriden_by_apex_min_sdk_version():
61*7594170eSAndroid Build Coastguard Worker    name = "crt_cc_object_min_sdk_version_overriden_by_apex_min_sdk_version"
62*7594170eSAndroid Build Coastguard Worker    test_name = name + "_test"
63*7594170eSAndroid Build Coastguard Worker    crt_apex_test_name = test_name + "_crt_apex"
64*7594170eSAndroid Build Coastguard Worker    not_crt_apex_test_name = test_name + "_not_crt_apex"
65*7594170eSAndroid Build Coastguard Worker    crt_not_apex_test_name = test_name + "_crt_not_apex"
66*7594170eSAndroid Build Coastguard Worker    not_crt_not_apex_test_name = test_name + "_not_crt_not_apex"
67*7594170eSAndroid Build Coastguard Worker    crt_obj_name = name + "_crt"
68*7594170eSAndroid Build Coastguard Worker    not_crt_obj_name = name + "_not_crt"
69*7594170eSAndroid Build Coastguard Worker    obj_dep_name = name + "_dep"
70*7594170eSAndroid Build Coastguard Worker    obj_min_sdk_version = "16"
71*7594170eSAndroid Build Coastguard Worker
72*7594170eSAndroid Build Coastguard Worker    cc_object(
73*7594170eSAndroid Build Coastguard Worker        name = obj_dep_name,
74*7594170eSAndroid Build Coastguard Worker        srcs = ["a.cc"],
75*7594170eSAndroid Build Coastguard Worker        tags = ["manual"],
76*7594170eSAndroid Build Coastguard Worker    )
77*7594170eSAndroid Build Coastguard Worker    cc_object(
78*7594170eSAndroid Build Coastguard Worker        name = crt_obj_name,
79*7594170eSAndroid Build Coastguard Worker        crt = True,
80*7594170eSAndroid Build Coastguard Worker        objs = [obj_dep_name],
81*7594170eSAndroid Build Coastguard Worker        srcs = ["a.cc"],
82*7594170eSAndroid Build Coastguard Worker        min_sdk_version = obj_min_sdk_version,
83*7594170eSAndroid Build Coastguard Worker        tags = ["manual"],
84*7594170eSAndroid Build Coastguard Worker    )
85*7594170eSAndroid Build Coastguard Worker    cc_object(
86*7594170eSAndroid Build Coastguard Worker        name = not_crt_obj_name,
87*7594170eSAndroid Build Coastguard Worker        objs = [obj_dep_name],
88*7594170eSAndroid Build Coastguard Worker        srcs = ["a.cc"],
89*7594170eSAndroid Build Coastguard Worker        min_sdk_version = obj_min_sdk_version,
90*7594170eSAndroid Build Coastguard Worker        tags = ["manual"],
91*7594170eSAndroid Build Coastguard Worker    )
92*7594170eSAndroid Build Coastguard Worker    _min_sdk_version_target_flag_with_apex_test(
93*7594170eSAndroid Build Coastguard Worker        name = crt_apex_test_name,
94*7594170eSAndroid Build Coastguard Worker        target_under_test = crt_obj_name,
95*7594170eSAndroid Build Coastguard Worker        expected_min_sdk_version = _apex_min_sdk_version,
96*7594170eSAndroid Build Coastguard Worker        target_compatible_with = ["@//build/bazel_common_rules/platforms/os:android"],
97*7594170eSAndroid Build Coastguard Worker    )
98*7594170eSAndroid Build Coastguard Worker    _min_sdk_version_target_flag_with_apex_test(
99*7594170eSAndroid Build Coastguard Worker        name = not_crt_apex_test_name,
100*7594170eSAndroid Build Coastguard Worker        target_under_test = not_crt_obj_name,
101*7594170eSAndroid Build Coastguard Worker        expected_min_sdk_version = obj_min_sdk_version,
102*7594170eSAndroid Build Coastguard Worker        target_compatible_with = ["@//build/bazel_common_rules/platforms/os:android"],
103*7594170eSAndroid Build Coastguard Worker    )
104*7594170eSAndroid Build Coastguard Worker    _min_sdk_version_target_flag_test(
105*7594170eSAndroid Build Coastguard Worker        name = crt_not_apex_test_name,
106*7594170eSAndroid Build Coastguard Worker        target_under_test = crt_obj_name,
107*7594170eSAndroid Build Coastguard Worker        expected_min_sdk_version = obj_min_sdk_version,
108*7594170eSAndroid Build Coastguard Worker        target_compatible_with = ["@//build/bazel_common_rules/platforms/os:android"],
109*7594170eSAndroid Build Coastguard Worker    )
110*7594170eSAndroid Build Coastguard Worker    _min_sdk_version_target_flag_test(
111*7594170eSAndroid Build Coastguard Worker        name = not_crt_not_apex_test_name,
112*7594170eSAndroid Build Coastguard Worker        target_under_test = not_crt_obj_name,
113*7594170eSAndroid Build Coastguard Worker        expected_min_sdk_version = obj_min_sdk_version,
114*7594170eSAndroid Build Coastguard Worker        target_compatible_with = ["@//build/bazel_common_rules/platforms/os:android"],
115*7594170eSAndroid Build Coastguard Worker    )
116*7594170eSAndroid Build Coastguard Worker
117*7594170eSAndroid Build Coastguard Worker    return [
118*7594170eSAndroid Build Coastguard Worker        crt_apex_test_name,
119*7594170eSAndroid Build Coastguard Worker        not_crt_apex_test_name,
120*7594170eSAndroid Build Coastguard Worker        crt_not_apex_test_name,
121*7594170eSAndroid Build Coastguard Worker        not_crt_not_apex_test_name,
122*7594170eSAndroid Build Coastguard Worker    ]
123*7594170eSAndroid Build Coastguard Worker
124*7594170eSAndroid Build Coastguard Workerdef _cc_object_partial_linking_test_impl(ctx):
125*7594170eSAndroid Build Coastguard Worker    env = analysistest.begin(ctx)
126*7594170eSAndroid Build Coastguard Worker    actions = analysistest.target_actions(env)
127*7594170eSAndroid Build Coastguard Worker    cpp_link_actions = [a for a in actions if a.mnemonic == "CppLink"]
128*7594170eSAndroid Build Coastguard Worker    noaddrsig_actions = [a for a in actions if a.mnemonic == "CppObjcopyNoAddrsig"]
129*7594170eSAndroid Build Coastguard Worker    asserts.true(
130*7594170eSAndroid Build Coastguard Worker        env,
131*7594170eSAndroid Build Coastguard Worker        len(cpp_link_actions) > 0,
132*7594170eSAndroid Build Coastguard Worker        "No CppLink actions found in : %s" % (
133*7594170eSAndroid Build Coastguard Worker            [a.mnemonic for a in actions],
134*7594170eSAndroid Build Coastguard Worker        ),
135*7594170eSAndroid Build Coastguard Worker    )
136*7594170eSAndroid Build Coastguard Worker
137*7594170eSAndroid Build Coastguard Worker    # Verify multiple objects results in a partial link command line
138*7594170eSAndroid Build Coastguard Worker    asserts.true(
139*7594170eSAndroid Build Coastguard Worker        env,
140*7594170eSAndroid Build Coastguard Worker        " ".join(cpp_link_actions[0].argv).find(" -Wl,-r ") != -1,
141*7594170eSAndroid Build Coastguard Worker        "CppLink action missing -r : %s" % (
142*7594170eSAndroid Build Coastguard Worker            cpp_link_actions[0].argv
143*7594170eSAndroid Build Coastguard Worker        ),
144*7594170eSAndroid Build Coastguard Worker    )
145*7594170eSAndroid Build Coastguard Worker
146*7594170eSAndroid Build Coastguard Worker    # Verify partial linking also triggers CppObjcopyNoAddrsig
147*7594170eSAndroid Build Coastguard Worker    asserts.true(
148*7594170eSAndroid Build Coastguard Worker        env,
149*7594170eSAndroid Build Coastguard Worker        len(noaddrsig_actions) > 0,
150*7594170eSAndroid Build Coastguard Worker        "No CppObjcopyNoAddrsig actions found in : %s" % (
151*7594170eSAndroid Build Coastguard Worker            actions,
152*7594170eSAndroid Build Coastguard Worker        ),
153*7594170eSAndroid Build Coastguard Worker    )
154*7594170eSAndroid Build Coastguard Worker
155*7594170eSAndroid Build Coastguard Worker    return analysistest.end(env)
156*7594170eSAndroid Build Coastguard Worker
157*7594170eSAndroid Build Coastguard Worker_cc_object_partial_linking_test = analysistest.make(
158*7594170eSAndroid Build Coastguard Worker    _cc_object_partial_linking_test_impl,
159*7594170eSAndroid Build Coastguard Worker    attrs = {
160*7594170eSAndroid Build Coastguard Worker    },
161*7594170eSAndroid Build Coastguard Worker)
162*7594170eSAndroid Build Coastguard Worker
163*7594170eSAndroid Build Coastguard Workerdef _cc_object_partial_linking():
164*7594170eSAndroid Build Coastguard Worker    name = "cc_object_partial_linking"
165*7594170eSAndroid Build Coastguard Worker    test_name = name + "_test"
166*7594170eSAndroid Build Coastguard Worker
167*7594170eSAndroid Build Coastguard Worker    dep1_name = name + "_dep1"
168*7594170eSAndroid Build Coastguard Worker    dep2_name = name + "_dep2"
169*7594170eSAndroid Build Coastguard Worker
170*7594170eSAndroid Build Coastguard Worker    cc_object(
171*7594170eSAndroid Build Coastguard Worker        name = dep1_name,
172*7594170eSAndroid Build Coastguard Worker        srcs = ["a.cc"],
173*7594170eSAndroid Build Coastguard Worker        tags = ["manual"],
174*7594170eSAndroid Build Coastguard Worker    )
175*7594170eSAndroid Build Coastguard Worker    cc_object(
176*7594170eSAndroid Build Coastguard Worker        name = dep2_name,
177*7594170eSAndroid Build Coastguard Worker        srcs = ["b.cc"],
178*7594170eSAndroid Build Coastguard Worker        tags = ["manual"],
179*7594170eSAndroid Build Coastguard Worker    )
180*7594170eSAndroid Build Coastguard Worker    cc_object(
181*7594170eSAndroid Build Coastguard Worker        name = name,
182*7594170eSAndroid Build Coastguard Worker        objs = [dep1_name, dep2_name],
183*7594170eSAndroid Build Coastguard Worker        tags = ["manual"],
184*7594170eSAndroid Build Coastguard Worker    )
185*7594170eSAndroid Build Coastguard Worker
186*7594170eSAndroid Build Coastguard Worker    _cc_object_partial_linking_test(
187*7594170eSAndroid Build Coastguard Worker        name = test_name,
188*7594170eSAndroid Build Coastguard Worker        target_under_test = name,
189*7594170eSAndroid Build Coastguard Worker        target_compatible_with = ["@//build/bazel_common_rules/platforms/os:android"],
190*7594170eSAndroid Build Coastguard Worker    )
191*7594170eSAndroid Build Coastguard Worker
192*7594170eSAndroid Build Coastguard Worker    return test_name
193*7594170eSAndroid Build Coastguard Worker
194*7594170eSAndroid Build Coastguard Workerdef cc_object_test_suite(name):
195*7594170eSAndroid Build Coastguard Worker    native.test_suite(
196*7594170eSAndroid Build Coastguard Worker        name = name,
197*7594170eSAndroid Build Coastguard Worker        tests = _crt_cc_object_min_sdk_version_overriden_by_apex_min_sdk_version() + [
198*7594170eSAndroid Build Coastguard Worker            _cc_object_partial_linking(),
199*7594170eSAndroid Build Coastguard Worker        ],
200*7594170eSAndroid Build Coastguard Worker    )
201