# 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/generate-dbus-adaptors.gni")
import("//common-mk/pkg_config.gni")
import("//common-mk/proto_library.gni")

group("all") {
  deps = [
    ":authpolicy_parser",
    ":authpolicyd",
    ":container-protos",
    ":dbus_code_generator",
    ":libauthpolicy",
    ":policy_code_generator",
  ]
  if (use.test) {
    deps += [
      ":authpolicy_test",
      ":stub_common",
      ":stub_kinit",
      ":stub_klist",
      ":stub_kpasswd",
      ":stub_net",
      ":stub_smbclient",
    ]
  }
  if (use.fuzzer) {
    deps += [ ":preg_parser_fuzzer" ]
  }
}

config("target_defaults") {
  cflags = [
    "-Wshadow",
    "-Wextra",

    # -Wextra enables unused parameter warnings, but there are unused parameters.
    "-Wno-unused-parameter",
  ]
}

# D-Bus code generator.
generate_dbus_adaptors("dbus_code_generator") {
  new_fd_bindings = true
  dbus_service_config = "dbus_bindings/dbus-service-config.json"
  dbus_adaptors_out_dir = "include/authpolicy"
  sources = [
    "dbus_bindings/org.chromium.AuthPolicy.xml",
  ]
}

# Container protos
proto_library("container-protos") {
  configs = [ ":target_defaults" ]
  proto_in_dir = "proto"
  proto_out_dir = "include/bindings"
  sources = [
    "${proto_in_dir}/authpolicy_containers.proto",
  ]
}

# Autogenerated policy sources
action("policy_code_generator") {
  policy_resources_dir = "${sysroot}/usr/share/policy_resources"
  out_dir = "${root_gen_dir}/include/bindings"
  policy_tools_dir = "${sysroot}/usr/share/policy_tools"
  script = "${policy_tools_dir}/generate_policy_source.py"

  sources = [
    "${policy_resources_dir}/VERSION",
    "${policy_resources_dir}/policy_templates.json",
  ]
  outputs = [
    "${out_dir}/policy_constants.h",
    "${out_dir}/policy_constants.cc",
  ]
  args = [
    "--cros-policy-constants-header=${out_dir}/policy_constants.h",
    "--cros-policy-constants-source=${out_dir}/policy_constants.cc",
    "${policy_resources_dir}/VERSION",
    "${OS}",
    "1",  # chromeos-flag
    "${policy_resources_dir}/policy_templates.json",
  ]
}

pkg_config("libauthpolicy_config") {
  pkg_deps = [
    "dbus-1",
    "libbrillo-${libbase_ver}",
    "libchrome-${libbase_ver}",
    "libsession_manager-client",
    "libpcrecpp",
  ]
}

# Authpolicy library.
static_library("libauthpolicy") {
  configs += [
    ":libauthpolicy_config",
    ":target_defaults",
  ]
  gen_src_in_dir = "${root_gen_dir}/include/bindings"
  sources = [
    "${gen_src_in_dir}/policy_constants.cc",
    "anonymizer.cc",
    "auth_data_cache.cc",
    "authpolicy.cc",
    "authpolicy_flags.cc",
    "authpolicy_metrics.cc",
    "constants.cc",
    "cryptohome_client.cc",
    "gpo_version_cache.cc",
    "jail_helper.cc",
    "log_colors.cc",
    "path_service.cc",
    "platform_helper.cc",
    "policy/device_policy_encoder.cc",
    "policy/extension_policy_encoder.cc",
    "policy/policy_encoder_helper.cc",
    "policy/preg_parser.cc",
    "policy/preg_policy_encoder.cc",
    "policy/user_policy_encoder.cc",
    "process_executor.cc",
    "samba_helper.cc",
    "samba_interface.cc",
    "session_manager_client.cc",
    "tgt_manager.cc",
  ]
  libs = [
    "installattributes-${libbase_ver}",
    "policy-${libbase_ver}",
  ]
  deps = [
    ":container-protos",
    ":dbus_code_generator",
    ":policy_code_generator",
    "//common-mk/external_dependencies:policy-protos",
    "//common-mk/external_dependencies:user_policy-protos",
  ]
}

pkg_config("authpolicy_parser_config") {
  pkg_deps = [
    "libbrillo-${libbase_ver}",
    "libcap",
    "libchrome-${libbase_ver}",
    "libmetrics-${libbase_ver}",
    "libminijail",
    "libpcrecpp",

    # system_api depends on protobuf (or protobuf-lite). It must
    # appear before protobuf or the linker flags won't be in the right
    # order.
    "system_api",
    "protobuf-lite",
  ]
}

