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