• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1// Copyright 2016 Google Inc. All rights reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7//     http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package config
16
17import (
18	"strings"
19
20	"android/soong/android"
21	"android/soong/remoteexec"
22)
23
24var (
25	// Flags used by lots of devices.  Putting them in package static variables
26	// will save bytes in build.ninja so they aren't repeated for every file
27	commonGlobalCflags = []string{
28		"-DANDROID",
29		"-fmessage-length=0",
30		"-W",
31		"-Wall",
32		"-Wno-unused",
33		"-Winit-self",
34		"-Wpointer-arith",
35
36		// Make paths in deps files relative
37		"-no-canonical-prefixes",
38		"-fno-canonical-system-headers",
39
40		"-DNDEBUG",
41		"-UDEBUG",
42
43		"-fno-exceptions",
44		"-Wno-multichar",
45
46		"-O2",
47		"-g",
48
49		"-fno-strict-aliasing",
50
51		"-Werror=date-time",
52		"-Werror=pragma-pack",
53		"-Werror=pragma-pack-suspicious-include",
54	}
55
56	commonGlobalConlyflags = []string{}
57
58	deviceGlobalCflags = []string{
59		"-fdiagnostics-color",
60
61		"-ffunction-sections",
62		"-fdata-sections",
63		"-fno-short-enums",
64		"-funwind-tables",
65		"-fstack-protector-strong",
66		"-Wa,--noexecstack",
67		"-D_FORTIFY_SOURCE=2",
68
69		"-Wstrict-aliasing=2",
70
71		"-Werror=return-type",
72		"-Werror=non-virtual-dtor",
73		"-Werror=address",
74		"-Werror=sequence-point",
75		"-Werror=format-security",
76	}
77
78	deviceGlobalCppflags = []string{
79		"-fvisibility-inlines-hidden",
80	}
81
82	deviceGlobalLdflags = []string{
83		"-Wl,-z,noexecstack",
84		"-Wl,-z,relro",
85		"-Wl,-z,now",
86		"-Wl,--build-id=md5",
87		"-Wl,--warn-shared-textrel",
88		"-Wl,--fatal-warnings",
89		"-Wl,--no-undefined-version",
90		"-Wl,--exclude-libs,libgcc.a",
91		"-Wl,--exclude-libs,libgcc_stripped.a",
92		"-Wl,--exclude-libs,libunwind_llvm.a",
93	}
94
95	deviceGlobalLldflags = append(ClangFilterUnknownLldflags(deviceGlobalLdflags),
96		[]string{
97			"-fuse-ld=lld",
98		}...)
99
100	hostGlobalCflags = []string{}
101
102	hostGlobalCppflags = []string{}
103
104	hostGlobalLdflags = []string{}
105
106	hostGlobalLldflags = []string{"-fuse-ld=lld"}
107
108	commonGlobalCppflags = []string{
109		"-Wsign-promo",
110	}
111
112	noOverrideGlobalCflags = []string{
113		"-Werror=int-to-pointer-cast",
114		"-Werror=pointer-to-int-cast",
115		"-Werror=fortify-source",
116	}
117
118	IllegalFlags = []string{
119		"-w",
120	}
121
122	CStdVersion               = "gnu99"
123	CppStdVersion             = "gnu++17"
124	ExperimentalCStdVersion   = "gnu11"
125	ExperimentalCppStdVersion = "gnu++2a"
126
127	NdkMaxPrebuiltVersionInt = 27
128
129	// prebuilts/clang default settings.
130	ClangDefaultBase         = "prebuilts/clang/host"
131	ClangDefaultVersion      = "clang-r383902b1"
132	ClangDefaultShortVersion = "11.0.2"
133
134	// Directories with warnings from Android.bp files.
135	WarningAllowedProjects = []string{
136		"device/",
137		"vendor/",
138	}
139
140	// Directories with warnings from Android.mk files.
141	WarningAllowedOldProjects = []string{}
142)
143
144var pctx = android.NewPackageContext("android/soong/cc/config")
145
146func init() {
147	if android.BuildOs == android.Linux {
148		commonGlobalCflags = append(commonGlobalCflags, "-fdebug-prefix-map=/proc/self/cwd=")
149	}
150
151	pctx.StaticVariable("CommonGlobalConlyflags", strings.Join(commonGlobalConlyflags, " "))
152	pctx.StaticVariable("DeviceGlobalCppflags", strings.Join(deviceGlobalCppflags, " "))
153	pctx.StaticVariable("DeviceGlobalLdflags", strings.Join(deviceGlobalLdflags, " "))
154	pctx.StaticVariable("DeviceGlobalLldflags", strings.Join(deviceGlobalLldflags, " "))
155	pctx.StaticVariable("HostGlobalCppflags", strings.Join(hostGlobalCppflags, " "))
156	pctx.StaticVariable("HostGlobalLdflags", strings.Join(hostGlobalLdflags, " "))
157	pctx.StaticVariable("HostGlobalLldflags", strings.Join(hostGlobalLldflags, " "))
158
159	pctx.VariableFunc("CommonClangGlobalCflags", func(ctx android.PackageVarContext) string {
160		flags := ClangFilterUnknownCflags(commonGlobalCflags)
161		flags = append(flags, "${ClangExtraCflags}")
162
163		// http://b/131390872
164		// Automatically initialize any uninitialized stack variables.
165		// Prefer zero-init if multiple options are set.
166		if ctx.Config().IsEnvTrue("AUTO_ZERO_INITIALIZE") {
167			flags = append(flags, "-ftrivial-auto-var-init=zero -enable-trivial-auto-var-init-zero-knowing-it-will-be-removed-from-clang")
168		} else if ctx.Config().IsEnvTrue("AUTO_PATTERN_INITIALIZE") {
169			flags = append(flags, "-ftrivial-auto-var-init=pattern")
170		} else if ctx.Config().IsEnvTrue("AUTO_UNINITIALIZE") {
171			flags = append(flags, "-ftrivial-auto-var-init=uninitialized")
172		} else {
173			// Default to zero initialization.
174			flags = append(flags, "-ftrivial-auto-var-init=zero -enable-trivial-auto-var-init-zero-knowing-it-will-be-removed-from-clang")
175		}
176
177		return strings.Join(flags, " ")
178	})
179
180	pctx.VariableFunc("DeviceClangGlobalCflags", func(ctx android.PackageVarContext) string {
181		if ctx.Config().Fuchsia() {
182			return strings.Join(ClangFilterUnknownCflags(deviceGlobalCflags), " ")
183		} else {
184			return strings.Join(append(ClangFilterUnknownCflags(deviceGlobalCflags), "${ClangExtraTargetCflags}"), " ")
185		}
186	})
187	pctx.StaticVariable("HostClangGlobalCflags",
188		strings.Join(ClangFilterUnknownCflags(hostGlobalCflags), " "))
189	pctx.StaticVariable("NoOverrideClangGlobalCflags",
190		strings.Join(append(ClangFilterUnknownCflags(noOverrideGlobalCflags), "${ClangExtraNoOverrideCflags}"), " "))
191
192	pctx.StaticVariable("CommonClangGlobalCppflags",
193		strings.Join(append(ClangFilterUnknownCflags(commonGlobalCppflags), "${ClangExtraCppflags}"), " "))
194
195	pctx.StaticVariable("ClangExternalCflags", "${ClangExtraExternalCflags}")
196
197	// Everything in these lists is a crime against abstraction and dependency tracking.
198	// Do not add anything to this list.
199	pctx.PrefixedExistentPathsForSourcesVariable("CommonGlobalIncludes", "-I",
200		[]string{
201			"system/core/include",
202			"system/media/audio/include",
203			"hardware/libhardware/include",
204			"hardware/libhardware_legacy/include",
205			"hardware/ril/include",
206			"frameworks/native/include",
207			"frameworks/native/opengl/include",
208			"frameworks/av/include",
209		})
210	// This is used by non-NDK modules to get jni.h. export_include_dirs doesn't help
211	// with this, since there is no associated library.
212	pctx.PrefixedExistentPathsForSourcesVariable("CommonNativehelperInclude", "-I",
213		[]string{"libnativehelper/include_jni"})
214
215	pctx.SourcePathVariable("ClangDefaultBase", ClangDefaultBase)
216	pctx.VariableFunc("ClangBase", func(ctx android.PackageVarContext) string {
217		if override := ctx.Config().Getenv("LLVM_PREBUILTS_BASE"); override != "" {
218			return override
219		}
220		return "${ClangDefaultBase}"
221	})
222	pctx.VariableFunc("ClangVersion", func(ctx android.PackageVarContext) string {
223		if override := ctx.Config().Getenv("LLVM_PREBUILTS_VERSION"); override != "" {
224			return override
225		}
226		return ClangDefaultVersion
227	})
228	pctx.StaticVariable("ClangPath", "${ClangBase}/${HostPrebuiltTag}/${ClangVersion}")
229	pctx.StaticVariable("ClangBin", "${ClangPath}/bin")
230
231	pctx.VariableFunc("ClangShortVersion", func(ctx android.PackageVarContext) string {
232		if override := ctx.Config().Getenv("LLVM_RELEASE_VERSION"); override != "" {
233			return override
234		}
235		return ClangDefaultShortVersion
236	})
237	pctx.StaticVariable("ClangAsanLibDir", "${ClangBase}/linux-x86/${ClangVersion}/lib64/clang/${ClangShortVersion}/lib/linux")
238
239	// These are tied to the version of LLVM directly in external/llvm, so they might trail the host prebuilts
240	// being used for the rest of the build process.
241	pctx.SourcePathVariable("RSClangBase", "prebuilts/clang/host")
242	pctx.SourcePathVariable("RSClangVersion", "clang-3289846")
243	pctx.SourcePathVariable("RSReleaseVersion", "3.8")
244	pctx.StaticVariable("RSLLVMPrebuiltsPath", "${RSClangBase}/${HostPrebuiltTag}/${RSClangVersion}/bin")
245	pctx.StaticVariable("RSIncludePath", "${RSLLVMPrebuiltsPath}/../lib64/clang/${RSReleaseVersion}/include")
246
247	pctx.PrefixedExistentPathsForSourcesVariable("RsGlobalIncludes", "-I",
248		[]string{
249			"external/clang/lib/Headers",
250			"frameworks/rs/script_api/include",
251		})
252
253	pctx.VariableFunc("CcWrapper", func(ctx android.PackageVarContext) string {
254		if override := ctx.Config().Getenv("CC_WRAPPER"); override != "" {
255			return override + " "
256		}
257		return ""
258	})
259
260	pctx.VariableFunc("RECXXPool", remoteexec.EnvOverrideFunc("RBE_CXX_POOL", remoteexec.DefaultPool))
261	pctx.VariableFunc("RECXXLinksPool", remoteexec.EnvOverrideFunc("RBE_CXX_LINKS_POOL", remoteexec.DefaultPool))
262	pctx.VariableFunc("RECXXLinksExecStrategy", remoteexec.EnvOverrideFunc("RBE_CXX_LINKS_EXEC_STRATEGY", remoteexec.LocalExecStrategy))
263	pctx.VariableFunc("REAbiDumperExecStrategy", remoteexec.EnvOverrideFunc("RBE_ABI_DUMPER_EXEC_STRATEGY", remoteexec.LocalExecStrategy))
264	pctx.VariableFunc("REAbiLinkerExecStrategy", remoteexec.EnvOverrideFunc("RBE_ABI_LINKER_EXEC_STRATEGY", remoteexec.LocalExecStrategy))
265}
266
267var HostPrebuiltTag = pctx.VariableConfigMethod("HostPrebuiltTag", android.Config.PrebuiltOS)
268
269func bionicHeaders(kernelArch string) string {
270	return strings.Join([]string{
271		"-isystem bionic/libc/include",
272		"-isystem bionic/libc/kernel/uapi",
273		"-isystem bionic/libc/kernel/uapi/asm-" + kernelArch,
274		"-isystem bionic/libc/kernel/android/scsi",
275		"-isystem bionic/libc/kernel/android/uapi",
276	}, " ")
277}
278
279func envOverrideFunc(envVar, defaultVal string) func(ctx android.PackageVarContext) string {
280	return func(ctx android.PackageVarContext) string {
281		if override := ctx.Config().Getenv(envVar); override != "" {
282			return override
283		}
284		return defaultVal
285	}
286}
287