1*333d2b36SAndroid Build Coastguard Worker// Copyright (C) 2022 The Android Open Source Project 2*333d2b36SAndroid Build Coastguard Worker// 3*333d2b36SAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License"); 4*333d2b36SAndroid Build Coastguard Worker// you may not use this file except in compliance with the License. 5*333d2b36SAndroid Build Coastguard Worker// You may obtain a copy of the License at 6*333d2b36SAndroid Build Coastguard Worker// 7*333d2b36SAndroid Build Coastguard Worker// http://www.apache.org/licenses/LICENSE-2.0 8*333d2b36SAndroid Build Coastguard Worker// 9*333d2b36SAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software 10*333d2b36SAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS, 11*333d2b36SAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*333d2b36SAndroid Build Coastguard Worker// See the License for the specific language governing permissions and 13*333d2b36SAndroid Build Coastguard Worker// limitations under the License. 14*333d2b36SAndroid Build Coastguard Worker 15*333d2b36SAndroid Build Coastguard Workerpackage filesystem 16*333d2b36SAndroid Build Coastguard Worker 17*333d2b36SAndroid Build Coastguard Workerimport ( 18*333d2b36SAndroid Build Coastguard Worker "github.com/google/blueprint" 19*333d2b36SAndroid Build Coastguard Worker "github.com/google/blueprint/proptools" 20*333d2b36SAndroid Build Coastguard Worker 21*333d2b36SAndroid Build Coastguard Worker "android/soong/android" 22*333d2b36SAndroid Build Coastguard Worker) 23*333d2b36SAndroid Build Coastguard Worker 24*333d2b36SAndroid Build Coastguard Workervar ( 25*333d2b36SAndroid Build Coastguard Worker toRawBinary = pctx.AndroidStaticRule("toRawBinary", 26*333d2b36SAndroid Build Coastguard Worker blueprint.RuleParams{ 27*333d2b36SAndroid Build Coastguard Worker Command: "${objcopy} --output-target=binary ${in} ${out} &&" + 28*333d2b36SAndroid Build Coastguard Worker "chmod -x ${out}", 29*333d2b36SAndroid Build Coastguard Worker CommandDeps: []string{"$objcopy"}, 30*333d2b36SAndroid Build Coastguard Worker }, 31*333d2b36SAndroid Build Coastguard Worker "objcopy") 32*333d2b36SAndroid Build Coastguard Worker) 33*333d2b36SAndroid Build Coastguard Worker 34*333d2b36SAndroid Build Coastguard Workerfunc init() { 35*333d2b36SAndroid Build Coastguard Worker pctx.Import("android/soong/cc/config") 36*333d2b36SAndroid Build Coastguard Worker 37*333d2b36SAndroid Build Coastguard Worker android.RegisterModuleType("raw_binary", rawBinaryFactory) 38*333d2b36SAndroid Build Coastguard Worker} 39*333d2b36SAndroid Build Coastguard Worker 40*333d2b36SAndroid Build Coastguard Workertype rawBinary struct { 41*333d2b36SAndroid Build Coastguard Worker android.ModuleBase 42*333d2b36SAndroid Build Coastguard Worker 43*333d2b36SAndroid Build Coastguard Worker properties rawBinaryProperties 44*333d2b36SAndroid Build Coastguard Worker 45*333d2b36SAndroid Build Coastguard Worker output android.Path 46*333d2b36SAndroid Build Coastguard Worker installDir android.InstallPath 47*333d2b36SAndroid Build Coastguard Worker} 48*333d2b36SAndroid Build Coastguard Worker 49*333d2b36SAndroid Build Coastguard Workertype rawBinaryProperties struct { 50*333d2b36SAndroid Build Coastguard Worker // Set the name of the output. Defaults to <module_name>.bin. 51*333d2b36SAndroid Build Coastguard Worker Stem *string 52*333d2b36SAndroid Build Coastguard Worker 53*333d2b36SAndroid Build Coastguard Worker // Name of input executable. Can be a name of a target. 54*333d2b36SAndroid Build Coastguard Worker Src *string `android:"path,arch_variant"` 55*333d2b36SAndroid Build Coastguard Worker} 56*333d2b36SAndroid Build Coastguard Worker 57*333d2b36SAndroid Build Coastguard Workerfunc rawBinaryFactory() android.Module { 58*333d2b36SAndroid Build Coastguard Worker module := &rawBinary{} 59*333d2b36SAndroid Build Coastguard Worker module.AddProperties(&module.properties) 60*333d2b36SAndroid Build Coastguard Worker android.InitAndroidArchModule(module, android.DeviceSupported, android.MultilibFirst) 61*333d2b36SAndroid Build Coastguard Worker return module 62*333d2b36SAndroid Build Coastguard Worker} 63*333d2b36SAndroid Build Coastguard Worker 64*333d2b36SAndroid Build Coastguard Workerfunc (r *rawBinary) DepsMutator(ctx android.BottomUpMutatorContext) { 65*333d2b36SAndroid Build Coastguard Worker // do nothing 66*333d2b36SAndroid Build Coastguard Worker} 67*333d2b36SAndroid Build Coastguard Worker 68*333d2b36SAndroid Build Coastguard Workerfunc (r *rawBinary) installFileName() string { 69*333d2b36SAndroid Build Coastguard Worker return proptools.StringDefault(r.properties.Stem, r.BaseModuleName()+".bin") 70*333d2b36SAndroid Build Coastguard Worker} 71*333d2b36SAndroid Build Coastguard Worker 72*333d2b36SAndroid Build Coastguard Workerfunc (r *rawBinary) GenerateAndroidBuildActions(ctx android.ModuleContext) { 73*333d2b36SAndroid Build Coastguard Worker inputFile := android.PathForModuleSrc(ctx, proptools.String(r.properties.Src)) 74*333d2b36SAndroid Build Coastguard Worker outputFile := android.PathForModuleOut(ctx, r.installFileName()) 75*333d2b36SAndroid Build Coastguard Worker 76*333d2b36SAndroid Build Coastguard Worker ctx.Build(pctx, android.BuildParams{ 77*333d2b36SAndroid Build Coastguard Worker Rule: toRawBinary, 78*333d2b36SAndroid Build Coastguard Worker Description: "raw binary " + outputFile.Base(), 79*333d2b36SAndroid Build Coastguard Worker Output: outputFile, 80*333d2b36SAndroid Build Coastguard Worker Input: inputFile, 81*333d2b36SAndroid Build Coastguard Worker Args: map[string]string{ 82*333d2b36SAndroid Build Coastguard Worker "objcopy": "${config.ClangBin}/llvm-objcopy", 83*333d2b36SAndroid Build Coastguard Worker }, 84*333d2b36SAndroid Build Coastguard Worker }) 85*333d2b36SAndroid Build Coastguard Worker 86*333d2b36SAndroid Build Coastguard Worker r.installDir = android.PathForModuleInstall(ctx, "etc") 87*333d2b36SAndroid Build Coastguard Worker ctx.InstallFile(r.installDir, r.installFileName(), outputFile) 88*333d2b36SAndroid Build Coastguard Worker 89*333d2b36SAndroid Build Coastguard Worker ctx.SetOutputFiles([]android.Path{outputFile}, "") 90*333d2b36SAndroid Build Coastguard Worker r.output = outputFile 91*333d2b36SAndroid Build Coastguard Worker} 92*333d2b36SAndroid Build Coastguard Worker 93*333d2b36SAndroid Build Coastguard Workervar _ android.AndroidMkEntriesProvider = (*rawBinary)(nil) 94*333d2b36SAndroid Build Coastguard Worker 95*333d2b36SAndroid Build Coastguard Worker// Implements android.AndroidMkEntriesProvider 96*333d2b36SAndroid Build Coastguard Workerfunc (r *rawBinary) AndroidMkEntries() []android.AndroidMkEntries { 97*333d2b36SAndroid Build Coastguard Worker return []android.AndroidMkEntries{{ 98*333d2b36SAndroid Build Coastguard Worker Class: "ETC", 99*333d2b36SAndroid Build Coastguard Worker OutputFile: android.OptionalPathForPath(r.output), 100*333d2b36SAndroid Build Coastguard Worker }} 101*333d2b36SAndroid Build Coastguard Worker} 102*333d2b36SAndroid Build Coastguard Worker 103*333d2b36SAndroid Build Coastguard Workervar _ Filesystem = (*rawBinary)(nil) 104*333d2b36SAndroid Build Coastguard Worker 105*333d2b36SAndroid Build Coastguard Workerfunc (r *rawBinary) OutputPath() android.Path { 106*333d2b36SAndroid Build Coastguard Worker return r.output 107*333d2b36SAndroid Build Coastguard Worker} 108*333d2b36SAndroid Build Coastguard Worker 109*333d2b36SAndroid Build Coastguard Workerfunc (r *rawBinary) SignedOutputPath() android.Path { 110*333d2b36SAndroid Build Coastguard Worker return nil 111*333d2b36SAndroid Build Coastguard Worker} 112