blob: ad29cc69318f30d2a0b687503edfd41e11ee182d [file] [log] [blame]
# Copyright 2016 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
################################################################################
# DEFAULT BUILD CONFIGURATION
################################################################################
import("compiler.gni")
import("platform.gni")
import("sysroot.gni")
if (mini_chromium_is_mac) {
declare_args() {
# The minimum runtime macOS version that built products are expected to run
# on. If empty, the toolchain will choose its own default, typically the
# older of the SDK version and the build host’s OS version.
mac_deployment_target = "10.9"
}
} else if (mini_chromium_is_ios) {
import("ios/ios_sdk.gni")
} else if (mini_chromium_is_linux) {
declare_args() {
# Path to the Clang toolchain. If unset, uses the system-installed Clang.
clang_path = ""
# If set, link against libstdc++ statically.
link_libstdcpp_statically = false
}
} else if (mini_chromium_is_fuchsia) {
declare_args() {
# Path to the Fuchsia Clang toolchain.
clang_path = "//third_party/fuchsia/clang/" + host_os + "-amd64"
}
} else if (mini_chromium_is_win) {
declare_args() {
# Path to the Windows toolchain. If "<autodetect>", discovery of the
# system-installed toolchain will be attempted. Otherwise,
# win_sdk\bin\SetEnv.cmd inside this path will be used to configure the
# Windows toolchain.
win_toolchain_path = "<autodetect>"
}
}
declare_args() {
# Extra flags passed to the C compiler.
# Space-separated string of flags.
# "cflags" are passed to all invocations of the C, C++, Objective-C, and
# Objective-C++ compilers.
extra_cflags = ""
# Extra flags passed to the C compiler.
# Space-separated string of flags.
extra_cflags_c = ""
# Extra flags passed to the C++ compiler.
# Space-separated string of flags.
extra_cflags_cc = ""
# Extra flags passed to the Objective-C compiler.
# Space-separated string of flags.
extra_cflags_objc = ""
# Extra flags passed to the Objective-C++ compiler.
# Space-separated string of flags.
extra_cflags_objcc = ""
# Extra flags passed to the linker.
# Space-separated string of flags.
# These flags are passed on the command-line to the linker and generally
# specify various linking options.
extra_ldflags = ""
# Extra arguments passed to static_library archiver
# Space-separated string of flags.
# A list of flags passed to the archive/lib command that creates static
# libraries.
extra_arflags = ""
}
config("debug") {
if (!mini_chromium_is_win) {
cflags = [ "-g" ]
}
}
config("release") {
defines = [ "NDEBUG" ]
if (mini_chromium_is_posix || mini_chromium_is_fuchsia) {
cflags = [ "-O3" ]
if (mini_chromium_is_mac || mini_chromium_is_ios) {
ldflags = [ "-Wl,-dead_strip" ]
} else {
cflags += [
"-fdata-sections",
"-ffunction-sections",
]
ldflags = [
"-Wl,-O1",
"-Wl,--gc-sections",
]
}
} else if (mini_chromium_is_win) {
cflags = [
"/GL", # LTCG.
"/O2",
"/Ob2", # Both explicit and auto inlining.
"/Oy-", # Disable omitting frame pointers, must be after /O2.
"/Zc:inline", # Remove unreferenced COMDAT (faster links).
"/d2Zi+", # Improve debugging of optimized code.
]
ldflags = [
"/OPT:ICF",
"/OPT:REF",
"/LTCG",
]
arflags = [ "/LTCG" ]
}
}
config("default") {
common_flags = []
asmflags = []
ldflags = []
if (mini_chromium_is_posix || mini_chromium_is_fuchsia) {
cflags = [
"-Wall",
"-Wendif-labels",
"-Werror",
"-Wextra",
"-Wextra-semi",
"-Wno-missing-field-initializers",
"-Wno-unused-parameter",
"-Wsign-compare",
"-fno-exceptions",
"-fno-rtti",
"-fno-strict-aliasing", # See https://crbug.com/32204
"-fobjc-call-cxx-cdtors",
"-fstack-protector-all", # Implies -fstack-protector
"-fvisibility-inlines-hidden",
"-fvisibility=hidden",
]
cflags_c = [ "-std=c11" ]
cflags_cc = [ "-std=c++14" ]
cflags_objc = cflags_c
cflags_objcc = cflags_cc
cflags += [
"-Wheader-hygiene",
"-Wnewline-eof",
"-Wstring-conversion",
]
if (sysroot != "") {
if (sysroot == rebase_path(sysroot)) {
# If it’s already system-absolute, leave it alone.
sysroot_path = sysroot
} else {
sysroot_path = rebase_path(sysroot, root_build_dir)
}
if (mini_chromium_is_mac || mini_chromium_is_ios) {
common_flags += [
"-isysroot",
sysroot_path,
]
} else {
common_flags += [ "--sysroot=" + sysroot_path ]
}
}
if (mini_chromium_is_mac || mini_chromium_is_ios) {
if (current_cpu == "x86") {
common_flags += [
"-arch",
"i386",
]
} else if (current_cpu == "x64") {
common_flags += [
"-arch",
"x86_64",
]
} else if (current_cpu == "arm64") {
common_flags += [
"-arch",
"arm64",
]
}
}
if (mini_chromium_is_fuchsia) {
common_flags += [
# The Fuchsia SDK no longer dumps everything in the sysroot, preferring
# the layout described in
# https://fuchsia.googlesource.com/docs/+/master/development/sdk/layout.md.
# Eventually /sysroot will be replaced by /pkg/system, but this work is
# not yet complete.
"-isystem",
rebase_path(fuchsia_sdk + "/pkg/fdio/include", root_build_dir),
]
lib_dirs = [ fuchsia_sdk + "/arch/$target_cpu/lib" ]
}
}
if (mini_chromium_is_mac) {
if (mac_deployment_target != "") {
common_flags += [ "-mmacosx-version-min=" + mac_deployment_target ]
}
}
if (mini_chromium_is_ios) {
if (ios_deployment_target != "") {
if (current_cpu == "x64") {
common_flags +=
[ "-mios-simulator-version-min=" + ios_deployment_target ]
} else if (current_cpu == "arm64") {
common_flags += [ "-mios-version-min=" + ios_deployment_target ]
}
}
}
if (mini_chromium_is_win) {
cflags = [
"/DNOMINMAX",
"/DUNICODE",
"/DWIN32_LEAN_AND_MEAN",
"/D_CRT_SECURE_NO_WARNINGS",
"/D_HAS_EXCEPTIONS=0",
"/D_UNICODE",
"/FS",
"/W4",
"/WX",
"/Zi",
"/bigobj", # Support larger number of sections in obj file.
"/wd4100", # Unreferenced formal parameter.
"/wd4127", # Conditional expression is constant.
"/wd4324", # Structure was padded due to alignment specifier.
"/wd4351", # New behavior: elements of array will be default initialized.
"/wd4577", # 'noexcept' used with no exception handling mode specified.
"/wd4996", # 'X' was declared deprecated.
]
ldflags += [ "/DEBUG" ]
libs = [ "kernel32.lib" ]
}
if (mini_chromium_is_linux) {
defines = [ "_FILE_OFFSET_BITS=64" ]
common_flags += [ "-pthread" ]
# This is currently required by the clang toolchain build that DEPS uses
# from the Fuchsia team. Only a static libc++ is provided, and it requires
# both -ldl and -pthread. (-pthread was already needed by mini_chromium and
# Crashpad). Eventually, the clang build should automatically add these
# when needed, but it does not do that yet, so manually add libdl here for
# now.
libs = [ "dl" ]
if (link_libstdcpp_statically) {
# The sysroot being built against is based on Stretch, which is newer than
# the libstdc++ that's on Trusty (14.04) which is the Chromium minspec.
# This minspec determines what the available buildbots are. Chromium
# doesn't have a problem with libstdc++ despite this, because it links
# against a local copy of libc++ instead. As this build file only affects
# the standalone Crashpad build, when this flag is set link libstdc++
# statically to avoid the problem on the bots.
cflags += [ "-stdlib=libstdc++" ]
ldflags += [
"-rtlib=libgcc",
"-static-libstdc++",
"-stdlib=libstdc++",
]
}
}
if (mini_chromium_is_fuchsia) {
if (target_cpu == "arm64") {
common_flags += [ "--target=aarch64-fuchsia" ]
} else if (target_cpu == "x64") {
common_flags += [ "--target=x86_64-fuchsia" ]
} else {
assert(false, "Unsupported architecture")
}
# fdio is listed in ldflags instead of libs because it’s important for it to
# be loaded in Fuchsia processes that expect POSIX-like file descriptor
# semantics, even if they don’t explicitly reference anything in the fdio
# library. To avoid inadvertently losing the runtime dependency, it must
# come before -Wl,--as-needed below. fdio needs zircon (and zircon needs to
# be in every process anyway).
ldflags += [
"-lfdio",
"-lzircon",
]
}
if ((mini_chromium_is_posix && !mini_chromium_is_mac &&
!mini_chromium_is_ios) || mini_chromium_is_fuchsia) {
cflags += [ "-fPIC" ]
ldflags += [
# This must follow Fuchsia’s fdio library above.
"-Wl,--as-needed",
"-Wl,-z,noexecstack",
]
}
cflags += common_flags
asmflags += common_flags
ldflags += common_flags
if (is_debug) {
configs = [ ":debug" ]
} else {
configs = [ ":release" ]
}
}
config("executable") {
if (mini_chromium_is_linux) {
ldflags = [ "-pie" ]
}
}
config("ios_enable_arc") {
if (mini_chromium_is_ios) {
common_flags = [ "-fobjc-arc" ]
cflags_objc = common_flags
cflags_objcc = common_flags
}
}
config("Wexit_time_destructors") {
if (mini_chromium_is_clang) {
cflags = [ "-Wexit-time-destructors" ]
}
}
config("Wimplicit_fallthrough") {
if (mini_chromium_is_clang) {
cflags = [ "-Wimplicit-fallthrough" ]
}
}
config("win_console") {
if (mini_chromium_is_win) {
ldflags = [ "/SUBSYSTEM:CONSOLE" ]
}
}
config("win_windowed") {
if (mini_chromium_is_win) {
ldflags = [ "/SUBSYSTEM:WINDOWS" ]
}
}
################################################################################
# TOOLCHAIN DEFINITIONS
################################################################################
toolchain("gcc_like_toolchain") {
lib_switch = "-l"
lib_dir_switch = "-L"
if ((mini_chromium_is_linux || mini_chromium_is_fuchsia) && clang_path != "") {
cc = rebase_path(clang_path, root_build_dir) + "/bin/clang"
cxx = rebase_path(clang_path, root_build_dir) + "/bin/clang++"
asm = cxx
ar = rebase_path(clang_path, root_build_dir) + "/bin/llvm-ar"
ld = cxx
} else {
cc = "clang"
cxx = "clang++"
asm = cxx
ld = cxx
if (!mini_chromium_is_mac && !mini_chromium_is_ios) {
# macOS uses libtool instead of ar.
ar = "ar"
}
}
if (defined(extra_cflags) && extra_cflags != "") {
extra_cflags = " " + extra_cflags
} else {
extra_cflags = ""
}
if (defined(extra_cflags_c) && extra_cflags_c != "") {
extra_cflags_c = " " + extra_cflags_c
} else {
extra_cflags_c = ""
}
if (defined(extra_cflags_cc) && extra_cflags_cc != "") {
extra_cflags_cc = " " + extra_cflags_cc
} else {
extra_cflags_cc = ""
}
if (defined(extra_ldflags) && extra_ldflags != "") {
extra_ldflags = " " + extra_ldflags
} else {
extra_ldflags = ""
}
if (defined(extra_arflags) && extra_arflags != "") {
extra_arflags = " " + extra_arflags
} else {
extra_arflags = ""
}
tool("cc") {
depfile = "{{output}}.d"
command = "$cc -MMD -MF $depfile {{defines}} {{include_dirs}} {{cflags}} {{cflags_c}}${extra_cflags}${extra_cflags_c} -c {{source}} -o {{output}}"
depsformat = "gcc"
description = "CC {{output}}"
outputs = [
"{{source_out_dir}}/{{label_name}}.{{source_name_part}}.o",
]
}
tool("cxx") {
depfile = "{{output}}.d"
command = "$cxx -MMD -MF $depfile {{defines}} {{include_dirs}} {{cflags}} {{cflags_cc}}${extra_cflags}${extra_cflags_cc} -c {{source}} -o {{output}}"
depsformat = "gcc"
description = "CXX {{output}}"
outputs = [
"{{source_out_dir}}/{{label_name}}.{{source_name_part}}.o",
]
}
if (mini_chromium_is_mac || mini_chromium_is_ios) {
if (defined(extra_cflags_objc) && extra_cflags_objc != "") {
extra_cflags_objc = " " + extra_cflags_objc
} else {
extra_cflags_objc = ""
}
if (defined(extra_cflags_objcc) && extra_cflags_objcc != "") {
extra_cflags_objcc = " " + extra_cflags_objcc
} else {
extra_cflags_objcc = ""
}
tool("objc") {
depfile = "{{output}}.d"
command = "$cc -MMD -MF $depfile {{defines}} {{include_dirs}} {{cflags}} {{cflags_objc}}${extra_cflags}${extra_cflags_objc} -c {{source}} -o {{output}}"
depsformat = "gcc"
description = "OBJC {{output}}"
outputs = [
"{{source_out_dir}}/{{label_name}}.{{source_name_part}}.o",
]
}
tool("objcxx") {
depfile = "{{output}}.d"
command = "$cxx -MMD -MF $depfile {{defines}} {{include_dirs}} {{cflags}} {{cflags_objcc}}${extra_cflags}${extra_cflags_objcc} -c {{source}} -o {{output}}"
depsformat = "gcc"
description = "OBJCXX {{output}}"
outputs = [
"{{source_out_dir}}/{{label_name}}.{{source_name_part}}.o",
]
}
tool("copy_bundle_data") {
_copydir = "mkdir -p {{output}} && cd {{source}} && " +
"pax -rwl . \"\$OLDPWD\"/{{output}}"
copy_command = "ln -f {{source}} {{output}} 2>/dev/null || (rm -rf {{output}} && cp -af {{source}} {{output}})"
command = "rm -rf {{output}} && if [[ -d {{source}} ]]; then " +
_copydir + "; else " + copy_command + "; fi"
description = "COPY_BUNDLE_DATA {{source}} {{output}}"
}
tool("compile_xcassets") {
command = "/bin/true"
}
}
tool("asm") {
depfile = "{{output}}.d"
command = "$asm -MMD -MF $depfile {{defines}} {{include_dirs}} {{asmflags}} -c {{source}} -o {{output}}"
depsformat = "gcc"
description = "ASM {{output}}"
outputs = [
"{{source_out_dir}}/{{label_name}}.{{source_name_part}}.o",
]
}
tool("alink") {
if (mini_chromium_is_mac || mini_chromium_is_ios) {
command = "libtool -static -no_warning_for_no_symbols {{arflags}}${extra_arflags} -o {{output}} {{inputs}}"
} else {
command = "rm -f {{output}}; $ar rcsD {{arflags}}${extra_arflags} {{output}} {{inputs}}"
}
description = "AR {{output}}"
default_output_dir = "{{target_out_dir}}"
default_output_extension = ".a"
output_prefix = "lib"
outputs = [
"{{output_dir}}/{{target_output_name}}{{output_extension}}",
]
}
tool("solink_module") {
# TODO(scottmg): This will need to do -framework, etc. for macOS.
soname = "{{target_output_name}}{{output_extension}}" # e.g. "libfoo.so".
sofile = "{{output_dir}}/$soname"
soname_flag = ""
start_whole_flag = ""
end_whole_flag = ""
if (mini_chromium_is_mac || mini_chromium_is_ios) {
soname_flag = "-Wl,-install_name,\"$soname\""
} else {
soname_flag = "-Wl,-soname=\"$soname\""
start_whole_flag = "-Wl,--whole-archive"
end_whole_flag = "-Wl,--no-whole-archive "
}
command = "$ld -shared {{ldflags}}${extra_ldflags} -o \"$sofile\" $soname_flag $start_whole_flag {{inputs}} {{solibs}} $end_whole_flag {{libs}}"
description = "SOLINK_MODULE $sofile"
default_output_dir = "{{root_out_dir}}"
default_output_extension = ".so"
outputs = [
sofile,
]
}
tool("link") {
exename = "{{target_output_name}}{{output_extension}}"
outfile = "{{output_dir}}/$exename"
start_group_flag = ""
end_group_flag = ""
if (!mini_chromium_is_mac && !mini_chromium_is_ios) {
start_group_flag = "-Wl,--start-group"
end_group_flag = "-Wl,--end-group"
}
command = "$ld {{ldflags}}${extra_ldflags} -o \"$outfile\" $start_group_flag {{inputs}} {{solibs}} $end_group_flag {{libs}}"
description = "LINK $outfile"
default_output_dir = "{{root_out_dir}}"
default_output_extension = ""
outputs = [
outfile,
]
}
tool("stamp") {
command = "touch {{output}}"
description = "STAMP {{output}}"
}
}
if (mini_chromium_is_win) {
helper_path = rebase_path("win_helper.py")
toolchain_data = exec_script(helper_path,
[
"get-visual-studio-data",
rebase_path(root_build_dir),
rebase_path(win_toolchain_path),
],
"scope")
# Required arguments:
# - environment_file: Path to saved environment file (see win_helper.py).
# - current_cpu: The cpu to target with this toolchain.
template("msvc_toolchain") {
toolchain("msvc_toolchain_$target_name") {
# @rsp files are not used for simplicity, and because mini_chromium and
# Crashpad shouldn't require them in any configurations.
cc = "cl.exe"
cxx = "cl.exe"
ar = "lib.exe"
ld = "link.exe"
lib_switch = ""
lib_dir_switch = "/LIBPATH:"
env = invoker.environment_file
if (defined(invoker.extra_cflags) && invoker.extra_cflags != "") {
extra_cflags = " " + invoker.extra_cflags
} else {
extra_cflags = ""
}
if (defined(invoker.extra_cflags_c) && invoker.extra_cflags_c != "") {
extra_cflags_c = " " + invoker.extra_cflags_c
} else {
extra_cflags_c = ""
}
if (defined(invoker.extra_cflags_cc) && invoker.extra_cflags_cc != "") {
extra_cflags_cc = " " + invoker.extra_cflags_cc
} else {
extra_cflags_cc = ""
}
if (defined(invoker.extra_ldflags) && invoker.extra_ldflags != "") {
extra_ldflags = " " + invoker.extra_ldflags
} else {
extra_ldflags = ""
}
if (defined(invoker.extra_arflags) && invoker.extra_arflags != "") {
extra_arflags = " " + invoker.extra_arflags
} else {
extra_arflags = ""
}
tool("cc") {
depfile = "{{output}}.d"
pdbname = "{{target_out_dir}}/{{label_name}}_c.pdb"
command = "ninja -t msvc -e $env -- $cc /nologo /showIncludes {{defines}} {{include_dirs}} {{cflags}} {{cflags_c}}${extra_cflags}${extra_cflags_c} /c {{source}} /Fo{{output}} /Fd\"$pdbname\""
depsformat = "msvc"
description = "CC {{output}}"
outputs = [
"{{source_out_dir}}/{{label_name}}.{{source_name_part}}.obj",
]
}
tool("cxx") {
depfile = "{{output}}.d"
pdbname = "{{target_out_dir}}/{{label_name}}_cc.pdb"
command = "ninja -t msvc -e $env -- $cxx /nologo /showIncludes {{defines}} {{include_dirs}} {{cflags}} {{cflags_c}}${extra_cflags}${extra_cflags_cc} /c {{source}} /Fo{{output}} /Fd\"$pdbname\""
depsformat = "msvc"
description = "CXX {{output}}"
outputs = [
"{{source_out_dir}}/{{label_name}}.{{source_name_part}}.obj",
]
}
tool("alink") {
command = "$python_path $helper_path link-wrapper $env $ar /nologo /out:{{output}} {{arflags}}${extra_arflags} {{inputs}}"
description = "AR {{output}}"
outputs = [
"{{output_dir}}/{{target_output_name}}{{output_extension}}",
]
default_output_dir = "{{target_out_dir}}"
default_output_extension = ".lib"
output_prefix = ""
}
tool("solink_module") {
outputs = [
"{{output_dir}}/{{target_output_name}}{{output_extension}}",
]
command = "$python_path $helper_path link-wrapper $env $ld /nologo /DLL /OUT:{{output}} {{ldflags}}${extra_ldflags} {{inputs}} {{solibs}} {{libs}}"
description = "SOLINK_MODULE {{output}}"
default_output_dir = "{{root_out_dir}}"
default_output_extension = ".dll"
}
tool("link") {
outputs = [
"{{output_dir}}/{{target_output_name}}{{output_extension}}",
]
command = "$python_path $helper_path link-wrapper $env $ld /nologo /OUT:{{output}} {{ldflags}}${extra_ldflags} {{inputs}} {{solibs}} {{libs}}"
description = "LINK {{output}}"
default_output_dir = "{{root_out_dir}}"
default_output_extension = ".exe"
}
tool("asm") {
if (invoker.current_cpu == "arm64") {
ml = "armasm64.exe"
command = "$python_path $helper_path asm-wrapper $env $ml {{include_dirs}} {{asmflags}} -o {{output}} {{source}}"
} else {
if (invoker.current_cpu == "x86") {
ml = "ml.exe"
} else {
ml = "ml64.exe"
}
command = "$python_path $helper_path asm-wrapper $env $ml {{defines}} {{include_dirs}} {{asmflags}} /c /Fo{{output}} {{source}}"
}
description = "ASM {{output}}"
outputs = [
"{{source_out_dir}}/{{label_name}}.{{source_name_part}}.obj",
]
}
tool("stamp") {
command = "$python_path $helper_path stamp {{output}}"
description = "STAMP {{output}}"
}
tool("copy") {
command = "cmd /c copy /y {{source}} {{output}} >nul"
description = "COPY {{source}} {{output}}"
}
}
}
msvc_toolchain("x64") {
environment_file = toolchain_data.x64_environment_file
current_cpu = "x64"
}
msvc_toolchain("x86") {
environment_file = toolchain_data.x86_environment_file
current_cpu = "x86"
}
msvc_toolchain("arm64") {
environment_file = toolchain_data.arm64_environment_file
current_cpu = "arm64"
}
}