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