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 "sort" 20*333d2b36SAndroid Build Coastguard Worker "strings" 21*333d2b36SAndroid Build Coastguard Worker "sync" 22*333d2b36SAndroid Build Coastguard Worker 23*333d2b36SAndroid Build Coastguard Worker "android/soong/android" 24*333d2b36SAndroid Build Coastguard Worker "android/soong/cc/config" 25*333d2b36SAndroid Build Coastguard Worker) 26*333d2b36SAndroid Build Coastguard Worker 27*333d2b36SAndroid Build Coastguard Workervar ( 28*333d2b36SAndroid Build Coastguard Worker sanitizerVariables = map[string]string{ 29*333d2b36SAndroid Build Coastguard Worker "ADDRESS_SANITIZER_RUNTIME_LIBRARY": config.AddressSanitizerRuntimeLibrary(), 30*333d2b36SAndroid Build Coastguard Worker "HWADDRESS_SANITIZER_RUNTIME_LIBRARY": config.HWAddressSanitizerRuntimeLibrary(), 31*333d2b36SAndroid Build Coastguard Worker "HWADDRESS_SANITIZER_STATIC_LIBRARY": config.HWAddressSanitizerStaticLibrary(), 32*333d2b36SAndroid Build Coastguard Worker "UBSAN_RUNTIME_LIBRARY": config.UndefinedBehaviorSanitizerRuntimeLibrary(), 33*333d2b36SAndroid Build Coastguard Worker "UBSAN_MINIMAL_RUNTIME_LIBRARY": config.UndefinedBehaviorSanitizerMinimalRuntimeLibrary(), 34*333d2b36SAndroid Build Coastguard Worker "TSAN_RUNTIME_LIBRARY": config.ThreadSanitizerRuntimeLibrary(), 35*333d2b36SAndroid Build Coastguard Worker "SCUDO_RUNTIME_LIBRARY": config.ScudoRuntimeLibrary(), 36*333d2b36SAndroid Build Coastguard Worker "SCUDO_MINIMAL_RUNTIME_LIBRARY": config.ScudoMinimalRuntimeLibrary(), 37*333d2b36SAndroid Build Coastguard Worker } 38*333d2b36SAndroid Build Coastguard Worker) 39*333d2b36SAndroid Build Coastguard Worker 40*333d2b36SAndroid Build Coastguard Workerfunc init() { 41*333d2b36SAndroid Build Coastguard Worker android.RegisterMakeVarsProvider(pctx, makeVarsProvider) 42*333d2b36SAndroid Build Coastguard Worker} 43*333d2b36SAndroid Build Coastguard Worker 44*333d2b36SAndroid Build Coastguard Workerfunc getNamedMapForConfig(config android.Config, key android.OnceKey) *sync.Map { 45*333d2b36SAndroid Build Coastguard Worker return config.Once(key, func() interface{} { 46*333d2b36SAndroid Build Coastguard Worker return &sync.Map{} 47*333d2b36SAndroid Build Coastguard Worker }).(*sync.Map) 48*333d2b36SAndroid Build Coastguard Worker} 49*333d2b36SAndroid Build Coastguard Worker 50*333d2b36SAndroid Build Coastguard Workerfunc makeVarsString(items []string) string { 51*333d2b36SAndroid Build Coastguard Worker items = android.SortedUniqueStrings(items) 52*333d2b36SAndroid Build Coastguard Worker return strings.Join(items, " ") 53*333d2b36SAndroid Build Coastguard Worker} 54*333d2b36SAndroid Build Coastguard Worker 55*333d2b36SAndroid Build Coastguard Workerfunc makeStringOfWarningAllowedProjects() string { 56*333d2b36SAndroid Build Coastguard Worker allProjects := append([]string{}, config.WarningAllowedProjects...) 57*333d2b36SAndroid Build Coastguard Worker sort.Strings(allProjects) 58*333d2b36SAndroid Build Coastguard Worker // Makefile rules use pattern "path/%" to match module paths. 59*333d2b36SAndroid Build Coastguard Worker if len(allProjects) > 0 { 60*333d2b36SAndroid Build Coastguard Worker return strings.Join(allProjects, "% ") + "%" 61*333d2b36SAndroid Build Coastguard Worker } else { 62*333d2b36SAndroid Build Coastguard Worker return "" 63*333d2b36SAndroid Build Coastguard Worker } 64*333d2b36SAndroid Build Coastguard Worker} 65*333d2b36SAndroid Build Coastguard Worker 66*333d2b36SAndroid Build Coastguard Workertype notOnHostContext struct { 67*333d2b36SAndroid Build Coastguard Worker} 68*333d2b36SAndroid Build Coastguard Worker 69*333d2b36SAndroid Build Coastguard Workerfunc (c *notOnHostContext) Host() bool { 70*333d2b36SAndroid Build Coastguard Worker return false 71*333d2b36SAndroid Build Coastguard Worker} 72*333d2b36SAndroid Build Coastguard Worker 73*333d2b36SAndroid Build Coastguard Workerfunc makeVarsProvider(ctx android.MakeVarsContext) { 74*333d2b36SAndroid Build Coastguard Worker ctx.Strict("LLVM_RELEASE_VERSION", "${config.ClangShortVersion}") 75*333d2b36SAndroid Build Coastguard Worker ctx.Strict("LLVM_PREBUILTS_VERSION", "${config.ClangVersion}") 76*333d2b36SAndroid Build Coastguard Worker ctx.Strict("LLVM_PREBUILTS_BASE", "${config.ClangBase}") 77*333d2b36SAndroid Build Coastguard Worker ctx.Strict("LLVM_PREBUILTS_PATH", "${config.ClangBin}") 78*333d2b36SAndroid Build Coastguard Worker ctx.Strict("CLANG", "${config.ClangBin}/clang") 79*333d2b36SAndroid Build Coastguard Worker ctx.Strict("CLANG_CXX", "${config.ClangBin}/clang++") 80*333d2b36SAndroid Build Coastguard Worker ctx.Strict("LLVM_AS", "${config.ClangBin}/llvm-as") 81*333d2b36SAndroid Build Coastguard Worker ctx.Strict("LLVM_LINK", "${config.ClangBin}/llvm-link") 82*333d2b36SAndroid Build Coastguard Worker ctx.Strict("LLVM_OBJCOPY", "${config.ClangBin}/llvm-objcopy") 83*333d2b36SAndroid Build Coastguard Worker ctx.Strict("LLVM_STRIP", "${config.ClangBin}/llvm-strip") 84*333d2b36SAndroid Build Coastguard Worker ctx.Strict("PATH_TO_CLANG_TIDY", "${config.ClangBin}/clang-tidy") 85*333d2b36SAndroid Build Coastguard Worker ctx.StrictSorted("CLANG_CONFIG_UNKNOWN_CFLAGS", strings.Join(config.ClangUnknownCflags, " ")) 86*333d2b36SAndroid Build Coastguard Worker 87*333d2b36SAndroid Build Coastguard Worker ctx.Strict("RS_LLVM_PREBUILTS_VERSION", "${config.RSClangVersion}") 88*333d2b36SAndroid Build Coastguard Worker ctx.Strict("RS_LLVM_PREBUILTS_BASE", "${config.RSClangBase}") 89*333d2b36SAndroid Build Coastguard Worker ctx.Strict("RS_LLVM_PREBUILTS_PATH", "${config.RSLLVMPrebuiltsPath}") 90*333d2b36SAndroid Build Coastguard Worker ctx.Strict("RS_LLVM_INCLUDES", "${config.RSIncludePath}") 91*333d2b36SAndroid Build Coastguard Worker ctx.Strict("RS_CLANG", "${config.RSLLVMPrebuiltsPath}/clang") 92*333d2b36SAndroid Build Coastguard Worker ctx.Strict("RS_LLVM_AS", "${config.RSLLVMPrebuiltsPath}/llvm-as") 93*333d2b36SAndroid Build Coastguard Worker ctx.Strict("RS_LLVM_LINK", "${config.RSLLVMPrebuiltsPath}/llvm-link") 94*333d2b36SAndroid Build Coastguard Worker 95*333d2b36SAndroid Build Coastguard Worker ctx.Strict("CLANG_EXTERNAL_CFLAGS", "${config.ExternalCflags}") 96*333d2b36SAndroid Build Coastguard Worker ctx.Strict("GLOBAL_CLANG_CFLAGS_NO_OVERRIDE", "${config.NoOverrideGlobalCflags}") 97*333d2b36SAndroid Build Coastguard Worker ctx.Strict("GLOBAL_CLANG_CFLAGS_64_NO_OVERRIDE", "${config.NoOverride64GlobalCflags}") 98*333d2b36SAndroid Build Coastguard Worker ctx.Strict("GLOBAL_CLANG_CPPFLAGS_NO_OVERRIDE", "") 99*333d2b36SAndroid Build Coastguard Worker ctx.Strict("GLOBAL_CLANG_EXTERNAL_CFLAGS_NO_OVERRIDE", "${config.NoOverrideExternalGlobalCflags}") 100*333d2b36SAndroid Build Coastguard Worker 101*333d2b36SAndroid Build Coastguard Worker // Filter vendor_public_library that are exported to make 102*333d2b36SAndroid Build Coastguard Worker var exportedVendorPublicLibraries []string 103*333d2b36SAndroid Build Coastguard Worker var warningsAllowed []string 104*333d2b36SAndroid Build Coastguard Worker var usingWnoErrors []string 105*333d2b36SAndroid Build Coastguard Worker var missingProfiles []string 106*333d2b36SAndroid Build Coastguard Worker ctx.VisitAllModules(func(module android.Module) { 107*333d2b36SAndroid Build Coastguard Worker if v, ok := android.OtherModuleProvider(ctx, module, CcMakeVarsInfoProvider); ok { 108*333d2b36SAndroid Build Coastguard Worker warningsAllowed = android.AppendIfNotZero(warningsAllowed, v.WarningsAllowed) 109*333d2b36SAndroid Build Coastguard Worker usingWnoErrors = android.AppendIfNotZero(usingWnoErrors, v.UsingWnoError) 110*333d2b36SAndroid Build Coastguard Worker missingProfiles = android.AppendIfNotZero(missingProfiles, v.MissingProfile) 111*333d2b36SAndroid Build Coastguard Worker } 112*333d2b36SAndroid Build Coastguard Worker if ccModule, ok := module.(*Module); ok { 113*333d2b36SAndroid Build Coastguard Worker baseName := ccModule.BaseModuleName() 114*333d2b36SAndroid Build Coastguard Worker if ccModule.IsVendorPublicLibrary() && module.ExportedToMake() { 115*333d2b36SAndroid Build Coastguard Worker exportedVendorPublicLibraries = append(exportedVendorPublicLibraries, baseName) 116*333d2b36SAndroid Build Coastguard Worker } 117*333d2b36SAndroid Build Coastguard Worker } 118*333d2b36SAndroid Build Coastguard Worker }) 119*333d2b36SAndroid Build Coastguard Worker ctx.Strict("VENDOR_PUBLIC_LIBRARIES", makeVarsString(exportedVendorPublicLibraries)) 120*333d2b36SAndroid Build Coastguard Worker 121*333d2b36SAndroid Build Coastguard Worker lsdumpPaths := *lsdumpPaths(ctx.Config()) 122*333d2b36SAndroid Build Coastguard Worker sort.Strings(lsdumpPaths) 123*333d2b36SAndroid Build Coastguard Worker ctx.Strict("LSDUMP_PATHS", strings.Join(lsdumpPaths, " ")) 124*333d2b36SAndroid Build Coastguard Worker 125*333d2b36SAndroid Build Coastguard Worker ctx.Strict("ANDROID_WARNING_ALLOWED_PROJECTS", makeStringOfWarningAllowedProjects()) 126*333d2b36SAndroid Build Coastguard Worker ctx.Strict("SOONG_MODULES_WARNINGS_ALLOWED", makeVarsString(warningsAllowed)) 127*333d2b36SAndroid Build Coastguard Worker ctx.Strict("SOONG_MODULES_USING_WNO_ERROR", makeVarsString(usingWnoErrors)) 128*333d2b36SAndroid Build Coastguard Worker ctx.Strict("SOONG_MODULES_MISSING_PGO_PROFILE_FILE", makeVarsString(missingProfiles)) 129*333d2b36SAndroid Build Coastguard Worker 130*333d2b36SAndroid Build Coastguard Worker ctx.Strict("CLANG_COVERAGE_CONFIG_CFLAGS", strings.Join(clangCoverageCFlags, " ")) 131*333d2b36SAndroid Build Coastguard Worker ctx.Strict("CLANG_COVERAGE_CONFIG_COMMFLAGS", strings.Join(clangCoverageCommonFlags, " ")) 132*333d2b36SAndroid Build Coastguard Worker ctx.Strict("CLANG_COVERAGE_HOST_LDFLAGS", strings.Join(clangCoverageHostLdFlags, " ")) 133*333d2b36SAndroid Build Coastguard Worker ctx.Strict("CLANG_COVERAGE_INSTR_PROFILE", profileInstrFlag) 134*333d2b36SAndroid Build Coastguard Worker ctx.Strict("CLANG_COVERAGE_CONTINUOUS_FLAGS", strings.Join(clangContinuousCoverageFlags, " ")) 135*333d2b36SAndroid Build Coastguard Worker ctx.Strict("CLANG_COVERAGE_HWASAN_FLAGS", strings.Join(clangCoverageHWASanFlags, " ")) 136*333d2b36SAndroid Build Coastguard Worker 137*333d2b36SAndroid Build Coastguard Worker ctx.Strict("ADDRESS_SANITIZER_CONFIG_EXTRA_CFLAGS", strings.Join(asanCflags, " ")) 138*333d2b36SAndroid Build Coastguard Worker 139*333d2b36SAndroid Build Coastguard Worker ctx.Strict("HWADDRESS_SANITIZER_CONFIG_EXTRA_CFLAGS", strings.Join(hwasanCflags, " ")) 140*333d2b36SAndroid Build Coastguard Worker 141*333d2b36SAndroid Build Coastguard Worker ctx.Strict("CFI_EXTRA_CFLAGS", strings.Join(cfiCflags, " ")) 142*333d2b36SAndroid Build Coastguard Worker ctx.Strict("CFI_EXTRA_ASFLAGS", strings.Join(cfiAsflags, " ")) 143*333d2b36SAndroid Build Coastguard Worker ctx.Strict("CFI_EXTRA_LDFLAGS", strings.Join(cfiLdflags, " ")) 144*333d2b36SAndroid Build Coastguard Worker 145*333d2b36SAndroid Build Coastguard Worker ctx.Strict("INTEGER_OVERFLOW_EXTRA_CFLAGS", strings.Join(intOverflowCflags, " ")) 146*333d2b36SAndroid Build Coastguard Worker 147*333d2b36SAndroid Build Coastguard Worker ctx.Strict("DEFAULT_C_STD_VERSION", config.CStdVersion) 148*333d2b36SAndroid Build Coastguard Worker ctx.Strict("DEFAULT_CPP_STD_VERSION", config.CppStdVersion) 149*333d2b36SAndroid Build Coastguard Worker ctx.Strict("EXPERIMENTAL_C_STD_VERSION", config.ExperimentalCStdVersion) 150*333d2b36SAndroid Build Coastguard Worker ctx.Strict("EXPERIMENTAL_CPP_STD_VERSION", config.ExperimentalCppStdVersion) 151*333d2b36SAndroid Build Coastguard Worker 152*333d2b36SAndroid Build Coastguard Worker ctx.Strict("DEFAULT_GLOBAL_TIDY_CHECKS", "${config.TidyDefaultGlobalChecks}") 153*333d2b36SAndroid Build Coastguard Worker ctx.Strict("DEFAULT_LOCAL_TIDY_CHECKS", joinLocalTidyChecks(config.DefaultLocalTidyChecks)) 154*333d2b36SAndroid Build Coastguard Worker ctx.Strict("DEFAULT_TIDY_HEADER_DIRS", "${config.TidyDefaultHeaderDirs}") 155*333d2b36SAndroid Build Coastguard Worker ctx.Strict("WITH_TIDY_FLAGS", "${config.TidyWithTidyFlags}") 156*333d2b36SAndroid Build Coastguard Worker 157*333d2b36SAndroid Build Coastguard Worker ctx.Strict("AIDL_CPP", "${aidlCmd}") 158*333d2b36SAndroid Build Coastguard Worker ctx.Strict("ALLOWED_MANUAL_INTERFACE_PATHS", strings.Join(allowedManualInterfacePaths, " ")) 159*333d2b36SAndroid Build Coastguard Worker 160*333d2b36SAndroid Build Coastguard Worker ctx.Strict("RS_GLOBAL_INCLUDES", "${config.RsGlobalIncludes}") 161*333d2b36SAndroid Build Coastguard Worker 162*333d2b36SAndroid Build Coastguard Worker ctx.Strict("SOONG_STRIP_PATH", "${stripPath}") 163*333d2b36SAndroid Build Coastguard Worker ctx.Strict("XZ", "${xzCmd}") 164*333d2b36SAndroid Build Coastguard Worker ctx.Strict("CREATE_MINIDEBUGINFO", "${createMiniDebugInfo}") 165*333d2b36SAndroid Build Coastguard Worker 166*333d2b36SAndroid Build Coastguard Worker includeFlags, err := ctx.Eval("${config.CommonGlobalIncludes}") 167*333d2b36SAndroid Build Coastguard Worker if err != nil { 168*333d2b36SAndroid Build Coastguard Worker panic(err) 169*333d2b36SAndroid Build Coastguard Worker } 170*333d2b36SAndroid Build Coastguard Worker includes, systemIncludes := splitSystemIncludes(ctx, includeFlags) 171*333d2b36SAndroid Build Coastguard Worker ctx.StrictRaw("SRC_HEADERS", strings.Join(includes, " ")) 172*333d2b36SAndroid Build Coastguard Worker ctx.StrictRaw("SRC_SYSTEM_HEADERS", strings.Join(systemIncludes, " ")) 173*333d2b36SAndroid Build Coastguard Worker 174*333d2b36SAndroid Build Coastguard Worker ndkKnownLibs := *getNDKKnownLibs(ctx.Config()) 175*333d2b36SAndroid Build Coastguard Worker sort.Strings(ndkKnownLibs) 176*333d2b36SAndroid Build Coastguard Worker ctx.Strict("NDK_KNOWN_LIBS", strings.Join(ndkKnownLibs, " ")) 177*333d2b36SAndroid Build Coastguard Worker 178*333d2b36SAndroid Build Coastguard Worker hostTargets := ctx.Config().Targets[ctx.Config().BuildOS] 179*333d2b36SAndroid Build Coastguard Worker makeVarsToolchain(ctx, "", hostTargets[0]) 180*333d2b36SAndroid Build Coastguard Worker if len(hostTargets) > 1 { 181*333d2b36SAndroid Build Coastguard Worker makeVarsToolchain(ctx, "2ND_", hostTargets[1]) 182*333d2b36SAndroid Build Coastguard Worker } 183*333d2b36SAndroid Build Coastguard Worker 184*333d2b36SAndroid Build Coastguard Worker deviceTargets := ctx.Config().Targets[android.Android] 185*333d2b36SAndroid Build Coastguard Worker makeVarsToolchain(ctx, "", deviceTargets[0]) 186*333d2b36SAndroid Build Coastguard Worker if len(deviceTargets) > 1 { 187*333d2b36SAndroid Build Coastguard Worker makeVarsToolchain(ctx, "2ND_", deviceTargets[1]) 188*333d2b36SAndroid Build Coastguard Worker } 189*333d2b36SAndroid Build Coastguard Worker 190*333d2b36SAndroid Build Coastguard Worker makeLlndkVars(ctx) 191*333d2b36SAndroid Build Coastguard Worker} 192*333d2b36SAndroid Build Coastguard Worker 193*333d2b36SAndroid Build Coastguard Workerfunc makeVarsToolchain(ctx android.MakeVarsContext, secondPrefix string, 194*333d2b36SAndroid Build Coastguard Worker target android.Target) { 195*333d2b36SAndroid Build Coastguard Worker var typePrefix string 196*333d2b36SAndroid Build Coastguard Worker switch target.Os.Class { 197*333d2b36SAndroid Build Coastguard Worker case android.Host: 198*333d2b36SAndroid Build Coastguard Worker typePrefix = "HOST_" 199*333d2b36SAndroid Build Coastguard Worker case android.Device: 200*333d2b36SAndroid Build Coastguard Worker typePrefix = "TARGET_" 201*333d2b36SAndroid Build Coastguard Worker } 202*333d2b36SAndroid Build Coastguard Worker makePrefix := secondPrefix + typePrefix 203*333d2b36SAndroid Build Coastguard Worker 204*333d2b36SAndroid Build Coastguard Worker toolchain := config.FindToolchain(target.Os, target.Arch) 205*333d2b36SAndroid Build Coastguard Worker 206*333d2b36SAndroid Build Coastguard Worker var productExtraCflags string 207*333d2b36SAndroid Build Coastguard Worker var productExtraLdflags string 208*333d2b36SAndroid Build Coastguard Worker 209*333d2b36SAndroid Build Coastguard Worker hod := "Host" 210*333d2b36SAndroid Build Coastguard Worker if target.Os.Class == android.Device { 211*333d2b36SAndroid Build Coastguard Worker hod = "Device" 212*333d2b36SAndroid Build Coastguard Worker } 213*333d2b36SAndroid Build Coastguard Worker 214*333d2b36SAndroid Build Coastguard Worker if target.Os.Class == android.Host && ctx.Config().HostStaticBinaries() { 215*333d2b36SAndroid Build Coastguard Worker productExtraLdflags += "-static" 216*333d2b36SAndroid Build Coastguard Worker } 217*333d2b36SAndroid Build Coastguard Worker 218*333d2b36SAndroid Build Coastguard Worker includeFlags, err := ctx.Eval(toolchain.IncludeFlags()) 219*333d2b36SAndroid Build Coastguard Worker if err != nil { 220*333d2b36SAndroid Build Coastguard Worker panic(err) 221*333d2b36SAndroid Build Coastguard Worker } 222*333d2b36SAndroid Build Coastguard Worker includes, systemIncludes := splitSystemIncludes(ctx, includeFlags) 223*333d2b36SAndroid Build Coastguard Worker ctx.StrictRaw(makePrefix+"C_INCLUDES", strings.Join(includes, " ")) 224*333d2b36SAndroid Build Coastguard Worker ctx.StrictRaw(makePrefix+"C_SYSTEM_INCLUDES", strings.Join(systemIncludes, " ")) 225*333d2b36SAndroid Build Coastguard Worker 226*333d2b36SAndroid Build Coastguard Worker if target.Arch.ArchType == android.Arm { 227*333d2b36SAndroid Build Coastguard Worker flags, err := toolchain.InstructionSetFlags("arm") 228*333d2b36SAndroid Build Coastguard Worker if err != nil { 229*333d2b36SAndroid Build Coastguard Worker panic(err) 230*333d2b36SAndroid Build Coastguard Worker } 231*333d2b36SAndroid Build Coastguard Worker ctx.Strict(makePrefix+"arm_CFLAGS", flags) 232*333d2b36SAndroid Build Coastguard Worker 233*333d2b36SAndroid Build Coastguard Worker flags, err = toolchain.InstructionSetFlags("thumb") 234*333d2b36SAndroid Build Coastguard Worker if err != nil { 235*333d2b36SAndroid Build Coastguard Worker panic(err) 236*333d2b36SAndroid Build Coastguard Worker } 237*333d2b36SAndroid Build Coastguard Worker ctx.Strict(makePrefix+"thumb_CFLAGS", flags) 238*333d2b36SAndroid Build Coastguard Worker } 239*333d2b36SAndroid Build Coastguard Worker 240*333d2b36SAndroid Build Coastguard Worker clangPrefix := secondPrefix + "CLANG_" + typePrefix 241*333d2b36SAndroid Build Coastguard Worker 242*333d2b36SAndroid Build Coastguard Worker ctx.Strict(clangPrefix+"TRIPLE", toolchain.ClangTriple()) 243*333d2b36SAndroid Build Coastguard Worker ctx.Strict(clangPrefix+"GLOBAL_CFLAGS", strings.Join([]string{ 244*333d2b36SAndroid Build Coastguard Worker toolchain.Cflags(), 245*333d2b36SAndroid Build Coastguard Worker "${config.CommonGlobalCflags}", 246*333d2b36SAndroid Build Coastguard Worker fmt.Sprintf("${config.%sGlobalCflags}", hod), 247*333d2b36SAndroid Build Coastguard Worker toolchain.ToolchainCflags(), 248*333d2b36SAndroid Build Coastguard Worker productExtraCflags, 249*333d2b36SAndroid Build Coastguard Worker }, " ")) 250*333d2b36SAndroid Build Coastguard Worker ctx.Strict(clangPrefix+"GLOBAL_CPPFLAGS", strings.Join([]string{ 251*333d2b36SAndroid Build Coastguard Worker "${config.CommonGlobalCppflags}", 252*333d2b36SAndroid Build Coastguard Worker fmt.Sprintf("${config.%sGlobalCppflags}", hod), 253*333d2b36SAndroid Build Coastguard Worker toolchain.Cppflags(), 254*333d2b36SAndroid Build Coastguard Worker }, " ")) 255*333d2b36SAndroid Build Coastguard Worker ctx.Strict(clangPrefix+"GLOBAL_LDFLAGS", strings.Join([]string{ 256*333d2b36SAndroid Build Coastguard Worker fmt.Sprintf("${config.%sGlobalLdflags}", hod), 257*333d2b36SAndroid Build Coastguard Worker toolchain.Ldflags(), 258*333d2b36SAndroid Build Coastguard Worker toolchain.ToolchainLdflags(), 259*333d2b36SAndroid Build Coastguard Worker productExtraLdflags, 260*333d2b36SAndroid Build Coastguard Worker }, " ")) 261*333d2b36SAndroid Build Coastguard Worker ctx.Strict(clangPrefix+"GLOBAL_LLDFLAGS", strings.Join([]string{ 262*333d2b36SAndroid Build Coastguard Worker fmt.Sprintf("${config.%sGlobalLldflags}", hod), 263*333d2b36SAndroid Build Coastguard Worker toolchain.Lldflags(), 264*333d2b36SAndroid Build Coastguard Worker toolchain.ToolchainLdflags(), 265*333d2b36SAndroid Build Coastguard Worker productExtraLdflags, 266*333d2b36SAndroid Build Coastguard Worker }, " ")) 267*333d2b36SAndroid Build Coastguard Worker 268*333d2b36SAndroid Build Coastguard Worker if target.Os.Class == android.Device { 269*333d2b36SAndroid Build Coastguard Worker for variable, value := range sanitizerVariables { 270*333d2b36SAndroid Build Coastguard Worker ctx.Strict(secondPrefix+variable, value) 271*333d2b36SAndroid Build Coastguard Worker } 272*333d2b36SAndroid Build Coastguard Worker } 273*333d2b36SAndroid Build Coastguard Worker 274*333d2b36SAndroid Build Coastguard Worker // This is used by external/gentoo/... 275*333d2b36SAndroid Build Coastguard Worker ctx.Strict("CLANG_CONFIG_"+target.Arch.ArchType.Name+"_"+typePrefix+"TRIPLE", 276*333d2b36SAndroid Build Coastguard Worker toolchain.ClangTriple()) 277*333d2b36SAndroid Build Coastguard Worker 278*333d2b36SAndroid Build Coastguard Worker if target.Os == android.Darwin { 279*333d2b36SAndroid Build Coastguard Worker ctx.Strict(makePrefix+"AR", "${config.MacArPath}") 280*333d2b36SAndroid Build Coastguard Worker ctx.Strict(makePrefix+"NM", "${config.MacToolPath}/nm") 281*333d2b36SAndroid Build Coastguard Worker ctx.Strict(makePrefix+"OTOOL", "${config.MacToolPath}/otool") 282*333d2b36SAndroid Build Coastguard Worker ctx.Strict(makePrefix+"STRIP", "${config.MacStripPath}") 283*333d2b36SAndroid Build Coastguard Worker } else { 284*333d2b36SAndroid Build Coastguard Worker ctx.Strict(makePrefix+"AR", "${config.ClangBin}/llvm-ar") 285*333d2b36SAndroid Build Coastguard Worker ctx.Strict(makePrefix+"READELF", "${config.ClangBin}/llvm-readelf") 286*333d2b36SAndroid Build Coastguard Worker ctx.Strict(makePrefix+"NM", "${config.ClangBin}/llvm-nm") 287*333d2b36SAndroid Build Coastguard Worker ctx.Strict(makePrefix+"STRIP", "${config.ClangBin}/llvm-strip") 288*333d2b36SAndroid Build Coastguard Worker } 289*333d2b36SAndroid Build Coastguard Worker 290*333d2b36SAndroid Build Coastguard Worker if target.Os.Class == android.Device { 291*333d2b36SAndroid Build Coastguard Worker ctx.Strict(makePrefix+"OBJCOPY", "${config.ClangBin}/llvm-objcopy") 292*333d2b36SAndroid Build Coastguard Worker ctx.Strict(makePrefix+"LD", "${config.ClangBin}/lld") 293*333d2b36SAndroid Build Coastguard Worker ctx.Strict(makePrefix+"NDK_TRIPLE", config.NDKTriple(toolchain)) 294*333d2b36SAndroid Build Coastguard Worker ctx.Strict(makePrefix+"TOOLS_PREFIX", "${config.ClangBin}/llvm-") 295*333d2b36SAndroid Build Coastguard Worker } 296*333d2b36SAndroid Build Coastguard Worker 297*333d2b36SAndroid Build Coastguard Worker if target.Os.Class == android.Host { 298*333d2b36SAndroid Build Coastguard Worker ctx.Strict(makePrefix+"AVAILABLE_LIBRARIES", strings.Join(toolchain.AvailableLibraries(), " ")) 299*333d2b36SAndroid Build Coastguard Worker } 300*333d2b36SAndroid Build Coastguard Worker 301*333d2b36SAndroid Build Coastguard Worker ctx.Strict(makePrefix+"SHLIB_SUFFIX", toolchain.ShlibSuffix()) 302*333d2b36SAndroid Build Coastguard Worker ctx.Strict(makePrefix+"EXECUTABLE_SUFFIX", toolchain.ExecutableSuffix()) 303*333d2b36SAndroid Build Coastguard Worker} 304*333d2b36SAndroid Build Coastguard Worker 305*333d2b36SAndroid Build Coastguard Workerfunc splitSystemIncludes(ctx android.MakeVarsContext, val string) (includes, systemIncludes []string) { 306*333d2b36SAndroid Build Coastguard Worker flags, err := ctx.Eval(val) 307*333d2b36SAndroid Build Coastguard Worker if err != nil { 308*333d2b36SAndroid Build Coastguard Worker panic(err) 309*333d2b36SAndroid Build Coastguard Worker } 310*333d2b36SAndroid Build Coastguard Worker 311*333d2b36SAndroid Build Coastguard Worker extract := func(flags string, dirs []string, prefix string) (string, []string, bool) { 312*333d2b36SAndroid Build Coastguard Worker if strings.HasPrefix(flags, prefix) { 313*333d2b36SAndroid Build Coastguard Worker flags = strings.TrimPrefix(flags, prefix) 314*333d2b36SAndroid Build Coastguard Worker flags = strings.TrimLeft(flags, " ") 315*333d2b36SAndroid Build Coastguard Worker s := strings.SplitN(flags, " ", 2) 316*333d2b36SAndroid Build Coastguard Worker dirs = append(dirs, s[0]) 317*333d2b36SAndroid Build Coastguard Worker if len(s) > 1 { 318*333d2b36SAndroid Build Coastguard Worker return strings.TrimLeft(s[1], " "), dirs, true 319*333d2b36SAndroid Build Coastguard Worker } 320*333d2b36SAndroid Build Coastguard Worker return "", dirs, true 321*333d2b36SAndroid Build Coastguard Worker } else { 322*333d2b36SAndroid Build Coastguard Worker return flags, dirs, false 323*333d2b36SAndroid Build Coastguard Worker } 324*333d2b36SAndroid Build Coastguard Worker } 325*333d2b36SAndroid Build Coastguard Worker 326*333d2b36SAndroid Build Coastguard Worker flags = strings.TrimLeft(flags, " ") 327*333d2b36SAndroid Build Coastguard Worker for flags != "" { 328*333d2b36SAndroid Build Coastguard Worker found := false 329*333d2b36SAndroid Build Coastguard Worker flags, includes, found = extract(flags, includes, "-I") 330*333d2b36SAndroid Build Coastguard Worker if !found { 331*333d2b36SAndroid Build Coastguard Worker flags, systemIncludes, found = extract(flags, systemIncludes, "-isystem ") 332*333d2b36SAndroid Build Coastguard Worker } 333*333d2b36SAndroid Build Coastguard Worker if !found { 334*333d2b36SAndroid Build Coastguard Worker panic(fmt.Errorf("Unexpected flag in %q", flags)) 335*333d2b36SAndroid Build Coastguard Worker } 336*333d2b36SAndroid Build Coastguard Worker } 337*333d2b36SAndroid Build Coastguard Worker 338*333d2b36SAndroid Build Coastguard Worker return includes, systemIncludes 339*333d2b36SAndroid Build Coastguard Worker} 340*333d2b36SAndroid Build Coastguard Worker 341*333d2b36SAndroid Build Coastguard Workerfunc joinLocalTidyChecks(checks []config.PathBasedTidyCheck) string { 342*333d2b36SAndroid Build Coastguard Worker rets := make([]string, len(checks)) 343*333d2b36SAndroid Build Coastguard Worker for i, check := range config.DefaultLocalTidyChecks { 344*333d2b36SAndroid Build Coastguard Worker rets[i] = check.PathPrefix + ":" + check.Checks 345*333d2b36SAndroid Build Coastguard Worker } 346*333d2b36SAndroid Build Coastguard Worker return strings.Join(rets, " ") 347*333d2b36SAndroid Build Coastguard Worker} 348