Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 60e62f0c authored by Dan Willemsen's avatar Dan Willemsen
Browse files

Add nanopb-c support

Test: cd hardware/ril; mma
Change-Id: Id1481940d15a2a3f6eb29af54ee30080ff2286cb
parent 8ba47246
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -351,6 +351,10 @@ func (c *config) BlueprintToolLocation() string {

var _ bootstrap.ConfigBlueprintToolLocation = (*config)(nil)

func (c *config) HostToolPath(ctx PathContext, tool string) Path {
	return PathForOutput(ctx, "host", c.PrebuiltOS(), "bin", tool)
}

// HostSystemTool looks for non-hermetic tools from the system we're running on.
// Generally shouldn't be used, but useful to find the XCode SDK, etc.
func (c *config) HostSystemTool(name string) string {
+8 −3
Original line number Diff line number Diff line
@@ -231,8 +231,6 @@ type builderFlags struct {
	ldFlags         string
	libFlags        string
	yaccFlags       string
	protoFlags      string
	protoOutParams  string
	tidyFlags       string
	sAbiFlags       string
	yasmFlags       string
@@ -242,7 +240,6 @@ type builderFlags struct {
	tidy            bool
	coverage        bool
	sAbiDump        bool
	protoRoot       bool

	systemIncludeFlags string

@@ -252,6 +249,14 @@ type builderFlags struct {
	stripKeepMiniDebugInfo bool
	stripAddGnuDebuglink   bool
	stripUseLlvmStrip      bool

	protoDeps        android.Paths
	protoFlags       string
	protoOutTypeFlag string
	protoOutParams   string
	protoC           bool
	protoOptionsFile bool
	protoRoot        bool
}

type Objects struct {
+8 −3
Original line number Diff line number Diff line
@@ -130,8 +130,6 @@ type Flags struct {
	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
	protoFlags      []string // Flags that apply to proto source files
	protoOutParams  []string // Flags that modify the output of proto generated 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
@@ -148,7 +146,6 @@ type Flags struct {
	Tidy      bool
	Coverage  bool
	SAbiDump  bool
	ProtoRoot bool

	RequiredInstructionSet string
	DynamicLinker          string
@@ -157,6 +154,14 @@ type Flags struct {
	LdFlagsDeps android.Paths // Files depended on by linker flags

	GroupStaticLibs bool

	protoDeps        android.Paths
	protoFlags       []string // Flags that apply to proto source files
	protoOutTypeFlag string   // The output type, --cpp_out for example
	protoOutParams   []string // Flags that modify the output of proto generated files
	protoC           bool     // Whether to use C instead of C++
	protoOptionsFile bool     // Whether to look for a .options file next to the .proto
	ProtoRoot        bool
}

type ObjectLinkerProperties struct {
+1 −2
Original line number Diff line number Diff line
@@ -182,8 +182,7 @@ func genSources(ctx android.ModuleContext, srcFiles android.Paths,
			srcFiles[i] = cppFile
			genLex(ctx, srcFile, cppFile)
		case ".proto":
			ccFile, headerFile := genProto(ctx, srcFile, buildFlags.protoFlags,
				buildFlags.protoOutParams, buildFlags.protoRoot)
			ccFile, headerFile := genProto(ctx, srcFile, buildFlags)
			srcFiles[i] = ccFile
			deps = append(deps, headerFile)
		case ".aidl":
+56 −10
Original line number Diff line number Diff line
@@ -31,41 +31,56 @@ func init() {
var (
	proto = pctx.AndroidStaticRule("protoc",
		blueprint.RuleParams{
			Command: "$protocCmd --cpp_out=$protoOutParams:$outDir --dependency_out=$out.d -I $protoBase $protoFlags $in && " +
			Command: "$protocCmd $protoOut=$protoOutParams:$outDir --dependency_out=$out.d -I $protoBase $protoFlags $in && " +
				`$depFixCmd $out.d`,
			CommandDeps: []string{"$protocCmd", "$depFixCmd"},
			Depfile:     "${out}.d",
			Deps:        blueprint.DepsGCC,
		}, "protoFlags", "protoOutParams", "protoBase", "outDir")
		}, "protoFlags", "protoOut", "protoOutParams", "protoBase", "outDir")
)

// genProto creates a rule to convert a .proto file to generated .pb.cc and .pb.h files and returns
// the paths to the generated files.
func genProto(ctx android.ModuleContext, protoFile android.Path,
	protoFlags, protoOutParams string, root bool) (ccFile, headerFile android.WritablePath) {
func genProto(ctx android.ModuleContext, protoFile android.Path, flags builderFlags) (ccFile, headerFile android.WritablePath) {

	srcSuffix := ".cc"
	if flags.protoC {
		srcSuffix = ".c"
	}

	var protoBase string
	if root {
	if flags.protoRoot {
		protoBase = "."
		ccFile = android.GenPathWithExt(ctx, "proto", protoFile, "pb.cc")
		ccFile = android.GenPathWithExt(ctx, "proto", protoFile, "pb"+srcSuffix)
		headerFile = android.GenPathWithExt(ctx, "proto", protoFile, "pb.h")
	} else {
		rel := protoFile.Rel()
		protoBase = strings.TrimSuffix(protoFile.String(), rel)
		ccFile = android.PathForModuleGen(ctx, "proto", pathtools.ReplaceExtension(rel, "pb.cc"))
		ccFile = android.PathForModuleGen(ctx, "proto", pathtools.ReplaceExtension(rel, "pb"+srcSuffix))
		headerFile = android.PathForModuleGen(ctx, "proto", pathtools.ReplaceExtension(rel, "pb.h"))
	}

	protoDeps := flags.protoDeps
	if flags.protoOptionsFile {
		optionsFile := pathtools.ReplaceExtension(protoFile.String(), "options")
		optionsPath := android.ExistentPathForSource(ctx, optionsFile)
		if optionsPath.Valid() {
			protoDeps = append(android.Paths{optionsPath.Path()}, protoDeps...)
		}
	}

	ctx.Build(pctx, android.BuildParams{
		Rule:           proto,
		Description:    "protoc " + protoFile.Rel(),
		Output:         ccFile,
		ImplicitOutput: headerFile,
		Input:          protoFile,
		Implicits:      protoDeps,
		Args: map[string]string{
			"outDir":         android.ProtoDir(ctx).String(),
			"protoFlags":     protoFlags,
			"protoOutParams": protoOutParams,
			"protoFlags":     flags.protoFlags,
			"protoOut":       flags.protoOutTypeFlag,
			"protoOutParams": flags.protoOutParams,
			"protoBase":      protoBase,
		},
	})
@@ -91,6 +106,12 @@ func protoDeps(ctx BaseModuleContext, deps Deps, p *android.ProtoProperties, sta
		} else {
			lib = "libprotobuf-cpp-lite"
		}
	case "nanopb-c":
		lib = "libprotobuf-c-nano"
		static = true
	case "nanopb-c-enable_malloc":
		lib = "libprotobuf-c-nano-enable_malloc"
		static = true
	default:
		ctx.PropertyErrorf("proto.type", "unknown proto type %q",
			String(p.Proto.Type))
@@ -118,8 +139,33 @@ func protoFlags(ctx ModuleContext, flags Flags, p *android.ProtoProperties) Flag

	flags.protoFlags = android.ProtoFlags(ctx, p)

	if String(p.Proto.Type) == "lite" {
	var plugin string

	switch String(p.Proto.Type) {
	case "nanopb-c", "nanopb-c-enable_malloc":
		flags.protoC = true
		flags.protoOptionsFile = true
		flags.protoOutTypeFlag = "--nanopb_out"
		plugin = "protoc-gen-nanopb"
	case "full":
		flags.protoOutTypeFlag = "--cpp_out"
	case "lite":
		flags.protoOutTypeFlag = "--cpp_out"
		flags.protoOutParams = append(flags.protoOutParams, "lite")
	case "":
		// TODO(b/119714316): this should be equivalent to "lite" in
		// order to match protoDeps, but some modules are depending on
		// this behavior
		flags.protoOutTypeFlag = "--cpp_out"
	default:
		ctx.PropertyErrorf("proto.type", "unknown proto type %q",
			String(p.Proto.Type))
	}

	if plugin != "" {
		path := ctx.Config().HostToolPath(ctx, plugin)
		flags.protoDeps = append(flags.protoDeps, path)
		flags.protoFlags = append(flags.protoFlags, "--plugin="+path.String())
	}

	return flags
Loading