xref: /aosp_15_r20/external/openscreen/build/toolchain/mac/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 Sanglardtoolchain("clang") {
6*3f982cf4SFabien Sanglard  c_command = "clang"
7*3f982cf4SFabien Sanglard  cpp_command = "clang++"
8*3f982cf4SFabien Sanglard
9*3f982cf4SFabien Sanglard  lib_switch = "-l"
10*3f982cf4SFabien Sanglard  lib_dir_switch = "-L"
11*3f982cf4SFabien Sanglard
12*3f982cf4SFabien Sanglard  tool("cc") {
13*3f982cf4SFabien Sanglard    depfile = "{{output}}.d"
14*3f982cf4SFabien Sanglard    command = "$c_command -MMD -MF $depfile {{defines}} {{include_dirs}} {{cflags}} {{cflags_c}} -c {{source}} -o {{output}}"
15*3f982cf4SFabien Sanglard    depsformat = "gcc"
16*3f982cf4SFabien Sanglard    description = "CC {{output}}"
17*3f982cf4SFabien Sanglard    outputs =
18*3f982cf4SFabien Sanglard        [ "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.o" ]
19*3f982cf4SFabien Sanglard  }
20*3f982cf4SFabien Sanglard
21*3f982cf4SFabien Sanglard  tool("cxx") {
22*3f982cf4SFabien Sanglard    depfile = "{{output}}.d"
23*3f982cf4SFabien Sanglard    command = "$cpp_command -MMD -MF $depfile {{defines}} {{include_dirs}} {{cflags}} {{cflags_cc}} -c {{source}} -o {{output}}"
24*3f982cf4SFabien Sanglard    depsformat = "gcc"
25*3f982cf4SFabien Sanglard    description = "CXX {{output}}"
26*3f982cf4SFabien Sanglard    outputs =
27*3f982cf4SFabien Sanglard        [ "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.o" ]
28*3f982cf4SFabien Sanglard  }
29*3f982cf4SFabien Sanglard
30*3f982cf4SFabien Sanglard  tool("asm") {
31*3f982cf4SFabien Sanglard    depfile = "{{output}}.d"
32*3f982cf4SFabien Sanglard    command = "$c_command -MMD -MF $depfile {{defines}} {{include_dirs}} {{asmflags}} -c {{source}} -o {{output}}"
33*3f982cf4SFabien Sanglard    depsformat = "gcc"
34*3f982cf4SFabien Sanglard    description = "ASM {{output}}"
35*3f982cf4SFabien Sanglard    outputs =
36*3f982cf4SFabien Sanglard        [ "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.o" ]
37*3f982cf4SFabien Sanglard  }
38*3f982cf4SFabien Sanglard
39*3f982cf4SFabien Sanglard  tool("objc") {
40*3f982cf4SFabien Sanglard    depfile = "{{output}}.d"
41*3f982cf4SFabien Sanglard    precompiled_header_type = "gcc"
42*3f982cf4SFabien Sanglard    command = "$c_command -MMD -MF $depfile {{defines}} {{include_dirs}} {{cflags}} {{cflags_objc}} -c {{source}} -o {{output}}"
43*3f982cf4SFabien Sanglard    depsformat = "gcc"
44*3f982cf4SFabien Sanglard    description = "OBJC {{output}}"
45*3f982cf4SFabien Sanglard    outputs =
46*3f982cf4SFabien Sanglard        [ "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.o" ]
47*3f982cf4SFabien Sanglard  }
48*3f982cf4SFabien Sanglard
49*3f982cf4SFabien Sanglard  tool("objcxx") {
50*3f982cf4SFabien Sanglard    depfile = "{{output}}.d"
51*3f982cf4SFabien Sanglard    precompiled_header_type = "gcc"
52*3f982cf4SFabien Sanglard    command = "$cpp_command -MMD -MF $depfile {{defines}} {{include_dirs}} {{cflags}} {{cflags_objcc}} -c {{source}} -o {{output}}"
53*3f982cf4SFabien Sanglard    depsformat = "gcc"
54*3f982cf4SFabien Sanglard    description = "OBJCXX {{output}}"
55*3f982cf4SFabien Sanglard    outputs =
56*3f982cf4SFabien Sanglard        [ "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.o" ]
57*3f982cf4SFabien Sanglard  }
58*3f982cf4SFabien Sanglard
59*3f982cf4SFabien Sanglard  tool("alink") {
60*3f982cf4SFabien Sanglard    # Note about -filelist: Apple's linker reads the file list file and
61*3f982cf4SFabien Sanglard    # interprets each newline-separated chunk of text as a file name. It
62*3f982cf4SFabien Sanglard    # doesn't do the things one would expect from the shell like unescaping
63*3f982cf4SFabien Sanglard    # or handling quotes. In contrast, when Ninja finds a file name with
64*3f982cf4SFabien Sanglard    # spaces, it single-quotes them in $inputs_newline as it would normally
65*3f982cf4SFabien Sanglard    # do for command-line arguments. Thus any source names with spaces, or
66*3f982cf4SFabien Sanglard    # label names with spaces (which GN bases the output paths on) will be
67*3f982cf4SFabien Sanglard    # corrupted by this process. Don't use spaces for source files or labels.
68*3f982cf4SFabien Sanglard    rspfile = "{{output}}.rsp"
69*3f982cf4SFabien Sanglard    rspfile_content = "{{inputs_newline}}"
70*3f982cf4SFabien Sanglard    command = "rm -f {{output}} && libtool -static {{arflags}} -o {{output}} -filelist $rspfile"
71*3f982cf4SFabien Sanglard    description = "LIBTOOL-STATIC {{output}}"
72*3f982cf4SFabien Sanglard    outputs = [ "{{output_dir}}/{{target_output_name}}{{output_extension}}" ]
73*3f982cf4SFabien Sanglard    default_output_dir = "{{target_out_dir}}"
74*3f982cf4SFabien Sanglard    default_output_extension = ".a"
75*3f982cf4SFabien Sanglard    output_prefix = "lib"
76*3f982cf4SFabien Sanglard  }
77*3f982cf4SFabien Sanglard
78*3f982cf4SFabien Sanglard  tool("solink") {
79*3f982cf4SFabien Sanglard    soname = "{{target_output_name}}{{output_extension}}"
80*3f982cf4SFabien Sanglard    dylib = "{{output_dir}}/$soname"  # e.g. "libfoo.dylib"
81*3f982cf4SFabien Sanglard    rspfile = soname + ".rsp"
82*3f982cf4SFabien Sanglard
83*3f982cf4SFabien Sanglard    # These variables are not built into GN but are helpers that implement
84*3f982cf4SFabien Sanglard    # (1) linking to produce a .dylib, (2) extracting the symbols from that
85*3f982cf4SFabien Sanglard    # file to a temporary file, (3) if the temporary file has differences from
86*3f982cf4SFabien Sanglard    # the existing .TOC file, overwrite it, otherwise, don't change it.
87*3f982cf4SFabien Sanglard    #
88*3f982cf4SFabien Sanglard    # As a special case, if the library reexports symbols from other dynamic
89*3f982cf4SFabien Sanglard    # libraries, we always update the .TOC and skip the temporary file and
90*3f982cf4SFabien Sanglard    # diffing steps, since that library always needs to be re-linked.
91*3f982cf4SFabien Sanglard    tocname = dylib + ".TOC"
92*3f982cf4SFabien Sanglard    temporary_tocname = dylib + ".tmp"
93*3f982cf4SFabien Sanglard
94*3f982cf4SFabien Sanglard    does_reexport_command = "[ ! -e \"$dylib\" -o ! -e \"$tocname\" ] || otool -l \"$dylib\" | grep -q LC_REEXPORT_DYLIB"
95*3f982cf4SFabien Sanglard    link_command = "$cpp_command -shared -Wl,-install_name,@rpath/\"$soname\" {{ldflags}} -o \"$dylib\" -Wl,-filelist,\"$rspfile\" {{libs}} {{solibs}} {{frameworks}}"
96*3f982cf4SFabien Sanglard    replace_command = "if ! cmp -s \"$temporary_tocname\" \"$tocname\"; then mv \"$temporary_tocname\" \"$tocname\""
97*3f982cf4SFabien Sanglard    extract_toc_command = "{ otool -l \"$dylib\" | grep LC_ID_DYLIB -A 5; nm -gP \"$dylib\" | cut -f1-2 -d' ' | grep -v U\$\$; true; }"
98*3f982cf4SFabien Sanglard    command = "if $does_reexport_command ; then $link_command && $extract_toc_command > \"$tocname\"; else $link_command && $extract_toc_command > \"$temporary_tocname\" && $replace_command; fi; fi"
99*3f982cf4SFabien Sanglard
100*3f982cf4SFabien Sanglard    # See comment in tool("alink") about content of the rspfile.
101*3f982cf4SFabien Sanglard    rspfile_content = "{{inputs_newline}}"
102*3f982cf4SFabien Sanglard
103*3f982cf4SFabien Sanglard    description = "DYLIB {{output}}"
104*3f982cf4SFabien Sanglard
105*3f982cf4SFabien Sanglard    # Use this for {{output_extension}} expansions unless a target manually
106*3f982cf4SFabien Sanglard    # overrides it (in which case {{output_extension}} will be what the target
107*3f982cf4SFabien Sanglard    # specifies).
108*3f982cf4SFabien Sanglard    default_output_extension = ".dylib"
109*3f982cf4SFabien Sanglard
110*3f982cf4SFabien Sanglard    # Use this for {{output_dir}} expansions unless a target manually overrides
111*3f982cf4SFabien Sanglard    # it (in which case {{output_dir}} will be what the target specifies).
112*3f982cf4SFabien Sanglard    default_output_dir = "{{root_out_dir}}"
113*3f982cf4SFabien Sanglard
114*3f982cf4SFabien Sanglard    # Link to the dylib but have GN use the tocname for dependency management.
115*3f982cf4SFabien Sanglard    # Tell GN about the output files. It will link to the dylib but use the
116*3f982cf4SFabien Sanglard    # tocname for dependency management.
117*3f982cf4SFabien Sanglard    outputs = [
118*3f982cf4SFabien Sanglard      dylib,
119*3f982cf4SFabien Sanglard      tocname,
120*3f982cf4SFabien Sanglard    ]
121*3f982cf4SFabien Sanglard    link_output = dylib
122*3f982cf4SFabien Sanglard    depend_output = tocname
123*3f982cf4SFabien Sanglard    output_prefix = "lib"
124*3f982cf4SFabien Sanglard
125*3f982cf4SFabien Sanglard    # Since the above commands only updates the .TOC file when it changes, ask
126*3f982cf4SFabien Sanglard    # Ninja to check if the timestamp actually changed to know if downstream
127*3f982cf4SFabien Sanglard    # dependencies should be recompiled.
128*3f982cf4SFabien Sanglard    restat = true
129*3f982cf4SFabien Sanglard  }
130*3f982cf4SFabien Sanglard
131*3f982cf4SFabien Sanglard  tool("link") {
132*3f982cf4SFabien Sanglard    outfile = "{{output_dir}}/{{target_output_name}}{{output_extension}}"
133*3f982cf4SFabien Sanglard    rspfile = "$outfile.rsp"
134*3f982cf4SFabien Sanglard
135*3f982cf4SFabien Sanglard    # These extra ldflags allow an executable to search for shared libraries in
136*3f982cf4SFabien Sanglard    # the current working directory.
137*3f982cf4SFabien Sanglard    additional_executable_ldflags = "-Wl,-rpath,@loader_path/."
138*3f982cf4SFabien Sanglard    command = "$cpp_command {{ldflags}} $additional_executable_ldflags -o \"$outfile\" -Wl,-filelist,\"$rspfile\" {{solibs}} {{libs}} {{frameworks}}"
139*3f982cf4SFabien Sanglard    description = "LINK $outfile"
140*3f982cf4SFabien Sanglard    default_output_dir = "{{root_out_dir}}"
141*3f982cf4SFabien Sanglard    rspfile_content = "{{inputs_newline}}"
142*3f982cf4SFabien Sanglard    outputs = [ outfile ]
143*3f982cf4SFabien Sanglard  }
144*3f982cf4SFabien Sanglard
145*3f982cf4SFabien Sanglard  tool("stamp") {
146*3f982cf4SFabien Sanglard    command = "touch {{output}}"
147*3f982cf4SFabien Sanglard    description = "STAMP {{output}}"
148*3f982cf4SFabien Sanglard  }
149*3f982cf4SFabien Sanglard
150*3f982cf4SFabien Sanglard  tool("copy") {
151*3f982cf4SFabien Sanglard    command = "ln -f {{source}} {{output}} 2>/dev/null || (rm -rf {{output}} && cp -af {{source}} {{output}})"
152*3f982cf4SFabien Sanglard    description = "COPY {{source}} {{output}}"
153*3f982cf4SFabien Sanglard  }
154*3f982cf4SFabien Sanglard}
155