1package cc 2 3import ( 4 "strings" 5 6 "android/soong/common" 7) 8 9var ( 10 linuxCflags = []string{ 11 "-fno-exceptions", // from build/core/combo/select.mk 12 "-Wno-multichar", // from build/core/combo/select.mk 13 14 "-fdiagnostics-color", 15 16 "-Wa,--noexecstack", 17 18 "-fPIC", 19 "-no-canonical-prefixes", 20 21 "-U_FORTIFY_SOURCE", 22 "-D_FORTIFY_SOURCE=2", 23 "-fstack-protector", 24 25 // Workaround differences in inttypes.h between host and target. 26 //See bug 12708004. 27 "-D__STDC_FORMAT_MACROS", 28 "-D__STDC_CONSTANT_MACROS", 29 30 // HOST_RELEASE_CFLAGS 31 "-O2", // from build/core/combo/select.mk 32 "-g", // from build/core/combo/select.mk 33 "-fno-strict-aliasing", // from build/core/combo/select.mk 34 } 35 36 linuxLdflags = []string{ 37 "-Wl,-z,noexecstack", 38 "-Wl,-z,relro", 39 "-Wl,-z,now", 40 "-Wl,--no-undefined-version", 41 } 42 43 // Extended cflags 44 linuxX86Cflags = []string{ 45 "-msse3", 46 "-mfpmath=sse", 47 "-m32", 48 "-march=prescott", 49 "-D_FILE_OFFSET_BITS=64", 50 "-D_LARGEFILE_SOURCE=1", 51 } 52 53 linuxX8664Cflags = []string{ 54 "-m64", 55 } 56 57 linuxX86Ldflags = []string{ 58 "-m32", 59 `-Wl,-rpath,\$$ORIGIN/../lib`, 60 `-Wl,-rpath,\$$ORIGIN/lib`, 61 } 62 63 linuxX8664Ldflags = []string{ 64 "-m64", 65 `-Wl,-rpath,\$$ORIGIN/../lib64`, 66 `-Wl,-rpath,\$$ORIGIN/lib64`, 67 } 68 69 linuxClangCflags = append(clangFilterUnknownCflags(linuxCflags), []string{ 70 "--gcc-toolchain=${linuxGccRoot}", 71 "--sysroot=${linuxGccRoot}/sysroot", 72 "-fstack-protector-strong", 73 }...) 74 75 linuxClangLdflags = append(clangFilterUnknownCflags(linuxLdflags), []string{ 76 "--gcc-toolchain=${linuxGccRoot}", 77 "--sysroot=${linuxGccRoot}/sysroot", 78 }...) 79 80 linuxX86ClangLdflags = append(clangFilterUnknownCflags(linuxX86Ldflags), []string{ 81 "-B${linuxGccRoot}/lib/gcc/${linuxGccTriple}/${linuxGccVersion}/32", 82 "-L${linuxGccRoot}/lib/gcc/${linuxGccTriple}/${linuxGccVersion}/32", 83 "-L${linuxGccRoot}/${linuxGccTriple}/lib32", 84 }...) 85 86 linuxX8664ClangLdflags = append(clangFilterUnknownCflags(linuxX8664Ldflags), []string{ 87 "-B${linuxGccRoot}/lib/gcc/${linuxGccTriple}/${linuxGccVersion}", 88 "-L${linuxGccRoot}/lib/gcc/${linuxGccTriple}/${linuxGccVersion}", 89 "-L${linuxGccRoot}/${linuxGccTriple}/lib64", 90 }...) 91 92 linuxClangCppflags = []string{ 93 "-isystem ${linuxGccRoot}/${linuxGccTriple}/include/c++/${linuxGccVersion}", 94 "-isystem ${linuxGccRoot}/${linuxGccTriple}/include/c++/${linuxGccVersion}/backward", 95 } 96 97 linuxX86ClangCppflags = []string{ 98 "-isystem ${linuxGccRoot}/${linuxGccTriple}/include/c++/${linuxGccVersion}/${linuxGccTriple}/32", 99 } 100 101 linuxX8664ClangCppflags = []string{ 102 "-isystem ${linuxGccRoot}/${linuxGccTriple}/include/c++/${linuxGccVersion}/${linuxGccTriple}", 103 } 104) 105 106const ( 107 linuxGccVersion = "4.8" 108) 109 110func init() { 111 pctx.StaticVariable("linuxGccVersion", linuxGccVersion) 112 113 pctx.SourcePathVariable("linuxGccRoot", 114 "prebuilts/gcc/${HostPrebuiltTag}/host/x86_64-linux-glibc2.15-${linuxGccVersion}") 115 116 pctx.StaticVariable("linuxGccTriple", "x86_64-linux") 117 118 pctx.StaticVariable("linuxCflags", strings.Join(linuxCflags, " ")) 119 pctx.StaticVariable("linuxLdflags", strings.Join(linuxLdflags, " ")) 120 121 pctx.StaticVariable("linuxClangCflags", strings.Join(linuxClangCflags, " ")) 122 pctx.StaticVariable("linuxClangLdflags", strings.Join(linuxClangLdflags, " ")) 123 pctx.StaticVariable("linuxClangCppflags", strings.Join(linuxClangCppflags, " ")) 124 125 // Extended cflags 126 pctx.StaticVariable("linuxX86Cflags", strings.Join(linuxX86Cflags, " ")) 127 pctx.StaticVariable("linuxX8664Cflags", strings.Join(linuxX8664Cflags, " ")) 128 pctx.StaticVariable("linuxX86Ldflags", strings.Join(linuxX86Ldflags, " ")) 129 pctx.StaticVariable("linuxX8664Ldflags", strings.Join(linuxX8664Ldflags, " ")) 130 131 pctx.StaticVariable("linuxX86ClangCflags", 132 strings.Join(clangFilterUnknownCflags(linuxX86Cflags), " ")) 133 pctx.StaticVariable("linuxX8664ClangCflags", 134 strings.Join(clangFilterUnknownCflags(linuxX8664Cflags), " ")) 135 pctx.StaticVariable("linuxX86ClangLdflags", strings.Join(linuxX86ClangLdflags, " ")) 136 pctx.StaticVariable("linuxX8664ClangLdflags", strings.Join(linuxX8664ClangLdflags, " ")) 137 pctx.StaticVariable("linuxX86ClangCppflags", strings.Join(linuxX86ClangCppflags, " ")) 138 pctx.StaticVariable("linuxX8664ClangCppflags", strings.Join(linuxX8664ClangCppflags, " ")) 139} 140 141type toolchainLinux struct { 142 cFlags, ldFlags string 143} 144 145type toolchainLinuxX86 struct { 146 toolchain32Bit 147 toolchainLinux 148} 149 150type toolchainLinuxX8664 struct { 151 toolchain64Bit 152 toolchainLinux 153} 154 155func (t *toolchainLinuxX86) Name() string { 156 return "x86" 157} 158 159func (t *toolchainLinuxX8664) Name() string { 160 return "x86_64" 161} 162 163func (t *toolchainLinux) GccRoot() string { 164 return "${linuxGccRoot}" 165} 166 167func (t *toolchainLinux) GccTriple() string { 168 return "${linuxGccTriple}" 169} 170 171func (t *toolchainLinux) GccVersion() string { 172 return linuxGccVersion 173} 174 175func (t *toolchainLinuxX86) Cflags() string { 176 return "${linuxCflags} ${linuxX86Cflags}" 177} 178 179func (t *toolchainLinuxX8664) Cflags() string { 180 return "${linuxCflags} ${linuxX8664Cflags}" 181} 182 183func (t *toolchainLinux) Cppflags() string { 184 return "" 185} 186 187func (t *toolchainLinuxX86) Ldflags() string { 188 return "${linuxLdflags} ${linuxX86Ldflags}" 189} 190 191func (t *toolchainLinuxX8664) Ldflags() string { 192 return "${linuxLdflags} ${linuxX8664Ldflags}" 193} 194 195func (t *toolchainLinux) IncludeFlags() string { 196 return "" 197} 198 199func (t *toolchainLinuxX86) ClangTriple() string { 200 return "i686-linux-gnu" 201} 202 203func (t *toolchainLinuxX86) ClangCflags() string { 204 return "${linuxClangCflags} ${linuxX86ClangCflags}" 205} 206 207func (t *toolchainLinuxX86) ClangCppflags() string { 208 return "${linuxClangCppflags} ${linuxX86ClangCppflags}" 209} 210 211func (t *toolchainLinuxX8664) ClangTriple() string { 212 return "x86_64-linux-gnu" 213} 214 215func (t *toolchainLinuxX8664) ClangCflags() string { 216 return "${linuxClangCflags} ${linuxX8664ClangCflags}" 217} 218 219func (t *toolchainLinuxX8664) ClangCppflags() string { 220 return "${linuxClangCppflags} ${linuxX8664ClangCppflags}" 221} 222 223func (t *toolchainLinuxX86) ClangLdflags() string { 224 return "${linuxClangLdflags} ${linuxX86ClangLdflags}" 225} 226 227func (t *toolchainLinuxX8664) ClangLdflags() string { 228 return "${linuxClangLdflags} ${linuxX8664ClangLdflags}" 229} 230 231var toolchainLinuxX86Singleton Toolchain = &toolchainLinuxX86{} 232var toolchainLinuxX8664Singleton Toolchain = &toolchainLinuxX8664{} 233 234func linuxX86ToolchainFactory(arch common.Arch) Toolchain { 235 return toolchainLinuxX86Singleton 236} 237 238func linuxX8664ToolchainFactory(arch common.Arch) Toolchain { 239 return toolchainLinuxX8664Singleton 240} 241 242func init() { 243 registerHostToolchainFactory(common.Linux, common.X86, linuxX86ToolchainFactory) 244 registerHostToolchainFactory(common.Linux, common.X86_64, linuxX8664ToolchainFactory) 245} 246