1*333d2b36SAndroid Build Coastguard Worker// Copyright 2015 Google Inc. All rights reserved. 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 cc 16*333d2b36SAndroid Build Coastguard Worker 17*333d2b36SAndroid Build Coastguard Workerimport ( 18*333d2b36SAndroid Build Coastguard Worker "path/filepath" 19*333d2b36SAndroid Build Coastguard Worker "strings" 20*333d2b36SAndroid Build Coastguard Worker 21*333d2b36SAndroid Build Coastguard Worker "android/soong/aidl_library" 22*333d2b36SAndroid Build Coastguard Worker "github.com/google/blueprint" 23*333d2b36SAndroid Build Coastguard Worker 24*333d2b36SAndroid Build Coastguard Worker "android/soong/android" 25*333d2b36SAndroid Build Coastguard Worker) 26*333d2b36SAndroid Build Coastguard Worker 27*333d2b36SAndroid Build Coastguard Workerfunc init() { 28*333d2b36SAndroid Build Coastguard Worker pctx.SourcePathVariable("lexCmd", "prebuilts/build-tools/${config.HostPrebuiltTag}/bin/flex") 29*333d2b36SAndroid Build Coastguard Worker pctx.SourcePathVariable("m4Cmd", "prebuilts/build-tools/${config.HostPrebuiltTag}/bin/m4") 30*333d2b36SAndroid Build Coastguard Worker 31*333d2b36SAndroid Build Coastguard Worker pctx.HostBinToolVariable("aidlCmd", "aidl-cpp") 32*333d2b36SAndroid Build Coastguard Worker pctx.HostBinToolVariable("syspropCmd", "sysprop_cpp") 33*333d2b36SAndroid Build Coastguard Worker} 34*333d2b36SAndroid Build Coastguard Worker 35*333d2b36SAndroid Build Coastguard Workervar ( 36*333d2b36SAndroid Build Coastguard Worker lex = pctx.AndroidStaticRule("lex", 37*333d2b36SAndroid Build Coastguard Worker blueprint.RuleParams{ 38*333d2b36SAndroid Build Coastguard Worker Command: "M4=$m4Cmd $lexCmd $flags -o$out $in", 39*333d2b36SAndroid Build Coastguard Worker CommandDeps: []string{"$lexCmd", "$m4Cmd"}, 40*333d2b36SAndroid Build Coastguard Worker }, "flags") 41*333d2b36SAndroid Build Coastguard Worker 42*333d2b36SAndroid Build Coastguard Worker sysprop = pctx.AndroidStaticRule("sysprop", 43*333d2b36SAndroid Build Coastguard Worker blueprint.RuleParams{ 44*333d2b36SAndroid Build Coastguard Worker Command: "$syspropCmd --header-dir=$headerOutDir --public-header-dir=$publicOutDir " + 45*333d2b36SAndroid Build Coastguard Worker "--source-dir=$srcOutDir --include-name=$includeName $in", 46*333d2b36SAndroid Build Coastguard Worker CommandDeps: []string{"$syspropCmd"}, 47*333d2b36SAndroid Build Coastguard Worker }, 48*333d2b36SAndroid Build Coastguard Worker "headerOutDir", "publicOutDir", "srcOutDir", "includeName") 49*333d2b36SAndroid Build Coastguard Worker) 50*333d2b36SAndroid Build Coastguard Worker 51*333d2b36SAndroid Build Coastguard Workertype YaccProperties struct { 52*333d2b36SAndroid Build Coastguard Worker // list of module-specific flags that will be used for .y and .yy compiles 53*333d2b36SAndroid Build Coastguard Worker Flags []string 54*333d2b36SAndroid Build Coastguard Worker 55*333d2b36SAndroid Build Coastguard Worker // whether the yacc files will produce a location.hh file 56*333d2b36SAndroid Build Coastguard Worker Gen_location_hh *bool 57*333d2b36SAndroid Build Coastguard Worker 58*333d2b36SAndroid Build Coastguard Worker // whether the yacc files will product a position.hh file 59*333d2b36SAndroid Build Coastguard Worker Gen_position_hh *bool 60*333d2b36SAndroid Build Coastguard Worker} 61*333d2b36SAndroid Build Coastguard Worker 62*333d2b36SAndroid Build Coastguard Workerfunc genYacc(ctx android.ModuleContext, rule *android.RuleBuilder, yaccFile android.Path, 63*333d2b36SAndroid Build Coastguard Worker outFile android.ModuleGenPath, props *YaccProperties) (headerFiles android.Paths) { 64*333d2b36SAndroid Build Coastguard Worker 65*333d2b36SAndroid Build Coastguard Worker outDir := android.PathForModuleGen(ctx, "yacc") 66*333d2b36SAndroid Build Coastguard Worker headerFile := android.GenPathWithExt(ctx, "yacc", yaccFile, "h") 67*333d2b36SAndroid Build Coastguard Worker ret := android.Paths{headerFile} 68*333d2b36SAndroid Build Coastguard Worker 69*333d2b36SAndroid Build Coastguard Worker cmd := rule.Command() 70*333d2b36SAndroid Build Coastguard Worker 71*333d2b36SAndroid Build Coastguard Worker // Fix up #line markers to not use the sbox temporary directory 72*333d2b36SAndroid Build Coastguard Worker // android.sboxPathForOutput(outDir, outDir) returns the sbox placeholder for the out 73*333d2b36SAndroid Build Coastguard Worker // directory itself, without any filename appended. 74*333d2b36SAndroid Build Coastguard Worker sboxOutDir := cmd.PathForOutput(outDir) 75*333d2b36SAndroid Build Coastguard Worker sedCmd := "sed -i.bak 's#" + sboxOutDir + "#" + outDir.String() + "#'" 76*333d2b36SAndroid Build Coastguard Worker rule.Command().Text(sedCmd).Input(outFile) 77*333d2b36SAndroid Build Coastguard Worker rule.Command().Text(sedCmd).Input(headerFile) 78*333d2b36SAndroid Build Coastguard Worker 79*333d2b36SAndroid Build Coastguard Worker var flags []string 80*333d2b36SAndroid Build Coastguard Worker if props != nil { 81*333d2b36SAndroid Build Coastguard Worker flags = props.Flags 82*333d2b36SAndroid Build Coastguard Worker 83*333d2b36SAndroid Build Coastguard Worker if Bool(props.Gen_location_hh) { 84*333d2b36SAndroid Build Coastguard Worker locationHeader := outFile.InSameDir(ctx, "location.hh") 85*333d2b36SAndroid Build Coastguard Worker ret = append(ret, locationHeader) 86*333d2b36SAndroid Build Coastguard Worker cmd.ImplicitOutput(locationHeader) 87*333d2b36SAndroid Build Coastguard Worker rule.Command().Text(sedCmd).Input(locationHeader) 88*333d2b36SAndroid Build Coastguard Worker } 89*333d2b36SAndroid Build Coastguard Worker if Bool(props.Gen_position_hh) { 90*333d2b36SAndroid Build Coastguard Worker positionHeader := outFile.InSameDir(ctx, "position.hh") 91*333d2b36SAndroid Build Coastguard Worker ret = append(ret, positionHeader) 92*333d2b36SAndroid Build Coastguard Worker cmd.ImplicitOutput(positionHeader) 93*333d2b36SAndroid Build Coastguard Worker rule.Command().Text(sedCmd).Input(positionHeader) 94*333d2b36SAndroid Build Coastguard Worker } 95*333d2b36SAndroid Build Coastguard Worker } 96*333d2b36SAndroid Build Coastguard Worker 97*333d2b36SAndroid Build Coastguard Worker cmd.Text("BISON_PKGDATADIR=prebuilts/build-tools/common/bison"). 98*333d2b36SAndroid Build Coastguard Worker FlagWithInput("M4=", ctx.Config().PrebuiltBuildTool(ctx, "m4")). 99*333d2b36SAndroid Build Coastguard Worker PrebuiltBuildTool(ctx, "bison"). 100*333d2b36SAndroid Build Coastguard Worker Flag("-d"). 101*333d2b36SAndroid Build Coastguard Worker Flags(flags). 102*333d2b36SAndroid Build Coastguard Worker FlagWithOutput("--defines=", headerFile). 103*333d2b36SAndroid Build Coastguard Worker Flag("-o").Output(outFile).Input(yaccFile) 104*333d2b36SAndroid Build Coastguard Worker 105*333d2b36SAndroid Build Coastguard Worker return ret 106*333d2b36SAndroid Build Coastguard Worker} 107*333d2b36SAndroid Build Coastguard Worker 108*333d2b36SAndroid Build Coastguard Workerfunc genAidl( 109*333d2b36SAndroid Build Coastguard Worker ctx android.ModuleContext, 110*333d2b36SAndroid Build Coastguard Worker rule *android.RuleBuilder, 111*333d2b36SAndroid Build Coastguard Worker outDirBase string, 112*333d2b36SAndroid Build Coastguard Worker aidlFile android.Path, 113*333d2b36SAndroid Build Coastguard Worker aidlHdrs android.Paths, 114*333d2b36SAndroid Build Coastguard Worker aidlFlags string, 115*333d2b36SAndroid Build Coastguard Worker) (cppFile android.OutputPath, headerFiles android.Paths) { 116*333d2b36SAndroid Build Coastguard Worker aidlPackage := strings.TrimSuffix(aidlFile.Rel(), aidlFile.Base()) 117*333d2b36SAndroid Build Coastguard Worker baseName := strings.TrimSuffix(aidlFile.Base(), aidlFile.Ext()) 118*333d2b36SAndroid Build Coastguard Worker shortName := baseName 119*333d2b36SAndroid Build Coastguard Worker // TODO(b/111362593): aidl_to_cpp_common.cpp uses heuristics to figure out if 120*333d2b36SAndroid Build Coastguard Worker // an interface name has a leading I. Those same heuristics have been 121*333d2b36SAndroid Build Coastguard Worker // moved here. 122*333d2b36SAndroid Build Coastguard Worker if len(baseName) >= 2 && baseName[0] == 'I' && 123*333d2b36SAndroid Build Coastguard Worker strings.ToUpper(baseName)[1] == baseName[1] { 124*333d2b36SAndroid Build Coastguard Worker shortName = strings.TrimPrefix(baseName, "I") 125*333d2b36SAndroid Build Coastguard Worker } 126*333d2b36SAndroid Build Coastguard Worker 127*333d2b36SAndroid Build Coastguard Worker outDir := android.PathForModuleGen(ctx, outDirBase) 128*333d2b36SAndroid Build Coastguard Worker cppFile = outDir.Join(ctx, aidlPackage, baseName+".cpp") 129*333d2b36SAndroid Build Coastguard Worker depFile := outDir.Join(ctx, aidlPackage, baseName+".cpp.d") 130*333d2b36SAndroid Build Coastguard Worker headerI := outDir.Join(ctx, aidlPackage, baseName+".h") 131*333d2b36SAndroid Build Coastguard Worker headerBn := outDir.Join(ctx, aidlPackage, "Bn"+shortName+".h") 132*333d2b36SAndroid Build Coastguard Worker headerBp := outDir.Join(ctx, aidlPackage, "Bp"+shortName+".h") 133*333d2b36SAndroid Build Coastguard Worker 134*333d2b36SAndroid Build Coastguard Worker cmd := rule.Command() 135*333d2b36SAndroid Build Coastguard Worker cmd.BuiltTool("aidl-cpp"). 136*333d2b36SAndroid Build Coastguard Worker // libc++ is default stl for aidl-cpp (a cc_binary_host module) 137*333d2b36SAndroid Build Coastguard Worker ImplicitTool(ctx.Config().HostCcSharedLibPath(ctx, "libc++")). 138*333d2b36SAndroid Build Coastguard Worker FlagWithDepFile("-d", depFile). 139*333d2b36SAndroid Build Coastguard Worker Flag("--ninja"). 140*333d2b36SAndroid Build Coastguard Worker Flag(aidlFlags). 141*333d2b36SAndroid Build Coastguard Worker Input(aidlFile). 142*333d2b36SAndroid Build Coastguard Worker OutputDir(). 143*333d2b36SAndroid Build Coastguard Worker Output(cppFile). 144*333d2b36SAndroid Build Coastguard Worker ImplicitOutputs(android.WritablePaths{ 145*333d2b36SAndroid Build Coastguard Worker headerI, 146*333d2b36SAndroid Build Coastguard Worker headerBn, 147*333d2b36SAndroid Build Coastguard Worker headerBp, 148*333d2b36SAndroid Build Coastguard Worker }) 149*333d2b36SAndroid Build Coastguard Worker 150*333d2b36SAndroid Build Coastguard Worker if aidlHdrs != nil { 151*333d2b36SAndroid Build Coastguard Worker cmd.Implicits(aidlHdrs) 152*333d2b36SAndroid Build Coastguard Worker } 153*333d2b36SAndroid Build Coastguard Worker 154*333d2b36SAndroid Build Coastguard Worker return cppFile, android.Paths{ 155*333d2b36SAndroid Build Coastguard Worker headerI, 156*333d2b36SAndroid Build Coastguard Worker headerBn, 157*333d2b36SAndroid Build Coastguard Worker headerBp, 158*333d2b36SAndroid Build Coastguard Worker } 159*333d2b36SAndroid Build Coastguard Worker} 160*333d2b36SAndroid Build Coastguard Worker 161*333d2b36SAndroid Build Coastguard Workertype LexProperties struct { 162*333d2b36SAndroid Build Coastguard Worker // list of module-specific flags that will be used for .l and .ll compiles 163*333d2b36SAndroid Build Coastguard Worker Flags []string 164*333d2b36SAndroid Build Coastguard Worker} 165*333d2b36SAndroid Build Coastguard Worker 166*333d2b36SAndroid Build Coastguard Workerfunc genLex(ctx android.ModuleContext, lexFile android.Path, outFile android.ModuleGenPath, props *LexProperties) { 167*333d2b36SAndroid Build Coastguard Worker var flags []string 168*333d2b36SAndroid Build Coastguard Worker if props != nil { 169*333d2b36SAndroid Build Coastguard Worker flags = props.Flags 170*333d2b36SAndroid Build Coastguard Worker } 171*333d2b36SAndroid Build Coastguard Worker flagsString := strings.Join(flags[:], " ") 172*333d2b36SAndroid Build Coastguard Worker ctx.Build(pctx, android.BuildParams{ 173*333d2b36SAndroid Build Coastguard Worker Rule: lex, 174*333d2b36SAndroid Build Coastguard Worker Description: "lex " + lexFile.Rel(), 175*333d2b36SAndroid Build Coastguard Worker Output: outFile, 176*333d2b36SAndroid Build Coastguard Worker Input: lexFile, 177*333d2b36SAndroid Build Coastguard Worker Args: map[string]string{"flags": flagsString}, 178*333d2b36SAndroid Build Coastguard Worker }) 179*333d2b36SAndroid Build Coastguard Worker} 180*333d2b36SAndroid Build Coastguard Worker 181*333d2b36SAndroid Build Coastguard Workerfunc genSysprop(ctx android.ModuleContext, syspropFile android.Path) (android.Path, android.Paths) { 182*333d2b36SAndroid Build Coastguard Worker headerFile := android.PathForModuleGen(ctx, "sysprop", "include", syspropFile.Rel()+".h") 183*333d2b36SAndroid Build Coastguard Worker publicHeaderFile := android.PathForModuleGen(ctx, "sysprop/public", "include", syspropFile.Rel()+".h") 184*333d2b36SAndroid Build Coastguard Worker cppFile := android.PathForModuleGen(ctx, "sysprop", syspropFile.Rel()+".cpp") 185*333d2b36SAndroid Build Coastguard Worker 186*333d2b36SAndroid Build Coastguard Worker headers := android.WritablePaths{headerFile, publicHeaderFile} 187*333d2b36SAndroid Build Coastguard Worker 188*333d2b36SAndroid Build Coastguard Worker ctx.Build(pctx, android.BuildParams{ 189*333d2b36SAndroid Build Coastguard Worker Rule: sysprop, 190*333d2b36SAndroid Build Coastguard Worker Description: "sysprop " + syspropFile.Rel(), 191*333d2b36SAndroid Build Coastguard Worker Output: cppFile, 192*333d2b36SAndroid Build Coastguard Worker ImplicitOutputs: headers, 193*333d2b36SAndroid Build Coastguard Worker Input: syspropFile, 194*333d2b36SAndroid Build Coastguard Worker Args: map[string]string{ 195*333d2b36SAndroid Build Coastguard Worker "headerOutDir": filepath.Dir(headerFile.String()), 196*333d2b36SAndroid Build Coastguard Worker "publicOutDir": filepath.Dir(publicHeaderFile.String()), 197*333d2b36SAndroid Build Coastguard Worker "srcOutDir": filepath.Dir(cppFile.String()), 198*333d2b36SAndroid Build Coastguard Worker "includeName": syspropFile.Rel() + ".h", 199*333d2b36SAndroid Build Coastguard Worker }, 200*333d2b36SAndroid Build Coastguard Worker }) 201*333d2b36SAndroid Build Coastguard Worker 202*333d2b36SAndroid Build Coastguard Worker return cppFile, headers.Paths() 203*333d2b36SAndroid Build Coastguard Worker} 204*333d2b36SAndroid Build Coastguard Worker 205*333d2b36SAndroid Build Coastguard Worker// Used to communicate information from the genSources method back to the library code that uses 206*333d2b36SAndroid Build Coastguard Worker// it. 207*333d2b36SAndroid Build Coastguard Workertype generatedSourceInfo struct { 208*333d2b36SAndroid Build Coastguard Worker // The headers created from .proto files 209*333d2b36SAndroid Build Coastguard Worker protoHeaders android.Paths 210*333d2b36SAndroid Build Coastguard Worker 211*333d2b36SAndroid Build Coastguard Worker // The files that can be used as order only dependencies in order to ensure that the proto header 212*333d2b36SAndroid Build Coastguard Worker // files are up to date. 213*333d2b36SAndroid Build Coastguard Worker protoOrderOnlyDeps android.Paths 214*333d2b36SAndroid Build Coastguard Worker 215*333d2b36SAndroid Build Coastguard Worker // The headers created from .aidl files 216*333d2b36SAndroid Build Coastguard Worker aidlHeaders android.Paths 217*333d2b36SAndroid Build Coastguard Worker 218*333d2b36SAndroid Build Coastguard Worker // The files that can be used as order only dependencies in order to ensure that the aidl header 219*333d2b36SAndroid Build Coastguard Worker // files are up to date. 220*333d2b36SAndroid Build Coastguard Worker aidlOrderOnlyDeps android.Paths 221*333d2b36SAndroid Build Coastguard Worker 222*333d2b36SAndroid Build Coastguard Worker // The headers created from .sysprop files 223*333d2b36SAndroid Build Coastguard Worker syspropHeaders android.Paths 224*333d2b36SAndroid Build Coastguard Worker 225*333d2b36SAndroid Build Coastguard Worker // The files that can be used as order only dependencies in order to ensure that the sysprop 226*333d2b36SAndroid Build Coastguard Worker // header files are up to date. 227*333d2b36SAndroid Build Coastguard Worker syspropOrderOnlyDeps android.Paths 228*333d2b36SAndroid Build Coastguard Worker 229*333d2b36SAndroid Build Coastguard Worker // List of generated code path. 230*333d2b36SAndroid Build Coastguard Worker // ex) '*.cpp' files generated from '*.ll / *.yy'. 231*333d2b36SAndroid Build Coastguard Worker generatedSources android.Paths 232*333d2b36SAndroid Build Coastguard Worker} 233*333d2b36SAndroid Build Coastguard Worker 234*333d2b36SAndroid Build Coastguard Workerfunc genSources( 235*333d2b36SAndroid Build Coastguard Worker ctx android.ModuleContext, 236*333d2b36SAndroid Build Coastguard Worker aidlLibraryInfos []aidl_library.AidlLibraryInfo, 237*333d2b36SAndroid Build Coastguard Worker srcFiles android.Paths, 238*333d2b36SAndroid Build Coastguard Worker buildFlags builderFlags, 239*333d2b36SAndroid Build Coastguard Worker) (android.Paths, android.Paths, generatedSourceInfo) { 240*333d2b36SAndroid Build Coastguard Worker 241*333d2b36SAndroid Build Coastguard Worker var info generatedSourceInfo 242*333d2b36SAndroid Build Coastguard Worker 243*333d2b36SAndroid Build Coastguard Worker var deps android.Paths 244*333d2b36SAndroid Build Coastguard Worker var rsFiles android.Paths 245*333d2b36SAndroid Build Coastguard Worker 246*333d2b36SAndroid Build Coastguard Worker // aidlRule supports compiling aidl files from srcs prop while aidlLibraryRule supports 247*333d2b36SAndroid Build Coastguard Worker // compiling aidl files from aidl_library modules specified in aidl.libs prop. 248*333d2b36SAndroid Build Coastguard Worker // The rules are separated so that they don't wipe out the other's outputDir 249*333d2b36SAndroid Build Coastguard Worker var aidlRule *android.RuleBuilder 250*333d2b36SAndroid Build Coastguard Worker var aidlLibraryRule *android.RuleBuilder 251*333d2b36SAndroid Build Coastguard Worker 252*333d2b36SAndroid Build Coastguard Worker var yaccRule_ *android.RuleBuilder 253*333d2b36SAndroid Build Coastguard Worker yaccRule := func() *android.RuleBuilder { 254*333d2b36SAndroid Build Coastguard Worker if yaccRule_ == nil { 255*333d2b36SAndroid Build Coastguard Worker yaccRule_ = android.NewRuleBuilder(pctx, ctx).Sbox(android.PathForModuleGen(ctx, "yacc"), 256*333d2b36SAndroid Build Coastguard Worker android.PathForModuleGen(ctx, "yacc.sbox.textproto")) 257*333d2b36SAndroid Build Coastguard Worker } 258*333d2b36SAndroid Build Coastguard Worker return yaccRule_ 259*333d2b36SAndroid Build Coastguard Worker } 260*333d2b36SAndroid Build Coastguard Worker 261*333d2b36SAndroid Build Coastguard Worker var generatedSources android.Paths = nil 262*333d2b36SAndroid Build Coastguard Worker 263*333d2b36SAndroid Build Coastguard Worker for i, srcFile := range srcFiles { 264*333d2b36SAndroid Build Coastguard Worker switch srcFile.Ext() { 265*333d2b36SAndroid Build Coastguard Worker case ".y": 266*333d2b36SAndroid Build Coastguard Worker cFile := android.GenPathWithExt(ctx, "yacc", srcFile, "c") 267*333d2b36SAndroid Build Coastguard Worker srcFiles[i] = cFile 268*333d2b36SAndroid Build Coastguard Worker deps = append(deps, genYacc(ctx, yaccRule(), srcFile, cFile, buildFlags.yacc)...) 269*333d2b36SAndroid Build Coastguard Worker generatedSources = append(generatedSources, cFile) 270*333d2b36SAndroid Build Coastguard Worker case ".yy": 271*333d2b36SAndroid Build Coastguard Worker cppFile := android.GenPathWithExt(ctx, "yacc", srcFile, "cpp") 272*333d2b36SAndroid Build Coastguard Worker srcFiles[i] = cppFile 273*333d2b36SAndroid Build Coastguard Worker deps = append(deps, genYacc(ctx, yaccRule(), srcFile, cppFile, buildFlags.yacc)...) 274*333d2b36SAndroid Build Coastguard Worker generatedSources = append(generatedSources, cppFile) 275*333d2b36SAndroid Build Coastguard Worker case ".l": 276*333d2b36SAndroid Build Coastguard Worker cFile := android.GenPathWithExt(ctx, "lex", srcFile, "c") 277*333d2b36SAndroid Build Coastguard Worker srcFiles[i] = cFile 278*333d2b36SAndroid Build Coastguard Worker genLex(ctx, srcFile, cFile, buildFlags.lex) 279*333d2b36SAndroid Build Coastguard Worker generatedSources = append(generatedSources, cFile) 280*333d2b36SAndroid Build Coastguard Worker case ".ll": 281*333d2b36SAndroid Build Coastguard Worker cppFile := android.GenPathWithExt(ctx, "lex", srcFile, "cpp") 282*333d2b36SAndroid Build Coastguard Worker srcFiles[i] = cppFile 283*333d2b36SAndroid Build Coastguard Worker genLex(ctx, srcFile, cppFile, buildFlags.lex) 284*333d2b36SAndroid Build Coastguard Worker generatedSources = append(generatedSources, cppFile) 285*333d2b36SAndroid Build Coastguard Worker case ".proto": 286*333d2b36SAndroid Build Coastguard Worker ccFile, headerFile := genProto(ctx, srcFile, buildFlags) 287*333d2b36SAndroid Build Coastguard Worker srcFiles[i] = ccFile 288*333d2b36SAndroid Build Coastguard Worker info.protoHeaders = append(info.protoHeaders, headerFile) 289*333d2b36SAndroid Build Coastguard Worker // Use the generated header as an order only dep to ensure that it is up to date when needed. 290*333d2b36SAndroid Build Coastguard Worker info.protoOrderOnlyDeps = append(info.protoOrderOnlyDeps, headerFile) 291*333d2b36SAndroid Build Coastguard Worker generatedSources = append(generatedSources, ccFile) 292*333d2b36SAndroid Build Coastguard Worker case ".aidl": 293*333d2b36SAndroid Build Coastguard Worker if aidlRule == nil { 294*333d2b36SAndroid Build Coastguard Worker aidlRule = android.NewRuleBuilder(pctx, ctx).Sbox(android.PathForModuleGen(ctx, "aidl"), 295*333d2b36SAndroid Build Coastguard Worker android.PathForModuleGen(ctx, "aidl.sbox.textproto")) 296*333d2b36SAndroid Build Coastguard Worker } 297*333d2b36SAndroid Build Coastguard Worker baseDir := strings.TrimSuffix(srcFile.String(), srcFile.Rel()) 298*333d2b36SAndroid Build Coastguard Worker cppFile, aidlHeaders := genAidl( 299*333d2b36SAndroid Build Coastguard Worker ctx, 300*333d2b36SAndroid Build Coastguard Worker aidlRule, 301*333d2b36SAndroid Build Coastguard Worker "aidl", 302*333d2b36SAndroid Build Coastguard Worker srcFile, 303*333d2b36SAndroid Build Coastguard Worker nil, 304*333d2b36SAndroid Build Coastguard Worker buildFlags.aidlFlags+" -I"+baseDir, 305*333d2b36SAndroid Build Coastguard Worker ) 306*333d2b36SAndroid Build Coastguard Worker srcFiles[i] = cppFile 307*333d2b36SAndroid Build Coastguard Worker 308*333d2b36SAndroid Build Coastguard Worker info.aidlHeaders = append(info.aidlHeaders, aidlHeaders...) 309*333d2b36SAndroid Build Coastguard Worker // Use the generated headers as order only deps to ensure that they are up to date when 310*333d2b36SAndroid Build Coastguard Worker // needed. 311*333d2b36SAndroid Build Coastguard Worker // TODO: Reduce the size of the ninja file by using one order only dep for the whole rule 312*333d2b36SAndroid Build Coastguard Worker info.aidlOrderOnlyDeps = append(info.aidlOrderOnlyDeps, aidlHeaders...) 313*333d2b36SAndroid Build Coastguard Worker generatedSources = append(generatedSources, cppFile) 314*333d2b36SAndroid Build Coastguard Worker case ".rscript", ".fs": 315*333d2b36SAndroid Build Coastguard Worker cppFile := rsGeneratedCppFile(ctx, srcFile) 316*333d2b36SAndroid Build Coastguard Worker rsFiles = append(rsFiles, srcFiles[i]) 317*333d2b36SAndroid Build Coastguard Worker srcFiles[i] = cppFile 318*333d2b36SAndroid Build Coastguard Worker generatedSources = append(generatedSources, cppFile) 319*333d2b36SAndroid Build Coastguard Worker case ".sysprop": 320*333d2b36SAndroid Build Coastguard Worker cppFile, headerFiles := genSysprop(ctx, srcFile) 321*333d2b36SAndroid Build Coastguard Worker srcFiles[i] = cppFile 322*333d2b36SAndroid Build Coastguard Worker info.syspropHeaders = append(info.syspropHeaders, headerFiles...) 323*333d2b36SAndroid Build Coastguard Worker // Use the generated headers as order only deps to ensure that they are up to date when 324*333d2b36SAndroid Build Coastguard Worker // needed. 325*333d2b36SAndroid Build Coastguard Worker info.syspropOrderOnlyDeps = append(info.syspropOrderOnlyDeps, headerFiles...) 326*333d2b36SAndroid Build Coastguard Worker generatedSources = append(generatedSources, cppFile) 327*333d2b36SAndroid Build Coastguard Worker } 328*333d2b36SAndroid Build Coastguard Worker } 329*333d2b36SAndroid Build Coastguard Worker 330*333d2b36SAndroid Build Coastguard Worker info.generatedSources = generatedSources 331*333d2b36SAndroid Build Coastguard Worker 332*333d2b36SAndroid Build Coastguard Worker for _, aidlLibraryInfo := range aidlLibraryInfos { 333*333d2b36SAndroid Build Coastguard Worker if aidlLibraryRule == nil { 334*333d2b36SAndroid Build Coastguard Worker aidlLibraryRule = android.NewRuleBuilder(pctx, ctx).Sbox( 335*333d2b36SAndroid Build Coastguard Worker android.PathForModuleGen(ctx, "aidl_library"), 336*333d2b36SAndroid Build Coastguard Worker android.PathForModuleGen(ctx, "aidl_library.sbox.textproto"), 337*333d2b36SAndroid Build Coastguard Worker ).SandboxInputs() 338*333d2b36SAndroid Build Coastguard Worker } 339*333d2b36SAndroid Build Coastguard Worker for _, aidlSrc := range aidlLibraryInfo.Srcs { 340*333d2b36SAndroid Build Coastguard Worker cppFile, aidlHeaders := genAidl( 341*333d2b36SAndroid Build Coastguard Worker ctx, 342*333d2b36SAndroid Build Coastguard Worker aidlLibraryRule, 343*333d2b36SAndroid Build Coastguard Worker "aidl_library", 344*333d2b36SAndroid Build Coastguard Worker aidlSrc, 345*333d2b36SAndroid Build Coastguard Worker aidlLibraryInfo.Hdrs.ToList(), 346*333d2b36SAndroid Build Coastguard Worker buildFlags.aidlFlags, 347*333d2b36SAndroid Build Coastguard Worker ) 348*333d2b36SAndroid Build Coastguard Worker 349*333d2b36SAndroid Build Coastguard Worker srcFiles = append(srcFiles, cppFile) 350*333d2b36SAndroid Build Coastguard Worker info.aidlHeaders = append(info.aidlHeaders, aidlHeaders...) 351*333d2b36SAndroid Build Coastguard Worker // Use the generated headers as order only deps to ensure that they are up to date when 352*333d2b36SAndroid Build Coastguard Worker // needed. 353*333d2b36SAndroid Build Coastguard Worker // TODO: Reduce the size of the ninja file by using one order only dep for the whole rule 354*333d2b36SAndroid Build Coastguard Worker info.aidlOrderOnlyDeps = append(info.aidlOrderOnlyDeps, aidlHeaders...) 355*333d2b36SAndroid Build Coastguard Worker } 356*333d2b36SAndroid Build Coastguard Worker } 357*333d2b36SAndroid Build Coastguard Worker 358*333d2b36SAndroid Build Coastguard Worker if aidlRule != nil { 359*333d2b36SAndroid Build Coastguard Worker aidlRule.Build("aidl", "gen aidl") 360*333d2b36SAndroid Build Coastguard Worker } 361*333d2b36SAndroid Build Coastguard Worker 362*333d2b36SAndroid Build Coastguard Worker if aidlLibraryRule != nil { 363*333d2b36SAndroid Build Coastguard Worker aidlLibraryRule.Build("aidl_library", "gen aidl_library") 364*333d2b36SAndroid Build Coastguard Worker } 365*333d2b36SAndroid Build Coastguard Worker 366*333d2b36SAndroid Build Coastguard Worker if yaccRule_ != nil { 367*333d2b36SAndroid Build Coastguard Worker yaccRule_.Build("yacc", "gen yacc") 368*333d2b36SAndroid Build Coastguard Worker } 369*333d2b36SAndroid Build Coastguard Worker 370*333d2b36SAndroid Build Coastguard Worker deps = append(deps, info.protoOrderOnlyDeps...) 371*333d2b36SAndroid Build Coastguard Worker deps = append(deps, info.aidlOrderOnlyDeps...) 372*333d2b36SAndroid Build Coastguard Worker deps = append(deps, info.syspropOrderOnlyDeps...) 373*333d2b36SAndroid Build Coastguard Worker 374*333d2b36SAndroid Build Coastguard Worker if len(rsFiles) > 0 { 375*333d2b36SAndroid Build Coastguard Worker deps = append(deps, rsGenerateCpp(ctx, rsFiles, buildFlags.rsFlags)...) 376*333d2b36SAndroid Build Coastguard Worker } 377*333d2b36SAndroid Build Coastguard Worker 378*333d2b36SAndroid Build Coastguard Worker return srcFiles, deps, info 379*333d2b36SAndroid Build Coastguard Worker} 380