# 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.

assert(!is_component_build, "component build is unsupported on iOS")

declare_args() {
  # Control whether cronet is build (this is usually set by the script
  # components/cronet/tools/cr_cronet.py as cronet requires specific
  # gn args to build correctly).
  is_cronet_build = false
}

# This list all targets that needs to be build as part of "gn_all" on iOS.
# This list should generally only include executables, but since some code
# has not yet been upstreamed it will sometimes also include targets that
# are not used upstream to ensure they are not broken inadvertently.
group("all") {
  testonly = true
  if (is_cronet_build) {
    deps = [
      "//components/cronet/ios:cronet_package",
      "//ios/crnet:crnet_framework",
      "//ios/crnet/crnet_consumer",
      "//ios/crnet/test:crnet_test",
    ]
  } else {
    deps = [
      "//ios/chrome:ios_chrome_unittests",
      "//ios/chrome/app",
      "//ios/chrome/browser",
      "//ios/chrome/common",
      "//ios/chrome/common/physical_web",
      "//ios/chrome/share_extension:packed_resources",
      "//ios/chrome/today_extension:packed_resources",
      "//ios/net:ios_net_unittests",
      "//ios/public/provider/chrome/browser",
      "//ios/public/provider/web",
      "//ios/testing:ocmock_support_unittest",
      "//ios/third_party/earl_grey",
      "//ios/web:earl_grey_test_support",
      "//ios/web:ios_web_inttests",
      "//ios/web:ios_web_unittests",
      "//ios/web/shell:ios_web_shell",
      "//ios/web/shell/test:ios_web_shell_test_host",
    ]
  }
}