# Parser tool.
executable("authpolicy_parser") {
  configs += [
    ":authpolicy_parser_config",
    ":target_defaults",
  ]
  sources = [
    "authpolicy_parser_main.cc",
  ]
  deps = [
    ":libauthpolicy",
  ]
}

# Authpolicy daemon executable.
executable("authpolicyd") {
  configs += [
    ":authpolicy_parser_config",
    ":target_defaults",
  ]
  sources = [
    "authpolicy_main.cc",
  ]
  deps = [
    ":authpolicy_parser",
    ":libauthpolicy",
  ]
}

# Unit tests.
if (use.test) {
  pkg_config("authpolicy_test_config") {
    pkg_deps = [
      "libbrillo-${libbase_ver}",
      "libcap",
      "libchrome-${libbase_ver}",
      "libchrome-test-${libbase_ver}",
      "libmetrics-${libbase_ver}",
      "libminijail",
      "libpcrecpp",

      # system_api depends on protobuf (or protobuf-lite). It must
      # appear before protobuf or the linker flags won't be in the right
      # order.
      "system_api",
      "protobuf-lite",
    ]
  }

  executable("authpolicy_test") {
    configs += [
      "//common-mk:test",
      ":authpolicy_test_config",
      ":target_defaults",
    ]
    sources = [
      "anonymizer_unittest.cc",
      "auth_data_cache_unittest.cc",
      "authpolicy_flags_unittest.cc",
      "authpolicy_unittest.cc",
      "gpo_version_cache_unittest.cc",
      "policy/device_policy_encoder_unittest.cc",
      "policy/extension_policy_encoder_unittest.cc",
      "policy/preg_parser_unittest.cc",
      "policy/preg_policy_encoder_unittest.cc",
      "policy/preg_policy_writer.cc",
      "policy/user_policy_encoder_unittest.cc",
      "process_executor_unittest.cc",
      "samba_helper_unittest.cc",
    ]
    defines = [ "UNIT_TEST" ]
    deps = [
      ":libauthpolicy",
      ":stub_common",
      ":stub_kinit",
      ":stub_klist",
      ":stub_kpasswd",
      ":stub_net",
      ":stub_smbclient",
      "//common-mk/testrunner",
    ]
  }

  pkg_config("stub_common_config") {
    pkg_deps = [ "libchrome-${libbase_ver}" ]
  }

  static_library("stub_common") {
    configs += [
      ":stub_common_config",
      ":target_defaults",
    ]
    sources = [
      "stub_common.cc",
    ]
  }

  pkg_config("stub_net_config") {
    pkg_deps = [
      "libcap",
      "libchrome-${libbase_ver}",
      "libpcrecpp",
    ]
  }

  executable("stub_net") {
    configs += [
      ":stub_net_config",
      ":target_defaults",
    ]
    sources = [
      "stub_net_main.cc",
    ]
    deps = [
      ":libauthpolicy",
      ":stub_common",
    ]
  }

  executable("stub_kinit") {
    configs += [
      ":stub_net_config",
      ":target_defaults",
    ]
    sources = [
      "stub_kinit_main.cc",
    ]
    deps = [
      ":libauthpolicy",
      ":stub_common",
    ]
  }

  pkg_config("stub_klist_config") {
    pkg_deps = [
      "libchrome-${libbase_ver}",
      "libpcrecpp",
    ]
  }

  executable("stub_klist") {
    configs += [
      ":stub_klist_config",
      ":target_defaults",
    ]
    sources = [
      "stub_klist_main.cc",
    ]
    deps = [
      ":libauthpolicy",
      ":stub_common",
    ]
  }

  executable("stub_kpasswd") {
    configs += [
      ":stub_klist_config",
      ":target_defaults",
    ]
    sources = [
      "stub_kpasswd_main.cc",
    ]
    deps = [
      ":libauthpolicy",
      ":stub_common",
    ]
  }

  executable("stub_smbclient") {
    configs += [
      ":stub_klist_config",
      ":target_defaults",
    ]
    sources = [
      "stub_smbclient_main.cc",
    ]
    deps = [
      ":libauthpolicy",
      ":stub_common",
    ]
  }
}

# Fuzzer target
if (use.fuzzer) {
  pkg_config("preg_parser_fuzzer_config") {
    pkg_deps = [
      "libbrillo-${libbase_ver}",
      "libchrome-${libbase_ver}",
      "libchrome-test-${libbase_ver}",
    ]
  }

  executable("preg_parser_fuzzer") {
    configs += [
      "//common-mk/common_fuzzer",
      ":preg_parser_fuzzer_config",
      ":target_defaults",
    ]
    sources = [
      "policy/preg_parser_fuzzer.cc",
    ]
    deps = [
      ":libauthpolicy",
    ]
  }
}
