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

import("//tools/grit/grit_rule.gni")

gypi_values = exec_script(
    "//build/gypi_to_gn.py",
    [ rebase_path("../chrome_common.gypi") ],
    "scope",
    [ "../chrome_common.gypi" ])

# GYP version: chrome/chrome_resources.gyp:chrome_resources
#              (generate_common_resources action)
grit("resources") {
  source = "common_resources.grd"
  output_dir = "$root_gen_dir/chrome"
  output_name = "common_resources"
  outputs = [
    "grit/common_resources.h",
    "common_resources.pak",
  ]
}

# GYP version: chrome/chrome_resources.gyp:chrome_resources
#              (generate_extensions_api_resources action)
grit("extensions_api_resources") {
  source = "extensions_api_resources.grd"
  output_dir = "$root_gen_dir/chrome"
  outputs = [
    "grit/extensions_api_resources.h",
    "extensions_api_resources.pak",
  ]
}

# GYP version: chrome/chrome_common.gyp:common
static_library("common") {
  sources = rebase_path(gypi_values.chrome_common_sources, ".", "//chrome")
  defines = []

  configs += [ "//build/config/compiler:wexit_time_destructors" ]

  deps = [
    ":version",
    "//base:base",
    "//base:i18n",
    "//base:prefs",
    "//base:base_static",
    "//chrome:resources",
    "//chrome:strings",
    "//chrome/app/theme:theme_resources",
    "//chrome/common:constants",
    "//chrome/common/net",
    "//chrome/common/safe_browsing:proto",
    "//components/cloud_devices/common",
    "//components/content_settings/core/common",
    "//components/json_schema",
    "//components/metrics",
    "//components/policy:policy_component_common",
    "//components/translate/core/common",
    "//components/variations",
    "//content/public/common",
    "//crypto",
    "//extensions:extensions_resources",
    "//extensions/strings",
    "//net",
    "//skia",
    "//third_party/icu",
    "//third_party/libxml",
    "//third_party/sqlite",
    "//third_party/zlib:zip",
    "//ui/resources:resources",
    "//url",
    #":installer_util",  TODO(GYP)
    #"//media/cast/cast.gyp:cast_transport",  TODO(GYP)
  ]

  if (is_ios) {
    sources += [
      # Use this Mac file that was filtered out.
      "chrome_version_info_mac.mm",
    ]
  } else {
    # Non-iOS.
    deps += [
      "//chrome/common/extensions/api",
      "//components/visitedlink/common",
      "//components/autofill/content/common",
      "//components/autofill/core/common",
      "//components/password_manager/core/common",
      "//components/signin/core/common",
      "//components/translate/content/common",
      "//extensions/common/api",
      "//ipc",
      "//third_party/adobe/flash:flapper_version_h",
      "//third_party/re2",
      "//third_party/widevine/cdm:version_h",
      #'<(DEPTH)/extensions/extensions.gyp:extensions_common',  TODO(GYP)
    ]
  }

  if (enable_extensions) {
    sources += rebase_path(
        gypi_values.chrome_common_extensions_sources,
        ".", "//chrome")
    deps += [
      "//device/bluetooth",
      "//device/usb",
    ]
  }

  if (is_win || is_mac) {
    sources += rebase_path(
        gypi_values.chrome_common_win_mac_sources,
        ".", "//chrome")
    if (use_openssl) {
      sources -= [
        "extensions/api/networking_private/networking_private_crypto_nss.cc",
      ]
      # networking_private_crypto_openssl.cc depends on boringssl.
      deps += [
        "//third_party/boringssl",
      ]
    } else {
      sources -= [
        "extensions/api/networking_private/networking_private_crypto_openssl.cc",
      ]
    }
    deps += [ "//breakpad:client" ]
  }
  if (is_mac) {
    sources += rebase_path(
        gypi_values.chrome_common_mac_sources,
        ".", "//chrome")
  }

  if (enable_nacl) {
    deps += [
      #'<(DEPTH)/components/nacl.gyp:nacl_common',  TODO(GYP)
    ]
  }

  # Printing.
  if (printing_mode == 0) {
    sources -= [
      "print_messages.cc",
      "print_messages.h",
    ]
  } else {
    deps += [ "//printing" ]
    if (printing_mode == 1) {
      # Full printing support.
      sources += rebase_path(
          gypi_values.chrome_common_service_process_sources,
          ".", "//chrome")
    }
  }

  if (enable_service_discovery) {
    sources += [
      "local_discovery/service_discovery_client.cc",
      "local_discovery/service_discovery_client.h",
    ]
  }
  if (enable_mdns) {
    sources += [
      "local_discovery/service_discovery_client_impl.cc",
      "local_discovery/service_discovery_client_impl.h",
    ]
  }

  if (is_android) {
    sources -= [
      "badge_util.cc",
      "chrome_version_info_posix.cc",
      "extensions/manifest_handlers/minimum_chrome_version_checker.cc",
      "icon_with_badge_image_source.cc",
      "media_galleries/metadata_types.h",
      "spellcheck_common.cc",
    ]
  } else {
    # Non-Android.
    sources += rebase_path(
        gypi_values.chrome_common_importer_sources,
        ".", "//chrome")
  }

  if (is_win) {
    deps += [ "//third_party/wtl" ]
  }

  if (enable_mdns) {
    sources += [ "local_discovery/local_discovery_messages.h" ]
  }

  if (is_chromeos) {
    sources -= [ "chrome_version_info_linux.cc" ]
  }

  if (is_mac) {
    sources -= [
      "chrome_version_info_posix.cc",
    ]
    deps += [
      "//third_party/mach_override",
      "//third_party/google_toolbox_for_mac",
    ]
  }

  if (enable_remoting) {
    #deps += [ '../remoting/remoting.gyp:remoting_client_plugin' ]  TODO(GYP)
  }
  if (!enable_plugins) {
    sources -= [ "pepper_permission_util.cc" ]
  }
  if (!enable_webrtc) {
    sources -= [ "media/webrtc_logging_messages.h" ]
  }
  if (enable_configuration_policy) {
    deps += [ "//components/policy" ]
  }

  if (safe_browsing_mode == 1) {
    defines += [ "FULL_SAFE_BROWSING" ]
    sources += rebase_path(
        gypi_values.chrome_common_full_safe_browsing_sources,
        ".", "//chrome")
  }
  if (safe_browsing_mode == 2) {
    defines += [ "MOBILE_SAFE_BROWSING" ]
  }
}

