| # 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/linux-amd64" |
| fuchsia_clang = "//third_party/fuchsia/clang/" + host_os + "-amd64" |
| |
| 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 += [ |
| "-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) { |
| cflags += [ "-fPIC" ] |
| |
| 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" ] |
| } |
| } |
| |
| config("Wexit_time_destructors") { |
| if (is_clang) { |
| cflags = [ "-Wexit-time-destructors" ] |
| } |
| } |
| |
| ################################################################################ |
| # 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++" |
| ar = rebase_path(fuchsia_clang, root_build_dir) + "/bin/llvm-ar" |
| ld = cxx |
| } else { |
| cc = "clang" |
| cxx = "clang++" |
| ld = cxx |
| |
| if (!is_mac) { |
| # macOS uses libtool instead of ar. |
| ar = "ar" |
| } |
| } |
| |
| 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 -no_warning_for_no_symbols {{arflags}} -o {{output}} {{inputs}}" |
| } else { |
| command = "$ar rcsD {{arflags}} {{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" |
| |
| 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}}" |
| rspfile_content = "{{inputs}}" |
| description = "LINK $outfile" |
| |
| default_output_extension = "" |
| default_output_dir = "{{root_out_dir}}" |
| 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("solink_module") { |
| outputs = [ |
| "{{root_out_dir}}/{{target_output_name}}{{output_extension}}", |
| ] |
| command = "$python_path $helper_path link-wrapper $ld /nologo /DLL /OUT:{{output}} {{ldflags}} {{inputs}} {{solibs}} {{libs}}" |
| description = "LINK_MODULE {{output}}" |
| default_output_extension = ".dll" |
| } |
| |
| 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}}" |
| } |
| |
| tool("copy") { |
| command = "cmd /c copy /y {{source}} {{output}} >nul" |
| description = "COPY {{source}} {{output}}" |
| } |
| } |