# Copyright 2019 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/mojom_bindings_generator.gni")
import("//common-mk/pkg_config.gni")

group("all") {
  deps = [
    ":install_dbus_config",
    ":install_dbus_service",
    ":install_init",
    ":midis",
  ]
  if (use.seccomp) {
    deps += [ ":install_seccomp_policy" ]
  }
  if (use.test) {
    deps += [ ":midis_testrunner" ]
  }
  if (use.fuzzer) {
    deps += [ ":midis_seq_handler_fuzzer" ]
  }
}

generate_mojom_bindings("midis_mojo_bindings") {
  sources = [ "mojo/midis.mojom" ]
}

pkg_config("midis_common_pkg_deps") {
  pkg_deps = [
    "alsa",
    "libbrillo",
    "libchrome",
    "libmojo",
  ]
}

static_library("midis_common") {
  sources = [
    # Files included from Chrome //src/media/midi checkout.
    # This directory is placed in platform2 as platform2/media/midi.
    "../media/midi/message_util.cc",
    "../media/midi/midi_message_queue.cc",
    "client.cc",
    "client_tracker.cc",
    "device.cc",
    "device_tracker.cc",
    "ports.cc",
    "seq_handler.cc",
    "subdevice_client_fd_holder.cc",
  ]
  all_dependent_configs = [ ":midis_common_pkg_deps" ]
  deps = [ ":midis_mojo_bindings" ]
}

executable("midis") {
  sources = [
    "daemon.cc",
    "main.cc",
  ]
  install_path = "bin"
  libs = [ "dl" ]
  deps = [ ":midis_common" ]
}

install_config("install_init") {
  sources = [ "init/midis.conf" ]
  install_path = "/etc/init"
}

# Install midis DBUS configuration file
install_config("install_dbus_config") {
  sources = [ "dbus_permissions/org.chromium.Midis.conf" ]
  install_path = "/etc/dbus-1/system.d"
}

# Install D-Bus service activation configuration.
install_config("install_dbus_service") {
  sources = [ "dbus_permissions/org.chromium.Midis.service" ]
  install_path = "/usr/share/dbus-1/system-services"
}

if (use.seccomp) {
  # Install seccomp policy file.
  install_config("install_seccomp_policy") {
    sources = [ "seccomp/midis-seccomp-" + getenv("ARCH") + ".policy" ]
    install_path = "/usr/share/policy"
    outputs = [ "midis-seccomp.policy" ]
  }
}

if (use.test) {
  executable("midis_testrunner") {
    sources = [
      "tests/client_test.cc",
      "tests/client_tracker_test.cc",
      "tests/device_tracker_test.cc",
      "tests/seq_handler_test.cc",
      "tests/test_helper.cc",
    ]
    configs += [ "//common-mk:test" ]
    run_test = true
    deps = [
      ":midis_common",
      "../common-mk/testrunner:testrunner",
    ]
  }
}

# Fuzzer target.
if (use.fuzzer) {
  executable("midis_seq_handler_fuzzer") {
    sources = [ "seq_handler_fuzzer.cc" ]
    configs += [ "//common-mk/common_fuzzer:common_fuzzer" ]
    deps = [ ":midis_common" ]
  }
}
