# 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 = [
    ":container_config_parser",
    ":run_oci",
  ]
  if (use.test) {
    deps += [
      ":container_config_parser_test",
      ":run_oci_test",
    ]
  }
}

pkg_config("target_defaults") {
  libs = [ "mount" ]

  pkg_deps = [
    "libbrillo",
    "libcap",
    "libchrome-${libbase_ver}",
    "libminijail",
  ]
}

shared_library("container_config_parser") {
  configs += [ ":target_defaults" ]
  configs -= [ "//common-mk:no_exceptions" ]
  sources = [
    "container_config_parser.cc",
  ]
}

pkg_config("run_oci_config") {
  pkg_deps = [ "libcontainer" ]
}

executable("run_oci") {
  configs += [
    ":run_oci_config",
    ":target_defaults",
  ]
  configs -= [ "//common-mk:no_exceptions" ]
  sources = [
    "container_config_parser.cc",
    "run_oci.cc",
    "run_oci_utils.cc",
  ]
}

if (use.test) {
  pkg_config("test_config") {
    pkg_deps = [ "libchrome-test-${libbase_ver}" ]
  }

  executable("container_config_parser_test") {
    configs += [
      "//common-mk:test",
      ":target_defaults",
      ":test_config",
    ]
    configs -= [ "//common-mk:no_exceptions" ]
    sources = [
      "container_config_parser.cc",
      "container_config_parser_test.cc",
    ]
    deps = [
      "//common-mk/testrunner",
    ]
  }

  executable("run_oci_test") {
    configs += [
      "//common-mk:test",
      ":target_defaults",
      ":test_config",
    ]
    configs -= [ "//common-mk:no_exceptions" ]
    sources = [
      "run_oci_test.cc",
      "run_oci_utils.cc",
      "run_oci_utils_test.cc",
    ]
    deps = [
      "//common-mk/testrunner",
    ]
  }
}
