# 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.

import("//starboard/build/config/os_definitions.gni")
import("//starboard/build/config/starboard_target_type.gni")
import("//starboard/contrib/cast/cast.gni")

group("gn_all") {
  testonly = true

  deps = [
    ":default",
    "//starboard/client_porting/cwrappers:cwrappers_test",
    "//starboard/client_porting/eztime",
    "//starboard/client_porting/eztime:eztime_test",
    "//starboard/client_porting/icu_init",
    "//starboard/client_porting/poem:poem_unittests",
    "//starboard/examples/hello_world:starboard_hello_world_example",
    "//starboard/examples/window:starboard_window_example",
    "//starboard/extension:extension_test",
    "//starboard/loader_app:app_key_files_test",
    "//starboard/nplb",
    "//starboard/nplb/nplb_evergreen_compat_tests",
  ]

  if (gl_type != "none") {
    deps += [ "//starboard/examples/glclear:starboard_glclear_example" ]
  }

  if (has_platform_targets) {
    deps += [ "//$starboard_path/platform_targets" ]
  }

  if (platform_tests_path == "") {
    deps += [ ":starboard_platform_tests($starboard_toolchain)" ]
  } else {
    deps += [ platform_tests_path ]
  }

  if (sb_filter_based_player) {
    deps += [
      "//starboard/shared/starboard/player/filter/testing:player_filter_tests($starboard_toolchain)",
      "//starboard/shared/starboard/player/filter/testing:player_filter_tests_install($starboard_toolchain)",
    ]

    # TODO: b/296715826 - Fix build error for windows modular builds.
    if (!(sb_is_modular && is_host_win)) {
      deps += [ "//starboard/shared/starboard/player/filter/tools:audio_dmp_player($starboard_toolchain)" ]
    }
  }

  if (sb_enable_benchmark) {
    deps += [ "//starboard/benchmark" ]
  }

  if (build_with_separate_cobalt_toolchain && use_contrib_cast) {
    deps += [ "//starboard/contrib/cast/cast_starboard_api/samples:cast" ]
  }

  if (!sb_is_evergreen) {
    deps += [ "//third_party/lz4_lib:lz4" ]

    if (sb_is_evergreen_compatible) {
      deps += [ "//third_party/crashpad/client" ]
      data_deps = [
        "//starboard/loader_app($starboard_toolchain)",
        "//third_party/crashpad/handler:crashpad_handler(//$starboard_path/toolchain:native_target)",
        "//third_party/crashpad/tools:crashpad_database_util(//$starboard_path/toolchain:native_target)",
      ]
    }
  }
}

group("default") {
  deps = [
    ":starboard_group",
    "//starboard/tools:build_app_launcher_zip",
  ]
}

group("starboard_group") {
  public_deps = [
    ":starboard_headers_only",
    "//starboard/client_porting/cwrappers",
    "//starboard/client_porting/eztime",
  ]

  if (sb_is_modular && current_toolchain == cobalt_toolchain) {
    public_deps += [
      "//third_party/llvm-project/compiler-rt:compiler_rt",
      "//third_party/llvm-project/libcxx:cxx",
      "//third_party/llvm-project/libcxxabi:cxxabi",
      "//third_party/musl:c",
    ]
    if (sb_is_evergreen) {
      public_deps += [ "//starboard/elf_loader:sabi_string" ]
    } else {
      data_deps = [ ":starboard($starboard_toolchain)" ]
    }

    # TODO: b/295702296 Fix libunwind for modular builds.
    if (sb_is_evergreen || is_host_win) {
      public_deps += [ "//third_party/llvm-project/libunwind:unwind" ]
    }
  } else {
    public_deps += [
      ":starboard_static($starboard_toolchain)",
      "//starboard/common",
    ]

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

    if (final_executable_type == "shared_library" &&
        current_toolchain != default_toolchain) {
      set_defaults("executable") {
        sources = [ "//starboard/shared/starboard/shared_main_adapter.cc" ]
      }
    }
  }
}

source_set("starboard_headers_only") {
  # We include starboard/common/log.h in starboard_headers, but some common
  # files include starboard headers.
  check_includes = false

  sources = [
    "atomic.h",
    "audio_sink.h",
    "byte_swap.h",
    "condition_variable.h",
    "configuration.h",
    "configuration_constants.h",
    "cpu_features.h",
    "decode_target.h",
    "directory.h",
    "drm.h",
    "egl.h",
    "event.h",
    "export.h",
    "file.h",
    "gles.h",
    "input.h",
    "key.h",
    "log.h",
    "media.h",
    "memory.h",
    "microphone.h",
    "mutex.h",
    "once.h",
    "player.h",
    "queue.h",
    "socket.h",
    "socket_waiter.h",
    "storage.h",
    "string.h",
    "system.h",
    "thread.h",
    "time.h",
    "time_zone.h",
    "types.h",
    "user.h",
    "window.h",
  ]

  if (is_internal_build) {
    public_deps = [ "//internal/starboard/private:private_starboard_headers" ]
  }
}

if (current_toolchain == starboard_toolchain) {
  # This is the default 'starboard_platform_target'; use default properties
  starboard_platform_target("starboard") {
  }

  starboard_platform_target("starboard_static") {
    target_type = "group"
  }

  if (platform_tests_path == "") {
    # If 'starboard_platform_tests' is not defined by the platform, then an
    # empty 'starboard_platform_tests' target is defined.
    target(starboard_level_gtest_target_type, "starboard_platform_tests") {
      testonly = true

      sources = [ "//starboard/common/test_main.cc" ]

      public_deps = [
        ":starboard_with_main",
        "//testing/gmock",
        "//testing/gtest",
      ]
    }
  }

  group("starboard_with_main") {
    public_deps = [ ":starboard_group" ]
    if (sb_is_modular && !sb_is_evergreen) {
      public_deps += [ "//$starboard_path:starboard_platform_with_main" ]
    }
  }
}
