xref: /aosp_15_r20/build/soong/cc/proto.go (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
1*333d2b36SAndroid Build Coastguard Worker// Copyright 2016 Google Inc. All rights reserved.
2*333d2b36SAndroid Build Coastguard Worker//
3*333d2b36SAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License");
4*333d2b36SAndroid Build Coastguard Worker// you may not use this file except in compliance with the License.
5*333d2b36SAndroid Build Coastguard Worker// You may obtain a copy of the License at
6*333d2b36SAndroid Build Coastguard Worker//
7*333d2b36SAndroid Build Coastguard Worker//     http://www.apache.org/licenses/LICENSE-2.0
8*333d2b36SAndroid Build Coastguard Worker//
9*333d2b36SAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software
10*333d2b36SAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS,
11*333d2b36SAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*333d2b36SAndroid Build Coastguard Worker// See the License for the specific language governing permissions and
13*333d2b36SAndroid Build Coastguard Worker// limitations under the License.
14*333d2b36SAndroid Build Coastguard Worker
15*333d2b36SAndroid Build Coastguard Workerpackage cc
16*333d2b36SAndroid Build Coastguard Worker
17*333d2b36SAndroid Build Coastguard Workerimport (
18*333d2b36SAndroid Build Coastguard Worker	"github.com/google/blueprint/pathtools"
19*333d2b36SAndroid Build Coastguard Worker	"github.com/google/blueprint/proptools"
20*333d2b36SAndroid Build Coastguard Worker
21*333d2b36SAndroid Build Coastguard Worker	"android/soong/android"
22*333d2b36SAndroid Build Coastguard Worker
23*333d2b36SAndroid Build Coastguard Worker	"strings"
24*333d2b36SAndroid Build Coastguard Worker)
25*333d2b36SAndroid Build Coastguard Worker
26*333d2b36SAndroid Build Coastguard Workerconst (
27*333d2b36SAndroid Build Coastguard Worker	protoTypeDefault = "lite"
28*333d2b36SAndroid Build Coastguard Worker)
29*333d2b36SAndroid Build Coastguard Worker
30*333d2b36SAndroid Build Coastguard Worker// genProto creates a rule to convert a .proto file to generated .pb.cc and .pb.h files and returns
31*333d2b36SAndroid Build Coastguard Worker// the paths to the generated files.
32*333d2b36SAndroid Build Coastguard Workerfunc genProto(ctx android.ModuleContext, protoFile android.Path, flags builderFlags) (cc, header android.WritablePath) {
33*333d2b36SAndroid Build Coastguard Worker	var ccFile, headerFile android.ModuleGenPath
34*333d2b36SAndroid Build Coastguard Worker
35*333d2b36SAndroid Build Coastguard Worker	srcSuffix := ".cc"
36*333d2b36SAndroid Build Coastguard Worker	if flags.protoC {
37*333d2b36SAndroid Build Coastguard Worker		srcSuffix = ".c"
38*333d2b36SAndroid Build Coastguard Worker	}
39*333d2b36SAndroid Build Coastguard Worker
40*333d2b36SAndroid Build Coastguard Worker	srcInfix := "pb"
41*333d2b36SAndroid Build Coastguard Worker	for _, value := range flags.proto.Flags {
42*333d2b36SAndroid Build Coastguard Worker		if strings.HasPrefix(value, "--plugin=") && strings.HasSuffix(value, "protoc-gen-grpc-cpp-plugin") {
43*333d2b36SAndroid Build Coastguard Worker			srcInfix = "grpc.pb"
44*333d2b36SAndroid Build Coastguard Worker			break
45*333d2b36SAndroid Build Coastguard Worker		}
46*333d2b36SAndroid Build Coastguard Worker	}
47*333d2b36SAndroid Build Coastguard Worker
48*333d2b36SAndroid Build Coastguard Worker	if flags.proto.CanonicalPathFromRoot {
49*333d2b36SAndroid Build Coastguard Worker		ccFile = android.GenPathWithExt(ctx, "proto", protoFile, srcInfix+srcSuffix)
50*333d2b36SAndroid Build Coastguard Worker		headerFile = android.GenPathWithExt(ctx, "proto", protoFile, srcInfix+".h")
51*333d2b36SAndroid Build Coastguard Worker	} else {
52*333d2b36SAndroid Build Coastguard Worker		rel := protoFile.Rel()
53*333d2b36SAndroid Build Coastguard Worker		ccFile = android.PathForModuleGen(ctx, "proto", pathtools.ReplaceExtension(rel, srcInfix+srcSuffix))
54*333d2b36SAndroid Build Coastguard Worker		headerFile = android.PathForModuleGen(ctx, "proto", pathtools.ReplaceExtension(rel, srcInfix+".h"))
55*333d2b36SAndroid Build Coastguard Worker	}
56*333d2b36SAndroid Build Coastguard Worker
57*333d2b36SAndroid Build Coastguard Worker	protoDeps := flags.proto.Deps
58*333d2b36SAndroid Build Coastguard Worker	if flags.protoOptionsFile {
59*333d2b36SAndroid Build Coastguard Worker		optionsFile := pathtools.ReplaceExtension(protoFile.String(), "options")
60*333d2b36SAndroid Build Coastguard Worker		optionsPath := android.PathForSource(ctx, optionsFile)
61*333d2b36SAndroid Build Coastguard Worker		protoDeps = append(android.Paths{optionsPath}, protoDeps...)
62*333d2b36SAndroid Build Coastguard Worker	}
63*333d2b36SAndroid Build Coastguard Worker
64*333d2b36SAndroid Build Coastguard Worker	outDir := flags.proto.Dir
65*333d2b36SAndroid Build Coastguard Worker	depFile := ccFile.ReplaceExtension(ctx, "d")
66*333d2b36SAndroid Build Coastguard Worker	outputs := android.WritablePaths{ccFile, headerFile}
67*333d2b36SAndroid Build Coastguard Worker
68*333d2b36SAndroid Build Coastguard Worker	rule := android.NewRuleBuilder(pctx, ctx)
69*333d2b36SAndroid Build Coastguard Worker
70*333d2b36SAndroid Build Coastguard Worker	android.ProtoRule(rule, protoFile, flags.proto, protoDeps, outDir, depFile, outputs)
71*333d2b36SAndroid Build Coastguard Worker
72*333d2b36SAndroid Build Coastguard Worker	rule.Build("protoc_"+protoFile.Rel(), "protoc "+protoFile.Rel())
73*333d2b36SAndroid Build Coastguard Worker
74*333d2b36SAndroid Build Coastguard Worker	return ccFile, headerFile
75*333d2b36SAndroid Build Coastguard Worker}
76*333d2b36SAndroid Build Coastguard Worker
77*333d2b36SAndroid Build Coastguard Workerfunc protoDeps(ctx DepsContext, deps Deps, p *android.ProtoProperties, static bool) Deps {
78*333d2b36SAndroid Build Coastguard Worker	var lib string
79*333d2b36SAndroid Build Coastguard Worker
80*333d2b36SAndroid Build Coastguard Worker	if String(p.Proto.Plugin) == "" {
81*333d2b36SAndroid Build Coastguard Worker		switch proptools.StringDefault(p.Proto.Type, protoTypeDefault) {
82*333d2b36SAndroid Build Coastguard Worker		case "full":
83*333d2b36SAndroid Build Coastguard Worker			if ctx.useSdk() {
84*333d2b36SAndroid Build Coastguard Worker				lib = "libprotobuf-cpp-full-ndk"
85*333d2b36SAndroid Build Coastguard Worker				static = true
86*333d2b36SAndroid Build Coastguard Worker			} else {
87*333d2b36SAndroid Build Coastguard Worker				lib = "libprotobuf-cpp-full"
88*333d2b36SAndroid Build Coastguard Worker			}
89*333d2b36SAndroid Build Coastguard Worker		case "lite":
90*333d2b36SAndroid Build Coastguard Worker			if ctx.useSdk() {
91*333d2b36SAndroid Build Coastguard Worker				lib = "libprotobuf-cpp-lite-ndk"
92*333d2b36SAndroid Build Coastguard Worker				static = true
93*333d2b36SAndroid Build Coastguard Worker			} else {
94*333d2b36SAndroid Build Coastguard Worker				lib = "libprotobuf-cpp-lite"
95*333d2b36SAndroid Build Coastguard Worker			}
96*333d2b36SAndroid Build Coastguard Worker		case "nanopb-c":
97*333d2b36SAndroid Build Coastguard Worker			lib = "libprotobuf-c-nano"
98*333d2b36SAndroid Build Coastguard Worker			static = true
99*333d2b36SAndroid Build Coastguard Worker		case "nanopb-c-enable_malloc":
100*333d2b36SAndroid Build Coastguard Worker			lib = "libprotobuf-c-nano-enable_malloc"
101*333d2b36SAndroid Build Coastguard Worker			static = true
102*333d2b36SAndroid Build Coastguard Worker		case "nanopb-c-16bit":
103*333d2b36SAndroid Build Coastguard Worker			lib = "libprotobuf-c-nano-16bit"
104*333d2b36SAndroid Build Coastguard Worker			static = true
105*333d2b36SAndroid Build Coastguard Worker		case "nanopb-c-enable_malloc-16bit":
106*333d2b36SAndroid Build Coastguard Worker			lib = "libprotobuf-c-nano-enable_malloc-16bit"
107*333d2b36SAndroid Build Coastguard Worker			static = true
108*333d2b36SAndroid Build Coastguard Worker		case "nanopb-c-32bit":
109*333d2b36SAndroid Build Coastguard Worker			lib = "libprotobuf-c-nano-32bit"
110*333d2b36SAndroid Build Coastguard Worker			static = true
111*333d2b36SAndroid Build Coastguard Worker		case "nanopb-c-enable_malloc-32bit":
112*333d2b36SAndroid Build Coastguard Worker			lib = "libprotobuf-c-nano-enable_malloc-32bit"
113*333d2b36SAndroid Build Coastguard Worker			static = true
114*333d2b36SAndroid Build Coastguard Worker		default:
115*333d2b36SAndroid Build Coastguard Worker			ctx.PropertyErrorf("proto.type", "unknown proto type %q",
116*333d2b36SAndroid Build Coastguard Worker				String(p.Proto.Type))
117*333d2b36SAndroid Build Coastguard Worker		}
118*333d2b36SAndroid Build Coastguard Worker
119*333d2b36SAndroid Build Coastguard Worker		if static {
120*333d2b36SAndroid Build Coastguard Worker			deps.StaticLibs = append(deps.StaticLibs, lib)
121*333d2b36SAndroid Build Coastguard Worker			deps.ReexportStaticLibHeaders = append(deps.ReexportStaticLibHeaders, lib)
122*333d2b36SAndroid Build Coastguard Worker		} else {
123*333d2b36SAndroid Build Coastguard Worker			deps.SharedLibs = append(deps.SharedLibs, lib)
124*333d2b36SAndroid Build Coastguard Worker			deps.ReexportSharedLibHeaders = append(deps.ReexportSharedLibHeaders, lib)
125*333d2b36SAndroid Build Coastguard Worker		}
126*333d2b36SAndroid Build Coastguard Worker	}
127*333d2b36SAndroid Build Coastguard Worker
128*333d2b36SAndroid Build Coastguard Worker	return deps
129*333d2b36SAndroid Build Coastguard Worker}
130*333d2b36SAndroid Build Coastguard Worker
131*333d2b36SAndroid Build Coastguard Workerfunc protoFlags(ctx ModuleContext, flags Flags, p *android.ProtoProperties) Flags {
132*333d2b36SAndroid Build Coastguard Worker	flags.Local.CFlags = append(flags.Local.CFlags, "-DGOOGLE_PROTOBUF_NO_RTTI")
133*333d2b36SAndroid Build Coastguard Worker
134*333d2b36SAndroid Build Coastguard Worker	flags.proto = android.GetProtoFlags(ctx, p)
135*333d2b36SAndroid Build Coastguard Worker	if flags.proto.CanonicalPathFromRoot {
136*333d2b36SAndroid Build Coastguard Worker		flags.Local.CommonFlags = append(flags.Local.CommonFlags, "-I"+flags.proto.SubDir.String())
137*333d2b36SAndroid Build Coastguard Worker	}
138*333d2b36SAndroid Build Coastguard Worker	flags.Local.CommonFlags = append(flags.Local.CommonFlags, "-I"+flags.proto.Dir.String())
139*333d2b36SAndroid Build Coastguard Worker
140*333d2b36SAndroid Build Coastguard Worker	if String(p.Proto.Plugin) == "" {
141*333d2b36SAndroid Build Coastguard Worker		var plugin string
142*333d2b36SAndroid Build Coastguard Worker
143*333d2b36SAndroid Build Coastguard Worker		switch String(p.Proto.Type) {
144*333d2b36SAndroid Build Coastguard Worker		case "nanopb-c", "nanopb-c-enable_malloc", "nanopb-c-16bit", "nanopb-c-enable_malloc-16bit", "nanopb-c-32bit", "nanopb-c-enable_malloc-32bit":
145*333d2b36SAndroid Build Coastguard Worker			flags.protoC = true
146*333d2b36SAndroid Build Coastguard Worker			flags.protoOptionsFile = true
147*333d2b36SAndroid Build Coastguard Worker			flags.proto.OutTypeFlag = "--nanopb_out"
148*333d2b36SAndroid Build Coastguard Worker			// Disable nanopb timestamps to support remote caching.
149*333d2b36SAndroid Build Coastguard Worker			flags.proto.OutParams = append(flags.proto.OutParams, "-T")
150*333d2b36SAndroid Build Coastguard Worker			plugin = "protoc-gen-nanopb"
151*333d2b36SAndroid Build Coastguard Worker		case "full":
152*333d2b36SAndroid Build Coastguard Worker			flags.proto.OutTypeFlag = "--cpp_out"
153*333d2b36SAndroid Build Coastguard Worker		case "lite":
154*333d2b36SAndroid Build Coastguard Worker			flags.proto.OutTypeFlag = "--cpp_out"
155*333d2b36SAndroid Build Coastguard Worker			flags.proto.OutParams = append(flags.proto.OutParams, "lite")
156*333d2b36SAndroid Build Coastguard Worker		case "":
157*333d2b36SAndroid Build Coastguard Worker			// TODO(b/119714316): this should be equivalent to "lite" in
158*333d2b36SAndroid Build Coastguard Worker			// order to match protoDeps, but some modules are depending on
159*333d2b36SAndroid Build Coastguard Worker			// this behavior
160*333d2b36SAndroid Build Coastguard Worker			flags.proto.OutTypeFlag = "--cpp_out"
161*333d2b36SAndroid Build Coastguard Worker		default:
162*333d2b36SAndroid Build Coastguard Worker			ctx.PropertyErrorf("proto.type", "unknown proto type %q",
163*333d2b36SAndroid Build Coastguard Worker				String(p.Proto.Type))
164*333d2b36SAndroid Build Coastguard Worker		}
165*333d2b36SAndroid Build Coastguard Worker
166*333d2b36SAndroid Build Coastguard Worker		if plugin != "" {
167*333d2b36SAndroid Build Coastguard Worker			path := ctx.Config().HostToolPath(ctx, plugin)
168*333d2b36SAndroid Build Coastguard Worker			flags.proto.Deps = append(flags.proto.Deps, path)
169*333d2b36SAndroid Build Coastguard Worker			flags.proto.Flags = append(flags.proto.Flags, "--plugin="+path.String())
170*333d2b36SAndroid Build Coastguard Worker		}
171*333d2b36SAndroid Build Coastguard Worker	}
172*333d2b36SAndroid Build Coastguard Worker
173*333d2b36SAndroid Build Coastguard Worker	return flags
174*333d2b36SAndroid Build Coastguard Worker}
175