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

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

  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",
      "-Wno-macro-redefined",
    ]
  }

  defines = []
  libs = []

  # Common sources.
  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/init.c",
    "${glfw_dir}/src/input.c",
    "${glfw_dir}/src/internal.h",
    "${glfw_dir}/src/mappings.h",
    "${glfw_dir}/src/monitor.c",
    "${glfw_dir}/src/null_init.c",
    "${glfw_dir}/src/null_joystick.c",
    "${glfw_dir}/src/null_joystick.h",
    "${glfw_dir}/src/null_monitor.c",
    "${glfw_dir}/src/null_platform.h",
    "${glfw_dir}/src/null_window.c",
    "${glfw_dir}/src/osmesa_context.c",
    "${glfw_dir}/src/platform.c",
    "${glfw_dir}/src/platform.h",
    "${glfw_dir}/src/vulkan.c",
    "${glfw_dir}/src/window.c",
  ]

  # Code shared by all backends on an OS.
  if (is_linux) {
    defines += [ "_GLFW_EGL_LIBRARY=\"libEGL.so\"" ]
    sources += [
      "${glfw_dir}/src/posix_module.c",
      "${glfw_dir}/src/posix_thread.c",
      "${glfw_dir}/src/posix_thread.h",
      "${glfw_dir}/src/posix_time.c",
      "${glfw_dir}/src/posix_time.h",
    ]
    libs += [
      "m",
      "rt",
      "dl",
    ]
  }

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

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

  # Per-backend code.
  if (dawn_use_x11) {
    defines += [ "_GLFW_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",
      "${glfw_dir}/src/xkb_unicode.c",
      "${glfw_dir}/src/xkb_unicode.h",
    ]
    libs += [
      "X11",
      "Xi",
      "Xcursor",
      "Xinerama",
      "Xrandr",
    ]
  }
  # No wayland support for GLFW in GN builds.
  if (dawn_use_x11) {
    if (is_linux) {
      sources += [
        "${glfw_dir}/src/linux_joystick.c",
        "${glfw_dir}/src/linux_joystick.h",
      ]
    }
    sources += [
      "${glfw_dir}/src/posix_poll.c",
      "${glfw_dir}/src/posix_poll.h",
    ]
  }

  if (is_mac) {
    defines += [ "_GLFW_COCOA" ]
    sources += [
      "${glfw_dir}/src/cocoa_init.m",
      "${glfw_dir}/src/cocoa_joystick.h",
      "${glfw_dir}/src/cocoa_joystick.m",
      "${glfw_dir}/src/cocoa_monitor.m",
      "${glfw_dir}/src/cocoa_platform.h",
      "${glfw_dir}/src/cocoa_window.m",
      "${glfw_dir}/src/nsgl_context.m",
    ]

    frameworks = [
      "Cocoa.framework",
      "IOKit.framework",
      "CoreFoundation.framework",
    ]
    cflags_objc = [
      "-Wno-sign-compare",
      "-Wno-unguarded-availability",
      "-Wno-objc-multiple-method-names",
    ]
  }

  if (is_win) {
    defines += [ "_GLFW_WIN32" ]
    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",
    ]
  }
}
