1*3f982cf4SFabien Sanglard# Copyright 2018 The Chromium Authors. All rights reserved. 2*3f982cf4SFabien Sanglard# Use of this source code is governed by a BSD-style license that can be 3*3f982cf4SFabien Sanglard# found in the LICENSE file. 4*3f982cf4SFabien Sanglard 5*3f982cf4SFabien Sanglardtemplate("gcc_toolchain") { 6*3f982cf4SFabien Sanglard toolchain(target_name) { 7*3f982cf4SFabien Sanglard assert(defined(invoker.ar), "Caller must define ar command.") 8*3f982cf4SFabien Sanglard assert(defined(invoker.cc), "Caller must define cc command.") 9*3f982cf4SFabien Sanglard assert(defined(invoker.cxx), "Caller must define cxx command.") 10*3f982cf4SFabien Sanglard assert(defined(invoker.ld), "Caller must define ld command.") 11*3f982cf4SFabien Sanglard forward_variables_from(invoker, 12*3f982cf4SFabien Sanglard [ 13*3f982cf4SFabien Sanglard "ar", 14*3f982cf4SFabien Sanglard "cc", 15*3f982cf4SFabien Sanglard "cxx", 16*3f982cf4SFabien Sanglard "ld", 17*3f982cf4SFabien Sanglard ]) 18*3f982cf4SFabien Sanglard 19*3f982cf4SFabien Sanglard toolchain_args = { 20*3f982cf4SFabien Sanglard forward_variables_from(invoker.toolchain_args, "*") 21*3f982cf4SFabien Sanglard 22*3f982cf4SFabien Sanglard # The host toolchain needs to be preserved by all secondary toolchains. 23*3f982cf4SFabien Sanglard # For futher explanation, see 24*3f982cf4SFabien Sanglard # https://gn.googlesource.com/gn/+/refs/heads/master/docs/reference.md#toolchain-overview 25*3f982cf4SFabien Sanglard host_toolchain = host_toolchain 26*3f982cf4SFabien Sanglard } 27*3f982cf4SFabien Sanglard 28*3f982cf4SFabien Sanglard lib_switch = "-l" 29*3f982cf4SFabien Sanglard lib_dir_switch = "-L" 30*3f982cf4SFabien Sanglard 31*3f982cf4SFabien Sanglard object_prefix = "{{source_out_dir}}/{{label_name}}." 32*3f982cf4SFabien Sanglard 33*3f982cf4SFabien Sanglard tool("cc") { 34*3f982cf4SFabien Sanglard depfile = "{{output}}.d" 35*3f982cf4SFabien Sanglard command = "$cc -MMD -MF $depfile {{defines}} {{include_dirs}} {{cflags}} {{cflags_c}} -c {{source}} -o {{output}}" 36*3f982cf4SFabien Sanglard depsformat = "gcc" 37*3f982cf4SFabien Sanglard description = "CC {{output}}" 38*3f982cf4SFabien Sanglard outputs = [ 39*3f982cf4SFabien Sanglard "$object_prefix{{source_name_part}}.o", 40*3f982cf4SFabien Sanglard ] 41*3f982cf4SFabien Sanglard } 42*3f982cf4SFabien Sanglard 43*3f982cf4SFabien Sanglard tool("cxx") { 44*3f982cf4SFabien Sanglard depfile = "{{output}}.d" 45*3f982cf4SFabien Sanglard command = "$cxx -MMD -MF $depfile {{defines}} {{include_dirs}} {{cflags}} {{cflags_cc}} -c {{source}} -o {{output}}" 46*3f982cf4SFabien Sanglard depsformat = "gcc" 47*3f982cf4SFabien Sanglard description = "CXX {{output}}" 48*3f982cf4SFabien Sanglard outputs = [ 49*3f982cf4SFabien Sanglard "$object_prefix{{source_name_part}}.o", 50*3f982cf4SFabien Sanglard ] 51*3f982cf4SFabien Sanglard } 52*3f982cf4SFabien Sanglard 53*3f982cf4SFabien Sanglard tool("asm") { 54*3f982cf4SFabien Sanglard depfile = "{{output}}.d" 55*3f982cf4SFabien Sanglard command = "$cc -MMD -MF $depfile {{defines}} {{include_dirs}} {{asmflags}} -c {{source}} -o {{output}}" 56*3f982cf4SFabien Sanglard depsformat = "gcc" 57*3f982cf4SFabien Sanglard description = "ASM {{output}}" 58*3f982cf4SFabien Sanglard outputs = [ 59*3f982cf4SFabien Sanglard "$object_prefix{{source_name_part}}.o", 60*3f982cf4SFabien Sanglard ] 61*3f982cf4SFabien Sanglard } 62*3f982cf4SFabien Sanglard 63*3f982cf4SFabien Sanglard tool("alink") { 64*3f982cf4SFabien Sanglard rspfile = "{{output}}.rsp" 65*3f982cf4SFabien Sanglard command = "rm -f {{output}} && $ar rcs {{output}} @$rspfile" 66*3f982cf4SFabien Sanglard description = "AR {{target_output_name}}{{output_extension}}" 67*3f982cf4SFabien Sanglard rspfile_content = "{{inputs}}" 68*3f982cf4SFabien Sanglard outputs = [ 69*3f982cf4SFabien Sanglard "{{output_dir}}/{{target_output_name}}{{output_extension}}", 70*3f982cf4SFabien Sanglard ] 71*3f982cf4SFabien Sanglard default_output_dir = "{{target_out_dir}}" 72*3f982cf4SFabien Sanglard default_output_extension = ".a" 73*3f982cf4SFabien Sanglard output_prefix = "lib" 74*3f982cf4SFabien Sanglard } 75*3f982cf4SFabien Sanglard 76*3f982cf4SFabien Sanglard tool("solink") { 77*3f982cf4SFabien Sanglard soname = "{{target_output_name}}{{output_extension}}" # e.g. "libfoo.so". 78*3f982cf4SFabien Sanglard sofile = "{{output_dir}}/$soname" 79*3f982cf4SFabien Sanglard rspfile = soname + ".rsp" 80*3f982cf4SFabien Sanglard 81*3f982cf4SFabien Sanglard command = 82*3f982cf4SFabien Sanglard "$ld -shared {{ldflags}} -o $sofile -Wl,-soname=$soname @$rspfile" 83*3f982cf4SFabien Sanglard rspfile_content = "-Wl,--whole-archive {{inputs}} {{solibs}} -Wl,--no-whole-archive {{libs}}" 84*3f982cf4SFabien Sanglard 85*3f982cf4SFabien Sanglard description = "SOLINK {{output}}" 86*3f982cf4SFabien Sanglard 87*3f982cf4SFabien Sanglard # Use this for {{output_extension}} expansions unless a target manually 88*3f982cf4SFabien Sanglard # overrides it (in which case {{output_extension}} will be what the target 89*3f982cf4SFabien Sanglard # specifies). 90*3f982cf4SFabien Sanglard default_output_extension = ".so" 91*3f982cf4SFabien Sanglard 92*3f982cf4SFabien Sanglard # Use this for {{output_dir}} expansions unless a target manually overrides 93*3f982cf4SFabien Sanglard # it (in which case {{output_dir}} will be what the target specifies). 94*3f982cf4SFabien Sanglard default_output_dir = "{{root_out_dir}}" 95*3f982cf4SFabien Sanglard 96*3f982cf4SFabien Sanglard outputs = [ 97*3f982cf4SFabien Sanglard sofile, 98*3f982cf4SFabien Sanglard ] 99*3f982cf4SFabien Sanglard link_output = sofile 100*3f982cf4SFabien Sanglard depend_output = sofile 101*3f982cf4SFabien Sanglard output_prefix = "lib" 102*3f982cf4SFabien Sanglard } 103*3f982cf4SFabien Sanglard 104*3f982cf4SFabien Sanglard tool("link") { 105*3f982cf4SFabien Sanglard outfile = "{{output_dir}}/{{target_output_name}}{{output_extension}}" 106*3f982cf4SFabien Sanglard rspfile = "$outfile.rsp" 107*3f982cf4SFabien Sanglard 108*3f982cf4SFabien Sanglard # These extra ldflags allow an executable to search for shared libraries in 109*3f982cf4SFabien Sanglard # the current working directory. 110*3f982cf4SFabien Sanglard additional_executable_ldflags = "-Wl,-rpath=\$ORIGIN/ -Wl,-rpath-link=" 111*3f982cf4SFabien Sanglard command = "$ld {{ldflags}} $additional_executable_ldflags -o $outfile -Wl,--start-group @$rspfile {{solibs}} -Wl,--end-group {{libs}}" 112*3f982cf4SFabien Sanglard description = "LINK $outfile" 113*3f982cf4SFabien Sanglard default_output_dir = "{{root_out_dir}}" 114*3f982cf4SFabien Sanglard rspfile_content = "{{inputs}}" 115*3f982cf4SFabien Sanglard outputs = [ 116*3f982cf4SFabien Sanglard outfile, 117*3f982cf4SFabien Sanglard ] 118*3f982cf4SFabien Sanglard } 119*3f982cf4SFabien Sanglard 120*3f982cf4SFabien Sanglard tool("stamp") { 121*3f982cf4SFabien Sanglard command = "touch {{output}}" 122*3f982cf4SFabien Sanglard description = "STAMP {{output}}" 123*3f982cf4SFabien Sanglard } 124*3f982cf4SFabien Sanglard 125*3f982cf4SFabien Sanglard tool("copy") { 126*3f982cf4SFabien Sanglard command = "ln -f {{source}} {{output}} 2>/dev/null || (rm -rf {{output}} && cp -af {{source}} {{output}})" 127*3f982cf4SFabien Sanglard description = "COPY {{source}} {{output}}" 128*3f982cf4SFabien Sanglard } 129*3f982cf4SFabien Sanglard } 130*3f982cf4SFabien Sanglard} 131*3f982cf4SFabien Sanglard 132*3f982cf4SFabien Sanglardtemplate("clang_toolchain") { 133*3f982cf4SFabien Sanglard prefix = rebase_path("$clang_base_path/bin", root_build_dir) 134*3f982cf4SFabien Sanglard 135*3f982cf4SFabien Sanglard gcc_toolchain(target_name) { 136*3f982cf4SFabien Sanglard ar = "$prefix/llvm-ar" 137*3f982cf4SFabien Sanglard cc = "$prefix/clang" 138*3f982cf4SFabien Sanglard cxx = "$prefix/clang++" 139*3f982cf4SFabien Sanglard ld = cxx 140*3f982cf4SFabien Sanglard toolchain_args = { 141*3f982cf4SFabien Sanglard forward_variables_from(invoker.toolchain_args, "*") 142*3f982cf4SFabien Sanglard is_clang = true 143*3f982cf4SFabien Sanglard } 144*3f982cf4SFabien Sanglard } 145*3f982cf4SFabien Sanglard} 146*3f982cf4SFabien Sanglard 147*3f982cf4SFabien Sanglardclang_toolchain("clang_x64") { 148*3f982cf4SFabien Sanglard toolchain_args = { 149*3f982cf4SFabien Sanglard current_cpu = "x64" 150*3f982cf4SFabien Sanglard current_os = "linux" 151*3f982cf4SFabien Sanglard } 152*3f982cf4SFabien Sanglard} 153*3f982cf4SFabien Sanglard 154*3f982cf4SFabien Sanglardclang_toolchain("clang_x86") { 155*3f982cf4SFabien Sanglard toolchain_args = { 156*3f982cf4SFabien Sanglard current_cpu = "x86" 157*3f982cf4SFabien Sanglard current_os = "linux" 158*3f982cf4SFabien Sanglard } 159*3f982cf4SFabien Sanglard} 160*3f982cf4SFabien Sanglard 161*3f982cf4SFabien Sanglardclang_toolchain("clang_arm") { 162*3f982cf4SFabien Sanglard toolchain_args = { 163*3f982cf4SFabien Sanglard current_cpu = "arm" 164*3f982cf4SFabien Sanglard current_os = "linux" 165*3f982cf4SFabien Sanglard } 166*3f982cf4SFabien Sanglard} 167*3f982cf4SFabien Sanglard 168*3f982cf4SFabien Sanglardclang_toolchain("clang_arm64") { 169*3f982cf4SFabien Sanglard toolchain_args = { 170*3f982cf4SFabien Sanglard current_cpu = "arm64" 171*3f982cf4SFabien Sanglard current_os = "linux" 172*3f982cf4SFabien Sanglard } 173*3f982cf4SFabien Sanglard} 174*3f982cf4SFabien Sanglard 175*3f982cf4SFabien Sanglardgcc_toolchain("gcc_x64") { 176*3f982cf4SFabien Sanglard ar = "ar" 177*3f982cf4SFabien Sanglard cc = "gcc" 178*3f982cf4SFabien Sanglard cxx = "g++" 179*3f982cf4SFabien Sanglard ld = cxx 180*3f982cf4SFabien Sanglard toolchain_args = { 181*3f982cf4SFabien Sanglard current_cpu = "x64" 182*3f982cf4SFabien Sanglard current_os = "linux" 183*3f982cf4SFabien Sanglard is_gcc = true 184*3f982cf4SFabien Sanglard } 185*3f982cf4SFabien Sanglard} 186*3f982cf4SFabien Sanglard 187*3f982cf4SFabien Sanglardgcc_toolchain("gcc_x86") { 188*3f982cf4SFabien Sanglard ar = "ar" 189*3f982cf4SFabien Sanglard cc = "gcc" 190*3f982cf4SFabien Sanglard cxx = "g++" 191*3f982cf4SFabien Sanglard ld = cxx 192*3f982cf4SFabien Sanglard toolchain_args = { 193*3f982cf4SFabien Sanglard current_cpu = "x86" 194*3f982cf4SFabien Sanglard current_os = "linux" 195*3f982cf4SFabien Sanglard is_gcc = true 196*3f982cf4SFabien Sanglard } 197*3f982cf4SFabien Sanglard} 198*3f982cf4SFabien Sanglard 199*3f982cf4SFabien Sanglardgcc_toolchain("gcc_arm") { 200*3f982cf4SFabien Sanglard ar = "ar" 201*3f982cf4SFabien Sanglard cc = "gcc" 202*3f982cf4SFabien Sanglard cxx = "g++" 203*3f982cf4SFabien Sanglard ld = cxx 204*3f982cf4SFabien Sanglard toolchain_args = { 205*3f982cf4SFabien Sanglard current_cpu = "arm" 206*3f982cf4SFabien Sanglard current_os = "linux" 207*3f982cf4SFabien Sanglard is_gcc = true 208*3f982cf4SFabien Sanglard } 209*3f982cf4SFabien Sanglard} 210*3f982cf4SFabien Sanglard 211*3f982cf4SFabien Sanglardgcc_toolchain("gcc_arm64") { 212*3f982cf4SFabien Sanglard ar = "ar" 213*3f982cf4SFabien Sanglard cc = "gcc" 214*3f982cf4SFabien Sanglard cxx = "g++" 215*3f982cf4SFabien Sanglard ld = cxx 216*3f982cf4SFabien Sanglard toolchain_args = { 217*3f982cf4SFabien Sanglard current_cpu = "arm64" 218*3f982cf4SFabien Sanglard current_os = "linux" 219*3f982cf4SFabien Sanglard is_gcc = true 220*3f982cf4SFabien Sanglard } 221*3f982cf4SFabien Sanglard} 222