diff --git a/android/config.go b/android/config.go index ed05c7267..0191e3850 100644 --- a/android/config.go +++ b/android/config.go @@ -405,6 +405,10 @@ func (c *config) GoRoot() string { return fmt.Sprintf("%s/prebuilts/go/%s", c.srcDir, c.PrebuiltOS()) } +func (c *config) PrebuiltBuildTool(ctx PathContext, tool string) Path { + return PathForSource(ctx, "prebuilts/build-tools", c.PrebuiltOS(), "bin", tool) +} + func (c *config) CpPreserveSymlinksFlags() string { switch runtime.GOOS { case "darwin": diff --git a/androidmk/cmd/androidmk/android.go b/androidmk/cmd/androidmk/android.go index e0932af38..b54ad5e00 100644 --- a/androidmk/cmd/androidmk/android.go +++ b/androidmk/cmd/androidmk/android.go @@ -131,7 +131,7 @@ func init() { "LOCAL_OVERRIDES_MODULES": "overrides", "LOCAL_LDLIBS": "host_ldlibs", "LOCAL_CLANG_CFLAGS": "clang_cflags", - "LOCAL_YACCFLAGS": "yaccflags", + "LOCAL_YACCFLAGS": "yacc.flags", "LOCAL_SANITIZE_RECOVER": "sanitize.recover", "LOCAL_LOGTAGS_FILES": "logtags", "LOCAL_EXPORT_HEADER_LIBRARY_HEADERS": "export_header_lib_headers", diff --git a/cc/builder.go b/cc/builder.go index 65369d621..87db6455a 100644 --- a/cc/builder.go +++ b/cc/builder.go @@ -239,7 +239,6 @@ type builderFlags struct { cppFlags string ldFlags string libFlags string - yaccFlags string tidyFlags string sAbiFlags string yasmFlags string @@ -262,6 +261,8 @@ type builderFlags struct { proto android.ProtoFlags protoC bool protoOptionsFile bool + + yacc *YaccProperties } type Objects struct { diff --git a/cc/cc.go b/cc/cc.go index 0668fd9aa..bec39ca9b 100644 --- a/cc/cc.go +++ b/cc/cc.go @@ -136,7 +136,6 @@ type Flags struct { ConlyFlags []string // Flags that apply to C source files CppFlags []string // Flags that apply to C++ source files ToolingCppFlags []string // Flags that apply to C++ source files parsed by clang LibTooling tools - YaccFlags []string // Flags that apply to Yacc source files aidlFlags []string // Flags that apply to aidl source files rsFlags []string // Flags that apply to renderscript source files LdFlags []string // Flags that apply to linker command lines @@ -165,6 +164,8 @@ type Flags struct { proto android.ProtoFlags protoC bool // Whether to use C instead of C++ protoOptionsFile bool // Whether to look for a .options file next to the .proto + + Yacc *YaccProperties } type ObjectLinkerProperties struct { diff --git a/cc/compiler.go b/cc/compiler.go index f9af4d829..7667ae7ab 100644 --- a/cc/compiler.go +++ b/cc/compiler.go @@ -57,9 +57,6 @@ type BaseCompilerProperties struct { // compiling with clang Clang_asflags []string `android:"arch_variant"` - // list of module-specific flags that will be used for .y and .yy compiles - Yaccflags []string - // the instruction set architecture to use to compile the C/C++ // module. Instruction_set *string `android:"arch_variant"` @@ -103,6 +100,8 @@ type BaseCompilerProperties struct { // if set to false, use -std=c++* instead of -std=gnu++* Gnu_extensions *bool + Yacc *YaccProperties + Aidl struct { // list of directories that will be added to the aidl include paths. Include_dirs []string @@ -275,7 +274,8 @@ func (compiler *baseCompiler) compilerFlags(ctx ModuleContext, flags Flags, deps flags.ConlyFlags = append(flags.ConlyFlags, esc(compiler.Properties.Conlyflags)...) flags.AsFlags = append(flags.AsFlags, esc(compiler.Properties.Asflags)...) flags.YasmFlags = append(flags.YasmFlags, esc(compiler.Properties.Asflags)...) - flags.YaccFlags = append(flags.YaccFlags, esc(compiler.Properties.Yaccflags)...) + + flags.Yacc = compiler.Properties.Yacc // Include dir cflags localIncludeDirs := android.PathsForModuleSrc(ctx, compiler.Properties.Local_include_dirs) diff --git a/cc/gen.go b/cc/gen.go index 0c3d089f4..ae761d036 100644 --- a/cc/gen.go +++ b/cc/gen.go @@ -24,21 +24,12 @@ import ( func init() { pctx.SourcePathVariable("lexCmd", "prebuilts/build-tools/${config.HostPrebuiltTag}/bin/flex") - pctx.SourcePathVariable("yaccCmd", "prebuilts/build-tools/${config.HostPrebuiltTag}/bin/bison") - pctx.SourcePathVariable("yaccDataDir", "prebuilts/build-tools/common/bison") pctx.HostBinToolVariable("aidlCmd", "aidl-cpp") pctx.HostBinToolVariable("syspropCmd", "sysprop_cpp") } var ( - yacc = pctx.AndroidStaticRule("yacc", - blueprint.RuleParams{ - Command: "BISON_PKGDATADIR=$yaccDataDir $yaccCmd -d $yaccFlags --defines=$hFile -o $out $in", - CommandDeps: []string{"$yaccCmd"}, - }, - "yaccFlags", "hFile") - lex = pctx.AndroidStaticRule("lex", blueprint.RuleParams{ Command: "$lexCmd -o$out $in", @@ -70,22 +61,57 @@ var ( "windmcCmd") ) -func genYacc(ctx android.ModuleContext, yaccFile android.Path, outFile android.ModuleGenPath, yaccFlags string) (headerFile android.ModuleGenPath) { - headerFile = android.GenPathWithExt(ctx, "yacc", yaccFile, "h") +type YaccProperties struct { + // list of module-specific flags that will be used for .y and .yy compiles + Flags []string - ctx.Build(pctx, android.BuildParams{ - Rule: yacc, - Description: "yacc " + yaccFile.Rel(), - Output: outFile, - ImplicitOutput: headerFile, - Input: yaccFile, - Args: map[string]string{ - "yaccFlags": yaccFlags, - "hFile": headerFile.String(), - }, - }) + // whether the yacc files will produce a location.hh file + Gen_location_hh *bool - return headerFile + // whether the yacc files will product a position.hh file + Gen_position_hh *bool +} + +func genYacc(ctx android.ModuleContext, rule *android.RuleBuilder, yaccFile android.Path, + outFile android.ModuleGenPath, props *YaccProperties) (headerFiles android.Paths) { + + outDir := android.PathForModuleGen(ctx, "yacc") + headerFile := android.GenPathWithExt(ctx, "yacc", yaccFile, "h") + ret := android.Paths{headerFile} + + cmd := rule.Command() + + // Fix up #line markers to not use the sbox temporary directory + sedCmd := "sed -i.bak 's#__SBOX_OUT_DIR__#" + outDir.String() + "#'" + rule.Command().Text(sedCmd).Input(outFile) + rule.Command().Text(sedCmd).Input(headerFile) + + var flags []string + if props != nil { + flags = props.Flags + + if Bool(props.Gen_location_hh) { + locationHeader := outFile.InSameDir(ctx, "location.hh") + ret = append(ret, locationHeader) + cmd.ImplicitOutput(locationHeader) + rule.Command().Text(sedCmd).Input(locationHeader) + } + if Bool(props.Gen_position_hh) { + positionHeader := outFile.InSameDir(ctx, "position.hh") + ret = append(ret, positionHeader) + cmd.ImplicitOutput(positionHeader) + rule.Command().Text(sedCmd).Input(positionHeader) + } + } + + cmd.Text("BISON_PKGDATADIR=prebuilts/build-tools/common/bison"). + Tool(ctx.Config().PrebuiltBuildTool(ctx, "bison")). + Flag("-d"). + Flags(flags). + FlagWithOutput("--defines=", headerFile). + Flag("-o").Output(outFile).Input(yaccFile) + + return ret } func genAidl(ctx android.ModuleContext, aidlFile android.Path, outFile android.ModuleGenPath, aidlFlags string) android.Paths { @@ -159,19 +185,26 @@ func genSources(ctx android.ModuleContext, srcFiles android.Paths, buildFlags builderFlags) (android.Paths, android.Paths) { var deps android.Paths - var rsFiles android.Paths + var yaccRule_ *android.RuleBuilder + yaccRule := func() *android.RuleBuilder { + if yaccRule_ == nil { + yaccRule_ = android.NewRuleBuilder().Sbox(android.PathForModuleGen(ctx, "yacc")) + } + return yaccRule_ + } + for i, srcFile := range srcFiles { switch srcFile.Ext() { case ".y": cFile := android.GenPathWithExt(ctx, "yacc", srcFile, "c") srcFiles[i] = cFile - deps = append(deps, genYacc(ctx, srcFile, cFile, buildFlags.yaccFlags)) + deps = append(deps, genYacc(ctx, yaccRule(), srcFile, cFile, buildFlags.yacc)...) case ".yy": cppFile := android.GenPathWithExt(ctx, "yacc", srcFile, "cpp") srcFiles[i] = cppFile - deps = append(deps, genYacc(ctx, srcFile, cppFile, buildFlags.yaccFlags)) + deps = append(deps, genYacc(ctx, yaccRule(), srcFile, cppFile, buildFlags.yacc)...) case ".l": cFile := android.GenPathWithExt(ctx, "lex", srcFile, "c") srcFiles[i] = cFile @@ -203,6 +236,10 @@ func genSources(ctx android.ModuleContext, srcFiles android.Paths, } } + if yaccRule_ != nil { + yaccRule_.Build(pctx, ctx, "yacc", "gen yacc") + } + if len(rsFiles) > 0 { deps = append(deps, rsGenerateCpp(ctx, rsFiles, buildFlags.rsFlags)...) } diff --git a/cc/util.go b/cc/util.go index 5dcbaeffb..3862728bb 100644 --- a/cc/util.go +++ b/cc/util.go @@ -67,7 +67,6 @@ func flagsToBuilderFlags(in Flags) builderFlags { toolingCppFlags: strings.Join(in.ToolingCppFlags, " "), conlyFlags: strings.Join(in.ConlyFlags, " "), cppFlags: strings.Join(in.CppFlags, " "), - yaccFlags: strings.Join(in.YaccFlags, " "), aidlFlags: strings.Join(in.aidlFlags, " "), rsFlags: strings.Join(in.rsFlags, " "), ldFlags: strings.Join(in.LdFlags, " "), @@ -87,6 +86,8 @@ func flagsToBuilderFlags(in Flags) builderFlags { proto: in.proto, protoC: in.protoC, protoOptionsFile: in.protoOptionsFile, + + yacc: in.Yacc, } }