Add libdart PRODUCT targets for Fuchsia's dart_runner

R=rmacnak@google.com

dart:hello_dart.dartx memory footprint: 6292k -> 5572k
Review-Url: https://codereview.chromium.org/2975343002 .
diff --git a/runtime/BUILD.gn b/runtime/BUILD.gn
index 31f9257..524ee04 100644
--- a/runtime/BUILD.gn
+++ b/runtime/BUILD.gn
@@ -27,6 +27,15 @@
   }
 }
 
+# This is a config to use to build PRODUCT mode artifacts in a RELEASE build.
+# If a DEBUG build has been specified it will be ignored.
+config("dart_product_config") {
+  defines = []
+  if (!dart_debug) {
+    defines += [ "PRODUCT" ]
+  }
+}
+
 config("dart_precompiled_runtime_config") {
   defines = []
   defines += [ "DART_PRECOMPILED_RUNTIME" ]
@@ -161,15 +170,11 @@
     extra_deps += invoker.extra_deps
   }
   static_library(target_name) {
-    configs += [
-                 ":dart_config",
-                 ":dart_maybe_product_config",
-               ] + extra_configs
+    configs += [ ":dart_config" ] + extra_configs
     if (is_fuchsia) {
       configs -= [ "//build/config:symbol_visibility_hidden" ]
     }
     deps = [
-             "vm:libdart_platform",
              "third_party/double-conversion/src:libdouble_conversion",
              ":generate_version_cc_file",
            ] + extra_deps
@@ -193,38 +198,95 @@
 
 libdart_library("libdart_jit") {
   extra_deps = [
+    "vm:libdart_platform",
     "vm:libdart_lib_jit",
     "vm:libdart_vm_jit",
   ]
 }
 
-libdart_library("libdart_precompiled_runtime") {
-  extra_configs = [ ":dart_precompiled_runtime_config" ]
+libdart_library("libdart_jit_product") {
+  extra_configs = [ ":dart_product_config" ]
   extra_deps = [
+    "vm:libdart_platform_product",
+    "vm:libdart_lib_jit_product",
+    "vm:libdart_vm_jit_product",
+  ]
+}
+
+libdart_library("libdart_precompiled_runtime") {
+  extra_configs = [
+    ":dart_maybe_product_config",
+    ":dart_precompiled_runtime_config",
+  ]
+  extra_deps = [
+    "vm:libdart_platform",
     "vm:libdart_lib_precompiled_runtime",
     "vm:libdart_vm_precompiled_runtime",
   ]
 }
 
+libdart_library("libdart_precompiled_runtime_product") {
+  extra_configs = [
+    ":dart_product_config",
+    ":dart_precompiled_runtime_config",
+  ]
+  extra_deps = [
+    "vm:libdart_platform_product",
+    "vm:libdart_lib_precompiled_runtime_product",
+    "vm:libdart_vm_precompiled_runtime_product",
+  ]
+}
+
 libdart_library("libdart_nosnapshot_with_precompiler") {
   extra_configs = [
+    ":dart_maybe_product_config",
     ":dart_no_snapshot_config",
     ":dart_precompiler_config",
   ]
   extra_deps = [
+    "vm:libdart_platform",
     "vm:libdart_lib_nosnapshot_with_precompiler",
     "vm:libdart_vm_nosnapshot_with_precompiler",
   ]
 }
 
-libdart_library("libdart_with_precompiler") {
-  extra_configs = [ ":dart_precompiler_config" ]
+libdart_library("libdart_nosnapshot_with_precompiler_product") {
+  extra_configs = [
+    ":dart_product_config",
+    ":dart_no_snapshot_config",
+    ":dart_precompiler_config",
+  ]
   extra_deps = [
+    "vm:libdart_platform_product",
+    "vm:libdart_lib_nosnapshot_with_precompiler_product",
+    "vm:libdart_vm_nosnapshot_with_precompiler_product",
+  ]
+}
+
+libdart_library("libdart_with_precompiler") {
+  extra_configs = [
+    ":dart_maybe_product_config",
+    ":dart_precompiler_config",
+  ]
+  extra_deps = [
+    "vm:libdart_platform",
     "vm:libdart_lib_with_precompiler",
     "vm:libdart_vm_with_precompiler",
   ]
 }
 
+libdart_library("libdart_with_precompiler_product") {
+  extra_configs = [
+    ":dart_product_config",
+    ":dart_precompiler_config",
+  ]
+  extra_deps = [
+    "vm:libdart_platform_product",
+    "vm:libdart_lib_with_precompiler_product",
+    "vm:libdart_vm_with_precompiler_product",
+  ]
+}
+
 action("generate_version_cc_file") {
   deps = [
     "third_party/double-conversion/src:libdouble_conversion",
diff --git a/runtime/bin/BUILD.gn b/runtime/bin/BUILD.gn
index 2e58fdd..cd0213a 100644
--- a/runtime/bin/BUILD.gn
+++ b/runtime/bin/BUILD.gn
@@ -232,172 +232,221 @@
   }
 }
 
-static_library("libdart_builtin") {
-  configs += [
-    "..:dart_config",
-    "..:dart_maybe_product_config",
-  ]
-  if (is_fuchsia) {
-    configs -= [ "//build/config:symbol_visibility_hidden" ]
+template("build_libdart_builtin") {
+  extra_configs = []
+  if (defined(invoker.extra_configs)) {
+    extra_configs += invoker.extra_configs
   }
-  public_configs = [ ":libdart_builtin_config" ]
-  deps = [
-    ":generate_blink_cc_file",
-    ":generate_builtin_cc_file",
-    ":generate_cached_patches_cc_file",
-    ":generate_html_cc_file",
-    ":generate_html_common_cc_file",
-    ":generate_indexed_db_cc_file",
-    ":generate_io_cc_file",
-    ":generate_io_patch_cc_file",
-    ":generate_js_cc_file",
-    ":generate_js_util_cc_file",
-    ":generate_metadata_cc_file",
-    ":generate_svg_cc_file",
-    ":generate_web_audio_cc_file",
-    ":generate_web_gl_cc_file",
-    ":generate_web_sql_cc_file",
-  ]
-  include_dirs = [ ".." ]
-  set_sources_assignment_filter([
-                                  "*_test.cc",
-                                  "*_test.h",
-                                ])
-  sources = [
-              "log_android.cc",
-              "log_fuchsia.cc",
-              "log_linux.cc",
-              "log_macos.cc",
-              "log_win.cc",
-            ] + builtin_impl_sources_gypi
+  static_library(target_name) {
+    configs += [ "..:dart_config" ] + extra_configs
+    if (is_fuchsia) {
+      configs -= [ "//build/config:symbol_visibility_hidden" ]
+    }
+    public_configs = [ ":libdart_builtin_config" ]
+    deps = [
+      ":generate_blink_cc_file",
+      ":generate_builtin_cc_file",
+      ":generate_cached_patches_cc_file",
+      ":generate_html_cc_file",
+      ":generate_html_common_cc_file",
+      ":generate_indexed_db_cc_file",
+      ":generate_io_cc_file",
+      ":generate_io_patch_cc_file",
+      ":generate_js_cc_file",
+      ":generate_js_util_cc_file",
+      ":generate_metadata_cc_file",
+      ":generate_svg_cc_file",
+      ":generate_web_audio_cc_file",
+      ":generate_web_gl_cc_file",
+      ":generate_web_sql_cc_file",
+    ]
+    include_dirs = [ ".." ]
+    set_sources_assignment_filter([
+                                    "*_test.cc",
+                                    "*_test.h",
+                                  ])
+    sources = [
+                "log_android.cc",
+                "log_fuchsia.cc",
+                "log_linux.cc",
+                "log_macos.cc",
+                "log_win.cc",
+              ] + builtin_impl_sources_gypi
+  }
 }
 
-executable("gen_snapshot") {
-  configs += [
-    "..:dart_config",
-    "..:dart_maybe_product_config",
-    "..:dart_precompiler_config",
-  ]
-  if (is_fuchsia) {
-    configs -= [ "//build/config:symbol_visibility_hidden" ]
+build_libdart_builtin("libdart_builtin") {
+  extra_configs = [ "..:dart_maybe_product_config" ]
+}
+
+build_libdart_builtin("libdart_builtin_product") {
+  extra_configs = [ "..:dart_product_config" ]
+}
+
+template("build_gen_snapshot") {
+  extra_configs = []
+  if (defined(invoker.extra_configs)) {
+    extra_configs += invoker.extra_configs
   }
-  deps = [
-    ":gen_resources_cc",
+  extra_deps = []
+  if (defined(invoker.extra_deps)) {
+    extra_deps += invoker.extra_deps
+  }
+  executable(target_name) {
+    configs += [
+                 "..:dart_config",
+                 "..:dart_precompiler_config",
+               ] + extra_configs
+    if (is_fuchsia) {
+      configs -= [ "//build/config:symbol_visibility_hidden" ]
+    }
+    deps = [
+             ":gen_resources_cc",
+             ":generate_builtin_cc_file",
+             ":generate_io_cc_file",
+             ":generate_io_patch_cc_file",
+           ] + extra_deps
+
+    sources = [
+      # Include generated source files.
+      "$target_gen_dir/builtin_gen.cc",
+      "$target_gen_dir/io_gen.cc",
+      "$target_gen_dir/io_patch_gen.cc",
+      "$target_gen_dir/resources_gen.cc",
+      "address_sanitizer.cc",
+      "builtin.cc",
+      "builtin.h",
+      "loader.cc",
+      "loader.h",
+
+      # Very limited native resolver provided.
+      "builtin_common.cc",
+      "builtin_gen_snapshot.cc",
+      "dfe.cc",
+      "dfe.h",
+      "gen_snapshot.cc",
+      "vmservice_impl.cc",
+      "vmservice_impl.h",
+    ]
+
+    include_dirs = [ ".." ]
+
+    if (dart_use_tcmalloc) {
+      deps += [ "//third_party/tcmalloc" ]
+    }
+
+    if (is_mac) {
+      libs = [
+        "CoreFoundation.framework",
+        "CoreServices.framework",
+      ]
+    }
+
+    if (is_win) {
+      libs = [
+        "iphlpapi.lib",
+        "psapi.lib",
+        "ws2_32.lib",
+        "Rpcrt4.lib",
+        "winmm.lib",
+      ]
+    }
+
+    if (is_fuchsia) {
+      libs = [ "launchpad" ]
+    }
+  }
+}
+
+build_gen_snapshot("gen_snapshot") {
+  extra_configs = [ "..:dart_maybe_product_config" ]
+  extra_deps = [
     ":gen_snapshot_dart_io",
-    ":generate_builtin_cc_file",
-    ":generate_io_cc_file",
-    ":generate_io_patch_cc_file",
     ":libdart_builtin",
     "..:libdart_nosnapshot_with_precompiler",
   ]
+}
 
-  sources = [
-    # Include generated source files.
-    "$target_gen_dir/builtin_gen.cc",
-    "$target_gen_dir/io_gen.cc",
-    "$target_gen_dir/io_patch_gen.cc",
-    "$target_gen_dir/resources_gen.cc",
-    "address_sanitizer.cc",
-    "builtin.cc",
-    "builtin.h",
-    "loader.cc",
-    "loader.h",
-
-    # Very limited native resolver provided.
-    "builtin_common.cc",
-    "builtin_gen_snapshot.cc",
-    "dfe.cc",
-    "dfe.h",
-    "gen_snapshot.cc",
-    "vmservice_impl.cc",
-    "vmservice_impl.h",
+build_gen_snapshot("gen_snapshot_product") {
+  extra_configs = [ "..:dart_product_config" ]
+  extra_deps = [
+    ":gen_snapshot_dart_io_product",
+    ":libdart_builtin_product",
+    "..:libdart_nosnapshot_with_precompiler_product",
   ]
-
-  include_dirs = [ ".." ]
-
-  if (dart_use_tcmalloc) {
-    deps += [ "//third_party/tcmalloc" ]
-  }
-
-  if (is_mac) {
-    libs = [
-      "CoreFoundation.framework",
-      "CoreServices.framework",
-    ]
-  }
-
-  if (is_win) {
-    libs = [
-      "iphlpapi.lib",
-      "psapi.lib",
-      "ws2_32.lib",
-      "Rpcrt4.lib",
-      "winmm.lib",
-    ]
-  }
-
-  if (is_fuchsia) {
-    libs = [ "launchpad" ]
-  }
 }
 
 # A source set for the implementation of 'dart:io' library
 # (without secure sockets) suitable for linking with gen_snapshot.
-source_set("gen_snapshot_dart_io") {
-  configs += [
-    "..:dart_config",
-    "..:dart_maybe_product_config",
-    "..:dart_precompiler_config",
-  ]
-  if (is_fuchsia) {
-    configs -= [ "//build/config:symbol_visibility_hidden" ]
+template("build_gen_snapshot_dart_io") {
+  extra_configs = []
+  if (defined(invoker.extra_configs)) {
+    extra_configs += invoker.extra_configs
   }
+  source_set(target_name) {
+    configs += [
+                 "..:dart_config",
+                 "..:dart_precompiler_config",
+               ] + extra_configs
+    if (is_fuchsia) {
+      configs -= [ "//build/config:symbol_visibility_hidden" ]
+    }
 
-  deps = [
-    "$dart_zlib_path",
-  ]
+    deps = [
+      "$dart_zlib_path",
+    ]
 
-  custom_sources_filter = [
-    "*_test.cc",
-    "*_test.h",
-    "builtin.cc",
-    "builtin_common.cc",
-    "builtin_gen_snapshot.cc",
-  ]
-  if (!is_mac && !is_ios) {
-    # Dart tree uses *_macos.* instead of *_mac.*
-    custom_sources_filter += [
-      "*_macos.h",
-      "*_macos.cc",
+    custom_sources_filter = [
+      "*_test.cc",
+      "*_test.h",
+      "builtin.cc",
+      "builtin_common.cc",
+      "builtin_gen_snapshot.cc",
+    ]
+    if (!is_mac && !is_ios) {
+      # Dart tree uses *_macos.* instead of *_mac.*
+      custom_sources_filter += [
+        "*_macos.h",
+        "*_macos.cc",
+      ]
+    }
+    set_sources_assignment_filter(custom_sources_filter)
+
+    defines = [ "DART_IO_SECURE_SOCKET_DISABLED" ]
+
+    sources = io_impl_sources_gypi + builtin_impl_sources_gypi
+    sources += [
+      "io_natives.cc",
+      "io_natives.h",
+    ]
+
+    include_dirs = [
+      "..",
+      "//third_party",
     ]
   }
-  set_sources_assignment_filter(custom_sources_filter)
+}
 
-  defines = [ "DART_IO_SECURE_SOCKET_DISABLED" ]
+build_gen_snapshot_dart_io("gen_snapshot_dart_io") {
+  extra_configs = [ "..:dart_maybe_product_config" ]
+}
 
-  sources = io_impl_sources_gypi + builtin_impl_sources_gypi
-  sources += [
-    "io_natives.cc",
-    "io_natives.h",
-  ]
-
-  include_dirs = [
-    "..",
-    "//third_party",
-  ]
+build_gen_snapshot_dart_io("gen_snapshot_dart_io_product") {
+  extra_configs = [ "..:dart_product_config" ]
 }
 
 # A source set for the implementation of 'dart:io' library.
 template("dart_io") {
+  extra_configs = []
+  if (defined(invoker.extra_configs)) {
+    extra_configs += invoker.extra_configs
+  }
   extra_sources = []
   if (defined(invoker.extra_sources)) {
     extra_sources += invoker.extra_sources
   }
   source_set(target_name) {
-    configs += [
-      "..:dart_config",
-      "..:dart_maybe_product_config",
-    ]
+    configs += [ "..:dart_config" ] + extra_configs
     if (is_fuchsia) {
       configs -= [ "//build/config:symbol_visibility_hidden" ]
     }
@@ -465,6 +514,16 @@
 }
 
 dart_io("embedded_dart_io") {
+  extra_configs = [ "..:dart_maybe_product_config" ]
+  extra_sources = [
+    "builtin_nolib.cc",
+    "embedded_dart_io.cc",
+    "embedded_dart_io.h",
+  ]
+}
+
+dart_io("embedded_dart_io_product") {
+  extra_configs = [ "..:dart_product_config" ]
   extra_sources = [
     "builtin_nolib.cc",
     "embedded_dart_io.cc",
@@ -473,6 +532,7 @@
 }
 
 dart_io("standalone_dart_io") {
+  extra_configs = [ "..:dart_maybe_product_config" ]
   extra_sources = []
 }
 
diff --git a/runtime/vm/BUILD.gn b/runtime/vm/BUILD.gn
index 3a79bd5..f836909 100644
--- a/runtime/vm/BUILD.gn
+++ b/runtime/vm/BUILD.gn
@@ -28,129 +28,117 @@
   }
 }
 
-static_library("libdart_platform") {
-  configs += [
-    "..:dart_config",
-    "..:dart_maybe_product_config",
-  ]
-  if (is_fuchsia) {
-    configs -= [ "//build/config:symbol_visibility_hidden" ]
-    deps = [
-      "//apps/tracing/lib/trace",
-    ]
+template("build_libdart_platform") {
+  extra_configs = []
+  if (defined(invoker.extra_configs)) {
+    extra_configs += invoker.extra_configs
   }
-  public_configs = [ ":libdart_vm_config" ]
+  static_library(target_name) {
+    configs += [ "..:dart_config" ] + extra_configs
+    if (is_fuchsia) {
+      configs -= [ "//build/config:symbol_visibility_hidden" ]
+      deps = [
+        "//apps/tracing/lib/trace",
+      ]
+    }
+    public_configs = [ ":libdart_vm_config" ]
 
-  sources = rebase_path(processed_gypis.platform_sources, ".", "../platform")
+    sources = rebase_path(processed_gypis.platform_sources, ".", "../platform")
 
-  include_dirs = [ ".." ]
+    include_dirs = [ ".." ]
+  }
+}
+
+build_libdart_platform("libdart_platform") {
+  extra_configs = [ "..:dart_maybe_product_config" ]
+}
+
+build_libdart_platform("libdart_platform_product") {
+  extra_configs = [ "..:dart_product_config" ]
 }
 
 vm_sources_list = processed_gypis.vm_sources
 
-source_set("libdart_vm_jit") {
-  configs += [
-    "..:dart_config",
-    "..:dart_maybe_product_config",
-  ]
-  if (is_fuchsia) {
-    configs -= [ "//build/config:symbol_visibility_hidden" ]
-    deps = [
-      "//apps/tracing/lib/trace",
-    ]
+template("build_libdart_vm") {
+  extra_configs = []
+  if (defined(invoker.extra_configs)) {
+    extra_configs += invoker.extra_configs
   }
-  public_configs = [ ":libdart_vm_config" ]
-  set_sources_assignment_filter([
-                                  "*_test.cc",
-                                  "*_test.h",
-                                ])
-  sources = vm_sources_list
-  include_dirs = [ ".." ]
+  source_set(target_name) {
+    configs += [ "..:dart_config" ] + extra_configs
+    if (is_fuchsia) {
+      configs -= [ "//build/config:symbol_visibility_hidden" ]
+      deps = [
+        "//apps/tracing/lib/trace",
+      ]
+    }
+    public_configs = [ ":libdart_vm_config" ]
+    set_sources_assignment_filter([
+                                    "*_test.cc",
+                                    "*_test.h",
+                                  ])
+    sources = vm_sources_list
+    include_dirs = [ ".." ]
+  }
 }
 
-source_set("libdart_vm_precompiled_runtime") {
-  configs += [
-    "..:dart_config",
+build_libdart_vm("libdart_vm_jit") {
+  extra_configs = [ "..:dart_maybe_product_config" ]
+}
+
+build_libdart_vm("libdart_vm_jit_product") {
+  extra_configs = [ "..:dart_product_config" ]
+}
+
+build_libdart_vm("libdart_vm_precompiled_runtime") {
+  extra_configs = [
     "..:dart_maybe_product_config",
     "..:dart_precompiled_runtime_config",
   ]
-  if (is_fuchsia) {
-    configs -= [ "//build/config:symbol_visibility_hidden" ]
-    deps = [
-      "//apps/tracing/lib/trace",
-    ]
-  }
-  public_configs = [ ":libdart_vm_config" ]
-  set_sources_assignment_filter([
-                                  "*_test.cc",
-                                  "*_test.h",
-                                ])
-  sources = vm_sources_list
-  include_dirs = [ ".." ]
 }
 
-source_set("libdart_vm_nosnapshot") {
-  configs += [
-    "..:dart_config",
+build_libdart_vm("libdart_vm_precompiled_runtime_product") {
+  extra_configs = [
+    "..:dart_product_config",
+    "..:dart_precompiled_runtime_config",
+  ]
+}
+
+build_libdart_vm("libdart_vm_nosnapshot") {
+  extra_configs = [
     "..:dart_maybe_product_config",
     "..:dart_no_snapshot_config",
   ]
-  if (is_fuchsia) {
-    configs -= [ "//build/config:symbol_visibility_hidden" ]
-    deps = [
-      "//apps/tracing/lib/trace",
-    ]
-  }
-  public_configs = [ ":libdart_vm_config" ]
-  set_sources_assignment_filter([
-                                  "*_test.cc",
-                                  "*_test.h",
-                                ])
-  sources = vm_sources_list
-  include_dirs = [ ".." ]
 }
 
-source_set("libdart_vm_nosnapshot_with_precompiler") {
-  configs += [
-    "..:dart_config",
+build_libdart_vm("libdart_vm_nosnapshot_with_precompiler") {
+  extra_configs = [
     "..:dart_maybe_product_config",
     "..:dart_precompiler_config",
     "..:dart_no_snapshot_config",
   ]
-  if (is_fuchsia) {
-    configs -= [ "//build/config:symbol_visibility_hidden" ]
-    deps = [
-      "//apps/tracing/lib/trace",
-    ]
-  }
-  public_configs = [ ":libdart_vm_config" ]
-  set_sources_assignment_filter([
-                                  "*_test.cc",
-                                  "*_test.h",
-                                ])
-  sources = vm_sources_list
-  include_dirs = [ ".." ]
 }
 
-source_set("libdart_vm_with_precompiler") {
-  configs += [
-    "..:dart_config",
+build_libdart_vm("libdart_vm_nosnapshot_with_precompiler_product") {
+  extra_configs = [
+    "..:dart_product_config",
+    "..:dart_precompiler_config",
+    "..:dart_no_snapshot_config",
+  ]
+}
+
+build_libdart_vm("libdart_vm_with_precompiler") {
+  extra_configs = [
     "..:dart_maybe_product_config",
     "..:dart_precompiler_config",
   ]
-  if (is_fuchsia) {
-    configs -= [ "//build/config:symbol_visibility_hidden" ]
-    deps = [
-      "//apps/tracing/lib/trace",
-    ]
-  }
-  public_configs = [ ":libdart_vm_config" ]
-  set_sources_assignment_filter([
-                                  "*_test.cc",
-                                  "*_test.h",
-                                ])
-  sources = vm_sources_list
-  include_dirs = [ ".." ]
+}
+
+build_libdart_vm("libdart_vm_with_precompiler_product") {
+  extra_configs = [
+    "..:dart_product_config",
+    "..:dart_precompiler_config",
+  ]
 }
 
 template("process_library_source") {
@@ -199,6 +187,30 @@
   }
 }
 
+template("build_libdart_lib") {
+  extra_configs = []
+  if (defined(invoker.extra_configs)) {
+    extra_configs += invoker.extra_configs
+  }
+  extra_deps = []
+  if (defined(invoker.extra_deps)) {
+    extra_deps += invoker.extra_deps
+  }
+  extra_sources = []
+  if (defined(invoker.extra_sources)) {
+    extra_sources += invoker.extra_sources
+  }
+  source_set(target_name) {
+    configs += [ "..:dart_config" ] + extra_configs
+    if (is_fuchsia) {
+      configs -= [ "//build/config:symbol_visibility_hidden" ]
+    }
+    deps = extra_deps
+    sources = extra_sources
+    include_dirs = [ ".." ]
+  }
+}
+
 # This templates expects invoker.sources to be a list of lists.
 # The lists contain the following information about each library:
 #   library name (string)
@@ -248,57 +260,66 @@
 
   all_libsources = rebase_path(invoker.allsources, ".", "../lib")
 
-  source_set("libdart_lib_nosnapshot_with_precompiler") {
-    configs += [
-      "..:dart_config",
+  build_libdart_lib("libdart_lib_nosnapshot_with_precompiler") {
+    extra_configs = [
       "..:dart_maybe_product_config",
       "..:dart_precompiler_config",
     ]
-    if (is_fuchsia) {
-      configs -= [ "//build/config:symbol_visibility_hidden" ]
-    }
-    deps = libdeps
-    sources = all_libsources + [ "bootstrap.cc" ] + liboutputs
-    include_dirs = [ ".." ]
+    extra_deps = libdeps
+    extra_sources = all_libsources + [ "bootstrap.cc" ] + liboutputs
   }
 
-  source_set("libdart_lib_with_precompiler") {
-    configs += [
-      "..:dart_config",
+  build_libdart_lib("libdart_lib_nosnapshot_with_precompiler_product") {
+    extra_configs = [
+      "..:dart_product_config",
+      "..:dart_precompiler_config",
+    ]
+    extra_deps = libdeps
+    extra_sources = all_libsources + [ "bootstrap.cc" ] + liboutputs
+  }
+
+  build_libdart_lib("libdart_lib_with_precompiler") {
+    extra_configs = [
       "..:dart_maybe_product_config",
       "..:dart_precompiler_config",
     ]
-    if (is_fuchsia) {
-      configs -= [ "//build/config:symbol_visibility_hidden" ]
-    }
-    deps = libdeps
-    sources = all_libsources + [ "bootstrap_nocore.cc" ]
-    include_dirs = [ ".." ]
+    extra_deps = libdeps
+    extra_sources = all_libsources + [ "bootstrap_nocore.cc" ]
   }
 
-  source_set("libdart_lib_jit") {
-    configs += [
-      "..:dart_config",
-      "..:dart_maybe_product_config",
+  build_libdart_lib("libdart_lib_with_precompiler_product") {
+    extra_configs = [
+      "..:dart_product_config",
+      "..:dart_precompiler_config",
     ]
-    if (is_fuchsia) {
-      configs -= [ "//build/config:symbol_visibility_hidden" ]
-    }
-    sources = all_libsources + [ "bootstrap_nocore.cc" ]
-    include_dirs = [ ".." ]
+    extra_deps = libdeps
+    extra_sources = all_libsources + [ "bootstrap_nocore.cc" ]
   }
 
-  source_set("libdart_lib_precompiled_runtime") {
-    configs += [
-      "..:dart_config",
+  build_libdart_lib("libdart_lib_jit") {
+    extra_configs = [ "..:dart_maybe_product_config" ]
+    extra_sources = all_libsources + [ "bootstrap_nocore.cc" ]
+  }
+
+  build_libdart_lib("libdart_lib_jit_product") {
+    extra_configs = [ "..:dart_product_config" ]
+    extra_sources = all_libsources + [ "bootstrap_nocore.cc" ]
+  }
+
+  build_libdart_lib("libdart_lib_precompiled_runtime") {
+    extra_configs = [
       "..:dart_maybe_product_config",
       "..:dart_precompiled_runtime_config",
     ]
-    if (is_fuchsia) {
-      configs -= [ "//build/config:symbol_visibility_hidden" ]
-    }
-    sources = all_libsources + [ "bootstrap_nocore.cc" ]
-    include_dirs = [ ".." ]
+    extra_sources = all_libsources + [ "bootstrap_nocore.cc" ]
+  }
+
+  build_libdart_lib("libdart_lib_precompiled_runtime_product") {
+    extra_configs = [
+      "..:dart_product_config",
+      "..:dart_precompiled_runtime_config",
+    ]
+    extra_sources = all_libsources + [ "bootstrap_nocore.cc" ]
   }
 }