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