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

group("gn_all") {
  testonly = true

  deps = [
    ":starboard",
    "//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/window:starboard_window_example",
    "//starboard/nplb",
    "//starboard/nplb/nplb_evergreen_compat_tests",

    # "//starboard/tools",  TODO(andrewsavage)
  ]

  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" ]
  } else {
    deps += [ platform_tests_path ]
  }

  if (sb_filter_based_player) {
    deps += [
      "//starboard/shared/starboard/player/filter/testing:player_filter_tests",
      "//starboard/shared/starboard/player/filter/tools:audio_dmp_player",
    ]
  }

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

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

    if (sb_is_evergreen_compatible) {
      deps += [
        "//third_party/crashpad/client",
        "//third_party/crashpad/handler",
      ]
      data_deps = [ "//starboard/loader_app" ]
    }
  }
}

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

  if (sb_is_evergreen) {
    public_deps += [
      "//starboard/elf_loader:sabi_string",
      "//third_party/llvm-project/compiler-rt:compiler_rt",
      "//third_party/llvm-project/libcxx:cxx",
      "//third_party/llvm-project/libcxxabi:cxxabi",
      "//third_party/llvm-project/libunwind:unwind_evergreen",
      "//third_party/musl:c",
    ]
  } else {
    public_deps += [
      "//$starboard_path:starboard_platform",
      "//starboard/common",
    ]

    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",
    "character.h",
    "condition_variable.h",
    "configuration.h",
    "configuration_constants.h",
    "cpu_features.h",
    "decode_target.h",
    "directory.h",
    "double.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",
    "spin_lock.h",
    "storage.h",
    "string.h",
    "system.h",
    "thread.h",
    "thread_types.h",
    "time.h",
    "time_zone.h",
    "types.h",
    "user.h",
    "window.h",

    # Include private headers, if present.
    # "<!@pymod_do_main(starboard.build.gyp_functions file_glob <(DEPTH)/starboard/private *.h)",
  ]
}

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

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

    public_deps = [
      ":starboard",
      "//testing/gmock",
    ]
  }
}
