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