Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 # Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 # Copyright (c) 2013 The Chromium Authors. All rights reserved. |
| 2 # Use of this source code is governed by a BSD-style license that can be | 2 # Use of this source code is governed by a BSD-style license that can be |
| 3 # found in the LICENSE file. | 3 # found in the LICENSE file. |
| 4 | 4 |
| 5 # This template defines a toolchain for something that works like gcc | 5 # This template defines a toolchain for something that works like gcc |
| 6 # (including clang). | 6 # (including clang). |
| 7 # | 7 # |
| 8 # It requires the following variables specifying the executables to run: | 8 # It requires the following variables specifying the executables to run: |
| 9 # - cc | 9 # - cc |
| 10 # - cxx | 10 # - cxx |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 68 } else { | 68 } else { |
| 69 solink_libs_section_prefix = "" | 69 solink_libs_section_prefix = "" |
| 70 } | 70 } |
| 71 | 71 |
| 72 if (defined(invoker.solink_libs_section_postfix)) { | 72 if (defined(invoker.solink_libs_section_postfix)) { |
| 73 solink_libs_section_postfix = invoker.solink_libs_section_postfix | 73 solink_libs_section_postfix = invoker.solink_libs_section_postfix |
| 74 } else { | 74 } else { |
| 75 solink_libs_section_postfix = "" | 75 solink_libs_section_postfix = "" |
| 76 } | 76 } |
| 77 | 77 |
| 78 # Make these apply to all tools below. | 78 # These library switches can apply to all tools below. |
| 79 lib_prefix = "-l" | 79 lib_switch = "-l" |
| 80 lib_dir_prefix="-L" | 80 lib_dir_switch = "-L" |
| 81 | 81 |
| 82 tool("cc") { | 82 tool("cc") { |
| 83 # cflags_pch_c | 83 depfile = "{{output}}.d" |
| 84 command = "$cc -MMD -MF \$out.d \$defines \$includes \$cflags \$cflags_c - c \$in -o \$out" | 84 command = "$cc -MMD -MF $depfile {{defines}} {{include_dirs}} {{cflags}} { {cflags_c}} -c {{source}} -o {{output}}" |
| 85 description = "CC \$out" | |
| 86 depfile = "\$out.d" | |
| 87 depsformat = "gcc" | 85 depsformat = "gcc" |
| 86 description = "CC {{output}}" | |
| 87 outputs = [ | |
| 88 "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.o", | |
| 89 ] | |
| 88 } | 90 } |
| 91 | |
| 89 tool("cxx") { | 92 tool("cxx") { |
| 90 # cflags_pch_cc | 93 depfile = "{{output}}.d" |
| 91 command = "$cxx -MMD -MF \$out.d \$defines \$includes \$cflags \$cflags_cc -c \$in -o \$out" | 94 command = "$cxx -MMD -MF $depfile {{defines}} {{include_dirs}} {{cflags}} {{cflags_cc}} -c {{source}} -o {{output}}" |
| 92 description = "CXX \$out" | |
| 93 depfile = "\$out.d" | |
| 94 depsformat = "gcc" | 95 depsformat = "gcc" |
| 96 description = "CXX {{output}}" | |
| 97 outputs = [ | |
| 98 "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.o", | |
| 99 ] | |
| 95 } | 100 } |
| 101 | |
| 102 tool("asm") { | |
| 103 # For GCC we can just use the C compiler to compile assembly. | |
| 104 depfile = "{{output}}.d" | |
| 105 command = "$cc -MMD -MF $depfile {{defines}} {{include_dirs}} {{cflags}} { {cflags_c}} -c {{source}} -o {{output}}" | |
| 106 depsformat = "gcc" | |
| 107 description = "ASM {{output}}" | |
| 108 outputs = [ | |
| 109 "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.o", | |
| 110 ] | |
| 111 } | |
| 112 | |
| 96 tool("alink") { | 113 tool("alink") { |
| 97 command = "rm -f \$out && $ar rcs \$out @\$rspfile" | 114 rspfile = "{{output}}.rsp" |
| 98 description = "AR \$out" | 115 command = "rm -f {{output}} && $ar rcs {{output}} @$rspfile" |
| 99 rspfile = "\$out.rsp" | 116 description = "AR {{output}}" |
| 100 rspfile_content = "\$in" | 117 rspfile_content = "{{inputs}}" |
| 118 outputs = [ | |
| 119 "{{target_out_dir}}/{{target_output_name}}{{output_extension}}" | |
| 120 ] | |
| 121 default_output_extension = ".a" | |
| 122 output_prefix = "lib" | |
| 101 } | 123 } |
| 124 | |
| 102 tool("solink") { | 125 tool("solink") { |
| 103 rspfile = "\$out.rsp" | 126 soname = "{{target_output_name}}{{output_extension}}" # e.g. "libfoo.so". |
| 104 rspfile_content = "-Wl,--whole-archive \$in \$solibs -Wl,--no-whole-archiv e $solink_libs_section_prefix \$libs $solink_libs_section_postfix" | 127 rspfile = soname + ".rsp" |
| 105 | 128 |
| 106 # TODO(cjhopman): There needs to be a way for gn to correctly figure out | 129 # These variables are not build into GN but are helpers that implement |
|
jamesr
2014/08/20 19:38:27
built
| |
| 107 # the outputs of a solink command. | 130 # (1) linking to produce a .so, (2) extracting the symbols from that file |
| 131 # to a temporary file, (3) if the temporary file has differences from the | |
| 132 # existing .TOC file, overwrite it, oterwise, don't change it. | |
|
jamesr
2014/08/20 19:38:27
otherwise
| |
| 133 tocname = soname + ".TOC" | |
| 134 temporary_tocname = soname + ".tmp" | |
| 135 link_command = "$ld -shared {{ldflags}} -o $soname -Wl,-soname=$soname @$r spfile" | |
| 136 toc_command = "{ readelf -d $soname | grep SONAME ; nm -gD -f p $soname | cut -f1-2 -d' '; } > $temporary_tocname" | |
| 137 replace_command = "if ! cmp -s $temporary_tocname $tocname; then mv $tempo rary_tocname $tocname; fi" | |
| 108 | 138 |
| 109 link_command = "$ld -shared \$ldflags -o \$lib -Wl,-soname=\$soname @\$rsp file" | |
| 110 toc_command = "{ readelf -d \${lib} | grep SONAME ; nm -gD -f p \${lib} | cut -f1-2 -d' '; } > \${lib}.tmp" | |
| 111 replace_command = "if ! cmp -s \${lib}.tmp \${lib}.TOC; then mv \${lib}.tm p \${lib}.TOC; fi" | |
| 112 command = "$link_command && $toc_command && $replace_command" | 139 command = "$link_command && $toc_command && $replace_command" |
| 113 | |
| 114 if (defined(invoker.postsolink)) { | 140 if (defined(invoker.postsolink)) { |
| 115 command += " && " + invoker.postsolink | 141 command += " && " + invoker.postsolink |
| 116 } | 142 } |
| 143 rspfile_content = "-Wl,--whole-archive {{inputs}} {{solibs}} -Wl,--no-whol e-archive $solink_libs_section_prefix {{libs}} $solink_libs_section_postfix" | |
| 117 | 144 |
| 118 description = "SOLINK \$lib" | 145 description = "SOLINK $soname" |
| 119 #pool = "link_pool" | 146 |
| 120 restat = "1" | 147 # Use this for {{output_extension}} expansions unless a target manually |
| 148 # overrides it (in which case {{output_extension}} will be what the target | |
| 149 # specifies). | |
| 150 default_output_extension = ".so" | |
| 151 | |
| 152 output_prefix = "lib" | |
| 153 | |
| 154 # Since the above commands only updates the .TOC file when it changes, ask | |
| 155 # Ninja to check if the timestamp actually changed to know if downstream | |
| 156 # dependencies should be recompiled. | |
| 157 restat = true | |
| 158 | |
| 159 # Tell GN about the output files. It will link to the soname but use the | |
| 160 # tocname for dependency management. | |
| 161 outputs = [ | |
| 162 soname, | |
| 163 tocname, | |
| 164 ] | |
| 165 link_output = soname | |
| 166 depend_output = tocname | |
| 121 } | 167 } |
| 168 | |
| 122 tool("link") { | 169 tool("link") { |
| 123 command = "$ld \$ldflags -o \$out -Wl,--start-group @\$rspfile \$solibs -W l,--end-group $libs_section_prefix \$libs $libs_section_postfix" | 170 outfile = "{{target_output_name}}{{output_extension}}" |
| 124 description = "LINK \$out" | 171 rspfile = "$outfile.rsp" |
| 125 rspfile = "\$out.rsp" | 172 command = "$ld {{ldflags}} -o $outfile -Wl,--start-group @$rspfile {{solib s}} -Wl,--end-group $libs_section_prefix {{libs}} $libs_section_postfix" |
| 126 rspfile_content = "\$in" | 173 description = "LINK $outfile" |
| 127 #pool = "link_pool" | 174 rspfile_content = "{{inputs}}" |
| 175 outputs = [ outfile ] | |
| 128 } | 176 } |
| 177 | |
| 129 tool("stamp") { | 178 tool("stamp") { |
| 130 command = "\${postbuilds}touch \$out" | 179 command = "touch {{output}}" |
| 131 description = "STAMP \$out" | 180 description = "STAMP {{output}}" |
| 132 } | 181 } |
| 182 | |
| 133 tool("copy") { | 183 tool("copy") { |
| 134 command = "ln -f \$in \$out 2>/dev/null || (rm -rf \$out && cp -af \$in \$ out)" | 184 command = "ln -f {{source}} {{output}} 2>/dev/null || (rm -rf {{output}} & & cp -af {{source}} {{output}})" |
| 135 description = "COPY \$in \$out" | 185 description = "COPY {{source}} {{output}}" |
| 136 } | 186 } |
| 137 | 187 |
| 138 # When invoking this toolchain not as the default one, these args will be | 188 # When invoking this toolchain not as the default one, these args will be |
| 139 # passed to the build. They are ignored when this is the default toolchain. | 189 # passed to the build. They are ignored when this is the default toolchain. |
| 140 toolchain_args() { | 190 toolchain_args() { |
| 141 cpu_arch = invoker.toolchain_cpu_arch | 191 cpu_arch = invoker.toolchain_cpu_arch |
| 142 os = invoker.toolchain_os | 192 os = invoker.toolchain_os |
| 143 if (defined(invoker.is_clang)) { | 193 if (defined(invoker.is_clang)) { |
| 144 is_clang = invoker.is_clang | 194 is_clang = invoker.is_clang |
| 145 } | 195 } |
| 146 } | 196 } |
| 147 | 197 |
| 148 if (defined(invoker.deps)) { | 198 if (defined(invoker.deps)) { |
| 149 deps = invoker.deps | 199 deps = invoker.deps |
| 150 } | 200 } |
| 151 } | 201 } |
| 152 } | 202 } |
| OLD | NEW |