# Copyright 2020 The Dawn Authors
#
# 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("../../../scripts/dawn_overrides_with_defaults.gni")

import("${dawn_root}/scripts/dawn_features.gni")

# Only expose GLFW targets on platforms where GLFW is supported: otherwise they
# might get discovered by GN when another target in this file is referenced,
# and GLFW will be built as part of "all" builds, causing compilation failures.

assert(dawn_supports_glfw_for_windowing)
glfw_dir = dawn_glfw_dir

config("glfw_public") {
  include_dirs = [ "${glfw_dir}/include" ]
}

config("glfw_private") {
  defines = []

  if (is_win) {
    defines += [ "_GLFW_WIN32" ]
  }

  if (is_mac) {
    defines += [ "_GLFW_COCOA" ]
  }

  if (dawn_use_x11) {
    # ANGLE builds only libEGL.so, so tell GLFW to load that instead of
    # the default libEGL.so.1.
    defines += [
      "_GLFW_X11",
      "_GLFW_EGL_LIBRARY=\"libEGL.so\"",
    ]
  }
}

static_library("glfw") {
  public_configs = [ ":glfw_public" ]
  configs += [ ":glfw_private" ]

  if (dawn_has_build) {
    configs -= [ "//build/config/compiler:chromium_code" ]
    configs += [ "//build/config/compiler:no_chromium_code" ]
  }

  if (is_win && !is_clang) {
    # nonstandard extension, function/data pointer conversion in expression
    cflags_c = [ "/wd4152" ]
  } else {
    cflags_c = [
      "-Wno-sign-compare",
      "-Wno-missing-field-initializers",
    ]
  }

  # Common between all OSes / platforms
  sources = [
    "${glfw_dir}/include/GLFW/glfw3.h",
    "${glfw_dir}/include/GLFW/glfw3native.h",
    "${glfw_dir}/src/context.c",
    "${glfw_dir}/src/egl_context.c",
    "${glfw_dir}/src/egl_context.h",
    "${glfw_dir}/src/init.c",
    "${glfw_dir}/src/input.c",
    "${glfw_dir}/src/internal.h",
    "${glfw_dir}/src/platform.h",
    "${glfw_dir}/src/platform.c",
    "${glfw_dir}/src/mappings.h",
    "${glfw_dir}/src/monitor.c",
    "${glfw_dir}/src/osmesa_context.c",
    "${glfw_dir}/src/null_platform.h",
    "${glfw_dir}/src/null_joystick.h",
    "${glfw_dir}/src/null_init.c",
    "${glfw_dir}/src/null_monitor.c",
    "${glfw_dir}/src/null_window.c",
    "${glfw_dir}/src/null_joystick.c",
    "${glfw_dir}/src/osmesa_context.h",
    "${glfw_dir}/src/vulkan.c",
    "${glfw_dir}/src/window.c",
  ]
  libs = []

  # Code shared by all platforms on the same OS.

  if (is_win) {
    sources += [
      "${glfw_dir}/src/win32_module.c",
      "${glfw_dir}/src/win32_module.h",
      "${glfw_dir}/src/win32_thread.c",
      "${glfw_dir}/src/win32_thread.h",
      "${glfw_dir}/src/win32_time.c",
      "${glfw_dir}/src/win32_time.h",
    ]
  }

  if (is_mac) {
    sources += [
      "${glfw_dir}/src/posix_module.c",
      "${glfw_dir}/src/posix_module.h",
      "${glfw_dir}/src/posix_thread.c",
      "${glfw_dir}/src/posix_thread.h",
      "${glfw_dir}/src/cocoa_time.c",
      "${glfw_dir}/src/cocoa_time.h",
    ]
  }

  if (is_linux) {
    sources += [
      "${glfw_dir}/src/posix_module.c",
      "${glfw_dir}/src/posix_module.h",
      "${glfw_dir}/src/posix_thread.c",
      "${glfw_dir}/src/posix_thread.h",
      "${glfw_dir}/src/posix_time.c",
      "${glfw_dir}/src/posix_time.h",
    ]
  }

  # Individual GLFW platforms.

  if (is_win) {
    sources += [
      "${glfw_dir}/src/wgl_context.c",
      "${glfw_dir}/src/win32_init.c",
      "${glfw_dir}/src/win32_joystick.c",
      "${glfw_dir}/src/win32_joystick.h",
      "${glfw_dir}/src/win32_monitor.c",
      "${glfw_dir}/src/win32_platform.h",
      "${glfw_dir}/src/win32_window.c",
    ]
  }

  if (is_mac) {
    sources += [
      "${glfw_dir}/src/nsgl_context.m",
      "${glfw_dir}/src/cocoa_init.m",
      "${glfw_dir}/src/cocoa_joystick.m",
      "${glfw_dir}/src/cocoa_joystick.h",
      "${glfw_dir}/src/cocoa_monitor.m",
      "${glfw_dir}/src/cocoa_platform.h",
      "${glfw_dir}/src/cocoa_window.m",
    ]
    frameworks = [
      "Cocoa.framework",
      "IOKit.framework",
      "CoreFoundation.framework",
      "CoreVideo.framework",
    ]
    cflags_objc = [
      "-Wno-sign-compare",
      "-Wno-unguarded-availability",
      "-Wno-objc-multiple-method-names",
    ]
  }

  if (is_linux) {
    sources += [
      "${glfw_dir}/src/linux_joystick.c",
      "${glfw_dir}/src/linux_joystick.h",
      "${glfw_dir}/src/xkb_unicode.c",
      "${glfw_dir}/src/xkb_unicode.h",
    ]
    libs += [
      "rt",
      "dl",
    ]
    if (dawn_use_x11) {
      sources += [
        "${glfw_dir}/src/glx_context.c",
        "${glfw_dir}/src/x11_init.c",
        "${glfw_dir}/src/x11_monitor.c",
        "${glfw_dir}/src/x11_platform.h",
        "${glfw_dir}/src/x11_window.c",
      ]
      libs += [
        "X11",
        "Xcursor",
        "Xinerama",
        "Xrandr",
      ]
    }
  }
}
