1*333d2b36SAndroid Build Coastguard Worker// Copyright (C) 2021 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 kernel 16*333d2b36SAndroid Build Coastguard Worker 17*333d2b36SAndroid Build Coastguard Workerimport ( 18*333d2b36SAndroid Build Coastguard Worker "fmt" 19*333d2b36SAndroid Build Coastguard Worker "path/filepath" 20*333d2b36SAndroid Build Coastguard Worker "strings" 21*333d2b36SAndroid Build Coastguard Worker 22*333d2b36SAndroid Build Coastguard Worker "android/soong/android" 23*333d2b36SAndroid Build Coastguard Worker _ "android/soong/cc/config" 24*333d2b36SAndroid Build Coastguard Worker 25*333d2b36SAndroid Build Coastguard Worker "github.com/google/blueprint" 26*333d2b36SAndroid Build Coastguard Worker "github.com/google/blueprint/proptools" 27*333d2b36SAndroid Build Coastguard Worker) 28*333d2b36SAndroid Build Coastguard Worker 29*333d2b36SAndroid Build Coastguard Workerfunc init() { 30*333d2b36SAndroid Build Coastguard Worker pctx.Import("android/soong/cc/config") 31*333d2b36SAndroid Build Coastguard Worker registerKernelBuildComponents(android.InitRegistrationContext) 32*333d2b36SAndroid Build Coastguard Worker} 33*333d2b36SAndroid Build Coastguard Worker 34*333d2b36SAndroid Build Coastguard Workerfunc registerKernelBuildComponents(ctx android.RegistrationContext) { 35*333d2b36SAndroid Build Coastguard Worker ctx.RegisterModuleType("prebuilt_kernel_modules", PrebuiltKernelModulesFactory) 36*333d2b36SAndroid Build Coastguard Worker} 37*333d2b36SAndroid Build Coastguard Worker 38*333d2b36SAndroid Build Coastguard Workertype prebuiltKernelModules struct { 39*333d2b36SAndroid Build Coastguard Worker android.ModuleBase 40*333d2b36SAndroid Build Coastguard Worker 41*333d2b36SAndroid Build Coastguard Worker properties prebuiltKernelModulesProperties 42*333d2b36SAndroid Build Coastguard Worker 43*333d2b36SAndroid Build Coastguard Worker installDir android.InstallPath 44*333d2b36SAndroid Build Coastguard Worker} 45*333d2b36SAndroid Build Coastguard Worker 46*333d2b36SAndroid Build Coastguard Workertype prebuiltKernelModulesProperties struct { 47*333d2b36SAndroid Build Coastguard Worker // List or filegroup of prebuilt kernel module files. Should have .ko suffix. 48*333d2b36SAndroid Build Coastguard Worker Srcs []string `android:"path,arch_variant"` 49*333d2b36SAndroid Build Coastguard Worker 50*333d2b36SAndroid Build Coastguard Worker // List of system_dlkm kernel modules that the local kernel modules depend on. 51*333d2b36SAndroid Build Coastguard Worker // The deps will be assembled into intermediates directory for running depmod 52*333d2b36SAndroid Build Coastguard Worker // but will not be added to the current module's installed files. 53*333d2b36SAndroid Build Coastguard Worker System_deps []string `android:"path,arch_variant"` 54*333d2b36SAndroid Build Coastguard Worker 55*333d2b36SAndroid Build Coastguard Worker // If false, then srcs will not be included in modules.load. 56*333d2b36SAndroid Build Coastguard Worker // This feature is used by system_dlkm 57*333d2b36SAndroid Build Coastguard Worker Load_by_default *bool 58*333d2b36SAndroid Build Coastguard Worker 59*333d2b36SAndroid Build Coastguard Worker Blocklist_file *string `android:"path"` 60*333d2b36SAndroid Build Coastguard Worker 61*333d2b36SAndroid Build Coastguard Worker // Path to the kernel module options file 62*333d2b36SAndroid Build Coastguard Worker Options_file *string `android:"path"` 63*333d2b36SAndroid Build Coastguard Worker 64*333d2b36SAndroid Build Coastguard Worker // Kernel version that these modules are for. Kernel modules are installed to 65*333d2b36SAndroid Build Coastguard Worker // /lib/modules/<kernel_version> directory in the corresponding partition. Default is "". 66*333d2b36SAndroid Build Coastguard Worker Kernel_version *string 67*333d2b36SAndroid Build Coastguard Worker 68*333d2b36SAndroid Build Coastguard Worker // Whether this module is directly installable to one of the partitions. Default is true 69*333d2b36SAndroid Build Coastguard Worker Installable *bool 70*333d2b36SAndroid Build Coastguard Worker} 71*333d2b36SAndroid Build Coastguard Worker 72*333d2b36SAndroid Build Coastguard Worker// prebuilt_kernel_modules installs a set of prebuilt kernel module files to the correct directory. 73*333d2b36SAndroid Build Coastguard Worker// In addition, this module builds modules.load, modules.dep, modules.softdep and modules.alias 74*333d2b36SAndroid Build Coastguard Worker// using depmod and installs them as well. 75*333d2b36SAndroid Build Coastguard Workerfunc PrebuiltKernelModulesFactory() android.Module { 76*333d2b36SAndroid Build Coastguard Worker module := &prebuiltKernelModules{} 77*333d2b36SAndroid Build Coastguard Worker module.AddProperties(&module.properties) 78*333d2b36SAndroid Build Coastguard Worker android.InitAndroidArchModule(module, android.DeviceSupported, android.MultilibFirst) 79*333d2b36SAndroid Build Coastguard Worker return module 80*333d2b36SAndroid Build Coastguard Worker} 81*333d2b36SAndroid Build Coastguard Worker 82*333d2b36SAndroid Build Coastguard Workerfunc (pkm *prebuiltKernelModules) installable() bool { 83*333d2b36SAndroid Build Coastguard Worker return proptools.BoolDefault(pkm.properties.Installable, true) 84*333d2b36SAndroid Build Coastguard Worker} 85*333d2b36SAndroid Build Coastguard Worker 86*333d2b36SAndroid Build Coastguard Workerfunc (pkm *prebuiltKernelModules) KernelVersion() string { 87*333d2b36SAndroid Build Coastguard Worker return proptools.StringDefault(pkm.properties.Kernel_version, "") 88*333d2b36SAndroid Build Coastguard Worker} 89*333d2b36SAndroid Build Coastguard Worker 90*333d2b36SAndroid Build Coastguard Workerfunc (pkm *prebuiltKernelModules) DepsMutator(ctx android.BottomUpMutatorContext) { 91*333d2b36SAndroid Build Coastguard Worker // do nothing 92*333d2b36SAndroid Build Coastguard Worker} 93*333d2b36SAndroid Build Coastguard Worker 94*333d2b36SAndroid Build Coastguard Workerfunc (pkm *prebuiltKernelModules) GenerateAndroidBuildActions(ctx android.ModuleContext) { 95*333d2b36SAndroid Build Coastguard Worker if !pkm.installable() { 96*333d2b36SAndroid Build Coastguard Worker pkm.SkipInstall() 97*333d2b36SAndroid Build Coastguard Worker } 98*333d2b36SAndroid Build Coastguard Worker 99*333d2b36SAndroid Build Coastguard Worker modules := android.PathsForModuleSrc(ctx, pkm.properties.Srcs) 100*333d2b36SAndroid Build Coastguard Worker systemModules := android.PathsForModuleSrc(ctx, pkm.properties.System_deps) 101*333d2b36SAndroid Build Coastguard Worker 102*333d2b36SAndroid Build Coastguard Worker depmodOut := pkm.runDepmod(ctx, modules, systemModules) 103*333d2b36SAndroid Build Coastguard Worker strippedModules := stripDebugSymbols(ctx, modules) 104*333d2b36SAndroid Build Coastguard Worker 105*333d2b36SAndroid Build Coastguard Worker installDir := android.PathForModuleInstall(ctx, "lib", "modules") 106*333d2b36SAndroid Build Coastguard Worker // Kernel module is installed to vendor_ramdisk/lib/modules regardless of product 107*333d2b36SAndroid Build Coastguard Worker // configuration. This matches the behavior in make and prevents the files from being 108*333d2b36SAndroid Build Coastguard Worker // installed in `vendor_ramdisk/first_stage_ramdisk`. 109*333d2b36SAndroid Build Coastguard Worker if pkm.InstallInVendorRamdisk() { 110*333d2b36SAndroid Build Coastguard Worker installDir = android.PathForModuleInPartitionInstall(ctx, "vendor_ramdisk", "lib", "modules") 111*333d2b36SAndroid Build Coastguard Worker } 112*333d2b36SAndroid Build Coastguard Worker 113*333d2b36SAndroid Build Coastguard Worker if pkm.KernelVersion() != "" { 114*333d2b36SAndroid Build Coastguard Worker installDir = installDir.Join(ctx, pkm.KernelVersion()) 115*333d2b36SAndroid Build Coastguard Worker } 116*333d2b36SAndroid Build Coastguard Worker 117*333d2b36SAndroid Build Coastguard Worker for _, m := range strippedModules { 118*333d2b36SAndroid Build Coastguard Worker ctx.InstallFile(installDir, filepath.Base(m.String()), m) 119*333d2b36SAndroid Build Coastguard Worker } 120*333d2b36SAndroid Build Coastguard Worker ctx.InstallFile(installDir, "modules.load", depmodOut.modulesLoad) 121*333d2b36SAndroid Build Coastguard Worker ctx.InstallFile(installDir, "modules.dep", depmodOut.modulesDep) 122*333d2b36SAndroid Build Coastguard Worker ctx.InstallFile(installDir, "modules.softdep", depmodOut.modulesSoftdep) 123*333d2b36SAndroid Build Coastguard Worker ctx.InstallFile(installDir, "modules.alias", depmodOut.modulesAlias) 124*333d2b36SAndroid Build Coastguard Worker pkm.installBlocklistFile(ctx, installDir) 125*333d2b36SAndroid Build Coastguard Worker pkm.installOptionsFile(ctx, installDir) 126*333d2b36SAndroid Build Coastguard Worker 127*333d2b36SAndroid Build Coastguard Worker ctx.SetOutputFiles(modules, ".modules") 128*333d2b36SAndroid Build Coastguard Worker} 129*333d2b36SAndroid Build Coastguard Worker 130*333d2b36SAndroid Build Coastguard Workerfunc (pkm *prebuiltKernelModules) installBlocklistFile(ctx android.ModuleContext, installDir android.InstallPath) { 131*333d2b36SAndroid Build Coastguard Worker if pkm.properties.Blocklist_file == nil { 132*333d2b36SAndroid Build Coastguard Worker return 133*333d2b36SAndroid Build Coastguard Worker } 134*333d2b36SAndroid Build Coastguard Worker blocklistOut := android.PathForModuleOut(ctx, "modules.blocklist") 135*333d2b36SAndroid Build Coastguard Worker 136*333d2b36SAndroid Build Coastguard Worker ctx.Build(pctx, android.BuildParams{ 137*333d2b36SAndroid Build Coastguard Worker Rule: processBlocklistFile, 138*333d2b36SAndroid Build Coastguard Worker Input: android.PathForModuleSrc(ctx, proptools.String(pkm.properties.Blocklist_file)), 139*333d2b36SAndroid Build Coastguard Worker Output: blocklistOut, 140*333d2b36SAndroid Build Coastguard Worker }) 141*333d2b36SAndroid Build Coastguard Worker ctx.InstallFile(installDir, "modules.blocklist", blocklistOut) 142*333d2b36SAndroid Build Coastguard Worker} 143*333d2b36SAndroid Build Coastguard Worker 144*333d2b36SAndroid Build Coastguard Workerfunc (pkm *prebuiltKernelModules) installOptionsFile(ctx android.ModuleContext, installDir android.InstallPath) { 145*333d2b36SAndroid Build Coastguard Worker if pkm.properties.Options_file == nil { 146*333d2b36SAndroid Build Coastguard Worker return 147*333d2b36SAndroid Build Coastguard Worker } 148*333d2b36SAndroid Build Coastguard Worker optionsOut := android.PathForModuleOut(ctx, "modules.options") 149*333d2b36SAndroid Build Coastguard Worker 150*333d2b36SAndroid Build Coastguard Worker ctx.Build(pctx, android.BuildParams{ 151*333d2b36SAndroid Build Coastguard Worker Rule: processOptionsFile, 152*333d2b36SAndroid Build Coastguard Worker Input: android.PathForModuleSrc(ctx, proptools.String(pkm.properties.Options_file)), 153*333d2b36SAndroid Build Coastguard Worker Output: optionsOut, 154*333d2b36SAndroid Build Coastguard Worker }) 155*333d2b36SAndroid Build Coastguard Worker ctx.InstallFile(installDir, "modules.options", optionsOut) 156*333d2b36SAndroid Build Coastguard Worker} 157*333d2b36SAndroid Build Coastguard Worker 158*333d2b36SAndroid Build Coastguard Workervar ( 159*333d2b36SAndroid Build Coastguard Worker pctx = android.NewPackageContext("android/soong/kernel") 160*333d2b36SAndroid Build Coastguard Worker 161*333d2b36SAndroid Build Coastguard Worker stripRule = pctx.AndroidStaticRule("strip", 162*333d2b36SAndroid Build Coastguard Worker blueprint.RuleParams{ 163*333d2b36SAndroid Build Coastguard Worker Command: "$stripCmd -o $out --strip-debug $in", 164*333d2b36SAndroid Build Coastguard Worker CommandDeps: []string{"$stripCmd"}, 165*333d2b36SAndroid Build Coastguard Worker }, "stripCmd") 166*333d2b36SAndroid Build Coastguard Worker) 167*333d2b36SAndroid Build Coastguard Worker 168*333d2b36SAndroid Build Coastguard Workerfunc stripDebugSymbols(ctx android.ModuleContext, modules android.Paths) android.OutputPaths { 169*333d2b36SAndroid Build Coastguard Worker dir := android.PathForModuleOut(ctx, "stripped").OutputPath 170*333d2b36SAndroid Build Coastguard Worker var outputs android.OutputPaths 171*333d2b36SAndroid Build Coastguard Worker 172*333d2b36SAndroid Build Coastguard Worker for _, m := range modules { 173*333d2b36SAndroid Build Coastguard Worker stripped := dir.Join(ctx, filepath.Base(m.String())) 174*333d2b36SAndroid Build Coastguard Worker ctx.Build(pctx, android.BuildParams{ 175*333d2b36SAndroid Build Coastguard Worker Rule: stripRule, 176*333d2b36SAndroid Build Coastguard Worker Input: m, 177*333d2b36SAndroid Build Coastguard Worker Output: stripped, 178*333d2b36SAndroid Build Coastguard Worker Args: map[string]string{ 179*333d2b36SAndroid Build Coastguard Worker "stripCmd": "${config.ClangBin}/llvm-strip", 180*333d2b36SAndroid Build Coastguard Worker }, 181*333d2b36SAndroid Build Coastguard Worker }) 182*333d2b36SAndroid Build Coastguard Worker outputs = append(outputs, stripped) 183*333d2b36SAndroid Build Coastguard Worker } 184*333d2b36SAndroid Build Coastguard Worker 185*333d2b36SAndroid Build Coastguard Worker return outputs 186*333d2b36SAndroid Build Coastguard Worker} 187*333d2b36SAndroid Build Coastguard Worker 188*333d2b36SAndroid Build Coastguard Workertype depmodOutputs struct { 189*333d2b36SAndroid Build Coastguard Worker modulesLoad android.OutputPath 190*333d2b36SAndroid Build Coastguard Worker modulesDep android.OutputPath 191*333d2b36SAndroid Build Coastguard Worker modulesSoftdep android.OutputPath 192*333d2b36SAndroid Build Coastguard Worker modulesAlias android.OutputPath 193*333d2b36SAndroid Build Coastguard Worker} 194*333d2b36SAndroid Build Coastguard Worker 195*333d2b36SAndroid Build Coastguard Workervar ( 196*333d2b36SAndroid Build Coastguard Worker // system/lib/modules/foo.ko: system/lib/modules/bar.ko 197*333d2b36SAndroid Build Coastguard Worker // will be converted to 198*333d2b36SAndroid Build Coastguard Worker // /system/lib/modules/foo.ko: /system/lib/modules/bar.ko 199*333d2b36SAndroid Build Coastguard Worker addLeadingSlashToPaths = pctx.AndroidStaticRule("add_leading_slash", 200*333d2b36SAndroid Build Coastguard Worker blueprint.RuleParams{ 201*333d2b36SAndroid Build Coastguard Worker Command: `sed -e 's|\([^: ]*lib/modules/[^: ]*\)|/\1|g' $in > $out`, 202*333d2b36SAndroid Build Coastguard Worker }, 203*333d2b36SAndroid Build Coastguard Worker ) 204*333d2b36SAndroid Build Coastguard Worker // Remove empty lines. Raise an exception if line is _not_ formatted as `blocklist $name.ko` 205*333d2b36SAndroid Build Coastguard Worker processBlocklistFile = pctx.AndroidStaticRule("process_blocklist_file", 206*333d2b36SAndroid Build Coastguard Worker blueprint.RuleParams{ 207*333d2b36SAndroid Build Coastguard Worker Command: `rm -rf $out && awk <$in > $out` + 208*333d2b36SAndroid Build Coastguard Worker ` '/^#/ { print; next }` + 209*333d2b36SAndroid Build Coastguard Worker ` NF == 0 { next }` + 210*333d2b36SAndroid Build Coastguard Worker ` NF != 2 || $$1 != "blocklist"` + 211*333d2b36SAndroid Build Coastguard Worker ` { print "Invalid blocklist line " FNR ": " $$0 >"/dev/stderr";` + 212*333d2b36SAndroid Build Coastguard Worker ` exit_status = 1; next }` + 213*333d2b36SAndroid Build Coastguard Worker ` { $$1 = $$1; print }` + 214*333d2b36SAndroid Build Coastguard Worker ` END { exit exit_status }'`, 215*333d2b36SAndroid Build Coastguard Worker }, 216*333d2b36SAndroid Build Coastguard Worker ) 217*333d2b36SAndroid Build Coastguard Worker // Remove empty lines. Raise an exception if line is _not_ formatted as `options $name.ko` 218*333d2b36SAndroid Build Coastguard Worker processOptionsFile = pctx.AndroidStaticRule("process_options_file", 219*333d2b36SAndroid Build Coastguard Worker blueprint.RuleParams{ 220*333d2b36SAndroid Build Coastguard Worker Command: `rm -rf $out && awk <$in > $out` + 221*333d2b36SAndroid Build Coastguard Worker ` '/^#/ { print; next }` + 222*333d2b36SAndroid Build Coastguard Worker ` NF == 0 { next }` + 223*333d2b36SAndroid Build Coastguard Worker ` NF < 2 || $$1 != "options"` + 224*333d2b36SAndroid Build Coastguard Worker ` { print "Invalid options line " FNR ": " $$0 >"/dev/stderr";` + 225*333d2b36SAndroid Build Coastguard Worker ` exit_status = 1; next }` + 226*333d2b36SAndroid Build Coastguard Worker ` { $$1 = $$1; print }` + 227*333d2b36SAndroid Build Coastguard Worker ` END { exit exit_status }'`, 228*333d2b36SAndroid Build Coastguard Worker }, 229*333d2b36SAndroid Build Coastguard Worker ) 230*333d2b36SAndroid Build Coastguard Worker) 231*333d2b36SAndroid Build Coastguard Worker 232*333d2b36SAndroid Build Coastguard Worker// This is the path in soong intermediates where the .ko files will be copied. 233*333d2b36SAndroid Build Coastguard Worker// The layout should match the layout on device so that depmod can create meaningful modules.* files. 234*333d2b36SAndroid Build Coastguard Workerfunc modulesDirForAndroidDlkm(ctx android.ModuleContext, modulesDir android.OutputPath, system bool) android.OutputPath { 235*333d2b36SAndroid Build Coastguard Worker if ctx.InstallInSystemDlkm() || system { 236*333d2b36SAndroid Build Coastguard Worker // The first component can be either system or system_dlkm 237*333d2b36SAndroid Build Coastguard Worker // system works because /system/lib/modules is a symlink to /system_dlkm/lib/modules. 238*333d2b36SAndroid Build Coastguard Worker // system was chosen to match the contents of the kati built modules.dep 239*333d2b36SAndroid Build Coastguard Worker return modulesDir.Join(ctx, "system", "lib", "modules") 240*333d2b36SAndroid Build Coastguard Worker } else if ctx.InstallInVendorDlkm() { 241*333d2b36SAndroid Build Coastguard Worker return modulesDir.Join(ctx, "vendor", "lib", "modules") 242*333d2b36SAndroid Build Coastguard Worker } else if ctx.InstallInOdmDlkm() { 243*333d2b36SAndroid Build Coastguard Worker return modulesDir.Join(ctx, "odm", "lib", "modules") 244*333d2b36SAndroid Build Coastguard Worker } else { 245*333d2b36SAndroid Build Coastguard Worker // not an android dlkm module. 246*333d2b36SAndroid Build Coastguard Worker return modulesDir 247*333d2b36SAndroid Build Coastguard Worker } 248*333d2b36SAndroid Build Coastguard Worker} 249*333d2b36SAndroid Build Coastguard Worker 250*333d2b36SAndroid Build Coastguard Workerfunc (pkm *prebuiltKernelModules) runDepmod(ctx android.ModuleContext, modules android.Paths, systemModules android.Paths) depmodOutputs { 251*333d2b36SAndroid Build Coastguard Worker baseDir := android.PathForModuleOut(ctx, "depmod").OutputPath 252*333d2b36SAndroid Build Coastguard Worker fakeVer := "0.0" // depmod demands this anyway 253*333d2b36SAndroid Build Coastguard Worker modulesDir := baseDir.Join(ctx, "lib", "modules", fakeVer) 254*333d2b36SAndroid Build Coastguard Worker modulesCpDir := modulesDirForAndroidDlkm(ctx, modulesDir, false) 255*333d2b36SAndroid Build Coastguard Worker 256*333d2b36SAndroid Build Coastguard Worker builder := android.NewRuleBuilder(pctx, ctx) 257*333d2b36SAndroid Build Coastguard Worker 258*333d2b36SAndroid Build Coastguard Worker // Copy the module files to a temporary dir 259*333d2b36SAndroid Build Coastguard Worker builder.Command().Text("rm").Flag("-rf").Text(modulesCpDir.String()) 260*333d2b36SAndroid Build Coastguard Worker builder.Command().Text("mkdir").Flag("-p").Text(modulesCpDir.String()) 261*333d2b36SAndroid Build Coastguard Worker for _, m := range modules { 262*333d2b36SAndroid Build Coastguard Worker builder.Command().Text("cp").Input(m).Text(modulesCpDir.String()) 263*333d2b36SAndroid Build Coastguard Worker } 264*333d2b36SAndroid Build Coastguard Worker 265*333d2b36SAndroid Build Coastguard Worker modulesDirForSystemDlkm := modulesDirForAndroidDlkm(ctx, modulesDir, true) 266*333d2b36SAndroid Build Coastguard Worker if len(systemModules) > 0 { 267*333d2b36SAndroid Build Coastguard Worker builder.Command().Text("mkdir").Flag("-p").Text(modulesDirForSystemDlkm.String()) 268*333d2b36SAndroid Build Coastguard Worker } 269*333d2b36SAndroid Build Coastguard Worker for _, m := range systemModules { 270*333d2b36SAndroid Build Coastguard Worker builder.Command().Text("cp").Input(m).Text(modulesDirForSystemDlkm.String()) 271*333d2b36SAndroid Build Coastguard Worker } 272*333d2b36SAndroid Build Coastguard Worker 273*333d2b36SAndroid Build Coastguard Worker // Enumerate modules to load 274*333d2b36SAndroid Build Coastguard Worker modulesLoad := modulesDir.Join(ctx, "modules.load") 275*333d2b36SAndroid Build Coastguard Worker // If Load_by_default is set to false explicitly, create an empty modules.load 276*333d2b36SAndroid Build Coastguard Worker if pkm.properties.Load_by_default != nil && !*pkm.properties.Load_by_default { 277*333d2b36SAndroid Build Coastguard Worker builder.Command().Text("rm").Flag("-rf").Text(modulesLoad.String()) 278*333d2b36SAndroid Build Coastguard Worker builder.Command().Text("touch").Output(modulesLoad) 279*333d2b36SAndroid Build Coastguard Worker } else { 280*333d2b36SAndroid Build Coastguard Worker var basenames []string 281*333d2b36SAndroid Build Coastguard Worker for _, m := range modules { 282*333d2b36SAndroid Build Coastguard Worker basenames = append(basenames, filepath.Base(m.String())) 283*333d2b36SAndroid Build Coastguard Worker } 284*333d2b36SAndroid Build Coastguard Worker builder.Command(). 285*333d2b36SAndroid Build Coastguard Worker Text("echo").Flag("\"" + strings.Join(basenames, " ") + "\""). 286*333d2b36SAndroid Build Coastguard Worker Text("|").Text("tr").Flag("\" \"").Flag("\"\\n\""). 287*333d2b36SAndroid Build Coastguard Worker Text(">").Output(modulesLoad) 288*333d2b36SAndroid Build Coastguard Worker } 289*333d2b36SAndroid Build Coastguard Worker 290*333d2b36SAndroid Build Coastguard Worker // Run depmod to build modules.dep/softdep/alias files 291*333d2b36SAndroid Build Coastguard Worker modulesDep := modulesDir.Join(ctx, "modules.dep") 292*333d2b36SAndroid Build Coastguard Worker modulesSoftdep := modulesDir.Join(ctx, "modules.softdep") 293*333d2b36SAndroid Build Coastguard Worker modulesAlias := modulesDir.Join(ctx, "modules.alias") 294*333d2b36SAndroid Build Coastguard Worker builder.Command().Text("mkdir").Flag("-p").Text(modulesDir.String()) 295*333d2b36SAndroid Build Coastguard Worker builder.Command(). 296*333d2b36SAndroid Build Coastguard Worker BuiltTool("depmod"). 297*333d2b36SAndroid Build Coastguard Worker FlagWithArg("-b ", baseDir.String()). 298*333d2b36SAndroid Build Coastguard Worker Text(fakeVer). 299*333d2b36SAndroid Build Coastguard Worker ImplicitOutput(modulesDep). 300*333d2b36SAndroid Build Coastguard Worker ImplicitOutput(modulesSoftdep). 301*333d2b36SAndroid Build Coastguard Worker ImplicitOutput(modulesAlias) 302*333d2b36SAndroid Build Coastguard Worker 303*333d2b36SAndroid Build Coastguard Worker builder.Build("depmod", fmt.Sprintf("depmod %s", ctx.ModuleName())) 304*333d2b36SAndroid Build Coastguard Worker 305*333d2b36SAndroid Build Coastguard Worker finalModulesDep := modulesDep 306*333d2b36SAndroid Build Coastguard Worker // Add a leading slash to paths in modules.dep of android dlkm 307*333d2b36SAndroid Build Coastguard Worker if ctx.InstallInSystemDlkm() || ctx.InstallInVendorDlkm() || ctx.InstallInOdmDlkm() { 308*333d2b36SAndroid Build Coastguard Worker finalModulesDep := modulesDep.ReplaceExtension(ctx, "intermediates") 309*333d2b36SAndroid Build Coastguard Worker ctx.Build(pctx, android.BuildParams{ 310*333d2b36SAndroid Build Coastguard Worker Rule: addLeadingSlashToPaths, 311*333d2b36SAndroid Build Coastguard Worker Input: modulesDep, 312*333d2b36SAndroid Build Coastguard Worker Output: finalModulesDep, 313*333d2b36SAndroid Build Coastguard Worker }) 314*333d2b36SAndroid Build Coastguard Worker } 315*333d2b36SAndroid Build Coastguard Worker 316*333d2b36SAndroid Build Coastguard Worker return depmodOutputs{modulesLoad, finalModulesDep, modulesSoftdep, modulesAlias} 317*333d2b36SAndroid Build Coastguard Worker} 318