# 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",
      ]
    }
  }
}

group("starboard") {
  public_deps = [ ":starboard_headers_only" ]

  if (sb_is_evergreen) {
    public_deps += []
  } else {
    public_deps += [
      "//$starboard_path:starboard_platform",
      "//starboard/client_porting/cwrappers",
      "//starboard/client_porting/eztime",
      "//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" ]
      }
    }
  }
}

static_library("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",
    "blitter.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",
    ]
  }
}
