# Copyright 2019 The Fuchsia Authors
#
# Use of this source code is governed by a MIT-style
# license that can be found in the LICENSE file or at
# https://opensource.org/licenses/MIT

import("//build/tracer/tracer.gni")
import("//build/zircon/migrated_targets.gni")
import("version_string.gni")

declare_args() {
  # Version string embedded in the kernel for `zx_system_get_version_string`.
  # If set to the default "", a string is generated based on the
  # status of the fuchsia git repository.
  kernel_version_string = ""
}

# The version string depends solely on the source and doesn't vary across
# machines or toolchains, so generate it only once.
gen_dir = get_label_info(".($default_toolchain)", "target_gen_dir")
if (current_toolchain == default_toolchain) {
  assert(gen_dir == target_gen_dir)

  _bin_visibility = [
    ":*",
    "//zircon/kernel:*",
  ]
  if (kernel_version_string != "") {
    generated_file("version-string.bin") {
      visibility = _bin_visibility
      outputs = [ kernel_version_string_file ]
      contents = kernel_version_string  # Not a list so no newline added.
    }
  } else {
    action("version-string.bin") {
      visibility = _bin_visibility
      script = "git-version-string.sh"
      inputs = [
        # Regenerate version if HEAD moves
        "//.git/HEAD",

        # Add "-dirty" suffix as needed
        "//.git/index",
      ]
      outputs = [ kernel_version_string_file ]
      hermetic_deps = false

      args = rebase_path([
                           kernel_version_string_file,
                           "//",
                         ],
                         root_build_dir)
    }
  }

  action("version-string.h") {
    visibility = [ ":*" ]
    script = "gen-version-string-header.sh"
    outputs = [ "$gen_dir/lib/version/version-string.h" ]
    deps = [ ":version-string.bin" ]
    sources = [ kernel_version_string_file ]
    args = rebase_path(sources + outputs, root_build_dir)
  }
} else {
  zx_library("version") {
    sources = [ "version.cc" ]
    defines = [ "ARCH=\"$current_cpu\"" ]
    public_deps = [ ":version-string.h($default_toolchain)" ]
    public_configs = [ ":gen.config" ]
    deps = [
      "//zircon/kernel/lib/console",
      "//zircon/kernel/lib/init",
    ]
  }

  config("gen.config") {
    visibility = [ ":*" ]
    include_dirs = [ gen_dir ]
  }
}
