blob: 29a183c26e472b714135aa0d18e5e78ceb85bc57 [file]
# 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
################################################################################
if (is_fuchsia) {
declare_args() {
# Path to Fuchsia SDK.
fuchsia_sdk = "//third_party/fuchsia/sdk"
fuchsia_clang = "//third_party/fuchsia/clang"
sysroot = ""
}
if (current_cpu == "arm64") {
sysroot = fuchsia_sdk + "/sysroot/aarch64-fuchsia"
} else if (current_cpu == "x64") {
sysroot = fuchsia_sdk + "/sysroot/x86_64-fuchsia"
}
}
config("debug") {
}
config("release") {
defines = [ "NDEBUG" ]
if (is_mac) {
cflags = [ "-O3" ]
ldflags = [ "-Wl,-dead_strip" ]
} else if (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") {
ldflags = []
if (is_mac || is_fuchsia) {
cflags = [
"-Wall",
"-Wendif-labels",
"-Werror",
"-Wextra",
"-Wno-missing-field-initializers",
"-Wno-unused-parameter",
"-Wsign-compare",
"-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=c99" ]
cflags_cc = [ "-std=c++14" ]
cflags_objc = cflags_c
cflags_objcc = cflags_cc
cflags += [
"-Wexit-time-destructors",
"-Wheader-hygiene",
"-Wnewline-eof",
"-Wstring-conversion",
]
} else if (is_win) {
cflags = [
"/DNOMINMAX",
"/DUNICODE",
"/DWIN32_LEAN_AND_MEAN",
"/D_CRT_SECURE_NO_WARNINGS",
"/D_HAS_EXCEPTIONS=0",
"/D_UNICODE",
"/W4",
"/WX",
"/wd4100", # Unreferenced formal parameter.
"/wd4127", # Conditional expression is constant.
"/wd4351", # New behavior: elements of array will be default initialized.
"/wd4530", # Exceptions disabled.
"/wd4702", # Unreachable code.
"/wd4996", # 'X' was declared deprecated.
]
}
if (is_fuchsia) {
if (target_cpu == "arm64") {
cflags += [ "--target=aarch64-fuchsia" ]
ldflags += [ "--target=aarch64-fuchsia" ]
} else if (target_cpu == "x64") {
cflags += [ "--target=x86_64-fuchsia" ]
ldflags += [ "--target=x86_64-fuchsia" ]
} else {
assert(false, "Unsupported architecture")
}
libs = [
"fdio",
"zircon",
]
# Pass the sysroot to all C compiler variants, the assembler, and linker.
sysroot_flags = [ "--sysroot=" + rebase_path(sysroot, root_build_dir) ]
ldflags += sysroot_flags
cflags_c += sysroot_flags
cflags_cc += sysroot_flags
cflags_objc += sysroot_flags
cflags_objcc += sysroot_flags
}
if (is_debug) {
configs = [ ":debug" ]
} else {
configs = [ ":release" ]
}
}
################################################################################
# TOOLCHAIN DEFINITIONS
################################################################################
toolchain("gcc_like_toolchain") {
lib_switch = "-l"
lib_dir_switch = "-L"
if (is_fuchsia) {
cc = rebase_path(fuchsia_clang, root_build_dir) + "/bin/clang"
cxx = rebase_path(fuchsia_clang, root_build_dir) + "/bin/clang++"
ld = cxx
} else {
cc = "clang"
cxx = "clang++"
ld = cxx
}
tool("cc") {
depfile = "{{output}}.d"
command = "$cc -MMD -MF $depfile {{defines}} {{include_dirs}} {{cflags}} {{cflags_c}} -c {{source}} -o {{output}}"
depsformat = "gcc"
description = "CXX {{output}}"
outputs = [
"{{target_out_dir}}/{{target_output_name}}.{{source_name_part}}.o",
]
}
tool("cxx") {
depfile = "{{output}}.d"
command = "$cxx -MMD -MF $depfile {{defines}} {{include_dirs}} {{cflags}} {{cflags_cc}} -c {{source}} -o {{output}}"
depsformat = "gcc"
description = "CXX {{output}}"
outputs = [
"{{target_out_dir}}/{{target_output_name}}.{{source_name_part}}.o",
]
}
tool("objc") {
depfile = "{{output}}.d"
command = "$cc -MMD -MF $depfile {{defines}} {{include_dirs}} {{cflags}} {{cflags_objc}} -c {{source}} -o {{output}}"
depsformat = "gcc"
description = "OBJC {{output}}"
outputs = [
"{{target_out_dir}}/{{target_output_name}}.{{source_name_part}}.o",
]
}
tool("objcxx") {
depfile = "{{output}}.d"
command = "$cxx -MMD -MF $depfile {{defines}} {{include_dirs}} {{cflags}} {{cflags_objcc}} -c {{source}} -o {{output}}"
depsformat = "gcc"
description = "OBJCXX {{output}}"
outputs = [
"{{target_out_dir}}/{{target_output_name}}.{{source_name_part}}.o",
]
}
tool("alink") {
if (is_mac) {
command = "libtool -static {{arflags}} -o {{output}} {{inputs}}"
} else {
command = "ar rcsD {{arflags}} -o {{output}} {{inputs}}"
}
description = "LIBTOOL-STATIC {{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"
rspfile = sofile + ".rsp"
command = "$ld -shared {{ldflags}} -o \"$sofile\" -Wl,-soname=\"$soname\" @\"$rspfile\""
rspfile_content = "-Wl,--whole-archive {{inputs}} {{solibs}} -Wl,--no-whole-archive {{libs}}"
description = "SOLINK_MODULE $sofile"
default_output_extension = ".so"
default_output_dir = "{{root_out_dir}}"
output_prefix = "lib"
outputs = [
sofile,
]
}
tool("link") {
exename = "{{target_output_name}}{{output_extension}}"
outfile = "{{output_dir}}/$exename"
rspfile = "$outfile.rsp"
default_output_extension = ""
default_output_dir = "{{root_out_dir}}"
start_group_flag = "-Wl,--start-group"
end_group_flag = "-Wl,--end-group "
command = "$ld {{ldflags}} -o \"$outfile\" $start_group_flag @\"$rspfile\" {{solibs}} $end_group_flag {{libs}}"
description = "LINK $outfile"
rspfile_content = "{{inputs}}"
outputs = [
outfile,
]
}
tool("stamp") {
command = "touch {{output}}"
description = "STAMP {{output}}"
}
}
toolchain("msvc_toolchain") {
# We don't support all the cross blah-de-blah that Chromium does here. The
# environment must be pre-setup by a vcvarsall.bat invocation. @rsp files are
# also not used, for simplicity, and because mini_chromium/Crashpad shouldn't
# require them in any configurations.
cc = "cl.exe"
cxx = "cl.exe"
ar = "lib.exe"
ld = "link.exe"
helper_path = rebase_path("win_helper.py")
tool("cc") {
depfile = "{{output}}.d"
command = "$cc /nologo /showIncludes {{defines}} {{include_dirs}} {{cflags}} {{cflags_c}} /c {{source}} /Fo{{output}}"
depsformat = "msvc"
description = "CC {{output}}"
outputs = [
"{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.obj",
]
}
tool("cxx") {
depfile = "{{output}}.d"
command = "$cxx /nologo /showIncludes {{defines}} {{include_dirs}} {{cflags}} {{cflags_c}} /c {{source}} /Fo{{output}}"
depsformat = "msvc"
description = "CXX {{output}}"
outputs = [
"{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.obj",
]
}
tool("alink") {
command = "$python_path $helper_path link-wrapper $ar /nologo /out:{{output}} {{arflags}} {{inputs}}"
description = "LIB {{output}}"
outputs = [
"{{target_out_dir}}/{{target_output_name}}{{output_extension}}",
]
default_output_extension = ".lib"
output_prefix = ""
}
tool("link") {
outputs = [
"{{root_out_dir}}/{{target_output_name}}{{output_extension}}",
]
command = "$python_path $helper_path link-wrapper $ld /nologo /OUT:{{output}} {{ldflags}} {{inputs}} {{solibs}} {{libs}}"
description = "LINK {{output}}"
default_output_extension = ".exe"
}
tool("stamp") {
command = "$python_path $helper_path stamp {{output}}"
description = "STAMP {{output}}"
}
}