Index: gn/BUILD.gn |
diff --git a/gn/BUILD.gn b/gn/BUILD.gn |
index fd2d0074c6f9abadeccf65b71206b99fa2147560..4d7494473fe60830f81a5473c6ac5bf74a7da3b5 100644 |
--- a/gn/BUILD.gn |
+++ b/gn/BUILD.gn |
@@ -22,137 +22,250 @@ declare_args() { |
compiler_prefix = "" |
} |
-config("no_rtti") { |
- if (sanitize != "ASAN") { # -fsanitize=vptr requires RTTI |
- cflags_cc = [ "-fno-rtti" ] |
+if (is_win) { |
+ config("default") { |
+ cflags = [ |
+ "/Gy", # Enable function-level linking. |
mtklein
2016/09/14 21:25:14
If there is any doubt, let's leave it out.
herb_g
2016/09/16 19:54:15
Done.
|
+ "/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", |
+ "NOMINMAX", |
+ ] |
} |
-} |
-config("default") { |
- 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 = [] |
- |
- # 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("no_rtti") { |
} |
+ |
+ config("executable") { |
- if (current_cpu == "arm") { |
- cflags += [ |
- "-march=armv7-a", |
- "-mfpu=neon", |
- "-mthumb", |
- ] |
- } else if (current_cpu == "mipsel") { |
- cflags += [ |
- "-march=mips32r2", |
- "-mdspr2", |
- ] |
} |
+} else { |
+ config("default") { |
+ cflags = [ |
+ "-O1", |
+ "-fstrict-aliasing", |
+ "-fPIC", |
+ "-fvisibility=hidden", |
- 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", |
+ "-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 = [] |
+ |
+ # 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) { |
mtklein
2016/09/14 21:25:14
This needs some rebasing.
herb_g
2016/09/16 19:54:15
Done.
|
+ cflags += [ "-gline-tables-only" ] |
+ } else { |
+ cflags += [ "-g" ] |
} |
- } |
- if (is_linux) { |
- libs = [ "pthread" ] |
+ if (current_cpu == "arm") { |
+ cflags += [ |
+ "-march=armv7-a", |
+ "-mfpu=neon", |
+ "-mthumb", |
+ ] |
+ } else if (current_cpu == "mipsel") { |
+ cflags += [ |
+ "-march=mips32r2", |
+ "-mdspr2", |
+ ] |
+ } |
+ |
+ 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", |
+ ] |
+ libs = [ |
+ # Order matters here! Keep these three in exactly this order. |
+ "c++_static", |
+ "c++abi", |
+ "android_support", |
+ ] |
+ if (target_cpu == "arm") { |
+ libs += [ "unwind" ] |
+ } |
+ } |
+ |
+ if (is_linux) { |
+ libs = [ "pthread" ] |
mtklein
2016/09/14 21:25:14
This is the source of our global pthread power.
herb_g
2016/09/16 19:54:15
Done.
|
+ } |
+ |
+ 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++" ] |
+ } |
+ } |
} |
- 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" |
+ config("no_rtti") { |
+ if (sanitize != "ASAN") { # -fsanitize=vptr requires RTTI |
+ cflags_cc = [ "-fno-rtti" ] |
} |
+ } |
- 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("executable") { |
+ if (is_mac) { |
+ ldflags = [ "-Wl,-rpath,@loader_path/." ] |
+ } else if (is_linux) { |
+ ldflags = [ "-Wl,-rpath,\$ORIGIN" ] |
} |
} |
} |
-config("release") { |
- cflags = [ "-O3" ] |
- defines = [ "NDEBUG" ] |
-} |
+toolchain("msvc") { |
-config("executable") { |
- if (is_mac) { |
- ldflags = [ "-Wl,-rpath,@loader_path/." ] |
- } else if (is_linux) { |
- ldflags = [ "-Wl,-rpath,\$ORIGIN" ] |
- } |
+ 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 = "ninja -t msvc -e environment.x64 -- C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\amd64\cl.exe /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", |
mtklein
2016/09/14 21:25:14
Probably can clean up these working drafts.
herb_g
2016/09/16 19:54:15
Done.
|
+ ] |
+ rspfile_content = "{{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 = "ninja -t msvc -e environment.x64 -- C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\amd64\cl.exe /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", |
+ # "$object_subdir/{{source_name_part}}.obj", |
+ ] |
+ rspfile_content = "{{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 = "python $gyp_win_tool_path link-wrapper environment.x64 False lib.exe /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. |
+ #"{{output_dir}}/{{target_output_name}}.lib", |
+ "{{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 = "python $gyp_win_tool_path link-wrapper environment.x64 False link.exe /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") { |