Chromium Code Reviews| Index: gn/BUILD.gn |
| diff --git a/gn/BUILD.gn b/gn/BUILD.gn |
| index aee8faebb45f5d45efdbf1c4ab797ba212c95727..7beefa13396173c52d6883ffab93c8f940301339 100644 |
| --- a/gn/BUILD.gn |
| +++ b/gn/BUILD.gn |
| @@ -14,6 +14,8 @@ declare_args() { |
| cxx = "$ndk/toolchains/llvm/prebuilt/$ndk_host/bin/clang++" |
| } |
| + windk = "" |
| + |
| extra_cflags = "" |
| extra_cflags_c = "" |
| extra_cflags_cc = "" |
| @@ -22,140 +24,162 @@ declare_args() { |
| compiler_prefix = "" |
| } |
| -config("no_rtti") { |
| - if (sanitize != "ASAN") { # -fsanitize=vptr requires RTTI |
| - cflags_cc = [ "-fno-rtti" ] |
| +if (is_win) { |
| + config("default") { |
| + cflags = [ |
| + "/FS", # Preserve previous PDB behavior. |
| + "/bigobj", # Some of our files are bigger than the regular limits. |
| + ] |
| + cflags_c = ["/TC"] |
| + cflags_cc = ["/TP"] |
| + defines = [ |
| + "_HAS_EXCEPTIONS=0", |
| + "WIN32_LEAN_AND_MEAN", |
|
hal.canary
2016/09/16 21:04:36
this may not be necessary, since we have SkLeanWin
|
| + "NOMINMAX", |
| + ] |
| } |
| -} |
| + config("no_rtti") { } |
| -config("debug_symbols") { |
| - # It's annoying to wait for full debug symbols to push over |
| - # to Android devices. -gline-tables-only is a lot slimmer. |
| - if (is_android) { |
| - cflags = [ "-gline-tables-only" ] |
| - } else { |
| - cflags = [ "-g" ] |
| + config("debug_symbols") { } |
| + |
| +} else { |
| + config("debug_symbols") { |
| + # It's annoying to wait for full debug symbols to push over |
| + # to Android devices. -gline-tables-only is a lot slimmer. |
| + if (is_android) { |
| + cflags = [ "-gline-tables-only" ] |
| + } else { |
| + cflags = [ "-g" ] |
| + } |
| } |
| -} |
| -config("default") { |
| - asmflags = [] |
| - cflags = [ |
| - "-O1", |
| - "-fstrict-aliasing", |
| - "-fPIC", |
| - "-fvisibility=hidden", |
| - |
| - "-Werror", |
| - "-Wall", |
| - "-Wextra", |
| - "-Winit-self", |
| - "-Wpointer-arith", |
| - "-Wsign-compare", |
| - "-Wvla", |
| - |
| - "-Wno-deprecated-declarations", |
| - "-Wno-unused-parameter", |
| - ] |
| - cflags_cc = [ |
| - "-std=c++11", |
| - "-fno-exceptions", |
| - "-fno-threadsafe-statics", |
| - "-fvisibility-inlines-hidden", |
| - |
| - "-Wnon-virtual-dtor", |
| - ] |
| - ldflags = [] |
| - |
| - if (current_cpu == "arm") { |
| - cflags += [ |
| - "-march=armv7-a", |
| - "-mfpu=neon", |
| - "-mthumb", |
| - ] |
| - } else if (current_cpu == "mipsel") { |
| - cflags += [ |
| - "-march=mips32r2", |
| - "-mdspr2", |
| - ] |
| - } else if (current_cpu == "x86") { |
| - asmflags += [ "-m32" ] |
| - cflags += [ |
| - "-m32", |
| - "-msse2", |
| - "-mfpmath=sse", |
| - ] |
| - ldflags += [ "-m32" ] |
| + config("no_rtti") { |
| + if (sanitize != "ASAN") { # -fsanitize=vptr requires RTTI |
| + cflags_cc = [ "-fno-rtti" ] |
| + } |
| } |
| - if (is_android) { |
| - asmflags += [ |
| - "--target=$ndk_target", |
| - "-B$ndk/toolchains/$ndk_gccdir-4.9/prebuilt/$ndk_host/$ndk_target/bin", |
| - ] |
| - cflags += [ |
| - "--sysroot=$ndk/platforms/$ndk_platform", |
| - "--target=$ndk_target", |
| - "-B$ndk/toolchains/$ndk_gccdir-4.9/prebuilt/$ndk_host/$ndk_target/bin", |
| - ] |
| - cflags_cc += [ |
| - "-isystem$ndk/sources/android/support/include", |
| - "-isystem$ndk/sources/cxx-stl/llvm-libc++/libcxx/include", |
| - ] |
| - ldflags += [ |
| - "--sysroot=$ndk/platforms/$ndk_platform", |
| - "--target=$ndk_target", |
| - "-B$ndk/toolchains/$ndk_gccdir-4.9/prebuilt/$ndk_host/$ndk_target/bin", |
| - "-pie", |
| - ] |
| - lib_dirs = [ |
| - "$ndk/sources/cxx-stl/llvm-libc++/libs/$ndk_stdlib", |
| - "$ndk/toolchains/$ndk_gccdir-4.9/prebuilt/$ndk_host/lib/gcc/$ndk_target/4.9.x", |
| + config("default") { |
| + asmflags = [] |
| + cflags = [ |
| + "-O1", |
| + "-fstrict-aliasing", |
| + "-fPIC", |
| + "-fvisibility=hidden", |
| + |
| + "-Werror", |
| + "-Wall", |
| + "-Wextra", |
| + "-Winit-self", |
| + "-Wpointer-arith", |
| + "-Wsign-compare", |
| + "-Wvla", |
| + |
| + "-Wno-deprecated-declarations", |
| + "-Wno-unused-parameter", |
| ] |
| - libs = [ |
| - # Order matters here! Keep these three in exactly this order. |
| - "c++_static", |
| - "c++abi", |
| - "android_support", |
| + cflags_cc = [ |
| + "-std=c++11", |
| + "-fno-exceptions", |
| + "-fno-threadsafe-statics", |
| + "-fvisibility-inlines-hidden", |
| + |
| + "-Wnon-virtual-dtor", |
| ] |
| - if (target_cpu == "arm") { |
| - libs += [ "unwind" ] |
| + ldflags = [] |
| + |
| + if (current_cpu == "arm") { |
| + cflags += [ |
| + "-march=armv7-a", |
| + "-mfpu=neon", |
| + "-mthumb", |
| + ] |
| + } else if (current_cpu == "mipsel") { |
| + cflags += [ |
| + "-march=mips32r2", |
| + "-mdspr2", |
| + ] |
| + } else if (current_cpu == "x86") { |
| + asmflags += [ "-m32" ] |
| + cflags += [ |
| + "-m32", |
| + "-msse2", |
| + "-mfpmath=sse", |
| + ] |
| + ldflags += [ "-m32" ] |
| } |
| - } |
| - if (is_linux) { |
| - libs = [ "pthread" ] |
| - } |
| + if (is_android) { |
| + asmflags += [ |
| + "--target=$ndk_target", |
| + "-B$ndk/toolchains/$ndk_gccdir-4.9/prebuilt/$ndk_host/$ndk_target/bin", |
| + ] |
| + cflags += [ |
| + "--sysroot=$ndk/platforms/$ndk_platform", |
| + "--target=$ndk_target", |
| + "-B$ndk/toolchains/$ndk_gccdir-4.9/prebuilt/$ndk_host/$ndk_target/bin", |
| + ] |
| + cflags_cc += [ |
| + "-isystem$ndk/sources/android/support/include", |
| + "-isystem$ndk/sources/cxx-stl/llvm-libc++/libcxx/include", |
| + ] |
| + ldflags += [ |
| + "--sysroot=$ndk/platforms/$ndk_platform", |
| + "--target=$ndk_target", |
| + "-B$ndk/toolchains/$ndk_gccdir-4.9/prebuilt/$ndk_host/$ndk_target/bin", |
| + "-pie", |
| + ] |
| + lib_dirs = [ |
| + "$ndk/sources/cxx-stl/llvm-libc++/libs/$ndk_stdlib", |
| + "$ndk/toolchains/$ndk_gccdir-4.9/prebuilt/$ndk_host/lib/gcc/$ndk_target/4.9.x", |
| + ] |
| - if (sanitize != "") { |
| - # You can either pass the sanitizers directly, e.g. "address,undefined", |
| - # or pass one of the couple common aliases used by the bots. |
| - sanitizers = sanitize |
| - if (sanitize == "ASAN") { |
| - sanitizers = "address,bool,function,integer-divide-by-zero,nonnull-attribute,null,object-size,return,returns-nonnull-attribute,shift,signed-integer-overflow,unreachable,vla-bound,vptr" |
| - } else if (sanitize == "TSAN") { |
| - sanitizers = "thread" |
| - } else if (sanitize == "MSAN") { |
| - sanitizers = "memory" |
| + libs = [ |
| + # Order matters here! Keep these three in exactly this order. |
| + "c++_static", |
| + "c++abi", |
| + "android_support", |
| + ] |
| + if (target_cpu == "arm") { |
| + libs += [ "unwind" ] |
| + } |
| } |
| - cflags += [ |
| - "-fsanitize=$sanitizers", |
| - "-fno-sanitize-recover=$sanitizers", |
| - "-fsanitize-blacklist=" + rebase_path("../tools/xsan.blacklist"), |
| - ] |
| - ldflags += [ "-fsanitize=$sanitizers" ] |
| - if (sanitizers == "memory") { |
| - cflags += [ "-fsanitize-memory-track-origins" ] |
| - cflags_cc += [ "-stdlib=libc++" ] |
| - ldflags += [ "-stdlib=libc++" ] |
| + if (is_linux) { |
| + libs = [ "pthread" ] |
| + } |
| + |
| + if (sanitize != "") { |
| + # You can either pass the sanitizers directly, e.g. "address,undefined", |
| + # or pass one of the couple common aliases used by the bots. |
| + sanitizers = sanitize |
| + if (sanitize == "ASAN") { |
| + sanitizers = "address,bool,function,integer-divide-by-zero,nonnull-attribute,null,object-size,return,returns-nonnull-attribute,shift,signed-integer-overflow,unreachable,vla-bound,vptr" |
| + } else if (sanitize == "TSAN") { |
| + sanitizers = "thread" |
| + } else if (sanitize == "MSAN") { |
| + sanitizers = "memory" |
| + } |
| + |
| + cflags += [ |
| + "-fsanitize=$sanitizers", |
| + "-fno-sanitize-recover=$sanitizers", |
| + "-fsanitize-blacklist=" + rebase_path("../tools/xsan.blacklist"), |
| + ] |
| + ldflags += [ "-fsanitize=$sanitizers" ] |
| + if (sanitizers == "memory") { |
| + cflags += [ "-fsanitize-memory-track-origins" ] |
| + cflags_cc += [ "-stdlib=libc++" ] |
| + ldflags += [ "-stdlib=libc++" ] |
| + } |
| } |
| } |
| -} |
| -config("release") { |
| - cflags = [ "-O3" ] |
| - defines = [ "NDEBUG" ] |
| + config("release") { |
| + cflags = [ "-O3" ] |
| + defines = [ "NDEBUG" ] |
| + } |
| + |
| } |
| config("executable") { |
| @@ -169,6 +193,100 @@ config("executable") { |
| } |
| } |
| +toolchain("msvc") { |
| + vc = "$windk\VC\bin\amd64\cl.exe" |
| + vlink = "$windk\VC\bin\amd64\link.exe" |
| + vlib = "$windk\VC\bin\amd64\lib.exe" |
| + # TODO: add a python function that generates the includes using <VSPATH>/win_sdk/bin/SetEnv.<cpu>.json |
| + windk_include_dirs = "/I$windk\win_sdk\bin\..\..\win_sdk\Include\10.0.10586.0\um /I$windk\win_sdk\bin\..\..\win_sdk\Include\10.0.10586.0\shared /I$windk\win_sdk\bin\..\..\win_sdk\Include\10.0.10586.0\winrt /I$windk\win_sdk\bin\..\..\win_sdk\Include\10.0.10586.0\ucrt /I$windk\win_sdk\bin\..\..\VC\include /I$windk\win_sdk\bin\..\..\VC\atlmfc\include " |
| + |
| + tool("cc") { |
| + rspfile = "{{output}}.rsp" |
| + precompiled_header_type = "msvc" |
| + pdbname = "{{target_out_dir}}/{{label_name}}_c.pdb" |
| + |
| + # Label names may have spaces in them so the pdbname must be quoted. The |
| + # source and output don't need to be quoted because GN knows they're a |
| + # full file name and will quote automatically when necessary. |
| + |
| + command = "$vc /nologo /showIncludes /FC @$rspfile /c {{source}} /Fo{{output}} /Fd\"$pdbname\"" |
| + depsformat = "msvc" |
| + description = "CC {{output}}" |
| + outputs = [ |
| + "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.obj", |
| + # "$object_subdir/{{source_name_part}}.obj", |
| + ] |
| + rspfile_content = "$windk_include_dirs {{defines}} {{include_dirs}} {{cflags}} {{cflags_c}}" |
| + } |
| + |
| + tool("cxx") { |
| + rspfile = "{{output}}.rsp" |
| + precompiled_header_type = "msvc" |
| + pdbname = "{{target_out_dir}}/{{label_name}}_c.pdb" |
| + |
| + # Label names may have spaces in them so the pdbname must be quoted. The |
| + # source and output don't need to be quoted because GN knows they're a |
| + # full file name and will quote automatically when necessary. |
| + command = "$vc /nologo /showIncludes /FC @$rspfile /c {{source}} /Fo{{output}} /Fd\"$pdbname\"" |
| + depsformat = "msvc" |
| + description = "C++ {{output}}" |
| + outputs = [ |
| + "{{source_out_dir}}/{{target_output_name}}.{{source_name_part}}.obj", |
| + ] |
| + rspfile_content = "$windk_include_dirs {{defines}} {{include_dirs}} {{cflags}} {{cflags_cc}}" |
| + } |
| + |
| + tool("alink") { |
| + rspfile = "{{output}}.rsp" |
| + # gyp_win_tool_path = rebase_path("../third_party/externals/gyp/pylib/gyp/win_tool.py") |
| + command = "$vlib /nologo {{arflags}} /OUT:{{output}} @$rspfile" |
| + description = "LIB {{output}}" |
| + 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}}" |
| + |
| + # The use of inputs_newline is to work around a fixed per-line buffer |
| + # size in the linker. |
| + rspfile_content = "{{inputs_newline}}" |
| + } |
| + |
| + tool("link") { |
| + exename = "{{root_out_dir}}/{{target_output_name}}{{output_extension}}" |
| + pdbname = "$exename.pdb" |
| + rspfile = "$exename.rsp" |
| + |
| + # gyp_win_tool_path = rebase_path("../third_party/externals/gyp/pylib/gyp/win_tool.py") |
| + command = "$vlink /nologo /OUT:$exename /PDB:$pdbname @$rspfile" |
| + |
| + default_output_extension = ".exe" |
| + default_output_dir = "{{root_out_dir}}" |
| + description = "LINK {{output}}" |
| + outputs = [ |
| + #"{{root_out_dir}}/{{target_output_name}}{{output_extension}}", |
| + exename, |
| + ] |
| + #if (symbol_level != 0) { |
| + # outputs += [ pdbname ] |
| + #} |
| + #runtime_outputs = outputs |
| + |
| + # The use of inputs_newline is to work around a fixed per-line buffer |
| + # size in the linker. |
| + rspfile_content = "{{inputs_newline}} {{libs}} {{solibs}} {{ldflags}}" |
| + } |
| + |
| + |
| + tool("stamp") { |
| + win_stamp_path = rebase_path("win_stamp.py") |
| + command = "python $win_stamp_path {{output}}" |
| + } |
| +} |
| + |
| + |
| toolchain("gcc_like") { |
| lib_switch = "-l" |
| lib_dir_switch = "-L" |