# Copyright 2015 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("//build/config/chrome_build.gni")
import("//build/util/lastchange.gni")
import("//build/util/process_version.gni")
if (!use_cobalt_customizations) {
import("//chrome/process_version_rc_template.gni")  # For branding_file_path.
}

declare_args() {
  use_unofficial_version_number = !is_chrome_branded
}

static_library("version_info") {
  sources = [
    "version_info.cc",
    "version_info.h",
  ]

  deps = [
    ":generate_version_info",
    "//base",
  ]

  public_deps = [
    ":generate_version_info",
    ":channel",
  ]

  if (is_starboard) {
    sources += [
      "starboard_version_info_values.h"
    ]

    # generate_version_info generateas Chrome-specific version values, unneeded
    # for Cobalt.
    deps -= [
      ":generate_version_info"
    ]

    public_deps -= [
      ":generate_version_info"
    ]
  }
}

if (!use_cobalt_customizations) {
# Isolate the //ui/base dependency in this target.
static_library("version_string") {
  sources = [
    "version_string.cc",
    "version_string.h",
  ]

  deps = [
    ":version_info",
    "//components/strings",
  ]

  if (use_unofficial_version_number) {
    defines = [ "USE_UNOFFICIAL_VERSION_NUMBER" ]
    deps += [ "//ui/base" ]
  }
}
}

source_set("channel") {
  sources = [
    "channel.h",
  ]
}

if (!use_cobalt_customizations) {
process_version("generate_version_info") {
  template_file = "version_info_values.h.version"
  sources = [
    "//chrome/VERSION",
    branding_file_path,
    lastchange_file,
  ]
  output = "$target_gen_dir/version_info_values.h"
}
}