if (is_linux) {
  action("version") {
    visibility = ":common"
    script = "//build/util/version.py"

    lastchange_path = "//build/util/LASTCHANGE"
    version_path = "//chrome/VERSION"
    template_input_path = "chrome_version_info_posix.h.version"
    if (is_chrome_branded) {
      branding_path = "//chrome/app/theme/google_chrome/BRANDING"
    } else {
      branding_path = "//chrome/app/theme/chromium/BRANDING"
    }

    inputs = [
      version_path,
      template_input_path,
      lastchange_path,
      branding_path,
    ]

    outfile = "$target_gen_dir/chrome_version_info_posix.h"
    outputs = [ outfile ]

    args = [
      "-f", rebase_path(version_path, root_build_dir),
      "-f", rebase_path(branding_path, root_build_dir),
      "-f", rebase_path(lastchange_path, root_build_dir),
      rebase_path(template_input_path, root_build_dir),
      rebase_path(outfile, root_build_dir),
    ]
  }
} else {
  # Other platforms have a different way to do versioning.
  group("version") {
  }
}

# GN version: chrome/common_constants.gyp:common_constants
static_library("constants") {
  sources = [
    "chrome_constants.cc",
    "chrome_constants.h",
    "chrome_icon_resources_win.cc",
    "chrome_icon_resources_win.h",
    "chrome_paths.cc",
    "chrome_paths.h",
    "chrome_paths_android.cc",
    "chrome_paths_internal.h",
    "chrome_paths_linux.cc",
    "chrome_paths_mac.mm",
    "chrome_paths_win.cc",
    "chrome_switches.cc",
    "chrome_switches.h",
    "env_vars.cc",
    "env_vars.h",
    "net/test_server_locations.cc",
    "net/test_server_locations.h",
    "pref_font_script_names-inl.h",
    "pref_font_webkit_names.h",
    "pref_names.cc",
    "pref_names.h",
    "widevine_cdm_constants.cc",
    "widevine_cdm_constants.h",
  ]

  deps = [
    "//base",
    "//base/third_party/dynamic_annotations",
    "//components/bookmarks/common",
    "//third_party/widevine/cdm:version_h",
  ]

  if (enable_nacl) {
    deps += [
      #'../components/nacl.gyp:nacl_switches',  TODO(GYP)
    ]
  }
}
