// Copyright 2016 Google Inc. All rights reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package config import ( "fmt" "runtime" "strings" "android/soong/android" ) var ( // Flags used by lots of devices. Putting them in package static variables // will save bytes in build.ninja so they aren't repeated for every file commonGlobalCflags = []string{ "-DANDROID", "-fmessage-length=0", "-W", "-Wall", "-Wno-unused", "-Winit-self", "-Wpointer-arith", // Make paths in deps files relative "-no-canonical-prefixes", "-fno-canonical-system-headers", "-DNDEBUG", "-UDEBUG", "-fno-exceptions", "-Wno-multichar", "-O2", "-g", "-fno-strict-aliasing", } commonGlobalConlyflags = []string{} deviceGlobalCflags = []string{ "-fdiagnostics-color", "-ffunction-sections", "-funwind-tables", "-fstack-protector-strong", "-Wa,--noexecstack", "-D_FORTIFY_SOURCE=2", "-Wstrict-aliasing=2", "-Werror=return-type", "-Werror=non-virtual-dtor", "-Werror=address", "-Werror=sequence-point", "-Werror=date-time", "-Werror=format-security", } deviceGlobalCppflags = []string{ "-fvisibility-inlines-hidden", } deviceGlobalLdflags = []string{ "-Wl,-z,noexecstack", "-Wl,-z,relro", "-Wl,-z,now", "-Wl,--build-id=md5", "-Wl,--warn-shared-textrel", "-Wl,--fatal-warnings", "-Wl,--no-undefined-version", } hostGlobalCflags = []string{} hostGlobalCppflags = []string{} hostGlobalLdflags = []string{} commonGlobalCppflags = []string{ "-Wsign-promo", } noOverrideGlobalCflags = []string{ "-Werror=int-to-pointer-cast", "-Werror=pointer-to-int-cast", } IllegalFlags = []string{ "-w", } CStdVersion = "gnu99" CppStdVersion = "gnu++14" GccCppStdVersion = "gnu++11" ExperimentalCStdVersion = "gnu11" ExperimentalCppStdVersion = "gnu++1z" NdkMaxPrebuiltVersionInt = 24 // prebuilts/clang default settings. ClangDefaultBase = "prebuilts/clang/host" ClangDefaultVersion = "clang-4393122" ClangDefaultShortVersion = "5.0.1" ) var pctx = android.NewPackageContext("android/soong/cc/config") func init() { if android.BuildOs == android.Linux { commonGlobalCflags = append(commonGlobalCflags, "-fdebug-prefix-map=/proc/self/cwd=") } pctx.StaticVariable("CommonGlobalCflags", strings.Join(commonGlobalCflags, " ")) pctx.StaticVariable("CommonGlobalConlyflags", strings.Join(commonGlobalConlyflags, " ")) pctx.StaticVariable("DeviceGlobalCflags", strings.Join(deviceGlobalCflags, " ")) pctx.StaticVariable("DeviceGlobalCppflags", strings.Join(deviceGlobalCppflags, " ")) pctx.StaticVariable("DeviceGlobalLdflags", strings.Join(deviceGlobalLdflags, " ")) pctx.StaticVariable("HostGlobalCflags", strings.Join(hostGlobalCflags, " ")) pctx.StaticVariable("HostGlobalCppflags", strings.Join(hostGlobalCppflags, " ")) pctx.StaticVariable("HostGlobalLdflags", strings.Join(hostGlobalLdflags, " ")) pctx.StaticVariable("NoOverrideGlobalCflags", strings.Join(noOverrideGlobalCflags, " ")) pctx.StaticVariable("CommonGlobalCppflags", strings.Join(commonGlobalCppflags, " ")) pctx.StaticVariable("CommonClangGlobalCflags", strings.Join(append(ClangFilterUnknownCflags(commonGlobalCflags), "${ClangExtraCflags}"), " ")) pctx.StaticVariable("DeviceClangGlobalCflags", strings.Join(append(ClangFilterUnknownCflags(deviceGlobalCflags), "${ClangExtraTargetCflags}"), " ")) pctx.StaticVariable("HostClangGlobalCflags", strings.Join(ClangFilterUnknownCflags(hostGlobalCflags), " ")) pctx.StaticVariable("NoOverrideClangGlobalCflags", strings.Join(append(ClangFilterUnknownCflags(noOverrideGlobalCflags), "${ClangExtraNoOverrideCflags}"), " ")) pctx.StaticVariable("CommonClangGlobalCppflags", strings.Join(append(ClangFilterUnknownCflags(commonGlobalCppflags), "${ClangExtraCppflags}"), " ")) // Everything in these lists is a crime against abstraction and dependency tracking. // Do not add anything to this list. pctx.PrefixedExistentPathsForSourcesVariable("CommonGlobalIncludes", "-I", []string{ "system/core/include", "system/media/audio/include", "hardware/libhardware/include", "hardware/libhardware_legacy/include", "hardware/ril/include", "libnativehelper/include", "frameworks/native/include", "frameworks/native/opengl/include", "frameworks/av/include", }) // This is used by non-NDK modules to get jni.h. export_include_dirs doesn't help // with this, since there is no associated library. pctx.PrefixedExistentPathsForSourcesVariable("CommonNativehelperInclude", "-I", []string{"libnativehelper/include_deprecated"}) pctx.SourcePathVariable("ClangDefaultBase", ClangDefaultBase) pctx.VariableFunc("ClangBase", func(config interface{}) (string, error) { if override := config.(android.Config).Getenv("LLVM_PREBUILTS_BASE"); override != "" { return override, nil } return "${ClangDefaultBase}", nil }) pctx.VariableFunc("ClangVersion", func(config interface{}) (string, error) { if override := config.(android.Config).Getenv("LLVM_PREBUILTS_VERSION"); override != "" { return override, nil } return ClangDefaultVersion, nil }) pctx.StaticVariable("ClangPath", "${ClangBase}/${HostPrebuiltTag}/${ClangVersion}") pctx.StaticVariable("ClangBin", "${ClangPath}/bin") pctx.VariableFunc("ClangShortVersion", func(config interface{}) (string, error) { if override := config.(android.Config).Getenv("LLVM_RELEASE_VERSION"); override != "" { return override, nil } return ClangDefaultShortVersion, nil }) pctx.StaticVariable("ClangAsanLibDir", "${ClangPath}/lib64/clang/${ClangShortVersion}/lib/linux") if runtime.GOOS == "darwin" { pctx.StaticVariable("LLVMGoldPlugin", "${ClangPath}/lib64/LLVMgold.dylib") } else { pctx.StaticVariable("LLVMGoldPlugin", "${ClangPath}/lib64/LLVMgold.so") } // These are tied to the version of LLVM directly in external/llvm, so they might trail the host prebuilts // being used for the rest of the build process. pctx.SourcePathVariable("RSClangBase", "prebuilts/clang/host") pctx.SourcePathVariable("RSClangVersion", "clang-3289846") pctx.SourcePathVariable("RSReleaseVersion", "3.8") pctx.StaticVariable("RSLLVMPrebuiltsPath", "${RSClangBase}/${HostPrebuiltTag}/${RSClangVersion}/bin") pctx.StaticVariable("RSIncludePath", "${RSLLVMPrebuiltsPath}/../lib64/clang/${RSReleaseVersion}/include") pctx.PrefixedExistentPathsForSourcesVariable("RsGlobalIncludes", "-I", []string{ "external/clang/lib/Headers", "frameworks/rs/script_api/include", }) pctx.VariableFunc("CcWrapper", func(config interface{}) (string, error) { if override := config.(android.Config).Getenv("CC_WRAPPER"); override != "" { return override + " ", nil } return "", nil }) } var HostPrebuiltTag = pctx.VariableConfigMethod("HostPrebuiltTag", android.Config.PrebuiltOS) func bionicHeaders(kernelArch string) string { return strings.Join([]string{ "-isystem bionic/libc/include", "-isystem bionic/libc/kernel/uapi", "-isystem bionic/libc/kernel/uapi/asm-" + kernelArch, "-isystem bionic/libc/kernel/android/scsi", "-isystem bionic/libc/kernel/android/uapi", }, " ") } func replaceFirst(slice []string, from, to string) { if slice[0] != from { panic(fmt.Errorf("Expected %q, found %q", from, to)) } slice[0] = to }