# Copyright 2021 The Cobalt Authors. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

_common_loader_app_sources = [
  "loader_app.cc",
  "loader_app_switches.cc",
  "loader_app_switches.h",
  "system_get_extension_shim.cc",
  "system_get_extension_shim.h",
]

group("common_loader_app_dependencies") {
  public_deps = [
    ":app_key",
    ":installation_manager",
    ":memory_tracker_thread",
    ":slot_management",
    "//starboard",
    "//starboard/elf_loader:evergreen_info",
    "//starboard/elf_loader:sabi_string",
  ]

  if (sb_is_evergreen_compatible) {
    public_deps += [ "//third_party/crashpad/wrapper" ]
  } else {
    public_deps += [ "//third_party/crashpad/wrapper:wrapper_stub" ]
  }
}

target(final_executable_type, "loader_app") {
  if (target_cpu == "x86" || target_cpu == "x64" || target_cpu == "arm" ||
      target_cpu == "arm64") {
    sources = _common_loader_app_sources
    deps = [
      ":common_loader_app_dependencies",
      "//cobalt/content/fonts:copy_font_data",
      "//starboard/elf_loader",
    ]
  }
}

if (sb_is_evergreen_compatible) {
  target(final_executable_type, "loader_app_sys") {
    if (target_cpu == "x86" || target_cpu == "x64" || target_cpu == "arm" ||
        target_cpu == "arm64") {
      sources = _common_loader_app_sources

      starboard_syms_path =
          rebase_path("//starboard/starboard.syms", root_build_dir)
      ldflags = [
        "-Wl,--dynamic-list=$starboard_syms_path",
        "-ldl",
      ]
      deps = [
        ":common_loader_app_dependencies",
        "//cobalt/content/fonts:copy_font_data",
        "//starboard/elf_loader:elf_loader_sys",
      ]
    }
  }
}

static_library("app_key_files") {
  sources = [
    "app_key_files.cc",
    "app_key_files.h",
  ]
  deps = [ "//starboard" ]
}

target(gtest_target_type, "app_key_files_test") {
  testonly = true
  sources = [
    "//starboard/common/test_main.cc",
    "app_key_files_test.cc",
  ]
  deps = [
    ":app_key_files",
    "//testing/gmock",
    "//testing/gtest",
  ]
}

static_library("app_key") {
  sources = [
    "app_key.cc",
    "app_key.h",
    "app_key_internal.cc",
    "app_key_internal.h",
  ]
  deps = [
    "//starboard",
    "//third_party/modp_b64",
  ]
}

target(gtest_target_type, "app_key_test") {
  testonly = true
  sources = [
    "//starboard/common/test_main.cc",
    "app_key_test.cc",
  ]
  deps = [
    ":app_key",
    "//testing/gmock",
    "//testing/gtest",
  ]
}

static_library("drain_file") {
  sources = [
    "drain_file.cc",
    "drain_file.h",
  ]
  deps = [ "//starboard/common" ]
}

target(gtest_target_type, "drain_file_test") {
  testonly = true
  sources = [
    "//starboard/common/test_main.cc",
    "drain_file_helper.cc",
    "drain_file_helper.h",
    "drain_file_test.cc",
  ]
  deps = [
    ":drain_file",
    "//testing/gmock",
    "//testing/gtest",
  ]
}

static_library("installation_store_proto") {
  sources = [
    "installation_store.pb.cc",
    "installation_store.pb.h",
  ]
  public_deps = [ "//third_party/protobuf:protobuf_lite" ]
}

static_library("installation_manager") {
  sources = [
    "installation_manager.cc",
    "installation_manager.h",
  ]

  include_dirs = [
    # Get protobuf headers from the chromium tree.
    "//third_party/protobuf/src",
  ]

  deps = [
    ":installation_store_proto",
    "//starboard",
  ]

  if (!sb_evergreen_compatible_enable_lite) {
    deps += [ ":pending_restart" ]
  }
}

target(gtest_target_type, "installation_manager_test") {
  testonly = true
  sources = [
    "//starboard/common/test_main.cc",
    "installation_manager_test.cc",
  ]
  if (sb_evergreen_compatible_enable_lite) {
    sources += [ "pending_restart_test.cc" ]
  }
  deps = [
    ":installation_manager",
    ":installation_store_proto",
    "//testing/gmock",
    "//testing/gtest",
  ]
}

static_library("slot_management") {
  sources = [
    "slot_management.cc",
    "slot_management.h",
  ]
  deps = [
    ":app_key_files",
    ":drain_file",
    ":installation_manager",
    "//starboard",
    "//starboard/elf_loader",
    "//starboard/elf_loader:sabi_string",
  ]

  if (sb_is_evergreen_compatible) {
    deps += [ "//third_party/crashpad/wrapper" ]
  } else {
    deps += [ "//third_party/crashpad/wrapper:wrapper_stub" ]
  }
}

target(gtest_target_type, "slot_management_test") {
  testonly = true
  sources = [
    "//starboard/common/test_main.cc",
    "slot_management_test.cc",
  ]
  deps = [
    ":app_key_files",
    ":drain_file",
    ":installation_manager",
    ":installation_store_proto",
    ":slot_management",
    "//starboard/elf_loader:sabi_string",
    "//testing/gmock",
    "//testing/gtest",
  ]
}

static_library("pending_restart") {
  sources = [
    "pending_restart.cc",
    "pending_restart.h",
  ]

  public_deps = [ "//starboard:starboard_headers_only" ]
}

static_library("memory_tracker_thread") {
  sources = [
    "memory_tracker_thread.cc",
    "memory_tracker_thread.h",
  ]

  deps = [
    "//starboard:starboard_headers_only",
    "//starboard/common",
  ]
}
