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) 22 23var ( 24 linuxCflags = []string{ 25 "-Wa,--noexecstack", 26 27 "-fPIC", 28 29 "-U_FORTIFY_SOURCE", 30 "-D_FORTIFY_SOURCE=2", 31 "-fstack-protector", 32 33 // Workaround differences in inttypes.h between host and target. 34 //See bug 12708004. 35 "-D__STDC_FORMAT_MACROS", 36 "-D__STDC_CONSTANT_MACROS", 37 38 "--gcc-toolchain=${LinuxGccRoot}", 39 "-fstack-protector-strong", 40 } 41 42 linuxGlibcCflags = []string{ 43 "--sysroot ${LinuxGccRoot}/sysroot", 44 } 45 46 linuxMuslCflags = []string{ 47 "-D_LIBCPP_HAS_MUSL_LIBC", 48 "-DANDROID_HOST_MUSL", 49 "-nostdlibinc", 50 "--sysroot /dev/null", 51 } 52 53 linuxLdflags = []string{ 54 "-Wl,-z,noexecstack", 55 "-Wl,-z,relro", 56 "-Wl,-z,now", 57 "-Wl,--no-undefined-version", 58 59 "--gcc-toolchain=${LinuxGccRoot}", 60 } 61 62 linuxGlibcLdflags = []string{ 63 "--sysroot ${LinuxGccRoot}/sysroot", 64 } 65 66 linuxMuslLdflags = []string{ 67 "-nostdlib", 68 "--sysroot /dev/null", 69 } 70 71 // Extended cflags 72 linuxX86Cflags = []string{ 73 "-msse3", 74 "-m32", 75 "-march=prescott", 76 "-D_FILE_OFFSET_BITS=64", 77 "-D_LARGEFILE_SOURCE=1", 78 } 79 80 linuxX8664Cflags = []string{ 81 "-m64", 82 } 83 84 linuxX86Ldflags = []string{ 85 "-m32", 86 "-B${LinuxGccRoot}/lib/gcc/${LinuxGccTriple}/${LinuxGccVersion}/32", 87 "-L${LinuxGccRoot}/lib/gcc/${LinuxGccTriple}/${LinuxGccVersion}/32", 88 "-L${LinuxGccRoot}/${LinuxGccTriple}/lib32", 89 } 90 91 linuxX8664Ldflags = []string{ 92 "-m64", 93 "-B${LinuxGccRoot}/lib/gcc/${LinuxGccTriple}/${LinuxGccVersion}", 94 "-L${LinuxGccRoot}/lib/gcc/${LinuxGccTriple}/${LinuxGccVersion}", 95 "-L${LinuxGccRoot}/${LinuxGccTriple}/lib64", 96 } 97 98 linuxAvailableLibraries = addPrefix([]string{ 99 "c", 100 "dl", 101 "gcc", 102 "gcc_s", 103 "m", 104 "ncurses", 105 "pthread", 106 "resolv", 107 "rt", 108 "util", 109 }, "-l") 110 111 muslCrtBeginStaticBinary, muslCrtEndStaticBinary = []string{"libc_musl_crtbegin_static"}, []string{"libc_musl_crtend"} 112 muslCrtBeginSharedBinary, muslCrtEndSharedBinary = []string{"libc_musl_crtbegin_dynamic", "musl_linker_script"}, []string{"libc_musl_crtend"} 113 muslCrtBeginSharedLibrary, muslCrtEndSharedLibrary = []string{"libc_musl_crtbegin_so"}, []string{"libc_musl_crtend_so"} 114 115 muslDefaultSharedLibraries = []string{"libc_musl"} 116) 117 118const ( 119 linuxGccVersion = "4.8.3" 120 linuxGlibcVersion = "2.17" 121) 122 123func init() { 124 exportedVars.ExportStringStaticVariable("LinuxGccVersion", linuxGccVersion) 125 exportedVars.ExportStringStaticVariable("LinuxGlibcVersion", linuxGlibcVersion) 126 127 // Most places use the full GCC version. A few only use up to the first two numbers. 128 if p := strings.Split(linuxGccVersion, "."); len(p) > 2 { 129 exportedVars.ExportStringStaticVariable("ShortLinuxGccVersion", strings.Join(p[:2], ".")) 130 } else { 131 exportedVars.ExportStringStaticVariable("ShortLinuxGccVersion", linuxGccVersion) 132 } 133 134 exportedVars.ExportSourcePathVariable("LinuxGccRoot", 135 "prebuilts/gcc/linux-x86/host/x86_64-linux-glibc${LinuxGlibcVersion}-${ShortLinuxGccVersion}") 136 137 exportedVars.ExportStringListStaticVariable("LinuxGccTriple", []string{"x86_64-linux"}) 138 139 exportedVars.ExportStringListStaticVariable("LinuxCflags", linuxCflags) 140 exportedVars.ExportStringListStaticVariable("LinuxLdflags", linuxLdflags) 141 exportedVars.ExportStringListStaticVariable("LinuxLldflags", linuxLdflags) 142 exportedVars.ExportStringListStaticVariable("LinuxGlibcCflags", linuxGlibcCflags) 143 exportedVars.ExportStringListStaticVariable("LinuxGlibcLdflags", linuxGlibcLdflags) 144 exportedVars.ExportStringListStaticVariable("LinuxGlibcLldflags", linuxGlibcLdflags) 145 exportedVars.ExportStringListStaticVariable("LinuxMuslCflags", linuxMuslCflags) 146 exportedVars.ExportStringListStaticVariable("LinuxMuslLdflags", linuxMuslLdflags) 147 exportedVars.ExportStringListStaticVariable("LinuxMuslLldflags", linuxMuslLdflags) 148 149 exportedVars.ExportStringListStaticVariable("LinuxX86Cflags", linuxX86Cflags) 150 exportedVars.ExportStringListStaticVariable("LinuxX8664Cflags", linuxX8664Cflags) 151 exportedVars.ExportStringListStaticVariable("LinuxX86Ldflags", linuxX86Ldflags) 152 exportedVars.ExportStringListStaticVariable("LinuxX86Lldflags", linuxX86Ldflags) 153 exportedVars.ExportStringListStaticVariable("LinuxX8664Ldflags", linuxX8664Ldflags) 154 exportedVars.ExportStringListStaticVariable("LinuxX8664Lldflags", linuxX8664Ldflags) 155 // Yasm flags 156 exportedVars.ExportStringListStaticVariable("LinuxX86YasmFlags", []string{"-f elf32 -m x86"}) 157 exportedVars.ExportStringListStaticVariable("LinuxX8664YasmFlags", []string{"-f elf64 -m amd64"}) 158} 159 160type toolchainLinux struct { 161 cFlags, ldFlags string 162} 163 164type toolchainLinuxX86 struct { 165 toolchain32Bit 166 toolchainLinux 167} 168 169type toolchainLinuxX8664 struct { 170 toolchain64Bit 171 toolchainLinux 172} 173 174func (t *toolchainLinuxX86) Name() string { 175 return "x86" 176} 177 178func (t *toolchainLinuxX8664) Name() string { 179 return "x86_64" 180} 181 182func (t *toolchainLinux) GccRoot() string { 183 return "${config.LinuxGccRoot}" 184} 185 186func (t *toolchainLinux) GccTriple() string { 187 return "${config.LinuxGccTriple}" 188} 189 190func (t *toolchainLinux) GccVersion() string { 191 return linuxGccVersion 192} 193 194func (t *toolchainLinux) IncludeFlags() string { 195 return "" 196} 197 198func (t *toolchainLinuxX86) Cflags() string { 199 return "${config.LinuxCflags} ${config.LinuxX86Cflags}" 200} 201 202func (t *toolchainLinuxX86) Cppflags() string { 203 return "" 204} 205 206func (t *toolchainLinuxX8664) Cflags() string { 207 return "${config.LinuxCflags} ${config.LinuxX8664Cflags}" 208} 209 210func (t *toolchainLinuxX8664) Cppflags() string { 211 return "" 212} 213 214func (t *toolchainLinuxX86) Ldflags() string { 215 return "${config.LinuxLdflags} ${config.LinuxX86Ldflags}" 216} 217 218func (t *toolchainLinuxX86) Lldflags() string { 219 return "${config.LinuxLldflags} ${config.LinuxX86Lldflags}" 220} 221 222func (t *toolchainLinuxX8664) Ldflags() string { 223 return "${config.LinuxLdflags} ${config.LinuxX8664Ldflags}" 224} 225 226func (t *toolchainLinuxX8664) Lldflags() string { 227 return "${config.LinuxLldflags} ${config.LinuxX8664Lldflags}" 228} 229 230func (t *toolchainLinuxX86) YasmFlags() string { 231 return "${config.LinuxX86YasmFlags}" 232} 233 234func (t *toolchainLinuxX8664) YasmFlags() string { 235 return "${config.LinuxX8664YasmFlags}" 236} 237 238func (toolchainLinuxX86) LibclangRuntimeLibraryArch() string { 239 return "i386" 240} 241 242func (toolchainLinuxX8664) LibclangRuntimeLibraryArch() string { 243 return "x86_64" 244} 245 246func (t *toolchainLinux) AvailableLibraries() []string { 247 return linuxAvailableLibraries 248} 249 250// glibc specialization of the linux toolchain 251 252type toolchainGlibc struct { 253} 254 255func (toolchainGlibc) Glibc() bool { return true } 256 257func (toolchainGlibc) Cflags() string { 258 return "${config.LinuxGlibcCflags}" 259} 260 261func (toolchainGlibc) Ldflags() string { 262 return "${config.LinuxGlibcLdflags}" 263} 264 265func (toolchainGlibc) Lldflags() string { 266 return "${config.LinuxGlibcLldflags}" 267} 268 269type toolchainLinuxGlibcX86 struct { 270 toolchainLinuxX86 271 toolchainGlibc 272} 273 274type toolchainLinuxGlibcX8664 struct { 275 toolchainLinuxX8664 276 toolchainGlibc 277} 278 279func (t *toolchainLinuxGlibcX86) ClangTriple() string { 280 return "i686-linux-gnu" 281} 282 283func (t *toolchainLinuxGlibcX86) Cflags() string { 284 return t.toolchainLinuxX86.Cflags() + " " + t.toolchainGlibc.Cflags() 285} 286 287func (t *toolchainLinuxGlibcX86) Ldflags() string { 288 return t.toolchainLinuxX86.Ldflags() + " " + t.toolchainGlibc.Ldflags() 289} 290 291func (t *toolchainLinuxGlibcX86) Lldflags() string { 292 return t.toolchainLinuxX86.Lldflags() + " " + t.toolchainGlibc.Lldflags() 293} 294 295func (t *toolchainLinuxGlibcX8664) ClangTriple() string { 296 return "x86_64-linux-gnu" 297} 298 299func (t *toolchainLinuxGlibcX8664) Cflags() string { 300 return t.toolchainLinuxX8664.Cflags() + " " + t.toolchainGlibc.Cflags() 301} 302 303func (t *toolchainLinuxGlibcX8664) Ldflags() string { 304 return t.toolchainLinuxX8664.Ldflags() + " " + t.toolchainGlibc.Ldflags() 305} 306 307func (t *toolchainLinuxGlibcX8664) Lldflags() string { 308 return t.toolchainLinuxX8664.Lldflags() + " " + t.toolchainGlibc.Lldflags() 309} 310 311var toolchainLinuxGlibcX86Singleton Toolchain = &toolchainLinuxGlibcX86{} 312var toolchainLinuxGlibcX8664Singleton Toolchain = &toolchainLinuxGlibcX8664{} 313 314func linuxGlibcX86ToolchainFactory(arch android.Arch) Toolchain { 315 return toolchainLinuxGlibcX86Singleton 316} 317 318func linuxGlibcX8664ToolchainFactory(arch android.Arch) Toolchain { 319 return toolchainLinuxGlibcX8664Singleton 320} 321 322// musl specialization of the linux toolchain 323 324type toolchainMusl struct { 325} 326 327func (toolchainMusl) Musl() bool { return true } 328 329func (toolchainMusl) CrtBeginStaticBinary() []string { return muslCrtBeginStaticBinary } 330func (toolchainMusl) CrtBeginSharedBinary() []string { return muslCrtBeginSharedBinary } 331func (toolchainMusl) CrtBeginSharedLibrary() []string { return muslCrtBeginSharedLibrary } 332func (toolchainMusl) CrtEndStaticBinary() []string { return muslCrtEndStaticBinary } 333func (toolchainMusl) CrtEndSharedBinary() []string { return muslCrtEndSharedBinary } 334func (toolchainMusl) CrtEndSharedLibrary() []string { return muslCrtEndSharedLibrary } 335 336func (toolchainMusl) DefaultSharedLibraries() []string { return muslDefaultSharedLibraries } 337 338func (toolchainMusl) Cflags() string { 339 return "${config.LinuxMuslCflags}" 340} 341 342func (toolchainMusl) Ldflags() string { 343 return "${config.LinuxMuslLdflags}" 344} 345 346func (toolchainMusl) Lldflags() string { 347 return "${config.LinuxMuslLldflags}" 348} 349 350type toolchainLinuxMuslX86 struct { 351 toolchainLinuxX86 352 toolchainMusl 353} 354 355type toolchainLinuxMuslX8664 struct { 356 toolchainLinuxX8664 357 toolchainMusl 358} 359 360func (t *toolchainLinuxMuslX86) ClangTriple() string { 361 return "i686-linux-musl" 362} 363 364func (t *toolchainLinuxMuslX86) Cflags() string { 365 return t.toolchainLinuxX86.Cflags() + " " + t.toolchainMusl.Cflags() 366} 367 368func (t *toolchainLinuxMuslX86) Ldflags() string { 369 return t.toolchainLinuxX86.Ldflags() + " " + t.toolchainMusl.Ldflags() 370} 371 372func (t *toolchainLinuxMuslX86) Lldflags() string { 373 return t.toolchainLinuxX86.Lldflags() + " " + t.toolchainMusl.Lldflags() 374} 375 376func (t *toolchainLinuxMuslX8664) ClangTriple() string { 377 return "x86_64-linux-musl" 378} 379 380func (t *toolchainLinuxMuslX8664) Cflags() string { 381 return t.toolchainLinuxX8664.Cflags() + " " + t.toolchainMusl.Cflags() 382} 383 384func (t *toolchainLinuxMuslX8664) Ldflags() string { 385 return t.toolchainLinuxX8664.Ldflags() + " " + t.toolchainMusl.Ldflags() 386} 387 388func (t *toolchainLinuxMuslX8664) Lldflags() string { 389 return t.toolchainLinuxX8664.Lldflags() + " " + t.toolchainMusl.Lldflags() 390} 391 392var toolchainLinuxMuslX86Singleton Toolchain = &toolchainLinuxMuslX86{} 393var toolchainLinuxMuslX8664Singleton Toolchain = &toolchainLinuxMuslX8664{} 394 395func linuxMuslX86ToolchainFactory(arch android.Arch) Toolchain { 396 return toolchainLinuxMuslX86Singleton 397} 398 399func linuxMuslX8664ToolchainFactory(arch android.Arch) Toolchain { 400 return toolchainLinuxMuslX8664Singleton 401} 402 403func init() { 404 registerToolchainFactory(android.Linux, android.X86, linuxGlibcX86ToolchainFactory) 405 registerToolchainFactory(android.Linux, android.X86_64, linuxGlibcX8664ToolchainFactory) 406 registerToolchainFactory(android.LinuxMusl, android.X86, linuxMuslX86ToolchainFactory) 407 registerToolchainFactory(android.LinuxMusl, android.X86_64, linuxMuslX8664ToolchainFactory) 408} 409