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:
parent
633c502295
commit
4e0aa23dd3
7 changed files with 78 additions and 34 deletions
|
@ -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":
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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 {
|
||||
|
|
3
cc/cc.go
3
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 {
|
||||
|
|
|
@ -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)
|
||||
|
|
89
cc/gen.go
89
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)...)
|
||||
}
|
||||
|
|
|
@ -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,
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue