xref: /aosp_15_r20/build/soong/cc/compiler.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	"fmt"
19*333d2b36SAndroid Build Coastguard Worker	"path/filepath"
20*333d2b36SAndroid Build Coastguard Worker	"regexp"
21*333d2b36SAndroid Build Coastguard Worker	"strconv"
22*333d2b36SAndroid Build Coastguard Worker	"strings"
23*333d2b36SAndroid Build Coastguard Worker
24*333d2b36SAndroid Build Coastguard Worker	"github.com/google/blueprint/proptools"
25*333d2b36SAndroid Build Coastguard Worker
26*333d2b36SAndroid Build Coastguard Worker	"android/soong/android"
27*333d2b36SAndroid Build Coastguard Worker	"android/soong/cc/config"
28*333d2b36SAndroid Build Coastguard Worker)
29*333d2b36SAndroid Build Coastguard Worker
30*333d2b36SAndroid Build Coastguard Workervar (
31*333d2b36SAndroid Build Coastguard Worker	allowedManualInterfacePaths = []string{"vendor/", "hardware/"}
32*333d2b36SAndroid Build Coastguard Worker)
33*333d2b36SAndroid Build Coastguard Worker
34*333d2b36SAndroid Build Coastguard Worker// This file contains the basic C/C++/assembly to .o compliation steps
35*333d2b36SAndroid Build Coastguard Worker
36*333d2b36SAndroid Build Coastguard Workertype BaseCompilerProperties struct {
37*333d2b36SAndroid Build Coastguard Worker	// list of source files used to compile the C/C++ module.  May be .c, .cpp, or .S files.
38*333d2b36SAndroid Build Coastguard Worker	// srcs may reference the outputs of other modules that produce source files like genrule
39*333d2b36SAndroid Build Coastguard Worker	// or filegroup using the syntax ":module".
40*333d2b36SAndroid Build Coastguard Worker	Srcs proptools.Configurable[[]string] `android:"path,arch_variant"`
41*333d2b36SAndroid Build Coastguard Worker
42*333d2b36SAndroid Build Coastguard Worker	// list of source files that should not be compiled with clang-tidy.
43*333d2b36SAndroid Build Coastguard Worker	Tidy_disabled_srcs []string `android:"path,arch_variant"`
44*333d2b36SAndroid Build Coastguard Worker
45*333d2b36SAndroid Build Coastguard Worker	// list of source files that should not be compiled by clang-tidy when TIDY_TIMEOUT is set.
46*333d2b36SAndroid Build Coastguard Worker	Tidy_timeout_srcs []string `android:"path,arch_variant"`
47*333d2b36SAndroid Build Coastguard Worker
48*333d2b36SAndroid Build Coastguard Worker	// list of source files that should not be used to build the C/C++ module.
49*333d2b36SAndroid Build Coastguard Worker	// This is most useful in the arch/multilib variants to remove non-common files
50*333d2b36SAndroid Build Coastguard Worker	Exclude_srcs proptools.Configurable[[]string] `android:"path,arch_variant"`
51*333d2b36SAndroid Build Coastguard Worker
52*333d2b36SAndroid Build Coastguard Worker	// list of module-specific flags that will be used for C and C++ compiles.
53*333d2b36SAndroid Build Coastguard Worker	Cflags proptools.Configurable[[]string] `android:"arch_variant"`
54*333d2b36SAndroid Build Coastguard Worker
55*333d2b36SAndroid Build Coastguard Worker	// list of module-specific flags that will be used for C++ compiles
56*333d2b36SAndroid Build Coastguard Worker	Cppflags proptools.Configurable[[]string] `android:"arch_variant"`
57*333d2b36SAndroid Build Coastguard Worker
58*333d2b36SAndroid Build Coastguard Worker	// list of module-specific flags that will be used for C compiles
59*333d2b36SAndroid Build Coastguard Worker	Conlyflags []string `android:"arch_variant"`
60*333d2b36SAndroid Build Coastguard Worker
61*333d2b36SAndroid Build Coastguard Worker	// list of module-specific flags that will be used for .S compiles
62*333d2b36SAndroid Build Coastguard Worker	Asflags []string `android:"arch_variant"`
63*333d2b36SAndroid Build Coastguard Worker
64*333d2b36SAndroid Build Coastguard Worker	// list of module-specific flags that will be used for C and C++ compiles when
65*333d2b36SAndroid Build Coastguard Worker	// compiling with clang
66*333d2b36SAndroid Build Coastguard Worker	Clang_cflags []string `android:"arch_variant"`
67*333d2b36SAndroid Build Coastguard Worker
68*333d2b36SAndroid Build Coastguard Worker	// list of module-specific flags that will be used for .S compiles when
69*333d2b36SAndroid Build Coastguard Worker	// compiling with clang
70*333d2b36SAndroid Build Coastguard Worker	Clang_asflags []string `android:"arch_variant"`
71*333d2b36SAndroid Build Coastguard Worker
72*333d2b36SAndroid Build Coastguard Worker	// the instruction set architecture to use to compile the C/C++
73*333d2b36SAndroid Build Coastguard Worker	// module.
74*333d2b36SAndroid Build Coastguard Worker	Instruction_set *string `android:"arch_variant"`
75*333d2b36SAndroid Build Coastguard Worker
76*333d2b36SAndroid Build Coastguard Worker	// list of directories relative to the root of the source tree that will
77*333d2b36SAndroid Build Coastguard Worker	// be added to the include path using -I.
78*333d2b36SAndroid Build Coastguard Worker	// If possible, don't use this.  If adding paths from the current directory use
79*333d2b36SAndroid Build Coastguard Worker	// local_include_dirs, if adding paths from other modules use export_include_dirs in
80*333d2b36SAndroid Build Coastguard Worker	// that module.
81*333d2b36SAndroid Build Coastguard Worker	Include_dirs proptools.Configurable[[]string] `android:"arch_variant,variant_prepend"`
82*333d2b36SAndroid Build Coastguard Worker
83*333d2b36SAndroid Build Coastguard Worker	// list of directories relative to the Blueprints file that will
84*333d2b36SAndroid Build Coastguard Worker	// be added to the include path using -I
85*333d2b36SAndroid Build Coastguard Worker	Local_include_dirs proptools.Configurable[[]string] `android:"arch_variant,variant_prepend"`
86*333d2b36SAndroid Build Coastguard Worker
87*333d2b36SAndroid Build Coastguard Worker	// Add the directory containing the Android.bp file to the list of include
88*333d2b36SAndroid Build Coastguard Worker	// directories. Defaults to true.
89*333d2b36SAndroid Build Coastguard Worker	Include_build_directory *bool
90*333d2b36SAndroid Build Coastguard Worker
91*333d2b36SAndroid Build Coastguard Worker	// list of generated sources to compile. These are the names of gensrcs or
92*333d2b36SAndroid Build Coastguard Worker	// genrule modules.
93*333d2b36SAndroid Build Coastguard Worker	Generated_sources []string `android:"arch_variant"`
94*333d2b36SAndroid Build Coastguard Worker
95*333d2b36SAndroid Build Coastguard Worker	// list of generated sources that should not be used to build the C/C++ module.
96*333d2b36SAndroid Build Coastguard Worker	// This is most useful in the arch/multilib variants to remove non-common files
97*333d2b36SAndroid Build Coastguard Worker	Exclude_generated_sources []string `android:"arch_variant"`
98*333d2b36SAndroid Build Coastguard Worker
99*333d2b36SAndroid Build Coastguard Worker	// list of generated headers to add to the include path. These are the names
100*333d2b36SAndroid Build Coastguard Worker	// of genrule modules.
101*333d2b36SAndroid Build Coastguard Worker	Generated_headers proptools.Configurable[[]string] `android:"arch_variant,variant_prepend"`
102*333d2b36SAndroid Build Coastguard Worker
103*333d2b36SAndroid Build Coastguard Worker	// Same as generated_headers, but the dependencies will be added based on the first supported
104*333d2b36SAndroid Build Coastguard Worker	// arch variant and the device os variant. This can be useful for creating a host tool that
105*333d2b36SAndroid Build Coastguard Worker	// embeds a copy of a device tool, that it then extracts and pushes to a device at runtime.
106*333d2b36SAndroid Build Coastguard Worker	Device_first_generated_headers proptools.Configurable[[]string] `android:"arch_variant,variant_prepend"`
107*333d2b36SAndroid Build Coastguard Worker
108*333d2b36SAndroid Build Coastguard Worker	// pass -frtti instead of -fno-rtti
109*333d2b36SAndroid Build Coastguard Worker	Rtti *bool `android:"arch_variant"`
110*333d2b36SAndroid Build Coastguard Worker
111*333d2b36SAndroid Build Coastguard Worker	// C standard version to use. Can be a specific version (such as "gnu11"),
112*333d2b36SAndroid Build Coastguard Worker	// "experimental" (which will use draft versions like C1x when available),
113*333d2b36SAndroid Build Coastguard Worker	// or the empty string (which will use the default).
114*333d2b36SAndroid Build Coastguard Worker	C_std *string
115*333d2b36SAndroid Build Coastguard Worker
116*333d2b36SAndroid Build Coastguard Worker	// C++ standard version to use. Can be a specific version (such as
117*333d2b36SAndroid Build Coastguard Worker	// "gnu++11"), "experimental" (which will use draft versions like C++1z when
118*333d2b36SAndroid Build Coastguard Worker	// available), or the empty string (which will use the default).
119*333d2b36SAndroid Build Coastguard Worker	Cpp_std *string
120*333d2b36SAndroid Build Coastguard Worker
121*333d2b36SAndroid Build Coastguard Worker	// if set to false, use -std=c++* instead of -std=gnu++*
122*333d2b36SAndroid Build Coastguard Worker	Gnu_extensions *bool
123*333d2b36SAndroid Build Coastguard Worker
124*333d2b36SAndroid Build Coastguard Worker	// cc Build rules targeting BPF must set this to true. The correct fix is to
125*333d2b36SAndroid Build Coastguard Worker	// ban targeting bpf in cc rules instead use bpf_rules. (b/323415017)
126*333d2b36SAndroid Build Coastguard Worker	Bpf_target *bool
127*333d2b36SAndroid Build Coastguard Worker
128*333d2b36SAndroid Build Coastguard Worker	// Add "-Xclang -verify" to the cflags and appends "touch $out" to
129*333d2b36SAndroid Build Coastguard Worker	// the clang command line.
130*333d2b36SAndroid Build Coastguard Worker	Clang_verify bool
131*333d2b36SAndroid Build Coastguard Worker
132*333d2b36SAndroid Build Coastguard Worker	Yacc *YaccProperties
133*333d2b36SAndroid Build Coastguard Worker	Lex  *LexProperties
134*333d2b36SAndroid Build Coastguard Worker
135*333d2b36SAndroid Build Coastguard Worker	Aidl struct {
136*333d2b36SAndroid Build Coastguard Worker		// List of aidl_library modules
137*333d2b36SAndroid Build Coastguard Worker		Libs []string
138*333d2b36SAndroid Build Coastguard Worker
139*333d2b36SAndroid Build Coastguard Worker		// list of directories that will be added to the aidl include paths.
140*333d2b36SAndroid Build Coastguard Worker		Include_dirs []string
141*333d2b36SAndroid Build Coastguard Worker
142*333d2b36SAndroid Build Coastguard Worker		// list of directories relative to the Blueprints file that will
143*333d2b36SAndroid Build Coastguard Worker		// be added to the aidl include paths.
144*333d2b36SAndroid Build Coastguard Worker		Local_include_dirs []string
145*333d2b36SAndroid Build Coastguard Worker
146*333d2b36SAndroid Build Coastguard Worker		// whether to generate traces (for systrace) for this interface
147*333d2b36SAndroid Build Coastguard Worker		Generate_traces *bool
148*333d2b36SAndroid Build Coastguard Worker
149*333d2b36SAndroid Build Coastguard Worker		// list of flags that will be passed to the AIDL compiler
150*333d2b36SAndroid Build Coastguard Worker		Flags []string
151*333d2b36SAndroid Build Coastguard Worker	}
152*333d2b36SAndroid Build Coastguard Worker
153*333d2b36SAndroid Build Coastguard Worker	// Populated by aidl_interface CPP backend to let other modules (e.g. cc_cmake_snapshot)
154*333d2b36SAndroid Build Coastguard Worker	// access actual source files and not generated cpp intermediary sources.
155*333d2b36SAndroid Build Coastguard Worker	AidlInterface struct {
156*333d2b36SAndroid Build Coastguard Worker		// list of aidl_interface sources
157*333d2b36SAndroid Build Coastguard Worker		Sources []string `blueprint:"mutated"`
158*333d2b36SAndroid Build Coastguard Worker
159*333d2b36SAndroid Build Coastguard Worker		// root directory of AIDL sources
160*333d2b36SAndroid Build Coastguard Worker		AidlRoot string `blueprint:"mutated"`
161*333d2b36SAndroid Build Coastguard Worker
162*333d2b36SAndroid Build Coastguard Worker		// AIDL backend language (e.g. "cpp", "ndk")
163*333d2b36SAndroid Build Coastguard Worker		Lang string `blueprint:"mutated"`
164*333d2b36SAndroid Build Coastguard Worker
165*333d2b36SAndroid Build Coastguard Worker		// list of flags passed to AIDL generator
166*333d2b36SAndroid Build Coastguard Worker		Flags []string `blueprint:"mutated"`
167*333d2b36SAndroid Build Coastguard Worker	} `blueprint:"mutated"`
168*333d2b36SAndroid Build Coastguard Worker
169*333d2b36SAndroid Build Coastguard Worker	Renderscript struct {
170*333d2b36SAndroid Build Coastguard Worker		// list of directories that will be added to the llvm-rs-cc include paths
171*333d2b36SAndroid Build Coastguard Worker		Include_dirs []string
172*333d2b36SAndroid Build Coastguard Worker
173*333d2b36SAndroid Build Coastguard Worker		// list of flags that will be passed to llvm-rs-cc
174*333d2b36SAndroid Build Coastguard Worker		Flags []string
175*333d2b36SAndroid Build Coastguard Worker
176*333d2b36SAndroid Build Coastguard Worker		// Renderscript API level to target
177*333d2b36SAndroid Build Coastguard Worker		Target_api *string
178*333d2b36SAndroid Build Coastguard Worker	}
179*333d2b36SAndroid Build Coastguard Worker
180*333d2b36SAndroid Build Coastguard Worker	Target struct {
181*333d2b36SAndroid Build Coastguard Worker		Vendor, Product struct {
182*333d2b36SAndroid Build Coastguard Worker			// list of source files that should only be used in vendor or
183*333d2b36SAndroid Build Coastguard Worker			// product variant of the C/C++ module.
184*333d2b36SAndroid Build Coastguard Worker			Srcs []string `android:"path"`
185*333d2b36SAndroid Build Coastguard Worker
186*333d2b36SAndroid Build Coastguard Worker			// list of source files that should not be used to build vendor
187*333d2b36SAndroid Build Coastguard Worker			// or product variant of the C/C++ module.
188*333d2b36SAndroid Build Coastguard Worker			Exclude_srcs []string `android:"path"`
189*333d2b36SAndroid Build Coastguard Worker
190*333d2b36SAndroid Build Coastguard Worker			// List of additional cflags that should be used to build vendor
191*333d2b36SAndroid Build Coastguard Worker			// or product variant of the C/C++ module.
192*333d2b36SAndroid Build Coastguard Worker			Cflags []string
193*333d2b36SAndroid Build Coastguard Worker
194*333d2b36SAndroid Build Coastguard Worker			// list of generated sources that should not be used to build
195*333d2b36SAndroid Build Coastguard Worker			// vendor or product variant of the C/C++ module.
196*333d2b36SAndroid Build Coastguard Worker			Exclude_generated_sources []string
197*333d2b36SAndroid Build Coastguard Worker		}
198*333d2b36SAndroid Build Coastguard Worker		Recovery struct {
199*333d2b36SAndroid Build Coastguard Worker			// list of source files that should only be used in the
200*333d2b36SAndroid Build Coastguard Worker			// recovery variant of the C/C++ module.
201*333d2b36SAndroid Build Coastguard Worker			Srcs []string `android:"path"`
202*333d2b36SAndroid Build Coastguard Worker
203*333d2b36SAndroid Build Coastguard Worker			// list of source files that should not be used to
204*333d2b36SAndroid Build Coastguard Worker			// build the recovery variant of the C/C++ module.
205*333d2b36SAndroid Build Coastguard Worker			Exclude_srcs []string `android:"path"`
206*333d2b36SAndroid Build Coastguard Worker
207*333d2b36SAndroid Build Coastguard Worker			// List of additional cflags that should be used to build the recovery
208*333d2b36SAndroid Build Coastguard Worker			// variant of the C/C++ module.
209*333d2b36SAndroid Build Coastguard Worker			Cflags []string
210*333d2b36SAndroid Build Coastguard Worker
211*333d2b36SAndroid Build Coastguard Worker			// list of generated sources that should not be used to
212*333d2b36SAndroid Build Coastguard Worker			// build the recovery variant of the C/C++ module.
213*333d2b36SAndroid Build Coastguard Worker			Exclude_generated_sources []string
214*333d2b36SAndroid Build Coastguard Worker		}
215*333d2b36SAndroid Build Coastguard Worker		Ramdisk, Vendor_ramdisk struct {
216*333d2b36SAndroid Build Coastguard Worker			// list of source files that should not be used to
217*333d2b36SAndroid Build Coastguard Worker			// build the ramdisk variants of the C/C++ module.
218*333d2b36SAndroid Build Coastguard Worker			Exclude_srcs []string `android:"path"`
219*333d2b36SAndroid Build Coastguard Worker
220*333d2b36SAndroid Build Coastguard Worker			// List of additional cflags that should be used to build the ramdisk
221*333d2b36SAndroid Build Coastguard Worker			// variants of the C/C++ module.
222*333d2b36SAndroid Build Coastguard Worker			Cflags []string
223*333d2b36SAndroid Build Coastguard Worker		}
224*333d2b36SAndroid Build Coastguard Worker		Platform struct {
225*333d2b36SAndroid Build Coastguard Worker			// List of additional cflags that should be used to build the platform
226*333d2b36SAndroid Build Coastguard Worker			// variant of the C/C++ module.
227*333d2b36SAndroid Build Coastguard Worker			Cflags []string
228*333d2b36SAndroid Build Coastguard Worker		}
229*333d2b36SAndroid Build Coastguard Worker	}
230*333d2b36SAndroid Build Coastguard Worker
231*333d2b36SAndroid Build Coastguard Worker	Proto struct {
232*333d2b36SAndroid Build Coastguard Worker		// Link statically against the protobuf runtime
233*333d2b36SAndroid Build Coastguard Worker		Static *bool `android:"arch_variant"`
234*333d2b36SAndroid Build Coastguard Worker	} `android:"arch_variant"`
235*333d2b36SAndroid Build Coastguard Worker
236*333d2b36SAndroid Build Coastguard Worker	// Build and link with OpenMP
237*333d2b36SAndroid Build Coastguard Worker	Openmp *bool `android:"arch_variant"`
238*333d2b36SAndroid Build Coastguard Worker}
239*333d2b36SAndroid Build Coastguard Worker
240*333d2b36SAndroid Build Coastguard Workerfunc NewBaseCompiler() *baseCompiler {
241*333d2b36SAndroid Build Coastguard Worker	return &baseCompiler{}
242*333d2b36SAndroid Build Coastguard Worker}
243*333d2b36SAndroid Build Coastguard Worker
244*333d2b36SAndroid Build Coastguard Workertype baseCompiler struct {
245*333d2b36SAndroid Build Coastguard Worker	Properties BaseCompilerProperties
246*333d2b36SAndroid Build Coastguard Worker	Proto      android.ProtoProperties
247*333d2b36SAndroid Build Coastguard Worker	cFlagsDeps android.Paths
248*333d2b36SAndroid Build Coastguard Worker	pathDeps   android.Paths
249*333d2b36SAndroid Build Coastguard Worker	flags      builderFlags
250*333d2b36SAndroid Build Coastguard Worker
251*333d2b36SAndroid Build Coastguard Worker	// Sources that were passed to the C/C++ compiler
252*333d2b36SAndroid Build Coastguard Worker	srcs android.Paths
253*333d2b36SAndroid Build Coastguard Worker
254*333d2b36SAndroid Build Coastguard Worker	// Sources that were passed in the Android.bp file, including generated sources generated by
255*333d2b36SAndroid Build Coastguard Worker	// other modules and filegroups. May include source files that have not yet been translated to
256*333d2b36SAndroid Build Coastguard Worker	// C/C++ (.aidl, .proto, etc.)
257*333d2b36SAndroid Build Coastguard Worker	srcsBeforeGen android.Paths
258*333d2b36SAndroid Build Coastguard Worker
259*333d2b36SAndroid Build Coastguard Worker	generatedSourceInfo
260*333d2b36SAndroid Build Coastguard Worker}
261*333d2b36SAndroid Build Coastguard Worker
262*333d2b36SAndroid Build Coastguard Workervar _ compiler = (*baseCompiler)(nil)
263*333d2b36SAndroid Build Coastguard Worker
264*333d2b36SAndroid Build Coastguard Workertype CompiledInterface interface {
265*333d2b36SAndroid Build Coastguard Worker	Srcs() android.Paths
266*333d2b36SAndroid Build Coastguard Worker}
267*333d2b36SAndroid Build Coastguard Worker
268*333d2b36SAndroid Build Coastguard Workerfunc (compiler *baseCompiler) Srcs() android.Paths {
269*333d2b36SAndroid Build Coastguard Worker	return append(android.Paths{}, compiler.srcs...)
270*333d2b36SAndroid Build Coastguard Worker}
271*333d2b36SAndroid Build Coastguard Worker
272*333d2b36SAndroid Build Coastguard Workerfunc (compiler *baseCompiler) appendCflags(flags []string) {
273*333d2b36SAndroid Build Coastguard Worker	compiler.Properties.Cflags.AppendSimpleValue(flags)
274*333d2b36SAndroid Build Coastguard Worker}
275*333d2b36SAndroid Build Coastguard Worker
276*333d2b36SAndroid Build Coastguard Workerfunc (compiler *baseCompiler) appendAsflags(flags []string) {
277*333d2b36SAndroid Build Coastguard Worker	compiler.Properties.Asflags = append(compiler.Properties.Asflags, flags...)
278*333d2b36SAndroid Build Coastguard Worker}
279*333d2b36SAndroid Build Coastguard Worker
280*333d2b36SAndroid Build Coastguard Workerfunc (compiler *baseCompiler) compilerProps() []interface{} {
281*333d2b36SAndroid Build Coastguard Worker	return []interface{}{&compiler.Properties, &compiler.Proto}
282*333d2b36SAndroid Build Coastguard Worker}
283*333d2b36SAndroid Build Coastguard Worker
284*333d2b36SAndroid Build Coastguard Workerfunc (compiler *baseCompiler) baseCompilerProps() BaseCompilerProperties {
285*333d2b36SAndroid Build Coastguard Worker	return compiler.Properties
286*333d2b36SAndroid Build Coastguard Worker}
287*333d2b36SAndroid Build Coastguard Worker
288*333d2b36SAndroid Build Coastguard Workerfunc includeBuildDirectory(prop *bool) bool {
289*333d2b36SAndroid Build Coastguard Worker	return proptools.BoolDefault(prop, true)
290*333d2b36SAndroid Build Coastguard Worker}
291*333d2b36SAndroid Build Coastguard Worker
292*333d2b36SAndroid Build Coastguard Workerfunc (compiler *baseCompiler) includeBuildDirectory() bool {
293*333d2b36SAndroid Build Coastguard Worker	return includeBuildDirectory(compiler.Properties.Include_build_directory)
294*333d2b36SAndroid Build Coastguard Worker}
295*333d2b36SAndroid Build Coastguard Worker
296*333d2b36SAndroid Build Coastguard Workerfunc (compiler *baseCompiler) compilerInit(ctx BaseModuleContext) {}
297*333d2b36SAndroid Build Coastguard Worker
298*333d2b36SAndroid Build Coastguard Workerfunc (compiler *baseCompiler) compilerDeps(ctx DepsContext, deps Deps) Deps {
299*333d2b36SAndroid Build Coastguard Worker	deps.GeneratedSources = append(deps.GeneratedSources, compiler.Properties.Generated_sources...)
300*333d2b36SAndroid Build Coastguard Worker	deps.GeneratedSources = removeListFromList(deps.GeneratedSources, compiler.Properties.Exclude_generated_sources)
301*333d2b36SAndroid Build Coastguard Worker	deps.GeneratedHeaders = append(deps.GeneratedHeaders, compiler.Properties.Generated_headers.GetOrDefault(ctx, nil)...)
302*333d2b36SAndroid Build Coastguard Worker	deps.DeviceFirstGeneratedHeaders = append(deps.DeviceFirstGeneratedHeaders, compiler.Properties.Device_first_generated_headers.GetOrDefault(ctx, nil)...)
303*333d2b36SAndroid Build Coastguard Worker	deps.AidlLibs = append(deps.AidlLibs, compiler.Properties.Aidl.Libs...)
304*333d2b36SAndroid Build Coastguard Worker
305*333d2b36SAndroid Build Coastguard Worker	android.ProtoDeps(ctx, &compiler.Proto)
306*333d2b36SAndroid Build Coastguard Worker	if compiler.hasSrcExt(ctx, ".proto") {
307*333d2b36SAndroid Build Coastguard Worker		deps = protoDeps(ctx, deps, &compiler.Proto, Bool(compiler.Properties.Proto.Static))
308*333d2b36SAndroid Build Coastguard Worker	}
309*333d2b36SAndroid Build Coastguard Worker
310*333d2b36SAndroid Build Coastguard Worker	if Bool(compiler.Properties.Openmp) {
311*333d2b36SAndroid Build Coastguard Worker		deps.StaticLibs = append(deps.StaticLibs, "libomp")
312*333d2b36SAndroid Build Coastguard Worker	}
313*333d2b36SAndroid Build Coastguard Worker
314*333d2b36SAndroid Build Coastguard Worker	return deps
315*333d2b36SAndroid Build Coastguard Worker}
316*333d2b36SAndroid Build Coastguard Worker
317*333d2b36SAndroid Build Coastguard Worker// Return true if the module is in the WarningAllowedProjects.
318*333d2b36SAndroid Build Coastguard Workerfunc warningsAreAllowed(subdir string) bool {
319*333d2b36SAndroid Build Coastguard Worker	subdir += "/"
320*333d2b36SAndroid Build Coastguard Worker	return android.HasAnyPrefix(subdir, config.WarningAllowedProjects)
321*333d2b36SAndroid Build Coastguard Worker}
322*333d2b36SAndroid Build Coastguard Worker
323*333d2b36SAndroid Build Coastguard Workerfunc addToModuleList(ctx ModuleContext, key android.OnceKey, module string) {
324*333d2b36SAndroid Build Coastguard Worker	getNamedMapForConfig(ctx.Config(), key).Store(module, true)
325*333d2b36SAndroid Build Coastguard Worker}
326*333d2b36SAndroid Build Coastguard Worker
327*333d2b36SAndroid Build Coastguard Workerfunc useGnuExtensions(gnuExtensions *bool) bool {
328*333d2b36SAndroid Build Coastguard Worker	return proptools.BoolDefault(gnuExtensions, true)
329*333d2b36SAndroid Build Coastguard Worker}
330*333d2b36SAndroid Build Coastguard Worker
331*333d2b36SAndroid Build Coastguard Workerfunc maybeReplaceGnuToC(gnuExtensions *bool, cStd string, cppStd string) (string, string) {
332*333d2b36SAndroid Build Coastguard Worker	if !useGnuExtensions(gnuExtensions) {
333*333d2b36SAndroid Build Coastguard Worker		cStd = gnuToCReplacer.Replace(cStd)
334*333d2b36SAndroid Build Coastguard Worker		cppStd = gnuToCReplacer.Replace(cppStd)
335*333d2b36SAndroid Build Coastguard Worker	}
336*333d2b36SAndroid Build Coastguard Worker	return cStd, cppStd
337*333d2b36SAndroid Build Coastguard Worker}
338*333d2b36SAndroid Build Coastguard Worker
339*333d2b36SAndroid Build Coastguard Workerfunc parseCppStd(cppStdPtr *string) string {
340*333d2b36SAndroid Build Coastguard Worker	cppStd := String(cppStdPtr)
341*333d2b36SAndroid Build Coastguard Worker	switch cppStd {
342*333d2b36SAndroid Build Coastguard Worker	case "":
343*333d2b36SAndroid Build Coastguard Worker		return config.CppStdVersion
344*333d2b36SAndroid Build Coastguard Worker	case "experimental":
345*333d2b36SAndroid Build Coastguard Worker		return config.ExperimentalCppStdVersion
346*333d2b36SAndroid Build Coastguard Worker	default:
347*333d2b36SAndroid Build Coastguard Worker		return cppStd
348*333d2b36SAndroid Build Coastguard Worker	}
349*333d2b36SAndroid Build Coastguard Worker}
350*333d2b36SAndroid Build Coastguard Worker
351*333d2b36SAndroid Build Coastguard Workerfunc parseCStd(cStdPtr *string) string {
352*333d2b36SAndroid Build Coastguard Worker	cStd := String(cStdPtr)
353*333d2b36SAndroid Build Coastguard Worker	switch cStd {
354*333d2b36SAndroid Build Coastguard Worker	case "":
355*333d2b36SAndroid Build Coastguard Worker		return config.CStdVersion
356*333d2b36SAndroid Build Coastguard Worker	case "experimental":
357*333d2b36SAndroid Build Coastguard Worker		return config.ExperimentalCStdVersion
358*333d2b36SAndroid Build Coastguard Worker	default:
359*333d2b36SAndroid Build Coastguard Worker		return cStd
360*333d2b36SAndroid Build Coastguard Worker	}
361*333d2b36SAndroid Build Coastguard Worker}
362*333d2b36SAndroid Build Coastguard Worker
363*333d2b36SAndroid Build Coastguard Worker// Create a Flags struct that collects the compile flags from global values,
364*333d2b36SAndroid Build Coastguard Worker// per-target values, module type values, and per-module Blueprints properties
365*333d2b36SAndroid Build Coastguard Workerfunc (compiler *baseCompiler) compilerFlags(ctx ModuleContext, flags Flags, deps PathDeps) Flags {
366*333d2b36SAndroid Build Coastguard Worker	tc := ctx.toolchain()
367*333d2b36SAndroid Build Coastguard Worker	modulePath := ctx.ModuleDir()
368*333d2b36SAndroid Build Coastguard Worker
369*333d2b36SAndroid Build Coastguard Worker	reuseObjs := false
370*333d2b36SAndroid Build Coastguard Worker	if len(ctx.GetDirectDepsWithTag(reuseObjTag)) > 0 {
371*333d2b36SAndroid Build Coastguard Worker		reuseObjs = true
372*333d2b36SAndroid Build Coastguard Worker	}
373*333d2b36SAndroid Build Coastguard Worker
374*333d2b36SAndroid Build Coastguard Worker	// If a reuseObjTag dependency exists then this module is reusing the objects (generally the shared variant
375*333d2b36SAndroid Build Coastguard Worker	// reusing objects from the static variant), and doesn't need to compile any sources of its own.
376*333d2b36SAndroid Build Coastguard Worker	var srcs []string
377*333d2b36SAndroid Build Coastguard Worker	if !reuseObjs {
378*333d2b36SAndroid Build Coastguard Worker		srcs = compiler.Properties.Srcs.GetOrDefault(ctx, nil)
379*333d2b36SAndroid Build Coastguard Worker		exclude_srcs := compiler.Properties.Exclude_srcs.GetOrDefault(ctx, nil)
380*333d2b36SAndroid Build Coastguard Worker		compiler.srcsBeforeGen = android.PathsForModuleSrcExcludes(ctx, srcs, exclude_srcs)
381*333d2b36SAndroid Build Coastguard Worker		compiler.srcsBeforeGen = append(compiler.srcsBeforeGen, deps.GeneratedSources...)
382*333d2b36SAndroid Build Coastguard Worker	}
383*333d2b36SAndroid Build Coastguard Worker
384*333d2b36SAndroid Build Coastguard Worker	cflags := compiler.Properties.Cflags.GetOrDefault(ctx, nil)
385*333d2b36SAndroid Build Coastguard Worker	cppflags := compiler.Properties.Cppflags.GetOrDefault(ctx, nil)
386*333d2b36SAndroid Build Coastguard Worker	CheckBadCompilerFlags(ctx, "cflags", cflags)
387*333d2b36SAndroid Build Coastguard Worker	CheckBadCompilerFlags(ctx, "cppflags", cppflags)
388*333d2b36SAndroid Build Coastguard Worker	CheckBadCompilerFlags(ctx, "conlyflags", compiler.Properties.Conlyflags)
389*333d2b36SAndroid Build Coastguard Worker	CheckBadCompilerFlags(ctx, "asflags", compiler.Properties.Asflags)
390*333d2b36SAndroid Build Coastguard Worker	CheckBadCompilerFlags(ctx, "vendor.cflags", compiler.Properties.Target.Vendor.Cflags)
391*333d2b36SAndroid Build Coastguard Worker	CheckBadCompilerFlags(ctx, "product.cflags", compiler.Properties.Target.Product.Cflags)
392*333d2b36SAndroid Build Coastguard Worker	CheckBadCompilerFlags(ctx, "recovery.cflags", compiler.Properties.Target.Recovery.Cflags)
393*333d2b36SAndroid Build Coastguard Worker	CheckBadCompilerFlags(ctx, "ramdisk.cflags", compiler.Properties.Target.Ramdisk.Cflags)
394*333d2b36SAndroid Build Coastguard Worker	CheckBadCompilerFlags(ctx, "vendor_ramdisk.cflags", compiler.Properties.Target.Vendor_ramdisk.Cflags)
395*333d2b36SAndroid Build Coastguard Worker	CheckBadCompilerFlags(ctx, "platform.cflags", compiler.Properties.Target.Platform.Cflags)
396*333d2b36SAndroid Build Coastguard Worker
397*333d2b36SAndroid Build Coastguard Worker	esc := proptools.NinjaAndShellEscapeList
398*333d2b36SAndroid Build Coastguard Worker
399*333d2b36SAndroid Build Coastguard Worker	flags.Local.CFlags = append(flags.Local.CFlags, esc(cflags)...)
400*333d2b36SAndroid Build Coastguard Worker	flags.Local.CppFlags = append(flags.Local.CppFlags, esc(cppflags)...)
401*333d2b36SAndroid Build Coastguard Worker	flags.Local.ConlyFlags = append(flags.Local.ConlyFlags, esc(compiler.Properties.Conlyflags)...)
402*333d2b36SAndroid Build Coastguard Worker	flags.Local.AsFlags = append(flags.Local.AsFlags, esc(compiler.Properties.Asflags)...)
403*333d2b36SAndroid Build Coastguard Worker	flags.Local.YasmFlags = append(flags.Local.YasmFlags, esc(compiler.Properties.Asflags)...)
404*333d2b36SAndroid Build Coastguard Worker
405*333d2b36SAndroid Build Coastguard Worker	flags.Yacc = compiler.Properties.Yacc
406*333d2b36SAndroid Build Coastguard Worker	flags.Lex = compiler.Properties.Lex
407*333d2b36SAndroid Build Coastguard Worker
408*333d2b36SAndroid Build Coastguard Worker	flags.ClangVerify = compiler.Properties.Clang_verify
409*333d2b36SAndroid Build Coastguard Worker	if compiler.Properties.Clang_verify {
410*333d2b36SAndroid Build Coastguard Worker		flags.Local.CFlags = append(flags.Local.CFlags, "-Xclang", "-verify")
411*333d2b36SAndroid Build Coastguard Worker	}
412*333d2b36SAndroid Build Coastguard Worker
413*333d2b36SAndroid Build Coastguard Worker	// Include dir cflags
414*333d2b36SAndroid Build Coastguard Worker	localIncludeDirs := android.PathsForModuleSrc(ctx, compiler.Properties.Local_include_dirs.GetOrDefault(ctx, nil))
415*333d2b36SAndroid Build Coastguard Worker	if len(localIncludeDirs) > 0 {
416*333d2b36SAndroid Build Coastguard Worker		f := includeDirsToFlags(localIncludeDirs)
417*333d2b36SAndroid Build Coastguard Worker		flags.Local.CommonFlags = append(flags.Local.CommonFlags, f)
418*333d2b36SAndroid Build Coastguard Worker		flags.Local.YasmFlags = append(flags.Local.YasmFlags, f)
419*333d2b36SAndroid Build Coastguard Worker	}
420*333d2b36SAndroid Build Coastguard Worker	rootIncludeDirs := android.PathsForSource(ctx, compiler.Properties.Include_dirs.GetOrDefault(ctx, nil))
421*333d2b36SAndroid Build Coastguard Worker	if len(rootIncludeDirs) > 0 {
422*333d2b36SAndroid Build Coastguard Worker		f := includeDirsToFlags(rootIncludeDirs)
423*333d2b36SAndroid Build Coastguard Worker		flags.Local.CommonFlags = append(flags.Local.CommonFlags, f)
424*333d2b36SAndroid Build Coastguard Worker		flags.Local.YasmFlags = append(flags.Local.YasmFlags, f)
425*333d2b36SAndroid Build Coastguard Worker	}
426*333d2b36SAndroid Build Coastguard Worker
427*333d2b36SAndroid Build Coastguard Worker	if compiler.includeBuildDirectory() {
428*333d2b36SAndroid Build Coastguard Worker		flags.Local.CommonFlags = append(flags.Local.CommonFlags, "-I"+modulePath)
429*333d2b36SAndroid Build Coastguard Worker		flags.Local.YasmFlags = append(flags.Local.YasmFlags, "-I"+modulePath)
430*333d2b36SAndroid Build Coastguard Worker	}
431*333d2b36SAndroid Build Coastguard Worker
432*333d2b36SAndroid Build Coastguard Worker	if !(ctx.useSdk() || ctx.InVendorOrProduct()) || ctx.Host() {
433*333d2b36SAndroid Build Coastguard Worker		flags.SystemIncludeFlags = append(flags.SystemIncludeFlags,
434*333d2b36SAndroid Build Coastguard Worker			"${config.CommonGlobalIncludes}",
435*333d2b36SAndroid Build Coastguard Worker			tc.IncludeFlags())
436*333d2b36SAndroid Build Coastguard Worker	}
437*333d2b36SAndroid Build Coastguard Worker
438*333d2b36SAndroid Build Coastguard Worker	if ctx.useSdk() {
439*333d2b36SAndroid Build Coastguard Worker		// The NDK headers are installed to a common sysroot. While a more
440*333d2b36SAndroid Build Coastguard Worker		// typical Soong approach would be to only make the headers for the
441*333d2b36SAndroid Build Coastguard Worker		// library you're using available, we're trying to emulate the NDK
442*333d2b36SAndroid Build Coastguard Worker		// behavior here, and the NDK always has all the NDK headers available.
443*333d2b36SAndroid Build Coastguard Worker		flags.SystemIncludeFlags = append(flags.SystemIncludeFlags,
444*333d2b36SAndroid Build Coastguard Worker			"--sysroot "+getNdkSysrootBase(ctx).String())
445*333d2b36SAndroid Build Coastguard Worker	} else if ctx.Device() {
446*333d2b36SAndroid Build Coastguard Worker		flags.Global.CommonFlags = append(flags.Global.CFlags, "-nostdlibinc")
447*333d2b36SAndroid Build Coastguard Worker	}
448*333d2b36SAndroid Build Coastguard Worker
449*333d2b36SAndroid Build Coastguard Worker	if ctx.InVendorOrProduct() {
450*333d2b36SAndroid Build Coastguard Worker		flags.Global.CommonFlags = append(flags.Global.CommonFlags, "-D__ANDROID_VNDK__")
451*333d2b36SAndroid Build Coastguard Worker		if ctx.inVendor() {
452*333d2b36SAndroid Build Coastguard Worker			flags.Global.CommonFlags = append(flags.Global.CommonFlags, "-D__ANDROID_VENDOR__")
453*333d2b36SAndroid Build Coastguard Worker		} else if ctx.inProduct() {
454*333d2b36SAndroid Build Coastguard Worker			flags.Global.CommonFlags = append(flags.Global.CommonFlags, "-D__ANDROID_PRODUCT__")
455*333d2b36SAndroid Build Coastguard Worker		}
456*333d2b36SAndroid Build Coastguard Worker
457*333d2b36SAndroid Build Coastguard Worker		// Define __ANDROID_VENDOR_API__ for both product and vendor variants
458*333d2b36SAndroid Build Coastguard Worker		// because they both use the same LLNDK libraries.
459*333d2b36SAndroid Build Coastguard Worker		vendorApiLevel := ctx.Config().VendorApiLevel()
460*333d2b36SAndroid Build Coastguard Worker		if vendorApiLevel == "" {
461*333d2b36SAndroid Build Coastguard Worker			// TODO(b/314036847): This is a fallback for UDC targets.
462*333d2b36SAndroid Build Coastguard Worker			// This must be a build failure when UDC is no longer built
463*333d2b36SAndroid Build Coastguard Worker			// from this source tree.
464*333d2b36SAndroid Build Coastguard Worker			vendorApiLevel = ctx.Config().PlatformSdkVersion().String()
465*333d2b36SAndroid Build Coastguard Worker		}
466*333d2b36SAndroid Build Coastguard Worker		flags.Global.CommonFlags = append(flags.Global.CommonFlags, "-D__ANDROID_VENDOR_API__="+vendorApiLevel)
467*333d2b36SAndroid Build Coastguard Worker	}
468*333d2b36SAndroid Build Coastguard Worker
469*333d2b36SAndroid Build Coastguard Worker	if ctx.inRecovery() {
470*333d2b36SAndroid Build Coastguard Worker		flags.Global.CommonFlags = append(flags.Global.CommonFlags, "-D__ANDROID_RECOVERY__")
471*333d2b36SAndroid Build Coastguard Worker	}
472*333d2b36SAndroid Build Coastguard Worker
473*333d2b36SAndroid Build Coastguard Worker	if ctx.inRecovery() || ctx.inRamdisk() || ctx.inVendorRamdisk() {
474*333d2b36SAndroid Build Coastguard Worker		flags.Global.CommonFlags = append(flags.Global.CommonFlags, "-D__ANDROID_RAMDISK__")
475*333d2b36SAndroid Build Coastguard Worker	}
476*333d2b36SAndroid Build Coastguard Worker
477*333d2b36SAndroid Build Coastguard Worker	if ctx.apexVariationName() != "" {
478*333d2b36SAndroid Build Coastguard Worker		flags.Global.CommonFlags = append(flags.Global.CommonFlags, "-D__ANDROID_APEX__")
479*333d2b36SAndroid Build Coastguard Worker	}
480*333d2b36SAndroid Build Coastguard Worker
481*333d2b36SAndroid Build Coastguard Worker	if ctx.Target().NativeBridge == android.NativeBridgeEnabled {
482*333d2b36SAndroid Build Coastguard Worker		flags.Global.CommonFlags = append(flags.Global.CommonFlags, "-D__ANDROID_NATIVE_BRIDGE__")
483*333d2b36SAndroid Build Coastguard Worker	}
484*333d2b36SAndroid Build Coastguard Worker
485*333d2b36SAndroid Build Coastguard Worker	instructionSet := String(compiler.Properties.Instruction_set)
486*333d2b36SAndroid Build Coastguard Worker	if flags.RequiredInstructionSet != "" {
487*333d2b36SAndroid Build Coastguard Worker		instructionSet = flags.RequiredInstructionSet
488*333d2b36SAndroid Build Coastguard Worker	}
489*333d2b36SAndroid Build Coastguard Worker	instructionSetFlags, err := tc.InstructionSetFlags(instructionSet)
490*333d2b36SAndroid Build Coastguard Worker	if err != nil {
491*333d2b36SAndroid Build Coastguard Worker		ctx.ModuleErrorf("%s", err)
492*333d2b36SAndroid Build Coastguard Worker	}
493*333d2b36SAndroid Build Coastguard Worker
494*333d2b36SAndroid Build Coastguard Worker	if !ctx.DeviceConfig().BuildBrokenClangCFlags() && len(compiler.Properties.Clang_cflags) != 0 {
495*333d2b36SAndroid Build Coastguard Worker		ctx.PropertyErrorf("clang_cflags", "property is deprecated, see Changes.md file")
496*333d2b36SAndroid Build Coastguard Worker	} else {
497*333d2b36SAndroid Build Coastguard Worker		CheckBadCompilerFlags(ctx, "clang_cflags", compiler.Properties.Clang_cflags)
498*333d2b36SAndroid Build Coastguard Worker	}
499*333d2b36SAndroid Build Coastguard Worker	if !ctx.DeviceConfig().BuildBrokenClangAsFlags() && len(compiler.Properties.Clang_asflags) != 0 {
500*333d2b36SAndroid Build Coastguard Worker		ctx.PropertyErrorf("clang_asflags", "property is deprecated, see Changes.md file")
501*333d2b36SAndroid Build Coastguard Worker	} else {
502*333d2b36SAndroid Build Coastguard Worker		CheckBadCompilerFlags(ctx, "clang_asflags", compiler.Properties.Clang_asflags)
503*333d2b36SAndroid Build Coastguard Worker	}
504*333d2b36SAndroid Build Coastguard Worker
505*333d2b36SAndroid Build Coastguard Worker	flags.Local.CFlags = config.ClangFilterUnknownCflags(flags.Local.CFlags)
506*333d2b36SAndroid Build Coastguard Worker	if !ctx.DeviceConfig().BuildBrokenClangCFlags() {
507*333d2b36SAndroid Build Coastguard Worker		flags.Local.CFlags = append(flags.Local.CFlags, esc(compiler.Properties.Clang_cflags)...)
508*333d2b36SAndroid Build Coastguard Worker	}
509*333d2b36SAndroid Build Coastguard Worker	if !ctx.DeviceConfig().BuildBrokenClangAsFlags() {
510*333d2b36SAndroid Build Coastguard Worker		flags.Local.AsFlags = append(flags.Local.AsFlags, esc(compiler.Properties.Clang_asflags)...)
511*333d2b36SAndroid Build Coastguard Worker	}
512*333d2b36SAndroid Build Coastguard Worker	flags.Local.CppFlags = config.ClangFilterUnknownCflags(flags.Local.CppFlags)
513*333d2b36SAndroid Build Coastguard Worker	flags.Local.ConlyFlags = config.ClangFilterUnknownCflags(flags.Local.ConlyFlags)
514*333d2b36SAndroid Build Coastguard Worker	flags.Local.LdFlags = config.ClangFilterUnknownCflags(flags.Local.LdFlags)
515*333d2b36SAndroid Build Coastguard Worker
516*333d2b36SAndroid Build Coastguard Worker	target := "-target " + tc.ClangTriple()
517*333d2b36SAndroid Build Coastguard Worker	if ctx.Os().Class == android.Device {
518*333d2b36SAndroid Build Coastguard Worker		version := ctx.minSdkVersion()
519*333d2b36SAndroid Build Coastguard Worker		if version == "" || version == "current" {
520*333d2b36SAndroid Build Coastguard Worker			target += strconv.Itoa(android.FutureApiLevelInt)
521*333d2b36SAndroid Build Coastguard Worker		} else {
522*333d2b36SAndroid Build Coastguard Worker			apiLevel := nativeApiLevelOrPanic(ctx, version)
523*333d2b36SAndroid Build Coastguard Worker			target += strconv.Itoa(apiLevel.FinalOrFutureInt())
524*333d2b36SAndroid Build Coastguard Worker		}
525*333d2b36SAndroid Build Coastguard Worker	}
526*333d2b36SAndroid Build Coastguard Worker
527*333d2b36SAndroid Build Coastguard Worker	// bpf targets don't need the default target triple. b/308826679
528*333d2b36SAndroid Build Coastguard Worker	if proptools.Bool(compiler.Properties.Bpf_target) {
529*333d2b36SAndroid Build Coastguard Worker		target = "--target=bpf"
530*333d2b36SAndroid Build Coastguard Worker	}
531*333d2b36SAndroid Build Coastguard Worker
532*333d2b36SAndroid Build Coastguard Worker	flags.Global.CFlags = append(flags.Global.CFlags, target)
533*333d2b36SAndroid Build Coastguard Worker	flags.Global.AsFlags = append(flags.Global.AsFlags, target)
534*333d2b36SAndroid Build Coastguard Worker	flags.Global.LdFlags = append(flags.Global.LdFlags, target)
535*333d2b36SAndroid Build Coastguard Worker
536*333d2b36SAndroid Build Coastguard Worker	hod := "Host"
537*333d2b36SAndroid Build Coastguard Worker	if ctx.Os().Class == android.Device {
538*333d2b36SAndroid Build Coastguard Worker		hod = "Device"
539*333d2b36SAndroid Build Coastguard Worker	}
540*333d2b36SAndroid Build Coastguard Worker
541*333d2b36SAndroid Build Coastguard Worker	flags.Global.CommonFlags = append(flags.Global.CommonFlags, instructionSetFlags)
542*333d2b36SAndroid Build Coastguard Worker	flags.Global.ConlyFlags = append([]string{"${config.CommonGlobalConlyflags}"}, flags.Global.ConlyFlags...)
543*333d2b36SAndroid Build Coastguard Worker	flags.Global.CppFlags = append([]string{fmt.Sprintf("${config.%sGlobalCppflags}", hod)}, flags.Global.CppFlags...)
544*333d2b36SAndroid Build Coastguard Worker
545*333d2b36SAndroid Build Coastguard Worker	flags.Global.AsFlags = append(flags.Global.AsFlags, tc.Asflags())
546*333d2b36SAndroid Build Coastguard Worker	flags.Global.CppFlags = append([]string{"${config.CommonGlobalCppflags}"}, flags.Global.CppFlags...)
547*333d2b36SAndroid Build Coastguard Worker
548*333d2b36SAndroid Build Coastguard Worker	// bpf targets don't need the target specific toolchain cflags. b/308826679
549*333d2b36SAndroid Build Coastguard Worker	if !proptools.Bool(compiler.Properties.Bpf_target) {
550*333d2b36SAndroid Build Coastguard Worker		flags.Global.CommonFlags = append(flags.Global.CommonFlags, tc.Cflags())
551*333d2b36SAndroid Build Coastguard Worker	}
552*333d2b36SAndroid Build Coastguard Worker	flags.Global.CommonFlags = append(flags.Global.CommonFlags,
553*333d2b36SAndroid Build Coastguard Worker		"${config.CommonGlobalCflags}",
554*333d2b36SAndroid Build Coastguard Worker		fmt.Sprintf("${config.%sGlobalCflags}", hod))
555*333d2b36SAndroid Build Coastguard Worker
556*333d2b36SAndroid Build Coastguard Worker	if android.IsThirdPartyPath(modulePath) {
557*333d2b36SAndroid Build Coastguard Worker		flags.Global.CommonFlags = append(flags.Global.CommonFlags, "${config.ExternalCflags}")
558*333d2b36SAndroid Build Coastguard Worker	}
559*333d2b36SAndroid Build Coastguard Worker
560*333d2b36SAndroid Build Coastguard Worker	if Bool(compiler.Properties.Rtti) {
561*333d2b36SAndroid Build Coastguard Worker		flags.Local.CppFlags = append(flags.Local.CppFlags, "-frtti")
562*333d2b36SAndroid Build Coastguard Worker	} else {
563*333d2b36SAndroid Build Coastguard Worker		flags.Local.CppFlags = append(flags.Local.CppFlags, "-fno-rtti")
564*333d2b36SAndroid Build Coastguard Worker	}
565*333d2b36SAndroid Build Coastguard Worker
566*333d2b36SAndroid Build Coastguard Worker	flags.Global.AsFlags = append(flags.Global.AsFlags, "${config.CommonGlobalAsflags}")
567*333d2b36SAndroid Build Coastguard Worker
568*333d2b36SAndroid Build Coastguard Worker	flags.Global.CppFlags = append(flags.Global.CppFlags, tc.Cppflags())
569*333d2b36SAndroid Build Coastguard Worker
570*333d2b36SAndroid Build Coastguard Worker	flags.Global.YasmFlags = append(flags.Global.YasmFlags, tc.YasmFlags())
571*333d2b36SAndroid Build Coastguard Worker
572*333d2b36SAndroid Build Coastguard Worker	// bpf targets don't need the target specific toolchain cflags. b/308826679
573*333d2b36SAndroid Build Coastguard Worker	if !proptools.Bool(compiler.Properties.Bpf_target) {
574*333d2b36SAndroid Build Coastguard Worker		flags.Global.CommonFlags = append(flags.Global.CommonFlags, tc.ToolchainCflags())
575*333d2b36SAndroid Build Coastguard Worker	}
576*333d2b36SAndroid Build Coastguard Worker
577*333d2b36SAndroid Build Coastguard Worker	cStd := parseCStd(compiler.Properties.C_std)
578*333d2b36SAndroid Build Coastguard Worker	cppStd := parseCppStd(compiler.Properties.Cpp_std)
579*333d2b36SAndroid Build Coastguard Worker
580*333d2b36SAndroid Build Coastguard Worker	cStd, cppStd = maybeReplaceGnuToC(compiler.Properties.Gnu_extensions, cStd, cppStd)
581*333d2b36SAndroid Build Coastguard Worker
582*333d2b36SAndroid Build Coastguard Worker	flags.Local.ConlyFlags = append([]string{"-std=" + cStd}, flags.Local.ConlyFlags...)
583*333d2b36SAndroid Build Coastguard Worker	flags.Local.CppFlags = append([]string{"-std=" + cppStd}, flags.Local.CppFlags...)
584*333d2b36SAndroid Build Coastguard Worker
585*333d2b36SAndroid Build Coastguard Worker	if ctx.inVendor() {
586*333d2b36SAndroid Build Coastguard Worker		flags.Local.CFlags = append(flags.Local.CFlags, esc(compiler.Properties.Target.Vendor.Cflags)...)
587*333d2b36SAndroid Build Coastguard Worker	}
588*333d2b36SAndroid Build Coastguard Worker
589*333d2b36SAndroid Build Coastguard Worker	if ctx.inProduct() {
590*333d2b36SAndroid Build Coastguard Worker		flags.Local.CFlags = append(flags.Local.CFlags, esc(compiler.Properties.Target.Product.Cflags)...)
591*333d2b36SAndroid Build Coastguard Worker	}
592*333d2b36SAndroid Build Coastguard Worker
593*333d2b36SAndroid Build Coastguard Worker	if ctx.inRecovery() {
594*333d2b36SAndroid Build Coastguard Worker		flags.Local.CFlags = append(flags.Local.CFlags, esc(compiler.Properties.Target.Recovery.Cflags)...)
595*333d2b36SAndroid Build Coastguard Worker	}
596*333d2b36SAndroid Build Coastguard Worker
597*333d2b36SAndroid Build Coastguard Worker	if ctx.inVendorRamdisk() {
598*333d2b36SAndroid Build Coastguard Worker		flags.Local.CFlags = append(flags.Local.CFlags, esc(compiler.Properties.Target.Vendor_ramdisk.Cflags)...)
599*333d2b36SAndroid Build Coastguard Worker	}
600*333d2b36SAndroid Build Coastguard Worker	if ctx.inRamdisk() {
601*333d2b36SAndroid Build Coastguard Worker		flags.Local.CFlags = append(flags.Local.CFlags, esc(compiler.Properties.Target.Ramdisk.Cflags)...)
602*333d2b36SAndroid Build Coastguard Worker	}
603*333d2b36SAndroid Build Coastguard Worker	if !ctx.useSdk() {
604*333d2b36SAndroid Build Coastguard Worker		flags.Local.CFlags = append(flags.Local.CFlags, esc(compiler.Properties.Target.Platform.Cflags)...)
605*333d2b36SAndroid Build Coastguard Worker	}
606*333d2b36SAndroid Build Coastguard Worker
607*333d2b36SAndroid Build Coastguard Worker	// We can enforce some rules more strictly in the code we own. strict
608*333d2b36SAndroid Build Coastguard Worker	// indicates if this is code that we can be stricter with. If we have
609*333d2b36SAndroid Build Coastguard Worker	// rules that we want to apply to *our* code (but maybe can't for
610*333d2b36SAndroid Build Coastguard Worker	// vendor/device specific things), we could extend this to be a ternary
611*333d2b36SAndroid Build Coastguard Worker	// value.
612*333d2b36SAndroid Build Coastguard Worker	strict := true
613*333d2b36SAndroid Build Coastguard Worker	if strings.HasPrefix(modulePath, "external/") {
614*333d2b36SAndroid Build Coastguard Worker		strict = false
615*333d2b36SAndroid Build Coastguard Worker	}
616*333d2b36SAndroid Build Coastguard Worker
617*333d2b36SAndroid Build Coastguard Worker	// Can be used to make some annotations stricter for code we can fix
618*333d2b36SAndroid Build Coastguard Worker	// (such as when we mark functions as deprecated).
619*333d2b36SAndroid Build Coastguard Worker	if strict {
620*333d2b36SAndroid Build Coastguard Worker		flags.Global.CFlags = append(flags.Global.CFlags, "-DANDROID_STRICT")
621*333d2b36SAndroid Build Coastguard Worker	}
622*333d2b36SAndroid Build Coastguard Worker
623*333d2b36SAndroid Build Coastguard Worker	if compiler.hasSrcExt(ctx, ".proto") {
624*333d2b36SAndroid Build Coastguard Worker		flags = protoFlags(ctx, flags, &compiler.Proto)
625*333d2b36SAndroid Build Coastguard Worker	}
626*333d2b36SAndroid Build Coastguard Worker
627*333d2b36SAndroid Build Coastguard Worker	if compiler.hasSrcExt(ctx, ".y") || compiler.hasSrcExt(ctx, ".yy") {
628*333d2b36SAndroid Build Coastguard Worker		flags.Local.CommonFlags = append(flags.Local.CommonFlags,
629*333d2b36SAndroid Build Coastguard Worker			"-I"+android.PathForModuleGen(ctx, "yacc", ctx.ModuleDir()).String())
630*333d2b36SAndroid Build Coastguard Worker	}
631*333d2b36SAndroid Build Coastguard Worker
632*333d2b36SAndroid Build Coastguard Worker	if len(compiler.Properties.Aidl.Libs) > 0 &&
633*333d2b36SAndroid Build Coastguard Worker		(len(compiler.Properties.Aidl.Include_dirs) > 0 || len(compiler.Properties.Aidl.Local_include_dirs) > 0) {
634*333d2b36SAndroid Build Coastguard Worker		ctx.ModuleErrorf("aidl.libs and (aidl.include_dirs or aidl.local_include_dirs) can't be set at the same time. For aidl headers, please only use aidl.libs prop")
635*333d2b36SAndroid Build Coastguard Worker	}
636*333d2b36SAndroid Build Coastguard Worker
637*333d2b36SAndroid Build Coastguard Worker	if compiler.hasAidl(ctx, deps) {
638*333d2b36SAndroid Build Coastguard Worker		flags.aidlFlags = append(flags.aidlFlags, compiler.Properties.Aidl.Flags...)
639*333d2b36SAndroid Build Coastguard Worker		if len(compiler.Properties.Aidl.Local_include_dirs) > 0 {
640*333d2b36SAndroid Build Coastguard Worker			localAidlIncludeDirs := android.PathsForModuleSrc(ctx, compiler.Properties.Aidl.Local_include_dirs)
641*333d2b36SAndroid Build Coastguard Worker			flags.aidlFlags = append(flags.aidlFlags, includeDirsToFlags(localAidlIncludeDirs))
642*333d2b36SAndroid Build Coastguard Worker		}
643*333d2b36SAndroid Build Coastguard Worker		if len(compiler.Properties.Aidl.Include_dirs) > 0 {
644*333d2b36SAndroid Build Coastguard Worker			rootAidlIncludeDirs := android.PathsForSource(ctx, compiler.Properties.Aidl.Include_dirs)
645*333d2b36SAndroid Build Coastguard Worker			flags.aidlFlags = append(flags.aidlFlags, includeDirsToFlags(rootAidlIncludeDirs))
646*333d2b36SAndroid Build Coastguard Worker		}
647*333d2b36SAndroid Build Coastguard Worker
648*333d2b36SAndroid Build Coastguard Worker		var rootAidlIncludeDirs android.Paths
649*333d2b36SAndroid Build Coastguard Worker		for _, aidlLibraryInfo := range deps.AidlLibraryInfos {
650*333d2b36SAndroid Build Coastguard Worker			rootAidlIncludeDirs = append(rootAidlIncludeDirs, aidlLibraryInfo.IncludeDirs.ToList()...)
651*333d2b36SAndroid Build Coastguard Worker		}
652*333d2b36SAndroid Build Coastguard Worker		if len(rootAidlIncludeDirs) > 0 {
653*333d2b36SAndroid Build Coastguard Worker			flags.aidlFlags = append(flags.aidlFlags, includeDirsToFlags(rootAidlIncludeDirs))
654*333d2b36SAndroid Build Coastguard Worker		}
655*333d2b36SAndroid Build Coastguard Worker
656*333d2b36SAndroid Build Coastguard Worker		if proptools.BoolDefault(compiler.Properties.Aidl.Generate_traces, true) {
657*333d2b36SAndroid Build Coastguard Worker			flags.aidlFlags = append(flags.aidlFlags, "-t")
658*333d2b36SAndroid Build Coastguard Worker		}
659*333d2b36SAndroid Build Coastguard Worker
660*333d2b36SAndroid Build Coastguard Worker		aidlMinSdkVersion := ctx.minSdkVersion()
661*333d2b36SAndroid Build Coastguard Worker		if aidlMinSdkVersion == "" {
662*333d2b36SAndroid Build Coastguard Worker			aidlMinSdkVersion = "platform_apis"
663*333d2b36SAndroid Build Coastguard Worker		}
664*333d2b36SAndroid Build Coastguard Worker		flags.aidlFlags = append(flags.aidlFlags, "--min_sdk_version="+aidlMinSdkVersion)
665*333d2b36SAndroid Build Coastguard Worker
666*333d2b36SAndroid Build Coastguard Worker		if compiler.hasSrcExt(ctx, ".aidl") {
667*333d2b36SAndroid Build Coastguard Worker			flags.Local.CommonFlags = append(flags.Local.CommonFlags,
668*333d2b36SAndroid Build Coastguard Worker				"-I"+android.PathForModuleGen(ctx, "aidl").String())
669*333d2b36SAndroid Build Coastguard Worker		}
670*333d2b36SAndroid Build Coastguard Worker		if len(deps.AidlLibraryInfos) > 0 {
671*333d2b36SAndroid Build Coastguard Worker			flags.Local.CommonFlags = append(flags.Local.CommonFlags,
672*333d2b36SAndroid Build Coastguard Worker				"-I"+android.PathForModuleGen(ctx, "aidl_library").String())
673*333d2b36SAndroid Build Coastguard Worker		}
674*333d2b36SAndroid Build Coastguard Worker	}
675*333d2b36SAndroid Build Coastguard Worker
676*333d2b36SAndroid Build Coastguard Worker	if compiler.hasSrcExt(ctx, ".rscript") || compiler.hasSrcExt(ctx, ".fs") {
677*333d2b36SAndroid Build Coastguard Worker		flags = rsFlags(ctx, flags, &compiler.Properties)
678*333d2b36SAndroid Build Coastguard Worker	}
679*333d2b36SAndroid Build Coastguard Worker
680*333d2b36SAndroid Build Coastguard Worker	if compiler.hasSrcExt(ctx, ".sysprop") {
681*333d2b36SAndroid Build Coastguard Worker		flags.Local.CommonFlags = append(flags.Local.CommonFlags,
682*333d2b36SAndroid Build Coastguard Worker			"-I"+android.PathForModuleGen(ctx, "sysprop", "include").String())
683*333d2b36SAndroid Build Coastguard Worker	}
684*333d2b36SAndroid Build Coastguard Worker
685*333d2b36SAndroid Build Coastguard Worker	if len(srcs) > 0 {
686*333d2b36SAndroid Build Coastguard Worker		module := ctx.ModuleDir() + "/Android.bp:" + ctx.ModuleName()
687*333d2b36SAndroid Build Coastguard Worker		if inList("-Wno-error", flags.Local.CFlags) || inList("-Wno-error", flags.Local.CppFlags) {
688*333d2b36SAndroid Build Coastguard Worker			ctx.getOrCreateMakeVarsInfo().UsingWnoError = module
689*333d2b36SAndroid Build Coastguard Worker		} else if !inList("-Werror", flags.Local.CFlags) && !inList("-Werror", flags.Local.CppFlags) {
690*333d2b36SAndroid Build Coastguard Worker			if warningsAreAllowed(ctx.ModuleDir()) {
691*333d2b36SAndroid Build Coastguard Worker				ctx.getOrCreateMakeVarsInfo().WarningsAllowed = module
692*333d2b36SAndroid Build Coastguard Worker			} else {
693*333d2b36SAndroid Build Coastguard Worker				flags.Local.CFlags = append([]string{"-Werror"}, flags.Local.CFlags...)
694*333d2b36SAndroid Build Coastguard Worker			}
695*333d2b36SAndroid Build Coastguard Worker		}
696*333d2b36SAndroid Build Coastguard Worker	}
697*333d2b36SAndroid Build Coastguard Worker
698*333d2b36SAndroid Build Coastguard Worker	if Bool(compiler.Properties.Openmp) {
699*333d2b36SAndroid Build Coastguard Worker		flags.Local.CFlags = append(flags.Local.CFlags, "-fopenmp")
700*333d2b36SAndroid Build Coastguard Worker	}
701*333d2b36SAndroid Build Coastguard Worker
702*333d2b36SAndroid Build Coastguard Worker	if ctx.optimizeForSize() {
703*333d2b36SAndroid Build Coastguard Worker		flags.Local.CFlags = append(flags.Local.CFlags, "-Oz")
704*333d2b36SAndroid Build Coastguard Worker		if !ctx.Config().IsEnvFalse("THINLTO_USE_MLGO") {
705*333d2b36SAndroid Build Coastguard Worker			flags.Local.LdFlags = append(flags.Local.LdFlags, "-Wl,-mllvm,-enable-ml-inliner=release")
706*333d2b36SAndroid Build Coastguard Worker		}
707*333d2b36SAndroid Build Coastguard Worker	}
708*333d2b36SAndroid Build Coastguard Worker
709*333d2b36SAndroid Build Coastguard Worker	// Exclude directories from manual binder interface allowed list.
710*333d2b36SAndroid Build Coastguard Worker	//TODO(b/145621474): Move this check into IInterface.h when clang-tidy no longer uses absolute paths.
711*333d2b36SAndroid Build Coastguard Worker	if android.HasAnyPrefix(ctx.ModuleDir(), allowedManualInterfacePaths) {
712*333d2b36SAndroid Build Coastguard Worker		flags.Local.CFlags = append(flags.Local.CFlags, "-DDO_NOT_CHECK_MANUAL_BINDER_INTERFACES")
713*333d2b36SAndroid Build Coastguard Worker	}
714*333d2b36SAndroid Build Coastguard Worker
715*333d2b36SAndroid Build Coastguard Worker	flags.NoOverrideFlags = append(flags.NoOverrideFlags, "${config.NoOverrideGlobalCflags}")
716*333d2b36SAndroid Build Coastguard Worker
717*333d2b36SAndroid Build Coastguard Worker	if flags.Toolchain.Is64Bit() {
718*333d2b36SAndroid Build Coastguard Worker		flags.NoOverrideFlags = append(flags.NoOverrideFlags, "${config.NoOverride64GlobalCflags}")
719*333d2b36SAndroid Build Coastguard Worker	}
720*333d2b36SAndroid Build Coastguard Worker
721*333d2b36SAndroid Build Coastguard Worker	if android.IsThirdPartyPath(ctx.ModuleDir()) {
722*333d2b36SAndroid Build Coastguard Worker		flags.NoOverrideFlags = append(flags.NoOverrideFlags, "${config.NoOverrideExternalGlobalCflags}")
723*333d2b36SAndroid Build Coastguard Worker	}
724*333d2b36SAndroid Build Coastguard Worker
725*333d2b36SAndroid Build Coastguard Worker	return flags
726*333d2b36SAndroid Build Coastguard Worker}
727*333d2b36SAndroid Build Coastguard Worker
728*333d2b36SAndroid Build Coastguard Workerfunc (compiler *baseCompiler) hasSrcExt(ctx BaseModuleContext, ext string) bool {
729*333d2b36SAndroid Build Coastguard Worker	for _, src := range compiler.srcsBeforeGen {
730*333d2b36SAndroid Build Coastguard Worker		if src.Ext() == ext {
731*333d2b36SAndroid Build Coastguard Worker			return true
732*333d2b36SAndroid Build Coastguard Worker		}
733*333d2b36SAndroid Build Coastguard Worker	}
734*333d2b36SAndroid Build Coastguard Worker	for _, src := range compiler.Properties.Srcs.GetOrDefault(ctx, nil) {
735*333d2b36SAndroid Build Coastguard Worker		if filepath.Ext(src) == ext {
736*333d2b36SAndroid Build Coastguard Worker			return true
737*333d2b36SAndroid Build Coastguard Worker		}
738*333d2b36SAndroid Build Coastguard Worker	}
739*333d2b36SAndroid Build Coastguard Worker
740*333d2b36SAndroid Build Coastguard Worker	return false
741*333d2b36SAndroid Build Coastguard Worker}
742*333d2b36SAndroid Build Coastguard Worker
743*333d2b36SAndroid Build Coastguard Workervar invalidDefineCharRegex = regexp.MustCompile("[^a-zA-Z0-9_]")
744*333d2b36SAndroid Build Coastguard Worker
745*333d2b36SAndroid Build Coastguard Worker// makeDefineString transforms a name of an APEX module into a value to be used as value for C define
746*333d2b36SAndroid Build Coastguard Worker// For example, com.android.foo => COM_ANDROID_FOO
747*333d2b36SAndroid Build Coastguard Workerfunc makeDefineString(name string) string {
748*333d2b36SAndroid Build Coastguard Worker	return invalidDefineCharRegex.ReplaceAllString(strings.ToUpper(name), "_")
749*333d2b36SAndroid Build Coastguard Worker}
750*333d2b36SAndroid Build Coastguard Worker
751*333d2b36SAndroid Build Coastguard Workervar gnuToCReplacer = strings.NewReplacer("gnu", "c")
752*333d2b36SAndroid Build Coastguard Worker
753*333d2b36SAndroid Build Coastguard Workerfunc ndkPathDeps(ctx ModuleContext) android.Paths {
754*333d2b36SAndroid Build Coastguard Worker	if ctx.Module().(*Module).IsSdkVariant() {
755*333d2b36SAndroid Build Coastguard Worker		// The NDK sysroot timestamp file depends on all the NDK sysroot header files
756*333d2b36SAndroid Build Coastguard Worker		// for compiling src to obj files.
757*333d2b36SAndroid Build Coastguard Worker		return android.Paths{getNdkHeadersTimestampFile(ctx)}
758*333d2b36SAndroid Build Coastguard Worker	}
759*333d2b36SAndroid Build Coastguard Worker	return nil
760*333d2b36SAndroid Build Coastguard Worker}
761*333d2b36SAndroid Build Coastguard Worker
762*333d2b36SAndroid Build Coastguard Workerfunc (compiler *baseCompiler) hasAidl(ctx BaseModuleContext, deps PathDeps) bool {
763*333d2b36SAndroid Build Coastguard Worker	return len(deps.AidlLibraryInfos) > 0 || compiler.hasSrcExt(ctx, ".aidl")
764*333d2b36SAndroid Build Coastguard Worker}
765*333d2b36SAndroid Build Coastguard Worker
766*333d2b36SAndroid Build Coastguard Workerfunc (compiler *baseCompiler) compile(ctx ModuleContext, flags Flags, deps PathDeps) Objects {
767*333d2b36SAndroid Build Coastguard Worker	pathDeps := deps.GeneratedDeps
768*333d2b36SAndroid Build Coastguard Worker	pathDeps = append(pathDeps, ndkPathDeps(ctx)...)
769*333d2b36SAndroid Build Coastguard Worker
770*333d2b36SAndroid Build Coastguard Worker	buildFlags := flagsToBuilderFlags(flags)
771*333d2b36SAndroid Build Coastguard Worker
772*333d2b36SAndroid Build Coastguard Worker	srcs := append(android.Paths(nil), compiler.srcsBeforeGen...)
773*333d2b36SAndroid Build Coastguard Worker
774*333d2b36SAndroid Build Coastguard Worker	srcs, genDeps, info := genSources(ctx, deps.AidlLibraryInfos, srcs, buildFlags)
775*333d2b36SAndroid Build Coastguard Worker	pathDeps = append(pathDeps, genDeps...)
776*333d2b36SAndroid Build Coastguard Worker
777*333d2b36SAndroid Build Coastguard Worker	compiler.pathDeps = pathDeps
778*333d2b36SAndroid Build Coastguard Worker	compiler.generatedSourceInfo = info
779*333d2b36SAndroid Build Coastguard Worker	compiler.cFlagsDeps = flags.CFlagsDeps
780*333d2b36SAndroid Build Coastguard Worker
781*333d2b36SAndroid Build Coastguard Worker	// Save src, buildFlags and context
782*333d2b36SAndroid Build Coastguard Worker	compiler.srcs = srcs
783*333d2b36SAndroid Build Coastguard Worker
784*333d2b36SAndroid Build Coastguard Worker	// Compile files listed in c.Properties.Srcs into objects
785*333d2b36SAndroid Build Coastguard Worker	objs := compileObjs(ctx, buildFlags, "", srcs,
786*333d2b36SAndroid Build Coastguard Worker		append(android.PathsForModuleSrc(ctx, compiler.Properties.Tidy_disabled_srcs), compiler.generatedSources...),
787*333d2b36SAndroid Build Coastguard Worker		android.PathsForModuleSrc(ctx, compiler.Properties.Tidy_timeout_srcs),
788*333d2b36SAndroid Build Coastguard Worker		pathDeps, compiler.cFlagsDeps)
789*333d2b36SAndroid Build Coastguard Worker
790*333d2b36SAndroid Build Coastguard Worker	if ctx.Failed() {
791*333d2b36SAndroid Build Coastguard Worker		return Objects{}
792*333d2b36SAndroid Build Coastguard Worker	}
793*333d2b36SAndroid Build Coastguard Worker
794*333d2b36SAndroid Build Coastguard Worker	return objs
795*333d2b36SAndroid Build Coastguard Worker}
796*333d2b36SAndroid Build Coastguard Worker
797*333d2b36SAndroid Build Coastguard Worker// Compile a list of source files into objects a specified subdirectory
798*333d2b36SAndroid Build Coastguard Workerfunc compileObjs(ctx ModuleContext, flags builderFlags, subdir string,
799*333d2b36SAndroid Build Coastguard Worker	srcFiles, noTidySrcs, timeoutTidySrcs, pathDeps android.Paths, cFlagsDeps android.Paths) Objects {
800*333d2b36SAndroid Build Coastguard Worker
801*333d2b36SAndroid Build Coastguard Worker	return transformSourceToObj(ctx, subdir, srcFiles, noTidySrcs, timeoutTidySrcs, flags, pathDeps, cFlagsDeps)
802*333d2b36SAndroid Build Coastguard Worker}
803*333d2b36SAndroid Build Coastguard Worker
804*333d2b36SAndroid Build Coastguard Worker// Properties for rust_bindgen related to generating rust bindings.
805*333d2b36SAndroid Build Coastguard Worker// This exists here so these properties can be included in a cc_default
806*333d2b36SAndroid Build Coastguard Worker// which can be used in both cc and rust modules.
807*333d2b36SAndroid Build Coastguard Workertype RustBindgenClangProperties struct {
808*333d2b36SAndroid Build Coastguard Worker	// list of directories relative to the Blueprints file that will
809*333d2b36SAndroid Build Coastguard Worker	// be added to the include path using -I
810*333d2b36SAndroid Build Coastguard Worker	Local_include_dirs proptools.Configurable[[]string] `android:"arch_variant,variant_prepend"`
811*333d2b36SAndroid Build Coastguard Worker
812*333d2b36SAndroid Build Coastguard Worker	// list of static libraries that provide headers for this binding.
813*333d2b36SAndroid Build Coastguard Worker	Static_libs proptools.Configurable[[]string] `android:"arch_variant,variant_prepend"`
814*333d2b36SAndroid Build Coastguard Worker
815*333d2b36SAndroid Build Coastguard Worker	// list of shared libraries that provide headers for this binding.
816*333d2b36SAndroid Build Coastguard Worker	Shared_libs proptools.Configurable[[]string] `android:"arch_variant"`
817*333d2b36SAndroid Build Coastguard Worker
818*333d2b36SAndroid Build Coastguard Worker	// List of libraries which export include paths required for this module
819*333d2b36SAndroid Build Coastguard Worker	Header_libs proptools.Configurable[[]string] `android:"arch_variant,variant_prepend"`
820*333d2b36SAndroid Build Coastguard Worker
821*333d2b36SAndroid Build Coastguard Worker	// list of clang flags required to correctly interpret the headers.
822*333d2b36SAndroid Build Coastguard Worker	Cflags proptools.Configurable[[]string] `android:"arch_variant"`
823*333d2b36SAndroid Build Coastguard Worker
824*333d2b36SAndroid Build Coastguard Worker	// list of c++ specific clang flags required to correctly interpret the headers.
825*333d2b36SAndroid Build Coastguard Worker	// This is provided primarily to make sure cppflags defined in cc_defaults are pulled in.
826*333d2b36SAndroid Build Coastguard Worker	Cppflags proptools.Configurable[[]string] `android:"arch_variant"`
827*333d2b36SAndroid Build Coastguard Worker
828*333d2b36SAndroid Build Coastguard Worker	// C standard version to use. Can be a specific version (such as "gnu11"),
829*333d2b36SAndroid Build Coastguard Worker	// "experimental" (which will use draft versions like C1x when available),
830*333d2b36SAndroid Build Coastguard Worker	// or the empty string (which will use the default).
831*333d2b36SAndroid Build Coastguard Worker	//
832*333d2b36SAndroid Build Coastguard Worker	// If this is set, the file extension will be ignored and this will be used as the std version value. Setting this
833*333d2b36SAndroid Build Coastguard Worker	// to "default" will use the build system default version. This cannot be set at the same time as cpp_std.
834*333d2b36SAndroid Build Coastguard Worker	C_std *string
835*333d2b36SAndroid Build Coastguard Worker
836*333d2b36SAndroid Build Coastguard Worker	// C++ standard version to use. Can be a specific version (such as
837*333d2b36SAndroid Build Coastguard Worker	// "gnu++11"), "experimental" (which will use draft versions like C++1z when
838*333d2b36SAndroid Build Coastguard Worker	// available), or the empty string (which will use the default).
839*333d2b36SAndroid Build Coastguard Worker	//
840*333d2b36SAndroid Build Coastguard Worker	// If this is set, the file extension will be ignored and this will be used as the std version value. Setting this
841*333d2b36SAndroid Build Coastguard Worker	// to "default" will use the build system default version. This cannot be set at the same time as c_std.
842*333d2b36SAndroid Build Coastguard Worker	Cpp_std *string
843*333d2b36SAndroid Build Coastguard Worker
844*333d2b36SAndroid Build Coastguard Worker	//TODO(b/161141999) Add support for headers from cc_library_header modules.
845*333d2b36SAndroid Build Coastguard Worker}
846