# Copyright 2018 The Chromium OS 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("//common-mk/pkg_config.gni")

group("all") {
  deps = [
    ":arc-apply-per-board-config",
    ":arc-create-data",
    ":arc-handle-upgrade",
    ":arc-prepare-host-generated-dir",
    ":arc-remove-data",
    ":arc-remove-stale-data",
    ":arc-setup",
    ":generate_squashfs",
  ]
  if (use.test) {
    deps += [ ":arc-setup_testrunner" ]
  }
  if (use.fuzzer) {
    deps += [
      ":arc_property_util_expand_property_contents_fuzzer",
      ":arc_setup_util_find_all_properties_fuzzer",
      ":arc_setup_util_find_fingerprint_and_sdk_version_fuzzer",
    ]
  }
}

pkg_config("target_defaults_pkg_deps") {
  pkg_deps = [
    "libbrillo",
    "libchrome",
    "libcros_config",
    "libcrypto",
    "libcryptohome-client",
    "libmetrics",
    "libminijail",
    "libpatchpanel-client",
    "libselinux",

    # system_api depends on protobuf (or protobuf-lite). It must appear
    # before protobuf here or the linker flags won"t be in the right
    # order.
    "system_api",
  ]
  if (use.fuzzer) {
    pkg_deps += [ "protobuf" ]
  } else {
    pkg_deps += [ "protobuf-lite" ]
  }
}

config("target_defaults") {
  configs = [ ":target_defaults_pkg_deps" ]
  defines = [
    "OS_CHROMEOS",
    "USE_ARCVM=${use.arcvm}",
    "USE_HOUDINI=${use.houdini}",
    "USE_HOUDINI64=${use.houdini64}",
    "USE_NDK_TRANSLATION=${use.ndk_translation}",
  ]
}

static_library("libarc_setup") {
  sources = [
    "arc_property_util.cc",
    "arc_setup.cc",
    "arc_setup_metrics.cc",
    "arc_setup_util.cc",
    "art_container.cc",
    "config.cc",
  ]
  configs += [ ":target_defaults" ]
  libs = [ "bootstat" ]
}

executable("arc-setup") {
  sources = [ "main.cc" ]
  configs += [ ":target_defaults" ]
  deps = [ ":libarc_setup" ]
}

executable("arc-remove-data") {
  sources = [ "arc_remove_data_main.cc" ]
  configs += [ ":target_defaults" ]
  deps = [ ":libarc_setup" ]
}

executable("arc-remove-stale-data") {
  sources = [ "arc_remove_stale_data_main.cc" ]
  configs += [ ":target_defaults" ]
  deps = [ ":libarc_setup" ]
}

executable("arc-apply-per-board-config") {
  sources = [ "arc_apply_per_board_config_main.cc" ]
  configs += [ ":target_defaults" ]
  deps = [ ":libarc_setup" ]
}

executable("arc-create-data") {
  sources = [ "arc_create_data_main.cc" ]
  configs += [ ":target_defaults" ]
  deps = [ ":libarc_setup" ]
}

executable("arc-handle-upgrade") {
  sources = [ "arc_handle_upgrade_main.cc" ]
  configs += [ ":target_defaults" ]
  deps = [ ":libarc_setup" ]
}

executable("arc-prepare-host-generated-dir") {
  sources = [ "arc_prepare_host_generated_dir_main.cc" ]
  configs += [ ":target_defaults" ]
  deps = [ ":libarc_setup" ]
}

action("mkdir_squashfs_source_dir") {
  inputs = []
  outputs = [ "${root_gen_dir}/squashfs_source_dir" ]
  script = "//common-mk/file_generator_wrapper.py"
  args = [
    "mkdir",
    "-p",
    "${root_gen_dir}/squashfs_source_dir",
  ]
}

action("generate_squashfs") {
  deps = [ ":mkdir_squashfs_source_dir" ]
  inputs = [ "${root_gen_dir}/squashfs_source_dir" ]
  outputs = [ "${root_out_dir}/dev-rootfs.squashfs" ]
  script = "//common-mk/file_generator_wrapper.py"
  args = [
    "mksquashfs",
    "${root_gen_dir}/squashfs_source_dir",
    "${root_out_dir}/dev-rootfs.squashfs",
    "-no-progress",
    "-info",
    "-all-root",
    "-noappend",
    "-comp",
    "lzo",
    "-b",
    "4K",

    # Create rootfs and necessary dev nodes for art container.
    # ashmem minor number is dynamic determined and will be bind
    # mounted.
    "-p",
    "/dev d 700 0 0",
    "-p",
    "/dev/ashmem c 666 root root 1 3",
    "-p",
    "/dev/random c 666 root root 1 8",
    "-p",
    "/dev/urandom c 666 root root 1 9",
  ]
}

if (use.test) {
  pkg_config("arc-setup_testrunner_pkg_deps") {
    pkg_deps = [
      "libbrillo-test",
      "libchrome-test",
    ]
  }
  executable("arc-setup_testrunner") {
    sources = [
      "arc_property_util_test.cc",
      "arc_setup_metrics_test.cc",
      "arc_setup_test.cc",
      "arc_setup_util_test.cc",
      "art_container_test.cc",
      "config_test.cc",
    ]
    configs += [
      "//common-mk:test",
      ":arc-setup_testrunner_pkg_deps",
      ":target_defaults",
    ]

    deps = [
      ":libarc_setup",
      "../../common-mk/testrunner:testrunner",
    ]
  }
}

if (use.fuzzer) {
  executable("arc_setup_util_find_all_properties_fuzzer") {
    sources = [ "arc_setup_util_find_all_properties_fuzzer.cc" ]
    configs += [
      "//common-mk/common_fuzzer",
      ":target_defaults",
    ]
    deps = [ ":libarc_setup" ]
  }

  executable("arc_setup_util_find_fingerprint_and_sdk_version_fuzzer") {
    sources = [ "arc_setup_util_find_fingerprint_and_sdk_version_fuzzer.cc" ]
    configs += [
      "//common-mk/common_fuzzer",
      ":target_defaults",
    ]
    deps = [ ":libarc_setup" ]
  }

  executable("arc_property_util_expand_property_contents_fuzzer") {
    sources = [ "arc_property_util_expand_property_contents_fuzzer.cc" ]
    configs += [
      "//common-mk/common_fuzzer",
      ":target_defaults",
    ]
    deps = [ ":libarc_setup" ]
  }
}
