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 "runtime" 19 "strings" 20 21 "android/soong/android" 22 "android/soong/remoteexec" 23) 24 25var ( 26 pctx = android.NewPackageContext("android/soong/cc/config") 27 exportedVars = android.NewExportedVariables(pctx) 28 29 // Flags used by lots of devices. Putting them in package static variables 30 // will save bytes in build.ninja so they aren't repeated for every file 31 commonGlobalCflags = []string{ 32 "-DANDROID", 33 "-fmessage-length=0", 34 "-W", 35 "-Wall", 36 "-Wno-unused", 37 "-Winit-self", 38 "-Wpointer-arith", 39 "-Wunreachable-code-loop-increment", 40 41 // Make paths in deps files relative 42 "-no-canonical-prefixes", 43 44 "-DNDEBUG", 45 "-UDEBUG", 46 47 "-fno-exceptions", 48 "-Wno-multichar", 49 50 "-O2", 51 "-g", 52 "-fdebug-default-version=5", 53 54 "-fno-strict-aliasing", 55 56 "-Werror=date-time", 57 "-Werror=pragma-pack", 58 "-Werror=pragma-pack-suspicious-include", 59 "-Werror=string-plus-int", 60 "-Werror=unreachable-code-loop-increment", 61 62 "-D__compiler_offsetof=__builtin_offsetof", 63 64 // Emit address-significance table which allows linker to perform safe ICF. Clang does 65 // not emit the table by default on Android since NDK still uses GNU binutils. 66 "-faddrsig", 67 68 // Turn on -fcommon explicitly, since Clang now defaults to -fno-common. The cleanup bug 69 // tracking this is http://b/151457797. 70 "-fcommon", 71 72 // Help catch common 32/64-bit errors. 73 "-Werror=int-conversion", 74 75 // Enable the new pass manager. 76 "-fexperimental-new-pass-manager", 77 78 // Disable overly aggressive warning for macros defined with a leading underscore 79 // This happens in AndroidConfig.h, which is included nearly everywhere. 80 // TODO: can we remove this now? 81 "-Wno-reserved-id-macro", 82 83 // Force clang to always output color diagnostics. Ninja will strip the ANSI 84 // color codes if it is not running in a terminal. 85 "-fcolor-diagnostics", 86 87 // Warnings from clang-7.0 88 "-Wno-sign-compare", 89 90 // Warnings from clang-8.0 91 "-Wno-defaulted-function-deleted", 92 93 // Disable -Winconsistent-missing-override until we can clean up the existing 94 // codebase for it. 95 "-Wno-inconsistent-missing-override", 96 97 // Warnings from clang-10 98 // Nested and array designated initialization is nice to have. 99 "-Wno-c99-designator", 100 101 // Many old files still have GNU designator syntax. 102 "-Wno-gnu-designator", 103 104 // Warnings from clang-12 105 "-Wno-gnu-folding-constant", 106 107 // Calls to the APIs that are newer than the min sdk version of the caller should be 108 // guarded with __builtin_available. 109 "-Wunguarded-availability", 110 // This macro allows the bionic versioning.h to indirectly determine whether the 111 // option -Wunguarded-availability is on or not. 112 "-D__ANDROID_UNAVAILABLE_SYMBOLS_ARE_WEAK__", 113 114 // Turn off FMA which got enabled by default in clang-r445002 (http://b/218805949) 115 "-ffp-contract=off", 116 } 117 118 commonGlobalConlyflags = []string{} 119 120 deviceGlobalCflags = []string{ 121 "-ffunction-sections", 122 "-fdata-sections", 123 "-fno-short-enums", 124 "-funwind-tables", 125 "-fstack-protector-strong", 126 "-Wa,--noexecstack", 127 "-D_FORTIFY_SOURCE=2", 128 129 "-Wstrict-aliasing=2", 130 131 "-Werror=return-type", 132 "-Werror=non-virtual-dtor", 133 "-Werror=address", 134 "-Werror=sequence-point", 135 "-Werror=format-security", 136 "-nostdlibinc", 137 138 // Emit additional debug info for AutoFDO 139 "-fdebug-info-for-profiling", 140 } 141 142 deviceGlobalCppflags = []string{ 143 "-fvisibility-inlines-hidden", 144 } 145 146 deviceGlobalLdflags = []string{ 147 "-Wl,-z,noexecstack", 148 "-Wl,-z,relro", 149 "-Wl,-z,now", 150 "-Wl,--build-id=md5", 151 "-Wl,--fatal-warnings", 152 "-Wl,--no-undefined-version", 153 // TODO: Eventually we should link against a libunwind.a with hidden symbols, and then these 154 // --exclude-libs arguments can be removed. 155 "-Wl,--exclude-libs,libgcc.a", 156 "-Wl,--exclude-libs,libgcc_stripped.a", 157 "-Wl,--exclude-libs,libunwind_llvm.a", 158 "-Wl,--exclude-libs,libunwind.a", 159 "-Wl,--icf=safe", 160 } 161 162 deviceGlobalLldflags = append(deviceGlobalLdflags, 163 []string{ 164 "-fuse-ld=lld", 165 }...) 166 167 hostGlobalCflags = []string{} 168 169 hostGlobalCppflags = []string{} 170 171 hostGlobalLdflags = []string{} 172 173 hostGlobalLldflags = []string{"-fuse-ld=lld"} 174 175 commonGlobalCppflags = []string{ 176 "-Wsign-promo", 177 178 // -Wimplicit-fallthrough is not enabled by -Wall. 179 "-Wimplicit-fallthrough", 180 181 // Enable clang's thread-safety annotations in libcxx. 182 "-D_LIBCPP_ENABLE_THREAD_SAFETY_ANNOTATIONS", 183 184 // libc++'s math.h has an #include_next outside of system_headers. 185 "-Wno-gnu-include-next", 186 } 187 188 noOverrideGlobalCflags = []string{ 189 "-Werror=bool-operation", 190 "-Werror=implicit-int-float-conversion", 191 "-Werror=int-in-bool-context", 192 "-Werror=int-to-pointer-cast", 193 "-Werror=pointer-to-int-cast", 194 "-Werror=string-compare", 195 "-Werror=xor-used-as-pow", 196 // http://b/161386391 for -Wno-void-pointer-to-enum-cast 197 "-Wno-void-pointer-to-enum-cast", 198 // http://b/161386391 for -Wno-void-pointer-to-int-cast 199 "-Wno-void-pointer-to-int-cast", 200 // http://b/161386391 for -Wno-pointer-to-int-cast 201 "-Wno-pointer-to-int-cast", 202 "-Werror=fortify-source", 203 204 "-Werror=address-of-temporary", 205 // Bug: http://b/29823425 Disable -Wnull-dereference until the 206 // new cases detected by this warning in Clang r271374 are 207 // fixed. 208 //"-Werror=null-dereference", 209 "-Werror=return-type", 210 211 // http://b/72331526 Disable -Wtautological-* until the instances detected by these 212 // new warnings are fixed. 213 "-Wno-tautological-constant-compare", 214 "-Wno-tautological-type-limit-compare", 215 // http://b/145210666 216 "-Wno-reorder-init-list", 217 // http://b/145211066 218 "-Wno-implicit-int-float-conversion", 219 // New warnings to be fixed after clang-r377782. 220 "-Wno-sizeof-array-div", // http://b/148815709 221 "-Wno-tautological-overlap-compare", // http://b/148815696 222 // New warnings to be fixed after clang-r383902. 223 "-Wno-deprecated-copy", // http://b/153746672 224 "-Wno-range-loop-construct", // http://b/153747076 225 "-Wno-misleading-indentation", // http://b/153746954 226 "-Wno-zero-as-null-pointer-constant", // http://b/68236239 227 "-Wno-deprecated-anon-enum-enum-conversion", // http://b/153746485 228 "-Wno-string-compare", // http://b/153764102 229 "-Wno-pessimizing-move", // http://b/154270751 230 // New warnings to be fixed after clang-r399163 231 "-Wno-non-c-typedef-for-linkage", // http://b/161304145 232 // New warnings to be fixed after clang-r428724 233 "-Wno-align-mismatch", // http://b/193679946 234 // New warnings to be fixed after clang-r433403 235 "-Wno-error=unused-but-set-variable", // http://b/197240255 236 "-Wno-error=unused-but-set-parameter", // http://b/197240255 237 } 238 239 noOverrideExternalGlobalCflags = []string{ 240 // http://b/197240255 241 "-Wno-unused-but-set-variable", 242 "-Wno-unused-but-set-parameter", 243 // http://b/215753485 244 "-Wno-bitwise-instead-of-logical", 245 } 246 247 // Extra cflags for external third-party projects to disable warnings that 248 // are infeasible to fix in all the external projects and their upstream repos. 249 extraExternalCflags = []string{ 250 "-Wno-enum-compare", 251 "-Wno-enum-compare-switch", 252 253 // http://b/72331524 Allow null pointer arithmetic until the instances detected by 254 // this new warning are fixed. 255 "-Wno-null-pointer-arithmetic", 256 257 // Bug: http://b/29823425 Disable -Wnull-dereference until the 258 // new instances detected by this warning are fixed. 259 "-Wno-null-dereference", 260 261 // http://b/145211477 262 "-Wno-pointer-compare", 263 // http://b/145211022 264 "-Wno-xor-used-as-pow", 265 // http://b/145211022 266 "-Wno-final-dtor-non-final-class", 267 268 // http://b/165945989 269 "-Wno-psabi", 270 271 // http://b/199369603 272 "-Wno-null-pointer-subtraction", 273 274 // http://b/175068488 275 "-Wno-string-concatenation", 276 } 277 278 IllegalFlags = []string{ 279 "-w", 280 } 281 282 CStdVersion = "gnu99" 283 CppStdVersion = "gnu++17" 284 ExperimentalCStdVersion = "gnu11" 285 ExperimentalCppStdVersion = "gnu++2a" 286 287 // prebuilts/clang default settings. 288 ClangDefaultBase = "prebuilts/clang/host" 289 ClangDefaultVersion = "clang-r450784d" 290 ClangDefaultShortVersion = "14.0.6" 291 292 // Directories with warnings from Android.bp files. 293 WarningAllowedProjects = []string{ 294 "device/", 295 "vendor/", 296 } 297 298 // Directories with warnings from Android.mk files. 299 WarningAllowedOldProjects = []string{} 300) 301 302// BazelCcToolchainVars generates bzl file content containing variables for 303// Bazel's cc_toolchain configuration. 304func BazelCcToolchainVars(config android.Config) string { 305 return android.BazelToolchainVars(config, exportedVars) 306} 307 308func ExportStringList(name string, value []string) { 309 exportedVars.ExportStringList(name, value) 310} 311 312func init() { 313 if runtime.GOOS == "linux" { 314 commonGlobalCflags = append(commonGlobalCflags, "-fdebug-prefix-map=/proc/self/cwd=") 315 } 316 317 exportedVars.ExportStringListStaticVariable("CommonGlobalConlyflags", commonGlobalConlyflags) 318 exportedVars.ExportStringListStaticVariable("DeviceGlobalCppflags", deviceGlobalCppflags) 319 exportedVars.ExportStringListStaticVariable("DeviceGlobalLdflags", deviceGlobalLdflags) 320 exportedVars.ExportStringListStaticVariable("DeviceGlobalLldflags", deviceGlobalLldflags) 321 exportedVars.ExportStringListStaticVariable("HostGlobalCppflags", hostGlobalCppflags) 322 exportedVars.ExportStringListStaticVariable("HostGlobalLdflags", hostGlobalLdflags) 323 exportedVars.ExportStringListStaticVariable("HostGlobalLldflags", hostGlobalLldflags) 324 325 // Export the static default CommonGlobalCflags to Bazel. 326 // TODO(187086342): handle cflags that are set in VariableFuncs. 327 bazelCommonGlobalCflags := append( 328 commonGlobalCflags, 329 []string{ 330 // Default to zero initialization. 331 "-ftrivial-auto-var-init=zero", 332 "-enable-trivial-auto-var-init-zero-knowing-it-will-be-removed-from-clang", 333 }...) 334 exportedVars.ExportStringList("CommonGlobalCflags", bazelCommonGlobalCflags) 335 336 pctx.VariableFunc("CommonGlobalCflags", func(ctx android.PackageVarContext) string { 337 flags := commonGlobalCflags 338 339 // http://b/131390872 340 // Automatically initialize any uninitialized stack variables. 341 // Prefer zero-init if multiple options are set. 342 if ctx.Config().IsEnvTrue("AUTO_ZERO_INITIALIZE") { 343 flags = append(flags, "-ftrivial-auto-var-init=zero -enable-trivial-auto-var-init-zero-knowing-it-will-be-removed-from-clang") 344 } else if ctx.Config().IsEnvTrue("AUTO_PATTERN_INITIALIZE") { 345 flags = append(flags, "-ftrivial-auto-var-init=pattern") 346 } else if ctx.Config().IsEnvTrue("AUTO_UNINITIALIZE") { 347 flags = append(flags, "-ftrivial-auto-var-init=uninitialized") 348 } else { 349 // Default to zero initialization. 350 flags = append(flags, "-ftrivial-auto-var-init=zero -enable-trivial-auto-var-init-zero-knowing-it-will-be-removed-from-clang") 351 } 352 353 // Workaround for ccache with clang. 354 // See http://petereisentraut.blogspot.com/2011/05/ccache-and-clang.html. 355 if ctx.Config().IsEnvTrue("USE_CCACHE") { 356 flags = append(flags, "-Wno-unused-command-line-argument") 357 } 358 return strings.Join(flags, " ") 359 }) 360 361 // Export the static default DeviceGlobalCflags to Bazel. 362 // TODO(187086342): handle cflags that are set in VariableFuncs. 363 exportedVars.ExportStringList("DeviceGlobalCflags", deviceGlobalCflags) 364 365 pctx.VariableFunc("DeviceGlobalCflags", func(ctx android.PackageVarContext) string { 366 return strings.Join(deviceGlobalCflags, " ") 367 }) 368 369 exportedVars.ExportStringListStaticVariable("HostGlobalCflags", hostGlobalCflags) 370 exportedVars.ExportStringListStaticVariable("NoOverrideGlobalCflags", noOverrideGlobalCflags) 371 exportedVars.ExportStringListStaticVariable("NoOverrideExternalGlobalCflags", noOverrideExternalGlobalCflags) 372 exportedVars.ExportStringListStaticVariable("CommonGlobalCppflags", commonGlobalCppflags) 373 exportedVars.ExportStringListStaticVariable("ExternalCflags", extraExternalCflags) 374 375 // Everything in these lists is a crime against abstraction and dependency tracking. 376 // Do not add anything to this list. 377 commonGlobalIncludes := []string{ 378 "system/core/include", 379 "system/logging/liblog/include", 380 "system/media/audio/include", 381 "hardware/libhardware/include", 382 "hardware/libhardware_legacy/include", 383 "hardware/ril/include", 384 "frameworks/native/include", 385 "frameworks/native/opengl/include", 386 "frameworks/av/include", 387 } 388 exportedVars.ExportStringList("CommonGlobalIncludes", commonGlobalIncludes) 389 pctx.PrefixedExistentPathsForSourcesVariable("CommonGlobalIncludes", "-I", commonGlobalIncludes) 390 391 exportedVars.ExportStringStaticVariable("CLANG_DEFAULT_VERSION", ClangDefaultVersion) 392 exportedVars.ExportStringStaticVariable("CLANG_DEFAULT_SHORT_VERSION", ClangDefaultShortVersion) 393 394 pctx.StaticVariableWithEnvOverride("ClangBase", "LLVM_PREBUILTS_BASE", ClangDefaultBase) 395 pctx.StaticVariableWithEnvOverride("ClangVersion", "LLVM_PREBUILTS_VERSION", ClangDefaultVersion) 396 pctx.StaticVariable("ClangPath", "${ClangBase}/${HostPrebuiltTag}/${ClangVersion}") 397 pctx.StaticVariable("ClangBin", "${ClangPath}/bin") 398 399 pctx.StaticVariableWithEnvOverride("ClangShortVersion", "LLVM_RELEASE_VERSION", ClangDefaultShortVersion) 400 pctx.StaticVariable("ClangAsanLibDir", "${ClangBase}/linux-x86/${ClangVersion}/lib64/clang/${ClangShortVersion}/lib/linux") 401 402 // These are tied to the version of LLVM directly in external/llvm, so they might trail the host prebuilts 403 // being used for the rest of the build process. 404 pctx.SourcePathVariable("RSClangBase", "prebuilts/clang/host") 405 pctx.SourcePathVariable("RSClangVersion", "clang-3289846") 406 pctx.SourcePathVariable("RSReleaseVersion", "3.8") 407 pctx.StaticVariable("RSLLVMPrebuiltsPath", "${RSClangBase}/${HostPrebuiltTag}/${RSClangVersion}/bin") 408 pctx.StaticVariable("RSIncludePath", "${RSLLVMPrebuiltsPath}/../lib64/clang/${RSReleaseVersion}/include") 409 410 pctx.PrefixedExistentPathsForSourcesVariable("RsGlobalIncludes", "-I", 411 []string{ 412 "external/clang/lib/Headers", 413 "frameworks/rs/script_api/include", 414 }) 415 416 pctx.VariableFunc("CcWrapper", func(ctx android.PackageVarContext) string { 417 if override := ctx.Config().Getenv("CC_WRAPPER"); override != "" { 418 return override + " " 419 } 420 return "" 421 }) 422 423 pctx.StaticVariableWithEnvOverride("RECXXPool", "RBE_CXX_POOL", remoteexec.DefaultPool) 424 pctx.StaticVariableWithEnvOverride("RECXXLinksPool", "RBE_CXX_LINKS_POOL", remoteexec.DefaultPool) 425 pctx.StaticVariableWithEnvOverride("REClangTidyPool", "RBE_CLANG_TIDY_POOL", remoteexec.DefaultPool) 426 pctx.StaticVariableWithEnvOverride("RECXXLinksExecStrategy", "RBE_CXX_LINKS_EXEC_STRATEGY", remoteexec.LocalExecStrategy) 427 pctx.StaticVariableWithEnvOverride("REClangTidyExecStrategy", "RBE_CLANG_TIDY_EXEC_STRATEGY", remoteexec.LocalExecStrategy) 428 pctx.StaticVariableWithEnvOverride("REAbiDumperExecStrategy", "RBE_ABI_DUMPER_EXEC_STRATEGY", remoteexec.LocalExecStrategy) 429 pctx.StaticVariableWithEnvOverride("REAbiLinkerExecStrategy", "RBE_ABI_LINKER_EXEC_STRATEGY", remoteexec.LocalExecStrategy) 430} 431 432var HostPrebuiltTag = exportedVars.ExportVariableConfigMethod("HostPrebuiltTag", android.Config.PrebuiltOS) 433 434func ClangPath(ctx android.PathContext, file string) android.SourcePath { 435 type clangToolKey string 436 437 key := android.NewCustomOnceKey(clangToolKey(file)) 438 439 return ctx.Config().OnceSourcePath(key, func() android.SourcePath { 440 return clangPath(ctx).Join(ctx, file) 441 }) 442} 443 444var clangPathKey = android.NewOnceKey("clangPath") 445 446func clangPath(ctx android.PathContext) android.SourcePath { 447 return ctx.Config().OnceSourcePath(clangPathKey, func() android.SourcePath { 448 clangBase := ClangDefaultBase 449 if override := ctx.Config().Getenv("LLVM_PREBUILTS_BASE"); override != "" { 450 clangBase = override 451 } 452 clangVersion := ClangDefaultVersion 453 if override := ctx.Config().Getenv("LLVM_PREBUILTS_VERSION"); override != "" { 454 clangVersion = override 455 } 456 return android.PathForSource(ctx, clangBase, ctx.Config().PrebuiltOS(), clangVersion) 457 }) 458} 459