b58792947c
This looks like a no-op, because we're just moving flags from cflags_cc to cflags_objcc, and then removing cflags_cc from the compiler command. However: GN is very specific about which flags it expects to be used by the toolchain for each file type. It ONLY emits cflags_cc into ninja files if there is at least one C++ source file in the target. If we had a target that only contained .mm source files, cflags_cc would be empty and the various flags it contains would be missing. Note that ninja silently leaves undefined variables as empty, making this not obvious. Bug: skia:13272 Change-Id: I8d729699b1bd34b677ec1b657bc34111fa8db2a4 Reviewed-on: https://skia-review.googlesource.com/c/skia/+/534763 Commit-Queue: Brian Osman <brianosman@google.com> Reviewed-by: Ben Wagner <bungeman@google.com>
441 lines
14 KiB
Plaintext
441 lines
14 KiB
Plaintext
if (is_wasm) {
|
|
import("wasm.gni")
|
|
}
|
|
if (is_fuchsia) {
|
|
import("//build/fuchsia/sdk.gni")
|
|
}
|
|
|
|
declare_args() {
|
|
host_ar = ar
|
|
host_cc = cc
|
|
host_cxx = cxx
|
|
|
|
if (is_android) {
|
|
_prefix = "$ndk/toolchains/llvm/prebuilt/$ndk_host/bin"
|
|
if (host_os == "win") {
|
|
target_ar = "$_prefix/llvm-ar.exe"
|
|
target_cc = "$_prefix/clang.exe --target=$ndk_target$ndk_api -fno-addrsig"
|
|
target_cxx =
|
|
"$_prefix/clang++.exe --target=$ndk_target$ndk_api -fno-addrsig"
|
|
} else {
|
|
target_ar = "$_prefix/llvm-ar"
|
|
target_cc = "$_prefix/$ndk_target$ndk_api-clang"
|
|
target_cxx = "$_prefix/$ndk_target$ndk_api-clang++"
|
|
}
|
|
} else if (is_fuchsia && using_fuchsia_sdk) {
|
|
target_ar = rebase_path("$fuchsia_toolchain_path/bin/llvm-ar")
|
|
target_cc = rebase_path("$fuchsia_toolchain_path/bin/clang")
|
|
target_cxx = rebase_path("$fuchsia_toolchain_path/bin/clang++")
|
|
cflags = "--sysroot=" +
|
|
rebase_path("$fuchsia_toolchain_path/$target_cpu/sysroot")
|
|
link = rebase_path("$fuchsia_toolchain_path/bin/ld.lld")
|
|
} else {
|
|
target_ar = ar
|
|
target_cc = cc
|
|
target_cxx = cxx
|
|
}
|
|
|
|
cc_wrapper = ""
|
|
|
|
# dsymutil seems to kill the machine when too many processes are run in
|
|
# parallel, so we need to use a pool to limit the concurrency when passing
|
|
# large -j to Ninja (e.g. Goma build). Unfortunately this is also one of the
|
|
# slowest steps in a build, so we don't want to limit too much. Use the number
|
|
# of CPUs as a default.
|
|
dlsymutil_pool_depth = exec_script("num_cpus.py", [], "value")
|
|
|
|
# Too many linkers running at once causes issues for some builders. Allow
|
|
# such builders to limit the number of concurrent link steps.
|
|
# link_pool_depth < 0 means no pool, 0 means cpu count, > 0 sets pool size.
|
|
link_pool_depth = -1
|
|
}
|
|
|
|
declare_args() {
|
|
host_link = host_cxx
|
|
target_link = target_cxx
|
|
}
|
|
|
|
# For 'shell' see https://ninja-build.org/manual.html#ref_rule_command
|
|
if (host_os == "win") {
|
|
shell = "cmd.exe /c "
|
|
stamp = "$shell echo >"
|
|
} else {
|
|
shell = ""
|
|
stamp = "touch"
|
|
}
|
|
|
|
if (current_toolchain == default_toolchain) {
|
|
pool("dsymutil_pool") {
|
|
depth = dlsymutil_pool_depth
|
|
}
|
|
if (0 <= link_pool_depth) {
|
|
pool("link_pool") {
|
|
if (link_pool_depth == 0) {
|
|
depth = exec_script("num_cpus.py", [], "value")
|
|
} else {
|
|
depth = link_pool_depth
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
toolchain("msvc") {
|
|
lib_switch = ""
|
|
lib_dir_switch = "/LIBPATH:"
|
|
|
|
bin = "$win_vc/Tools/MSVC/$win_toolchain_version/bin/HostX64/$target_cpu"
|
|
|
|
env_setup = ""
|
|
if (target_cpu == "x86") {
|
|
# Toolchain asset includes a script that configures for x86 building.
|
|
# We don't support x86 builds with local MSVC installations.
|
|
env_setup = "$shell $win_sdk/bin/SetEnv.cmd /x86 && "
|
|
} else if (target_cpu == "arm64") {
|
|
# ARM64 compiler is incomplete - it relies on DLLs located in the host toolchain directory.
|
|
env_setup = "$shell set \"PATH=%PATH%;$win_vc\\Tools\\MSVC\\$win_toolchain_version\\bin\\HostX64\\x64\" && "
|
|
}
|
|
|
|
cl_m32_flag = ""
|
|
|
|
if (clang_win != "") {
|
|
if (target_cpu == "x86") {
|
|
# cl.exe knows implicitly by the choice of executable that it's targeting
|
|
# x86, but clang-cl.exe needs to be told when targeting non-host
|
|
# platforms. (All our builders are x86-64, so x86 is always non-host.)
|
|
cl_m32_flag = "-m32"
|
|
}
|
|
if (host_os == "win") {
|
|
cl = "\"$clang_win/bin/clang-cl.exe\""
|
|
lib = "\"$clang_win/bin/lld-link.exe\" /lib"
|
|
link = "\"$clang_win/bin/lld-link.exe\""
|
|
} else {
|
|
cl = "\"$clang_win/bin/clang-cl\""
|
|
lib = "\"$clang_win/bin/lld-link\" /lib"
|
|
link = "\"$clang_win/bin/lld-link\""
|
|
}
|
|
} else {
|
|
cl = "\"$bin/cl.exe\""
|
|
lib = "\"$bin/lib.exe\""
|
|
link = "\"$bin/link.exe\""
|
|
}
|
|
|
|
tool("asm") {
|
|
_ml = "ml"
|
|
if (target_cpu == "x64") {
|
|
_ml += "64"
|
|
}
|
|
command = "$env_setup \"$bin/$_ml.exe\" {{asmflags}} /nologo /c /Fo {{output}} {{source}}"
|
|
outputs =
|
|
[ "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.obj" ]
|
|
description = "assemble {{source}}"
|
|
}
|
|
|
|
tool("cc") {
|
|
precompiled_header_type = "msvc"
|
|
pdbname = "{{target_out_dir}}/{{label_name}}_c.pdb"
|
|
|
|
# Label names may have spaces so pdbname must be quoted.
|
|
command = "$env_setup $cc_wrapper $cl /nologo /showIncludes /FC {{defines}} {{include_dirs}} {{cflags}} $cl_m32_flag {{cflags_c}} /c {{source}} /Fo{{output}} /Fd\"$pdbname\""
|
|
depsformat = "msvc"
|
|
outputs =
|
|
[ "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.obj" ]
|
|
description = "compile {{source}}"
|
|
}
|
|
|
|
tool("cxx") {
|
|
precompiled_header_type = "msvc"
|
|
pdbname = "{{target_out_dir}}/{{label_name}}_c.pdb"
|
|
|
|
# Label names may have spaces so pdbname must be quoted.
|
|
command = "$env_setup $cc_wrapper $cl /nologo /showIncludes /FC {{defines}} {{include_dirs}} {{cflags}} $cl_m32_flag {{cflags_cc}} /c {{source}} /Fo{{output}} /Fd\"$pdbname\""
|
|
depsformat = "msvc"
|
|
outputs =
|
|
[ "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.obj" ]
|
|
description = "compile {{source}}"
|
|
}
|
|
|
|
tool("alink") {
|
|
rspfile = "{{output}}.rsp"
|
|
|
|
command = "$env_setup $lib /nologo /ignore:4221 {{arflags}} /OUT:{{output}} @$rspfile"
|
|
outputs = [
|
|
# Ignore {{output_extension}} and always use .lib, there's no reason to
|
|
# allow targets to override this extension on Windows.
|
|
"{{root_out_dir}}/{{target_output_name}}{{output_extension}}",
|
|
]
|
|
default_output_extension = ".lib"
|
|
default_output_dir = "{{target_out_dir}}"
|
|
|
|
# inputs_newline works around a fixed per-line buffer size in the linker.
|
|
rspfile_content = "{{inputs_newline}}"
|
|
description = "link {{output}}"
|
|
if (0 <= link_pool_depth) {
|
|
pool = ":link_pool($default_toolchain)"
|
|
}
|
|
}
|
|
|
|
tool("solink") {
|
|
dllname = "{{output_dir}}/{{target_output_name}}{{output_extension}}"
|
|
libname = "${dllname}.lib"
|
|
pdbname = "${dllname}.pdb"
|
|
rspfile = "${dllname}.rsp"
|
|
|
|
command = "$env_setup $link /nologo /IMPLIB:$libname /DLL /OUT:$dllname /PDB:$pdbname @$rspfile"
|
|
outputs = [
|
|
dllname,
|
|
libname,
|
|
pdbname,
|
|
]
|
|
default_output_extension = ".dll"
|
|
default_output_dir = "{{root_out_dir}}"
|
|
|
|
link_output = libname
|
|
depend_output = libname
|
|
runtime_outputs = [
|
|
dllname,
|
|
pdbname,
|
|
]
|
|
|
|
# I don't quite understand this. Aping Chrome's toolchain/win/BUILD.gn.
|
|
restat = true
|
|
|
|
# inputs_newline works around a fixed per-line buffer size in the linker.
|
|
rspfile_content = "{{inputs_newline}} {{libs}} {{solibs}} {{ldflags}}"
|
|
description = "link {{output}}"
|
|
if (0 <= link_pool_depth) {
|
|
pool = ":link_pool($default_toolchain)"
|
|
}
|
|
}
|
|
|
|
tool("link") {
|
|
exename = "{{root_out_dir}}/{{target_output_name}}{{output_extension}}"
|
|
pdbname = "$exename.pdb"
|
|
rspfile = "$exename.rsp"
|
|
|
|
command = "$env_setup $link /nologo /OUT:$exename /PDB:$pdbname @$rspfile"
|
|
default_output_extension = ".exe"
|
|
default_output_dir = "{{root_out_dir}}"
|
|
outputs = [ exename ]
|
|
|
|
# inputs_newline works around a fixed per-line buffer size in the linker.
|
|
rspfile_content = "{{inputs_newline}} {{libs}} {{solibs}} {{ldflags}}"
|
|
description = "link {{output}}"
|
|
if (0 <= link_pool_depth) {
|
|
pool = ":link_pool($default_toolchain)"
|
|
}
|
|
}
|
|
|
|
tool("stamp") {
|
|
command = "$stamp {{output}}"
|
|
description = "stamp {{output}}"
|
|
}
|
|
|
|
tool("copy") {
|
|
cp_py = rebase_path("../cp.py")
|
|
command = "$shell python3 \"$cp_py\" {{source}} {{output}}"
|
|
description = "copy {{source}} {{output}}"
|
|
}
|
|
}
|
|
|
|
template("gcc_like_toolchain") {
|
|
toolchain(target_name) {
|
|
ar = invoker.ar
|
|
cc = invoker.cc
|
|
cxx = invoker.cxx
|
|
link = invoker.link
|
|
lib_switch = "-l"
|
|
lib_dir_switch = "-L"
|
|
|
|
tool("cc") {
|
|
depfile = "{{output}}.d"
|
|
command = "$cc_wrapper $cc -MD -MF $depfile {{defines}} {{include_dirs}} {{cflags}} {{cflags_c}} -c {{source}} -o {{output}}"
|
|
depsformat = "gcc"
|
|
outputs =
|
|
[ "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.o" ]
|
|
description = "compile {{source}}"
|
|
}
|
|
|
|
tool("cxx") {
|
|
depfile = "{{output}}.d"
|
|
command = "$cc_wrapper $cxx -MD -MF $depfile {{defines}} {{include_dirs}} {{cflags}} {{cflags_cc}} -c {{source}} -o {{output}}"
|
|
depsformat = "gcc"
|
|
outputs =
|
|
[ "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.o" ]
|
|
description = "compile {{source}}"
|
|
}
|
|
|
|
tool("objc") {
|
|
depfile = "{{output}}.d"
|
|
command = "$cc_wrapper $cc -MD -MF $depfile {{defines}} {{include_dirs}} {{framework_dirs}} {{cflags}} {{cflags_objc}} -c {{source}} -o {{output}}"
|
|
depsformat = "gcc"
|
|
outputs =
|
|
[ "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.o" ]
|
|
description = "compile {{source}}"
|
|
}
|
|
|
|
tool("objcxx") {
|
|
depfile = "{{output}}.d"
|
|
command = "$cc_wrapper $cxx -MD -MF $depfile {{defines}} {{include_dirs}} {{framework_dirs}} {{cflags}} {{cflags_objcc}} -c {{source}} -o {{output}}"
|
|
depsformat = "gcc"
|
|
outputs =
|
|
[ "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.o" ]
|
|
description = "compile {{source}}"
|
|
}
|
|
|
|
tool("asm") {
|
|
depfile = "{{output}}.d"
|
|
command = "$cc_wrapper $cc -MD -MF $depfile {{defines}} {{include_dirs}} {{asmflags}} -c {{source}} -o {{output}}"
|
|
depsformat = "gcc"
|
|
outputs =
|
|
[ "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.o" ]
|
|
description = "assemble {{source}}"
|
|
}
|
|
|
|
if (is_mac || is_ios) {
|
|
not_needed([ "ar" ]) # We use libtool instead.
|
|
}
|
|
|
|
tool("alink") {
|
|
if (is_mac || is_ios) {
|
|
command = "libtool -static -o {{output}} -no_warning_for_no_symbols {{inputs}}"
|
|
} else {
|
|
rspfile = "{{output}}.rsp"
|
|
rspfile_content = "{{inputs}}"
|
|
rm_py = rebase_path("../rm.py")
|
|
command = "$shell python3 \"$rm_py\" \"{{output}}\" && $ar rcs {{output}} @$rspfile"
|
|
}
|
|
|
|
outputs =
|
|
[ "{{root_out_dir}}/{{target_output_name}}{{output_extension}}" ]
|
|
default_output_extension = ".a"
|
|
output_prefix = "lib"
|
|
description = "link {{output}}"
|
|
if (0 <= link_pool_depth) {
|
|
pool = ":link_pool($default_toolchain)"
|
|
}
|
|
}
|
|
|
|
tool("solink") {
|
|
soname = "{{target_output_name}}{{output_extension}}"
|
|
|
|
rpath = "-Wl,-soname,$soname"
|
|
if (is_mac || is_ios) {
|
|
rpath = "-Wl,-install_name,@rpath/$soname"
|
|
}
|
|
|
|
rspfile = "{{output}}.rsp"
|
|
rspfile_content = "{{inputs}}"
|
|
|
|
# --start-group/--end-group let us link multiple .a {{inputs}}
|
|
# without worrying about their relative order on the link line.
|
|
#
|
|
# This is mostly important for traditional linkers like GNU ld and Gold.
|
|
# The Mac/iOS linker neither needs nor accepts these flags.
|
|
# LLD doesn't need these flags, but accepts and ignores them.
|
|
_start_group = "-Wl,--start-group"
|
|
_end_group = "-Wl,--end-group"
|
|
if (is_mac || is_ios || is_fuchsia) {
|
|
_start_group = ""
|
|
_end_group = ""
|
|
}
|
|
|
|
command = "$link -shared {{ldflags}} $_start_group @$rspfile {{frameworks}} {{solibs}} $_end_group {{libs}} $rpath -o {{output}}"
|
|
outputs = [ "{{root_out_dir}}/$soname" ]
|
|
output_prefix = "lib"
|
|
if (is_mac || is_ios) {
|
|
default_output_extension = ".dylib"
|
|
} else {
|
|
default_output_extension = ".so"
|
|
}
|
|
description = "link {{output}}"
|
|
if (0 <= link_pool_depth) {
|
|
pool = ":link_pool($default_toolchain)"
|
|
}
|
|
}
|
|
|
|
tool("link") {
|
|
exe_name = "{{root_out_dir}}/{{target_output_name}}{{output_extension}}"
|
|
rspfile = "$exe_name.rsp"
|
|
rspfile_content = "{{inputs}}"
|
|
|
|
# --start-group/--end-group let us link multiple .a {{inputs}}
|
|
# without worrying about their relative order on the link line.
|
|
#
|
|
# This is mostly important for traditional linkers like GNU ld and Gold.
|
|
# The Mac/iOS linker neither needs nor accepts these flags.
|
|
# LLD doesn't need these flags, but accepts and ignores them.
|
|
_start_group = "-Wl,--start-group"
|
|
_end_group = "-Wl,--end-group"
|
|
if (is_mac || is_ios || is_fuchsia) {
|
|
_start_group = ""
|
|
_end_group = ""
|
|
}
|
|
command = "$link {{ldflags}} $_start_group @$rspfile {{frameworks}} {{solibs}} $_end_group {{libs}} -o $exe_name"
|
|
|
|
outputs = [ "$exe_name" ]
|
|
description = "link {{output}}"
|
|
if (0 <= link_pool_depth) {
|
|
pool = ":link_pool($default_toolchain)"
|
|
}
|
|
}
|
|
|
|
tool("stamp") {
|
|
command = "$stamp {{output}}"
|
|
description = "stamp {{output}}"
|
|
}
|
|
|
|
tool("copy") {
|
|
cp_py = rebase_path("../cp.py")
|
|
command = "python3 \"$cp_py\" {{source}} {{output}}"
|
|
description = "copy {{source}} {{output}}"
|
|
}
|
|
|
|
tool("copy_bundle_data") {
|
|
cp_py = rebase_path("../cp.py")
|
|
command = "python3 \"$cp_py\" {{source}} {{output}}"
|
|
description = "copy_bundle_data {{source}} {{output}}"
|
|
}
|
|
|
|
# We don't currently have any xcasset files so make this a NOP
|
|
tool("compile_xcassets") {
|
|
command = "true"
|
|
description = "compile_xcassets {{output}}"
|
|
}
|
|
|
|
toolchain_args = {
|
|
current_cpu = invoker.cpu
|
|
current_os = invoker.os
|
|
}
|
|
}
|
|
}
|
|
|
|
gcc_like_toolchain("gcc_like") {
|
|
cpu = current_cpu
|
|
os = current_os
|
|
ar = target_ar
|
|
cc = target_cc
|
|
cxx = target_cxx
|
|
link = target_link
|
|
}
|
|
|
|
gcc_like_toolchain("gcc_like_host") {
|
|
cpu = host_cpu
|
|
os = host_os
|
|
ar = host_ar
|
|
cc = host_cc
|
|
cxx = host_cxx
|
|
link = host_link
|
|
}
|
|
|
|
# Only define this toolchain if actually building for wasm.
|
|
if (is_wasm) {
|
|
gcc_like_toolchain("wasm") {
|
|
cpu = "wasm"
|
|
os = "wasm"
|
|
ar = "$skia_emsdk_dir/upstream/emscripten/emar"
|
|
cc = "$skia_emsdk_dir/upstream/emscripten/emcc"
|
|
cxx = "$skia_emsdk_dir/upstream/emscripten/em++"
|
|
link = cxx
|
|
}
|
|
}
|