# Copyright (C) 2018-2019 The ANGLE Project Authors.
# Copyright (C) 2019 LunarG, Inc.
#
# 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
#
#     https://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("//build_overrides/build.gni")
import("//build_overrides/vulkan_loader.gni")

if (is_fuchsia) {
  import("//build/cpp/sdk_shared_library.gni")
  import("//build/sdk/sdk_documentation.gni")
}

if (!is_android) {
  vulkan_undefine_configs = []
}
if (is_win) {
  vulkan_undefine_configs += [
    "//build/config/win:nominmax",
    "//build/config/win:unicode",
  ]
}

config("vulkan_internal_config") {
  defines = [ "VULKAN_NON_CMAKE_BUILD" ]
  if (is_clang || !is_win) {
    cflags = [ "-Wno-unused-function" ]
  }
  if (is_fuchsia) {
    defines += [
      "SYSCONFDIR=\"/config\"",
      "EXTRASYSCONFDIR=\"/pkg/data\"",
    ]
  }
  if (is_linux || is_mac) {
    defines += [
      "SYSCONFDIR=\"/etc\"",
      "FALLBACK_CONFIG_DIRS=\"/etc/xdg\"",
      "FALLBACK_DATA_DIRS=\"/usr/local/share:/usr/share\"",
    ]
  }
}

# Vulkan loader
# -------------

config("vulkan_loader_config") {
  include_dirs = [
    "loader/generated",
    "loader",
  ]
  defines = [
    "API_NAME=\"Vulkan\"",
    "USE_UNSAFE_FILE_SEARCH=1",
  ]

  if (is_win) {
    cflags = [ "/wd4201" ]
  }
  if (is_linux) {
    # assume secure_getenv() is available
    defines += [ "HAVE_SECURE_GETENV" ]
  }
}

if (!is_android) {
  if (is_fuchsia) {
    library_type = "sdk_shared_library"
  } else if (vulkan_loader_shared) {
    library_type = "shared_library"
  } else {
    library_type = "static_library"
  }

  target(library_type, "libvulkan") {
    sources = [
      "loader/asm_offset.c",
      "loader/cJSON.c",
      "loader/cJSON.h",
      "loader/debug_utils.c",
      "loader/debug_utils.h",
      "loader/dev_ext_trampoline.c",
      "loader/extension_manual.c",
      "loader/extension_manual.h",
      "loader/gpa_helper.h",
      "loader/loader.c",
      "loader/loader.h",
      "loader/murmurhash.c",
      "loader/murmurhash.h",
      "loader/phys_dev_ext.c",
      "loader/trampoline.c",

      # TODO(jmadill): Use assembler where available.
      "loader/unknown_ext_chain.c",
      "loader/vk_loader_platform.h",
      "loader/wsi.c",
      "loader/wsi.h",
    ]
    if (is_win) {
      output_name = "vulkan-1"
      sources += [
        "loader/dirent_on_windows.c",
        "loader/dirent_on_windows.h",
        "loader/dxgi_loader.c",
        "loader/dxgi_loader.h",
        "loader/vulkan-1.def",
      ]
      if (!is_clang) {
        cflags = [
          "/wd4054",  # Type cast from function pointer
          "/wd4055",  # Type cast from data pointer
          "/wd4100",  # Unreferenced formal parameter
          "/wd4152",  # Nonstandard extension used (pointer conversion)
          "/wd4201",  # Nonstandard extension used: nameless struct/union
          "/wd4214",  # Nonstandard extension used: bit field types other than
                      # int
          "/wd4232",  # Nonstandard extension used: address of dllimport is not
                      # static
          "/wd4305",  # Type cast truncation
          "/wd4706",  # Assignment within conditional expression
          "/wd4996",  # Unsafe stdlib function
        ]
      }
      if (is_clang) {
        cflags = [ "-Wno-incompatible-pointer-types" ]
      }
      libs = [ "Cfgmgr32.lib" ]
    }
    if (is_mac) {
      libs = [ "CoreFoundation.framework" ]
    }
    if (build_with_chromium) {
      configs -= [ "//build/config/compiler:chromium_code" ]
      configs += [ "//build/config/compiler:no_chromium_code" ]
    }
    public_deps = [ "$vulkan_headers_dir:vulkan_headers" ]
    configs += [ ":vulkan_internal_config" ]
    public_configs = [ ":vulkan_loader_config" ]
    configs -= vulkan_undefine_configs

    if (is_fuchsia) {
      output_name = "vulkan"
      category = "partner"

      # The Vulkan loader's interface is defined by standard Khronos vulkan headers
      # which can be obtained separately from the loader implementation itself.
      no_headers = true

      sources += [ "fuchsia/loader_extensions.c" ]

      deps = [
        ":dlopen_fuchsia",
        "//zircon/public/lib/fdio",
      ]

      # TODO(MA-488) - while these shared libraries are needed by vulkan icd
      # the app must provide them, so we add the deps here.
      deps += [ "//zircon/system/ulib/async-default" ]

      libs = [ "zircon" ]

      runtime_deps = [ "//zircon/public/lib/fdio:fdio_sdk" ]

      # TODO(MA-488): remove this too
      runtime_deps += [ "//zircon/system/ulib/async-default:async-default_sdk" ]

      # TODO(MA-488): The //zircon/public/lib/async-default dep gives us a dep
      # on //zircon/public/lib/async, which uses the C++ standard library and
      # is linked statically (built from source, though async-default is a
      # prebuilt shared library).  So link in the C++ standard library
      # statically just to satisfy those references.  When the async-default
      # dep is dropped, this can change to "none" (i.e. be removed).
      libcxx_linkage = "static"
    }
  }
}

if (is_fuchsia) {
  config("fuchsia_config") {
    include_dirs = [ "fuchsia" ]
  }

  source_set("dlopen_fuchsia") {
    public_configs = [ ":fuchsia_config" ]

    sources = [
      "fuchsia/dlopen_fuchsia.c",
      "fuchsia/dlopen_fuchsia.h",
    ]

    deps = [
      "//sdk/fidl/fuchsia.vulkan.loader:fuchsia.vulkan.loader_c_client",
      "//zircon/public/lib/fdio",
    ]
  }

  sdk_documentation("vulkan_license") {
    name = "vulkan_license"
    category = "public"

    files = [
      {
        source = "LICENSE.txt"
        dest = "LICENSE.vulkan"
      },
    ]
  }
}

group("tests") {
  # TODO(MA-684)
}
