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

    # If a "build with ARC" config is present, remove it.
    if (filter_include(configs, [ "//build/config/compiler:enable_arc" ]) !=
        []) {
      configs -= [ "//build/config/compiler:enable_arc" ]
    }

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