1 // Copyright 2015 Google Inc. All rights reserved. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 package cc 16 17 // This file generates the final rules for compiling all C/C++. All properties related to 18 // compiling should have been translated into builderFlags or another argument to the Transform* 19 // functions. 20 21 import ( 22 "github.com/google/blueprint" 23 24 "android/soong/common" 25 ) 26 27 func init() { 28 pctx.SourcePathVariable("lexCmd", "prebuilts/misc/${HostPrebuiltTag}/flex/flex-2.5.39") 29 pctx.SourcePathVariable("yaccCmd", "prebuilts/misc/${HostPrebuiltTag}/bison/bison") 30 pctx.SourcePathVariable("yaccDataDir", "external/bison/data") 31 } 32 33 var ( 34 yacc = pctx.StaticRule("yacc", 35 blueprint.RuleParams{ 36 Command: "BISON_PKGDATADIR=$yaccDataDir $yaccCmd -d $yaccFlags --defines=$hFile -o $cFile $in", 37 CommandDeps: []string{"$yaccCmd"}, 38 Description: "yacc $out", 39 }, 40 "yaccFlags", "cFile", "hFile") 41 42 lex = pctx.StaticRule("lex", 43 blueprint.RuleParams{ 44 Command: "$lexCmd -o$out $in", 45 CommandDeps: []string{"$lexCmd"}, 46 Description: "lex $out", 47 }) 48 ) 49 50 func genYacc(ctx common.AndroidModuleContext, yaccFile common.Path, outFile common.ModuleGenPath, yaccFlags string) (headerFile common.ModuleGenPath) { 51 headerFile = common.GenPathWithExt(ctx, yaccFile, "h") 52 53 ctx.ModuleBuild(pctx, common.ModuleBuildParams{ 54 Rule: yacc, 55 Outputs: common.WritablePaths{outFile, headerFile}, 56 Input: yaccFile, 57 Args: map[string]string{ 58 "yaccFlags": yaccFlags, 59 "cFile": outFile.String(), 60 "hFile": headerFile.String(), 61 }, 62 }) 63 64 return headerFile 65 } 66 67 func genLex(ctx common.AndroidModuleContext, lexFile common.Path, outFile common.ModuleGenPath) { 68 ctx.ModuleBuild(pctx, common.ModuleBuildParams{ 69 Rule: lex, 70 Output: outFile, 71 Input: lexFile, 72 }) 73 } 74 75 func genSources(ctx common.AndroidModuleContext, srcFiles common.Paths, 76 buildFlags builderFlags) (common.Paths, common.Paths) { 77 78 var deps common.Paths 79 80 for i, srcFile := range srcFiles { 81 switch srcFile.Ext() { 82 case ".y": 83 cFile := common.GenPathWithExt(ctx, srcFile, "c") 84 srcFiles[i] = cFile 85 deps = append(deps, genYacc(ctx, srcFile, cFile, buildFlags.yaccFlags)) 86 case ".yy": 87 cppFile := common.GenPathWithExt(ctx, srcFile, "cpp") 88 srcFiles[i] = cppFile 89 deps = append(deps, genYacc(ctx, srcFile, cppFile, buildFlags.yaccFlags)) 90 case ".l": 91 cFile := common.GenPathWithExt(ctx, srcFile, "c") 92 srcFiles[i] = cFile 93 genLex(ctx, srcFile, cFile) 94 case ".ll": 95 cppFile := common.GenPathWithExt(ctx, srcFile, "cpp") 96 srcFiles[i] = cppFile 97 genLex(ctx, srcFile, cppFile) 98 } 99 } 100 101 return srcFiles, deps 102 } 103