| Index: BUILD.gn | 
| diff --git a/BUILD.gn b/BUILD.gn | 
| index c1aed787a59a16627a28b346e6e566c5acad9f8a..2ea5a075fdd0f0c1a38f97811ca6df3f50f95e8e 100644 | 
| --- a/BUILD.gn | 
| +++ b/BUILD.gn | 
| @@ -4,6 +4,8 @@ | 
| # found in the LICENSE file. | 
|  | 
| declare_args() { | 
| +  skia_enable_tools = !is_fuchsia && !is_component_build | 
| + | 
| skia_use_expat = true | 
| skia_use_giflib = !is_fuchsia | 
| skia_use_libjpeg_turbo = true | 
| @@ -176,6 +178,7 @@ if (is_x86) { | 
| } | 
| } | 
|  | 
| +# Any feature of Skia that requires third-party code should be optional and use this template. | 
| template("optional") { | 
| if (invoker.enabled) { | 
| config(target_name + "_public") { | 
| @@ -451,7 +454,7 @@ skia_h_headers = exec_script("gyp/find.py", | 
| action("skia.h") { | 
| script = "gn/echo_headers.py" | 
| args = [ rebase_path("$target_gen_dir/skia.h", root_build_dir) ] + | 
| -         rebase_path(skia_h_headers, root_build_dir) | 
| +         rebase_path(skia_h_headers, target_gen_dir) | 
| outputs = [ | 
| "$target_gen_dir/skia.h", | 
| ] | 
| @@ -465,202 +468,203 @@ executable("fiddle") { | 
| } | 
|  | 
| sources = [ | 
| +    "src/images/SkForceLinking.cpp", | 
| "tools/fiddle/draw.cpp", | 
| "tools/fiddle/fiddle_main.cpp", | 
| ] | 
| deps = [ | 
| ":skia", | 
| ":skia.h", | 
| -    ":tool_utils", | 
| ] | 
| -  testonly = true | 
| } | 
|  | 
| -template("test_lib") { | 
| -  config(target_name + "_config") { | 
| -    include_dirs = invoker.public_include_dirs | 
| +# Targets guarded by skia_enable_tools may use //third_party freely. | 
| +if (skia_enable_tools) { | 
| +  template("test_lib") { | 
| +    config(target_name + "_config") { | 
| +      include_dirs = invoker.public_include_dirs | 
| +    } | 
| +    source_set(target_name) { | 
| +      forward_variables_from(invoker, "*", [ "public_include_dirs" ]) | 
| +      public_configs = [ | 
| +        ":" + target_name + "_config", | 
| +        ":skia_private", | 
| +      ] | 
| + | 
| +      if (!defined(deps)) { | 
| +        deps = [] | 
| +      } | 
| +      deps += [ ":skia" ] | 
| +      testonly = true | 
| +    } | 
| } | 
| -  source_set(target_name) { | 
| -    forward_variables_from(invoker, "*", [ "public_include_dirs" ]) | 
| -    public_configs = [ | 
| -      ":" + target_name + "_config", | 
| -      ":skia_private", | 
| + | 
| +  test_lib("gpu_tool_utils") { | 
| +    public_include_dirs = [ "tools/gpu" ] | 
| +    sources = [ | 
| +      "tools/gpu/GrContextFactory.cpp", | 
| +      "tools/gpu/GrTest.cpp", | 
| +      "tools/gpu/TestContext.cpp", | 
| +      "tools/gpu/gl/GLTestContext.cpp", | 
| +      "tools/gpu/gl/debug/DebugGLTestContext.cpp", | 
| +      "tools/gpu/gl/debug/GrBufferObj.cpp", | 
| +      "tools/gpu/gl/debug/GrFrameBufferObj.cpp", | 
| +      "tools/gpu/gl/debug/GrProgramObj.cpp", | 
| +      "tools/gpu/gl/debug/GrShaderObj.cpp", | 
| +      "tools/gpu/gl/debug/GrTextureObj.cpp", | 
| +      "tools/gpu/gl/debug/GrTextureUnitObj.cpp", | 
| +      "tools/gpu/gl/null/NullGLTestContext.cpp", | 
| ] | 
| +    libs = [] | 
|  | 
| -    if (!defined(deps)) { | 
| -      deps = [] | 
| +    if (is_linux) { | 
| +      sources += [ "tools/gpu/gl/glx/CreatePlatformGLTestContext_glx.cpp" ] | 
| +    } else if (is_mac) { | 
| +      sources += [ "tools/gpu/gl/mac/CreatePlatformGLTestContext_mac.cpp" ] | 
| } | 
| -    deps += [ ":skia" ] | 
| -    testonly = true | 
| } | 
| -} | 
| - | 
| -test_lib("gpu_tool_utils") { | 
| -  public_include_dirs = [ "tools/gpu" ] | 
| -  sources = [ | 
| -    "tools/gpu/GrContextFactory.cpp", | 
| -    "tools/gpu/GrTest.cpp", | 
| -    "tools/gpu/TestContext.cpp", | 
| -    "tools/gpu/gl/GLTestContext.cpp", | 
| -    "tools/gpu/gl/debug/DebugGLTestContext.cpp", | 
| -    "tools/gpu/gl/debug/GrBufferObj.cpp", | 
| -    "tools/gpu/gl/debug/GrFrameBufferObj.cpp", | 
| -    "tools/gpu/gl/debug/GrProgramObj.cpp", | 
| -    "tools/gpu/gl/debug/GrShaderObj.cpp", | 
| -    "tools/gpu/gl/debug/GrTextureObj.cpp", | 
| -    "tools/gpu/gl/debug/GrTextureUnitObj.cpp", | 
| -    "tools/gpu/gl/null/NullGLTestContext.cpp", | 
| -  ] | 
| -  libs = [] | 
|  | 
| -  if (is_linux) { | 
| -    sources += [ "tools/gpu/gl/glx/CreatePlatformGLTestContext_glx.cpp" ] | 
| -  } else if (is_mac) { | 
| -    sources += [ "tools/gpu/gl/mac/CreatePlatformGLTestContext_mac.cpp" ] | 
| +  test_lib("flags") { | 
| +    public_include_dirs = [ "tools/flags" ] | 
| +    sources = [ | 
| +      "tools/flags/SkCommandLineFlags.cpp", | 
| +      "tools/flags/SkCommonFlags.cpp", | 
| +      "tools/flags/SkCommonFlagsConfig.cpp", | 
| +    ] | 
| +    deps = [ | 
| +      ":gpu_tool_utils", | 
| +    ] | 
| } | 
| -} | 
| - | 
| -test_lib("flags") { | 
| -  public_include_dirs = [ "tools/flags" ] | 
| -  sources = [ | 
| -    "tools/flags/SkCommandLineFlags.cpp", | 
| -    "tools/flags/SkCommonFlags.cpp", | 
| -    "tools/flags/SkCommonFlagsConfig.cpp", | 
| -  ] | 
| -  deps = [ | 
| -    ":gpu_tool_utils", | 
| -  ] | 
| -} | 
|  | 
| -test_lib("tool_utils") { | 
| -  public_include_dirs = [ | 
| -    "tools", | 
| -    "tools/debugger", | 
| -    "tools/timer", | 
| -  ] | 
| -  sources = [ | 
| -    "src/images/SkForceLinking.cpp", | 
| -    "src/utils/SkMultiPictureDocumentReader.cpp",  # TODO(halcanary): move to tools? | 
| -    "tools/CrashHandler.cpp", | 
| -    "tools/ProcStats.cpp", | 
| -    "tools/Resources.cpp", | 
| -    "tools/ThermalManager.cpp", | 
| -    "tools/UrlDataManager.cpp", | 
| -    "tools/debugger/SkDebugCanvas.cpp", | 
| -    "tools/debugger/SkDrawCommand.cpp", | 
| -    "tools/debugger/SkJsonWriteBuffer.cpp", | 
| -    "tools/debugger/SkObjectParser.cpp", | 
| -    "tools/debugger/SkOverdrawMode.cpp", | 
| -    "tools/picture_utils.cpp", | 
| -    "tools/random_parse_path.cpp", | 
| -    "tools/sk_tool_utils.cpp", | 
| -    "tools/sk_tool_utils_font.cpp", | 
| -    "tools/timer/Timer.cpp", | 
| -  ] | 
| -  deps = [ | 
| -    ":flags", | 
| -    "//third_party/libpng", | 
| -  ] | 
| -  public_deps = [ | 
| -    "//third_party/jsoncpp", | 
| -  ] | 
| -} | 
| +  test_lib("tool_utils") { | 
| +    public_include_dirs = [ | 
| +      "tools", | 
| +      "tools/debugger", | 
| +      "tools/timer", | 
| +    ] | 
| +    sources = [ | 
| +      "src/images/SkForceLinking.cpp", | 
| +      "src/utils/SkMultiPictureDocumentReader.cpp",  # TODO(halcanary): move to tools? | 
| +      "tools/CrashHandler.cpp", | 
| +      "tools/ProcStats.cpp", | 
| +      "tools/Resources.cpp", | 
| +      "tools/ThermalManager.cpp", | 
| +      "tools/UrlDataManager.cpp", | 
| +      "tools/debugger/SkDebugCanvas.cpp", | 
| +      "tools/debugger/SkDrawCommand.cpp", | 
| +      "tools/debugger/SkJsonWriteBuffer.cpp", | 
| +      "tools/debugger/SkObjectParser.cpp", | 
| +      "tools/debugger/SkOverdrawMode.cpp", | 
| +      "tools/picture_utils.cpp", | 
| +      "tools/random_parse_path.cpp", | 
| +      "tools/sk_tool_utils.cpp", | 
| +      "tools/sk_tool_utils_font.cpp", | 
| +      "tools/timer/Timer.cpp", | 
| +    ] | 
| +    deps = [ | 
| +      ":flags", | 
| +      "//third_party/libpng", | 
| +    ] | 
| +    public_deps = [ | 
| +      "//third_party/jsoncpp", | 
| +    ] | 
| +  } | 
|  | 
| -gm_sources = exec_script("gyp/find.py", | 
| -                         [ | 
| -                           "*.c*", | 
| -                           rebase_path("gm"), | 
| -                         ], | 
| -                         "list lines", | 
| -                         []) | 
| -test_lib("gm") { | 
| -  public_include_dirs = [ "gm" ] | 
| -  sources = gm_sources | 
| -  deps = [ | 
| -    ":gpu_tool_utils", | 
| -    ":skia", | 
| -    ":tool_utils", | 
| -  ] | 
| -} | 
| +  gm_sources = exec_script("gyp/find.py", | 
| +                           [ | 
| +                             "*.c*", | 
| +                             rebase_path("gm"), | 
| +                           ], | 
| +                           "list lines", | 
| +                           []) | 
| +  test_lib("gm") { | 
| +    public_include_dirs = [ "gm" ] | 
| +    sources = gm_sources | 
| +    deps = [ | 
| +      ":gpu_tool_utils", | 
| +      ":skia", | 
| +      ":tool_utils", | 
| +    ] | 
| +  } | 
|  | 
| -tests_sources = exec_script("gyp/find.py", | 
| -                            [ | 
| -                              "*.c*", | 
| -                              rebase_path("tests"), | 
| -                            ], | 
| -                            "list lines", | 
| -                            []) | 
| - | 
| -test_lib("tests") { | 
| -  public_include_dirs = [ "tests" ] | 
| -  sources = tests_sources - [ | 
| -              rebase_path("tests/FontMgrAndroidParserTest.cpp"),  # Android only | 
| -              rebase_path("tests/PathOpsSkpClipTest.cpp"),  # alternate main | 
| -              rebase_path("tests/SkSLErrorTest.cpp"),  # TODO: make work | 
| -              rebase_path("tests/SkSLGLSLTest.cpp"),  # TODO: make work | 
| -              rebase_path("tests/SkpSkGrTest.cpp"),  # doesn't compile | 
| -              rebase_path("tests/skia_test.cpp"),  # alternate main | 
| -            ] | 
| -  deps = [ | 
| -    ":flags", | 
| -    ":gpu_tool_utils", | 
| -    ":skia", | 
| -    ":tool_utils", | 
| -    "//third_party/libpng", | 
| -    "//third_party/zlib", | 
| -  ] | 
| -} | 
| +  tests_sources = exec_script("gyp/find.py", | 
| +                              [ | 
| +                                "*.c*", | 
| +                                rebase_path("tests"), | 
| +                              ], | 
| +                              "list lines", | 
| +                              []) | 
| + | 
| +  test_lib("tests") { | 
| +    public_include_dirs = [ "tests" ] | 
| +    sources = | 
| +        tests_sources - [ | 
| +          rebase_path("tests/FontMgrAndroidParserTest.cpp"),  # Android only | 
| +          rebase_path("tests/PathOpsSkpClipTest.cpp"),  # alternate main | 
| +          rebase_path("tests/SkSLErrorTest.cpp"),  # TODO: make work | 
| +          rebase_path("tests/SkSLGLSLTest.cpp"),  # TODO: make work | 
| +          rebase_path("tests/SkpSkGrTest.cpp"),  # doesn't compile | 
| +          rebase_path("tests/skia_test.cpp"),  # alternate main | 
| +        ] | 
| +    deps = [ | 
| +      ":flags", | 
| +      ":gpu_tool_utils", | 
| +      ":skia", | 
| +      ":tool_utils", | 
| +      "//third_party/libpng", | 
| +      "//third_party/zlib", | 
| +    ] | 
| +  } | 
|  | 
| -bench_sources = exec_script("gyp/find.py", | 
| -                            [ | 
| -                              "*.c*", | 
| -                              rebase_path("bench"), | 
| -                            ], | 
| -                            "list lines", | 
| -                            []) | 
| - | 
| -test_lib("bench") { | 
| -  public_include_dirs = [ "bench" ] | 
| -  sources = bench_sources | 
| -  sources -= [ | 
| -    rebase_path("bench/nanobench.cpp"), | 
| -    rebase_path("bench/nanobenchAndroid.cpp"), | 
| -  ] | 
| -  deps = [ | 
| -    ":flags", | 
| -    ":gm", | 
| -    ":gpu_tool_utils", | 
| -    ":skia", | 
| -    ":tool_utils", | 
| -  ] | 
| -} | 
| +  bench_sources = exec_script("gyp/find.py", | 
| +                              [ | 
| +                                "*.c*", | 
| +                                rebase_path("bench"), | 
| +                              ], | 
| +                              "list lines", | 
| +                              []) | 
| + | 
| +  test_lib("bench") { | 
| +    public_include_dirs = [ "bench" ] | 
| +    sources = bench_sources | 
| +    sources -= [ | 
| +      rebase_path("bench/nanobench.cpp"), | 
| +      rebase_path("bench/nanobenchAndroid.cpp"), | 
| +    ] | 
| +    deps = [ | 
| +      ":flags", | 
| +      ":gm", | 
| +      ":gpu_tool_utils", | 
| +      ":skia", | 
| +      ":tool_utils", | 
| +    ] | 
| +  } | 
|  | 
| -test_lib("experimental_svg_model") { | 
| -  public_include_dirs = [ "experimental/svg/model" ] | 
| -  sources = [ | 
| -    "experimental/svg/model/SkSVGAttribute.cpp", | 
| -    "experimental/svg/model/SkSVGAttributeParser.cpp", | 
| -    "experimental/svg/model/SkSVGCircle.cpp", | 
| -    "experimental/svg/model/SkSVGContainer.cpp", | 
| -    "experimental/svg/model/SkSVGDOM.cpp", | 
| -    "experimental/svg/model/SkSVGEllipse.cpp", | 
| -    "experimental/svg/model/SkSVGLine.cpp", | 
| -    "experimental/svg/model/SkSVGNode.cpp", | 
| -    "experimental/svg/model/SkSVGPath.cpp", | 
| -    "experimental/svg/model/SkSVGPoly.cpp", | 
| -    "experimental/svg/model/SkSVGRect.cpp", | 
| -    "experimental/svg/model/SkSVGRenderContext.cpp", | 
| -    "experimental/svg/model/SkSVGSVG.cpp", | 
| -    "experimental/svg/model/SkSVGShape.cpp", | 
| -    "experimental/svg/model/SkSVGTransformableNode.cpp", | 
| -    "experimental/svg/model/SkSVGValue.cpp", | 
| -  ] | 
| -  deps = [ | 
| -    ":skia", | 
| -  ] | 
| -} | 
| +  test_lib("experimental_svg_model") { | 
| +    public_include_dirs = [ "experimental/svg/model" ] | 
| +    sources = [ | 
| +      "experimental/svg/model/SkSVGAttribute.cpp", | 
| +      "experimental/svg/model/SkSVGAttributeParser.cpp", | 
| +      "experimental/svg/model/SkSVGCircle.cpp", | 
| +      "experimental/svg/model/SkSVGContainer.cpp", | 
| +      "experimental/svg/model/SkSVGDOM.cpp", | 
| +      "experimental/svg/model/SkSVGEllipse.cpp", | 
| +      "experimental/svg/model/SkSVGLine.cpp", | 
| +      "experimental/svg/model/SkSVGNode.cpp", | 
| +      "experimental/svg/model/SkSVGPath.cpp", | 
| +      "experimental/svg/model/SkSVGPoly.cpp", | 
| +      "experimental/svg/model/SkSVGRect.cpp", | 
| +      "experimental/svg/model/SkSVGRenderContext.cpp", | 
| +      "experimental/svg/model/SkSVGSVG.cpp", | 
| +      "experimental/svg/model/SkSVGShape.cpp", | 
| +      "experimental/svg/model/SkSVGTransformableNode.cpp", | 
| +      "experimental/svg/model/SkSVGValue.cpp", | 
| +    ] | 
| +    deps = [ | 
| +      ":skia", | 
| +    ] | 
| +  } | 
|  | 
| -if (!is_component_build) {  # Our test tools use many non-SK_API APIs... | 
| executable("dm") { | 
| sources = [ | 
| "dm/DM.cpp", | 
|  |