# Copyright 2017 Google Inc. 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("all") {
  testonly = true
  deps = [
    # TODO: uncomment as each of these are implemented
    # "//starboard/client_porting/eztime:all",
    # "//starboard/client_porting/icu_init:all",
    # "//starboard/client_porting/poem:all",
    "//starboard/examples",
    # "//starboard/nplb/blitter_pixel_tests:all",
    "//starboard/nplb:all",
    ":starboard",
  ]

  has_platform_tests =
      exec_script("//build/dir_exists.py",
                  [ rebase_path("//$starboard_path/tests", root_build_dir) ],
                  "string") == "True"
  if (has_platform_tests) {
    deps += [ "//$starboard_path/tests" ]
  }
}

source_set("starboard") {
  sources = [
    "atomic.h",
    "audio_sink.h",
    "blitter.h",
    "byte_swap.h",
    "character.h",
    "condition_variable.h",
    "configuration.h",
    "decode_target.h",
    "directory.h",
    "double.h",
    "drm.h",
    "event.h",
    "export.h",
    "file.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",
    "//starboard/shared/media_session/playback_state.h",
  ]

  private_sources = exec_script("tools/find_private_files.py",
                                [
                                  rebase_path("//", root_build_dir),
                                  "*.h",
                                ],
                                "list lines",
                                [ "//starboard/private" ])
  sources += rebase_path(private_sources, ".", root_build_dir)

  deps = [
    "//starboard/common",
  ]

  public_deps = [
    "//$starboard_path:starboard_platform",
  ]

  # TODO: handle shared_main_adapter.cc
}
