Merge changes from topic 'genpath_yacc'

* changes:
  Add yacc generated headers to the include path
  Add subdir to GenPath
diff --git a/android/paths.go b/android/paths.go
index 56c3715..1202d6d 100644
--- a/android/paths.go
+++ b/android/paths.go
@@ -94,7 +94,7 @@
 }
 
 type genPathProvider interface {
-	genPathWithExt(ctx ModuleContext, ext string) ModuleGenPath
+	genPathWithExt(ctx ModuleContext, subdir, ext string) ModuleGenPath
 }
 type objPathProvider interface {
 	objPathWithExt(ctx ModuleContext, subdir, ext string) ModuleObjPath
@@ -105,9 +105,9 @@
 
 // GenPathWithExt derives a new file path in ctx's generated sources directory
 // from the current path, but with the new extension.
-func GenPathWithExt(ctx ModuleContext, p Path, ext string) ModuleGenPath {
+func GenPathWithExt(ctx ModuleContext, subdir string, p Path, ext string) ModuleGenPath {
 	if path, ok := p.(genPathProvider); ok {
-		return path.genPathWithExt(ctx, ext)
+		return path.genPathWithExt(ctx, subdir, ext)
 	}
 	reportPathError(ctx, "Tried to create generated file from unsupported path: %s(%s)", reflect.TypeOf(p).Name(), p)
 	return PathForModuleGen(ctx)
@@ -115,7 +115,7 @@
 
 // ObjPathWithExt derives a new file path in ctx's object directory from the
 // current path, but with the new extension.
-func ObjPathWithExt(ctx ModuleContext, p Path, subdir, ext string) ModuleObjPath {
+func ObjPathWithExt(ctx ModuleContext, subdir string, p Path, ext string) ModuleObjPath {
 	if path, ok := p.(objPathProvider); ok {
 		return path.objPathWithExt(ctx, subdir, ext)
 	}
@@ -535,8 +535,8 @@
 	return p.sourcePath.String()
 }
 
-func (p ModuleSrcPath) genPathWithExt(ctx ModuleContext, ext string) ModuleGenPath {
-	return PathForModuleGen(ctx, p.moduleDir, pathtools.ReplaceExtension(p.path, ext))
+func (p ModuleSrcPath) genPathWithExt(ctx ModuleContext, subdir, ext string) ModuleGenPath {
+	return PathForModuleGen(ctx, subdir, p.moduleDir, pathtools.ReplaceExtension(p.path, ext))
 }
 
 func (p ModuleSrcPath) objPathWithExt(ctx ModuleContext, subdir, ext string) ModuleObjPath {
@@ -583,9 +583,9 @@
 	}
 }
 
-func (p ModuleGenPath) genPathWithExt(ctx ModuleContext, ext string) ModuleGenPath {
+func (p ModuleGenPath) genPathWithExt(ctx ModuleContext, subdir, ext string) ModuleGenPath {
 	// TODO: make a different path for local vs remote generated files?
-	return PathForModuleGen(ctx, pathtools.ReplaceExtension(p.path, ext))
+	return PathForModuleGen(ctx, subdir, pathtools.ReplaceExtension(p.path, ext))
 }
 
 func (p ModuleGenPath) objPathWithExt(ctx ModuleContext, subdir, ext string) ModuleObjPath {
diff --git a/cc/builder.go b/cc/builder.go
index faa39d1..f795bba 100644
--- a/cc/builder.go
+++ b/cc/builder.go
@@ -234,7 +234,7 @@
 	}
 
 	for i, srcFile := range srcFiles {
-		objFile := android.ObjPathWithExt(ctx, srcFile, subdir, "o")
+		objFile := android.ObjPathWithExt(ctx, subdir, srcFile, "o")
 
 		objFiles[i] = objFile
 
@@ -285,7 +285,7 @@
 		})
 
 		if tidy {
-			tidyFile := android.ObjPathWithExt(ctx, srcFile, subdir, "tidy")
+			tidyFile := android.ObjPathWithExt(ctx, subdir, srcFile, "tidy")
 			tidyFiles = append(tidyFiles, tidyFile)
 
 			ctx.ModuleBuild(pctx, android.ModuleBuildParams{
diff --git a/cc/compiler.go b/cc/compiler.go
index 454be5e..a14f397 100644
--- a/cc/compiler.go
+++ b/cc/compiler.go
@@ -124,7 +124,7 @@
 	deps.GeneratedSources = append(deps.GeneratedSources, compiler.Properties.Generated_sources...)
 	deps.GeneratedHeaders = append(deps.GeneratedHeaders, compiler.Properties.Generated_headers...)
 
-	if compiler.hasProto() {
+	if compiler.hasSrcExt(".proto") {
 		deps = protoDeps(ctx, deps, &compiler.Proto)
 	}
 
@@ -322,16 +322,21 @@
 		flags.CFlags = append(flags.CFlags, "-DANDROID_STRICT")
 	}
 
-	if compiler.hasProto() {
+	if compiler.hasSrcExt(".proto") {
 		flags = protoFlags(ctx, flags, &compiler.Proto)
 	}
 
+	if compiler.hasSrcExt(".y") || compiler.hasSrcExt(".yy") {
+		flags.GlobalFlags = append(flags.GlobalFlags,
+			"-I"+android.PathForModuleGen(ctx, "yacc", ctx.ModuleDir()).String())
+	}
+
 	return flags
 }
 
-func (compiler *baseCompiler) hasProto() bool {
+func (compiler *baseCompiler) hasSrcExt(ext string) bool {
 	for _, src := range compiler.Properties.Srcs {
-		if filepath.Ext(src) == ".proto" {
+		if filepath.Ext(src) == ext {
 			return true
 		}
 	}
diff --git a/cc/gen.go b/cc/gen.go
index 1451895..9d3a67c 100644
--- a/cc/gen.go
+++ b/cc/gen.go
@@ -48,7 +48,7 @@
 )
 
 func genYacc(ctx android.ModuleContext, yaccFile android.Path, outFile android.ModuleGenPath, yaccFlags string) (headerFile android.ModuleGenPath) {
-	headerFile = android.GenPathWithExt(ctx, yaccFile, "h")
+	headerFile = android.GenPathWithExt(ctx, "yacc", yaccFile, "h")
 
 	ctx.ModuleBuild(pctx, android.ModuleBuildParams{
 		Rule:    yacc,
@@ -80,19 +80,19 @@
 	for i, srcFile := range srcFiles {
 		switch srcFile.Ext() {
 		case ".y":
-			cFile := android.GenPathWithExt(ctx, srcFile, "c")
+			cFile := android.GenPathWithExt(ctx, "yacc", srcFile, "c")
 			srcFiles[i] = cFile
 			deps = append(deps, genYacc(ctx, srcFile, cFile, buildFlags.yaccFlags))
 		case ".yy":
-			cppFile := android.GenPathWithExt(ctx, srcFile, "cpp")
+			cppFile := android.GenPathWithExt(ctx, "yacc", srcFile, "cpp")
 			srcFiles[i] = cppFile
 			deps = append(deps, genYacc(ctx, srcFile, cppFile, buildFlags.yaccFlags))
 		case ".l":
-			cFile := android.GenPathWithExt(ctx, srcFile, "c")
+			cFile := android.GenPathWithExt(ctx, "lex", srcFile, "c")
 			srcFiles[i] = cFile
 			genLex(ctx, srcFile, cFile)
 		case ".ll":
-			cppFile := android.GenPathWithExt(ctx, srcFile, "cpp")
+			cppFile := android.GenPathWithExt(ctx, "lex", srcFile, "cpp")
 			srcFiles[i] = cppFile
 			genLex(ctx, srcFile, cppFile)
 		case ".proto":
diff --git a/cc/library.go b/cc/library.go
index dcfc077..73efb9e 100644
--- a/cc/library.go
+++ b/cc/library.go
@@ -477,7 +477,7 @@
 	library.reexportFlags(deps.ReexportedFlags)
 	library.reexportDeps(deps.ReexportedFlagsDeps)
 
-	if library.baseCompiler.hasProto() {
+	if library.baseCompiler.hasSrcExt(".proto") {
 		if library.Properties.Proto.Export_proto_headers {
 			library.reexportFlags([]string{
 				"-I" + protoSubDir(ctx).String(),
diff --git a/cc/proto.go b/cc/proto.go
index 3d3ca59..51f5448 100644
--- a/cc/proto.go
+++ b/cc/proto.go
@@ -15,8 +15,6 @@
 package cc
 
 import (
-	"strings"
-
 	"github.com/google/blueprint"
 
 	"android/soong/android"
@@ -46,17 +44,14 @@
 func genProto(ctx android.ModuleContext, protoFile android.Path,
 	protoFlags string) (android.ModuleGenPath, android.ModuleGenPath) {
 
-	outDir := android.PathForModuleGen(ctx, "proto")
-	baseName := strings.TrimSuffix(protoFile.Base(), protoFile.Ext())
-
-	outFile := android.PathForModuleGen(ctx, "proto", ctx.ModuleDir(), baseName+".pb.cc")
-	headerFile := android.PathForModuleGen(ctx, "proto", ctx.ModuleDir(), baseName+".pb.h")
+	outFile := android.GenPathWithExt(ctx, "proto", protoFile, "pb.cc")
+	headerFile := android.GenPathWithExt(ctx, "proto", protoFile, "pb.h")
 	ctx.ModuleBuild(pctx, android.ModuleBuildParams{
 		Rule:    proto,
 		Outputs: android.WritablePaths{outFile, headerFile},
 		Input:   protoFile,
 		Args: map[string]string{
-			"outDir":     outDir.String(),
+			"outDir":     protoDir(ctx).String(),
 			"protoFlags": protoFlags,
 		},
 	})
diff --git a/genrule/genrule.go b/genrule/genrule.go
index f70c5fc..5ee8b0b 100644
--- a/genrule/genrule.go
+++ b/genrule/genrule.go
@@ -196,7 +196,7 @@
 		for _, in := range srcFiles {
 			tasks = append(tasks, generateTask{
 				in:  android.Paths{in},
-				out: android.WritablePaths{android.GenPathWithExt(ctx, in, properties.Output_extension)},
+				out: android.WritablePaths{android.GenPathWithExt(ctx, "", in, properties.Output_extension)},
 			})
 		}
 		return tasks
diff --git a/java/gen.go b/java/gen.go
index 52a0c79..0624708 100644
--- a/java/gen.go
+++ b/java/gen.go
@@ -57,7 +57,7 @@
 )
 
 func genAidl(ctx android.ModuleContext, aidlFile android.Path, aidlFlags string) android.Path {
-	javaFile := android.GenPathWithExt(ctx, aidlFile, "java")
+	javaFile := android.GenPathWithExt(ctx, "aidl", aidlFile, "java")
 	depFile := javaFile.String() + ".d"
 
 	ctx.ModuleBuild(pctx, android.ModuleBuildParams{
@@ -74,7 +74,7 @@
 }
 
 func genLogtags(ctx android.ModuleContext, logtagsFile android.Path) android.Path {
-	javaFile := android.GenPathWithExt(ctx, logtagsFile, "java")
+	javaFile := android.GenPathWithExt(ctx, "logtags", logtagsFile, "java")
 
 	ctx.ModuleBuild(pctx, android.ModuleBuildParams{
 		Rule:   logtags,