# Copyright 2014 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

assert(!defined(is_nacl) || !is_nacl)

import("../../mojo_sdk.gni")

mojo_sdk_source_set("system") {
  sources = [
    "system_thunks.cc",
    "system_thunks.h",
  ]
  defines = [ "MOJO_SYSTEM_IMPLEMENTATION" ]
  mojo_sdk_deps = [ "mojo/public/c/system" ]

  # The GYP target analogous to this one builds this code into a
  # static library.  When building for Android, both the GYP and GN
  # builds add --exclude-libs=ALL globally, which means that all
  # symbols in static libraries are excluded from export.  That's a
  # problem, as code outside this target needs to be able to call
  # MojoSetSystemThunks(). Therefore, the GYP target needs to specifiy
  # that all dependent targets remove that link flag. Since GN uses a
  # source_set here, this flag change is not needed.
}

# For internal use only.
mojo_sdk_source_set("system_impl_private") {
  sources = [
    "system_impl_private_thunks.cc",
    "system_impl_private_thunks.h",
  ]
  defines = [ "MOJO_SYSTEM_IMPLEMENTATION" ]
  deps = [
    ":system_impl_private_api",
  ]
  mojo_sdk_deps = [ "mojo/public/c/system" ]
}

# For internal use only.
mojo_sdk_source_set("system_impl_private_api") {
  sources = [
    "system_impl_private.h",
  ]
  mojo_sdk_deps = [ "mojo/public/c/system" ]
}

mojo_sdk_source_set("system_impl_private_tests") {
  testonly = true

  sources = [
    "system_impl_private_unittest.cc",
  ]

  deps = [
    ":system_impl_private_api",
    "//testing/gtest",
  ]

  mojo_sdk_deps = [ "mojo/public/c/system" ]
}

mojo_sdk_source_set("gles2") {
  sources = [
    "gles2_impl_chromium_copy_texture_thunks.cc",
    "gles2_impl_chromium_copy_texture_thunks.h",
    "gles2_impl_chromium_image_thunks.cc",
    "gles2_impl_chromium_image_thunks.h",
    "gles2_impl_chromium_miscellaneous_thunks.cc",
    "gles2_impl_chromium_miscellaneous_thunks.h",
    "gles2_impl_chromium_pixel_transfer_buffer_object_thunks.cc",
    "gles2_impl_chromium_pixel_transfer_buffer_object_thunks.h",
    "gles2_impl_chromium_resize_thunks.cc",
    "gles2_impl_chromium_resize_thunks.h",
    "gles2_impl_chromium_sub_image_thunks.cc",
    "gles2_impl_chromium_sub_image_thunks.h",
    "gles2_impl_chromium_sync_point_thunks.cc",
    "gles2_impl_chromium_sync_point_thunks.h",
    "gles2_impl_chromium_texture_mailbox_thunks.cc",
    "gles2_impl_chromium_texture_mailbox_thunks.h",
    "gles2_impl_ext_debug_marker_thunks.cc",
    "gles2_impl_ext_debug_marker_thunks.h",
    "gles2_impl_occlusion_query_ext_thunks.cc",
    "gles2_impl_occlusion_query_ext_thunks.h",
    "gles2_impl_oes_vertex_array_object_thunks.cc",
    "gles2_impl_oes_vertex_array_object_thunks.h",
    "gles2_impl_thunks.cc",
    "gles2_impl_thunks.h",
    "gles2_thunks.cc",
    "gles2_thunks.h",
  ]

  defines = [ "MOJO_GLES2_IMPLEMENTATION" ]

  configs = [ "//third_party/khronos:khronos_headers" ]

  mojo_sdk_deps = [
    "mojo/public/c/gles2:headers",
    "mojo/public/c/environment",
    "mojo/public/c/system",
  ]

  if (is_mac) {
    # TODO(GYP): Make it a run-path dependent library.
    # 'DYLIB_INSTALL_NAME_BASE': '@loader_path',
  }
}
