xref: /aosp_15_r20/external/angle/build/toolchain/zos/BUILD.gn (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker# Copyright 2021 The Chromium Authors
2*8975f5c5SAndroid Build Coastguard Worker# Use of this source code is governed by a BSD-style license that can be
3*8975f5c5SAndroid Build Coastguard Worker# found in the LICENSE file.
4*8975f5c5SAndroid Build Coastguard Worker
5*8975f5c5SAndroid Build Coastguard Worker# This file is based on gcc_toolchain.gni and customized for z/OS.
6*8975f5c5SAndroid Build Coastguard Worker
7*8975f5c5SAndroid Build Coastguard Workerimport("//build/toolchain/gcc_toolchain.gni")
8*8975f5c5SAndroid Build Coastguard Worker
9*8975f5c5SAndroid Build Coastguard Workertoolchain("s390x") {
10*8975f5c5SAndroid Build Coastguard Worker  cc = "ibm-clang"
11*8975f5c5SAndroid Build Coastguard Worker  cxx = "ibm-clang++"
12*8975f5c5SAndroid Build Coastguard Worker  asm = "ibm-clang"
13*8975f5c5SAndroid Build Coastguard Worker  ar = "ar"
14*8975f5c5SAndroid Build Coastguard Worker  ld = cxx
15*8975f5c5SAndroid Build Coastguard Worker
16*8975f5c5SAndroid Build Coastguard Worker  toolchain_args = {
17*8975f5c5SAndroid Build Coastguard Worker    current_cpu = "s390x"
18*8975f5c5SAndroid Build Coastguard Worker    current_os = "zos"
19*8975f5c5SAndroid Build Coastguard Worker  }
20*8975f5c5SAndroid Build Coastguard Worker
21*8975f5c5SAndroid Build Coastguard Worker  rebuild_string = ""
22*8975f5c5SAndroid Build Coastguard Worker  default_shlib_extension = ".so"
23*8975f5c5SAndroid Build Coastguard Worker  default_shlib_subdir = ""
24*8975f5c5SAndroid Build Coastguard Worker  extra_cflags = ""
25*8975f5c5SAndroid Build Coastguard Worker  extra_cppflags = ""
26*8975f5c5SAndroid Build Coastguard Worker  extra_cxxflags = ""
27*8975f5c5SAndroid Build Coastguard Worker  extra_asmflags = ""
28*8975f5c5SAndroid Build Coastguard Worker  extra_ldflags = ""
29*8975f5c5SAndroid Build Coastguard Worker
30*8975f5c5SAndroid Build Coastguard Worker  # These library switches can apply to all tools below.
31*8975f5c5SAndroid Build Coastguard Worker  lib_switch = "-l"
32*8975f5c5SAndroid Build Coastguard Worker  lib_dir_switch = "-L"
33*8975f5c5SAndroid Build Coastguard Worker
34*8975f5c5SAndroid Build Coastguard Worker  # Object files go in this directory.
35*8975f5c5SAndroid Build Coastguard Worker  object_subdir = "{{target_out_dir}}/{{label_name}}"
36*8975f5c5SAndroid Build Coastguard Worker
37*8975f5c5SAndroid Build Coastguard Worker  tool("cc") {
38*8975f5c5SAndroid Build Coastguard Worker    depfile = "{{output}}.d"
39*8975f5c5SAndroid Build Coastguard Worker    command = "$cc -MMD -MF $depfile ${rebuild_string}{{defines}} {{include_dirs}} {{cflags}} {{cflags_c}}${extra_cflags} -c {{source}} -o {{output}}"
40*8975f5c5SAndroid Build Coastguard Worker    depsformat = "gcc"
41*8975f5c5SAndroid Build Coastguard Worker    description = "CC {{output}}"
42*8975f5c5SAndroid Build Coastguard Worker    outputs = [ "$object_subdir/{{source_name_part}}.o" ]
43*8975f5c5SAndroid Build Coastguard Worker  }
44*8975f5c5SAndroid Build Coastguard Worker
45*8975f5c5SAndroid Build Coastguard Worker  tool("cxx") {
46*8975f5c5SAndroid Build Coastguard Worker    depfile = "{{output}}.d"
47*8975f5c5SAndroid Build Coastguard Worker    command = "$cxx -MMD -MF $depfile ${rebuild_string}{{defines}} {{include_dirs}} {{cflags}} {{cflags_cc}}${extra_cppflags}${extra_cxxflags} -c {{source}} -o {{output}}"
48*8975f5c5SAndroid Build Coastguard Worker    depsformat = "gcc"
49*8975f5c5SAndroid Build Coastguard Worker    description = "CXX {{output}}"
50*8975f5c5SAndroid Build Coastguard Worker    outputs = [ "$object_subdir/{{source_name_part}}.o" ]
51*8975f5c5SAndroid Build Coastguard Worker  }
52*8975f5c5SAndroid Build Coastguard Worker
53*8975f5c5SAndroid Build Coastguard Worker  tool("asm") {
54*8975f5c5SAndroid Build Coastguard Worker    # Just use the C compiler to compile assembly.
55*8975f5c5SAndroid Build Coastguard Worker    depfile = "{{output}}.d"
56*8975f5c5SAndroid Build Coastguard Worker    command = "$asm ${rebuild_string} {{asmflags}}${extra_asmflags} -c {{source}} -o {{output}}"
57*8975f5c5SAndroid Build Coastguard Worker    depsformat = "gcc"
58*8975f5c5SAndroid Build Coastguard Worker    description = "ASM {{output}}"
59*8975f5c5SAndroid Build Coastguard Worker    outputs = [ "$object_subdir/{{source_name_part}}.o" ]
60*8975f5c5SAndroid Build Coastguard Worker  }
61*8975f5c5SAndroid Build Coastguard Worker
62*8975f5c5SAndroid Build Coastguard Worker  tool("alink") {
63*8975f5c5SAndroid Build Coastguard Worker    command = "$ar {{arflags}} -r -c -s {{output}} {{inputs}}"
64*8975f5c5SAndroid Build Coastguard Worker
65*8975f5c5SAndroid Build Coastguard Worker    # Remove the output file first so that ar doesn't try to modify the
66*8975f5c5SAndroid Build Coastguard Worker    # existing file.
67*8975f5c5SAndroid Build Coastguard Worker    command = "rm -f {{output}} && $command"
68*8975f5c5SAndroid Build Coastguard Worker
69*8975f5c5SAndroid Build Coastguard Worker    # Almost all targets build with //build/config/compiler:thin_archive which
70*8975f5c5SAndroid Build Coastguard Worker    # adds -T to arflags.
71*8975f5c5SAndroid Build Coastguard Worker    description = "AR {{output}}"
72*8975f5c5SAndroid Build Coastguard Worker    outputs = [ "{{output_dir}}/{{target_output_name}}{{output_extension}}" ]
73*8975f5c5SAndroid Build Coastguard Worker
74*8975f5c5SAndroid Build Coastguard Worker    # Shared libraries go in the target out directory by default so we can
75*8975f5c5SAndroid Build Coastguard Worker    # generate different targets with the same name and not have them collide.
76*8975f5c5SAndroid Build Coastguard Worker    default_output_dir = "{{target_out_dir}}"
77*8975f5c5SAndroid Build Coastguard Worker    default_output_extension = ".a"
78*8975f5c5SAndroid Build Coastguard Worker    output_prefix = "lib"
79*8975f5c5SAndroid Build Coastguard Worker  }
80*8975f5c5SAndroid Build Coastguard Worker
81*8975f5c5SAndroid Build Coastguard Worker  tool("solink") {
82*8975f5c5SAndroid Build Coastguard Worker    soname = "{{target_output_name}}{{output_extension}}"  # e.g. "libfoo.so".
83*8975f5c5SAndroid Build Coastguard Worker    sofile = "{{output_dir}}/$soname"  # Possibly including toolchain dir.
84*8975f5c5SAndroid Build Coastguard Worker    xfile = "{{output_dir}}/{{target_output_name}}.x"
85*8975f5c5SAndroid Build Coastguard Worker    rspfile = sofile + ".rsp"
86*8975f5c5SAndroid Build Coastguard Worker
87*8975f5c5SAndroid Build Coastguard Worker    # These variables are not built into GN but are helpers that
88*8975f5c5SAndroid Build Coastguard Worker    # implement (1) linking to produce a .so, (2) extracting the symbols
89*8975f5c5SAndroid Build Coastguard Worker    # from that file (3) if the extracted list differs from the existing
90*8975f5c5SAndroid Build Coastguard Worker    # .TOC file, overwrite it, otherwise, don't change it.
91*8975f5c5SAndroid Build Coastguard Worker    link_command = "$ld -Wl,-x${xfile} {{ldflags}}${extra_ldflags} -o \"$sofile\" `cat $rspfile`"
92*8975f5c5SAndroid Build Coastguard Worker
93*8975f5c5SAndroid Build Coastguard Worker    solink_wrapper =
94*8975f5c5SAndroid Build Coastguard Worker        rebase_path("//build/toolchain/gcc_link_wrapper.py", root_build_dir)
95*8975f5c5SAndroid Build Coastguard Worker    command =
96*8975f5c5SAndroid Build Coastguard Worker        "$python_path \"$solink_wrapper\" --output=\"$sofile\" -- $link_command"
97*8975f5c5SAndroid Build Coastguard Worker
98*8975f5c5SAndroid Build Coastguard Worker    rspfile_content = "{{inputs}} {{solibs}} {{libs}}"
99*8975f5c5SAndroid Build Coastguard Worker
100*8975f5c5SAndroid Build Coastguard Worker    description = "SOLINK $sofile"
101*8975f5c5SAndroid Build Coastguard Worker
102*8975f5c5SAndroid Build Coastguard Worker    # Use this for {{output_extension}} expansions unless a target manually
103*8975f5c5SAndroid Build Coastguard Worker    # overrides it (in which case {{output_extension}} will be what the target
104*8975f5c5SAndroid Build Coastguard Worker    # specifies).
105*8975f5c5SAndroid Build Coastguard Worker    default_output_extension = default_shlib_extension
106*8975f5c5SAndroid Build Coastguard Worker
107*8975f5c5SAndroid Build Coastguard Worker    default_output_dir = "{{root_out_dir}}${default_shlib_subdir}"
108*8975f5c5SAndroid Build Coastguard Worker
109*8975f5c5SAndroid Build Coastguard Worker    output_prefix = "lib"
110*8975f5c5SAndroid Build Coastguard Worker
111*8975f5c5SAndroid Build Coastguard Worker    # Since the above commands only updates the .TOC file when it changes, ask
112*8975f5c5SAndroid Build Coastguard Worker    # Ninja to check if the timestamp actually changed to know if downstream
113*8975f5c5SAndroid Build Coastguard Worker    # dependencies should be recompiled.
114*8975f5c5SAndroid Build Coastguard Worker    restat = true
115*8975f5c5SAndroid Build Coastguard Worker
116*8975f5c5SAndroid Build Coastguard Worker    # Tell GN about the output files. It will link to the sofile but use the
117*8975f5c5SAndroid Build Coastguard Worker    # tocfile for dependency management.
118*8975f5c5SAndroid Build Coastguard Worker    outputs = [ xfile ]
119*8975f5c5SAndroid Build Coastguard Worker    outputs += [ sofile ]
120*8975f5c5SAndroid Build Coastguard Worker
121*8975f5c5SAndroid Build Coastguard Worker    link_output = xfile
122*8975f5c5SAndroid Build Coastguard Worker    depend_output = xfile
123*8975f5c5SAndroid Build Coastguard Worker  }
124*8975f5c5SAndroid Build Coastguard Worker
125*8975f5c5SAndroid Build Coastguard Worker  tool("solink_module") {
126*8975f5c5SAndroid Build Coastguard Worker    soname = "{{target_output_name}}{{output_extension}}"  # e.g. "libfoo.so".
127*8975f5c5SAndroid Build Coastguard Worker    sofile = "{{output_dir}}/$soname"
128*8975f5c5SAndroid Build Coastguard Worker    xfile = "{{output_dir}}/{{target_output_name}}.x"
129*8975f5c5SAndroid Build Coastguard Worker
130*8975f5c5SAndroid Build Coastguard Worker    rspfile = sofile + ".rsp"
131*8975f5c5SAndroid Build Coastguard Worker
132*8975f5c5SAndroid Build Coastguard Worker    command = "$ld {{ldflags}}${extra_ldflags} -o \"$sofile\" `cat $rspfile`"
133*8975f5c5SAndroid Build Coastguard Worker
134*8975f5c5SAndroid Build Coastguard Worker    rspfile_content = "{{inputs}} {{solibs}} {{libs}}"
135*8975f5c5SAndroid Build Coastguard Worker
136*8975f5c5SAndroid Build Coastguard Worker    description = "SOLINK_MODULE $sofile"
137*8975f5c5SAndroid Build Coastguard Worker
138*8975f5c5SAndroid Build Coastguard Worker    default_output_dir = "{{root_out_dir}}${default_shlib_subdir}"
139*8975f5c5SAndroid Build Coastguard Worker
140*8975f5c5SAndroid Build Coastguard Worker    output_prefix = "lib"
141*8975f5c5SAndroid Build Coastguard Worker    outputs = [ xfile ]
142*8975f5c5SAndroid Build Coastguard Worker    outputs += [ sofile ]
143*8975f5c5SAndroid Build Coastguard Worker  }
144*8975f5c5SAndroid Build Coastguard Worker
145*8975f5c5SAndroid Build Coastguard Worker  tool("link") {
146*8975f5c5SAndroid Build Coastguard Worker    exename = "{{target_output_name}}{{output_extension}}"
147*8975f5c5SAndroid Build Coastguard Worker    outfile = "{{output_dir}}/$exename"
148*8975f5c5SAndroid Build Coastguard Worker    rspfile = "$outfile.rsp"
149*8975f5c5SAndroid Build Coastguard Worker
150*8975f5c5SAndroid Build Coastguard Worker    default_output_dir = "{{root_out_dir}}"
151*8975f5c5SAndroid Build Coastguard Worker
152*8975f5c5SAndroid Build Coastguard Worker    link_command = "$ld {{ldflags}}${extra_ldflags} -o \"$outfile\" `cat $rspfile` {{solibs}} {{libs}}"
153*8975f5c5SAndroid Build Coastguard Worker
154*8975f5c5SAndroid Build Coastguard Worker    link_wrapper =
155*8975f5c5SAndroid Build Coastguard Worker        rebase_path("//build/toolchain/gcc_link_wrapper.py", root_build_dir)
156*8975f5c5SAndroid Build Coastguard Worker
157*8975f5c5SAndroid Build Coastguard Worker    command =
158*8975f5c5SAndroid Build Coastguard Worker        "$python_path \"$link_wrapper\" --output=\"$outfile\" -- $link_command"
159*8975f5c5SAndroid Build Coastguard Worker
160*8975f5c5SAndroid Build Coastguard Worker    description = "LINK $outfile"
161*8975f5c5SAndroid Build Coastguard Worker    rspfile_content = "{{inputs}}"
162*8975f5c5SAndroid Build Coastguard Worker    outputs = [ outfile ]
163*8975f5c5SAndroid Build Coastguard Worker  }
164*8975f5c5SAndroid Build Coastguard Worker
165*8975f5c5SAndroid Build Coastguard Worker  # These two are really entirely generic, but have to be repeated in
166*8975f5c5SAndroid Build Coastguard Worker  # each toolchain because GN doesn't allow a template to be used here.
167*8975f5c5SAndroid Build Coastguard Worker  # See //build/toolchain/toolchain.gni for details.
168*8975f5c5SAndroid Build Coastguard Worker  tool("stamp") {
169*8975f5c5SAndroid Build Coastguard Worker    command = stamp_command
170*8975f5c5SAndroid Build Coastguard Worker    description = stamp_description
171*8975f5c5SAndroid Build Coastguard Worker  }
172*8975f5c5SAndroid Build Coastguard Worker  tool("copy") {
173*8975f5c5SAndroid Build Coastguard Worker    command = copy_command
174*8975f5c5SAndroid Build Coastguard Worker    description = copy_description
175*8975f5c5SAndroid Build Coastguard Worker  }
176*8975f5c5SAndroid Build Coastguard Worker}
177