Convert yacc to a single RuleBuilder rule

So that <module>/gen/yacc/... is (re)created by a single rule, previous
files are removed, and location.hh is in the build graph when it is
produced.

Test: treehugger
Change-Id: I2f6e47ea07f315e10ae1cb8ad50697e7123d0285
This commit is contained in:
Dan Willemsen 2019-04-10 22:59:54 -07:00
parent 633c502295
commit 4e0aa23dd3
7 changed files with 78 additions and 34 deletions

View file

@ -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":

View file

@ -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",

View file

@ -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 {

View file

@ -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 {

View file

@ -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)

View file

@ -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)...)
}

View file

@ -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,
}
}