xref: /aosp_15_r20/external/openscreen/build/toolchain/linux/BUILD.gn (revision 3f982cf4871df8771c9d4abe6e9a6f8d829b2736)
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