# Copyright (C) 2018 Google, Inc.
#
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
#
#    Redistributions of source code must retain the above copyright
#    notice, this list of conditions and the following disclaimer.
#
#    Redistributions in binary form must reproduce the above
#    copyright notice, this list of conditions and the following
#    disclaimer in the documentation and/or other materials provided
#    with the distribution.
#
#    Neither the name of Google Inc. nor the names of its
#    contributors may be used to endorse or promote products derived
#    from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
# COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.

import("//build/checkout.gni")
import("//build_overrides/glslang.gni")

# Both Chromium and Fuchsia use by default a set of warning errors
# that is far too strict to compile this project. These are also
# typically appended after |cflags|, overriding target-specific
# definitions. To work around this, determine which configs to
# add and remove in order to succesfully build the project.
if (defined(is_fuchsia_tree) && is_fuchsia_tree) {
  import("//build/licenses/license.gni")

  license("license") {
    public_package_name = "glslang"
    license_files = [ "LICENSE.txt" ]
  }
  applicable_licenses = [ ":license" ]

  _configs_to_remove = [ "//build/config:default_warnings" ]
  _configs_to_add = []
} else {
  _configs_to_remove = [ "//build/config/compiler:chromium_code" ]
  _configs_to_add = [ "//build/config/compiler:no_chromium_code" ]
}

if (submodules) {
  git_link_path_list = read_file(".git", "list lines")
  git_link_path = git_link_path_list[0]
  relative_git_dir_split = string_split(git_link_path)
  relative_git_dir = relative_git_dir_split[1]
  git_head = "${relative_git_dir}/HEAD"
} else {
  git_head = ".git/HEAD"
}

action("glslang_build_info") {
  script = "build_info.py"

  src_dir = "."
  changes_file = "CHANGES.md"
  template_file = "build_info.h.tmpl"
  out_file = "${target_gen_dir}/include/glslang/build_info.h"

  inputs = [
    changes_file,
    script,
    template_file,
    git_head,
  ]
  outputs = [ out_file ]
  args = [
    rebase_path(src_dir, root_build_dir),
    "-i",
    rebase_path(template_file, root_build_dir),
    "-o",
    rebase_path(out_file, root_build_dir),
  ]
}

action("glslang_extension_headers") {
  script = "gen_extension_headers.py"

  out_file = "${target_gen_dir}/include/glslang/glsl_intrinsic_header.h"

  # Fuchsia GN build rules require all GN actions to be hermetic and they
  # should correctly and fully state their inputs and outpus (see
  # https://fuchsia.dev/fuchsia-src/development/build/hermetic_actions
  # for details). All input files of the script should be added to the
  # |sources| list.
  sources = [
    "glslang/ExtensionHeaders/GL_EXT_shader_realtime_clock.glsl",
  ]

  inputs = [
    script
  ]
  outputs = [ out_file ]
  args = [
    "-i",
    rebase_path("glslang/ExtensionHeaders", root_build_dir),
    "-o",
    rebase_path(out_file, root_build_dir),
  ]
}

spirv_tools_dir = glslang_spirv_tools_dir

config("glslang_public") {
  include_dirs = [ "." ]
  if (!is_win || is_clang) {
    cflags = [ "-Wno-conversion" ]
  }
}

config("glslang_hlsl") {
  defines = [ "ENABLE_HLSL=1" ]

  cflags = [ "-Wno-conversion" ]
}

template("glslang_sources_common") {
  source_set(target_name) {
    public_configs = [ ":glslang_public" ]

    if (invoker.enable_hlsl) {
      public_configs += [ ":glslang_hlsl" ]
    }

    sources = [
      "OGLCompilersDLL/InitializeDll.cpp",
      "OGLCompilersDLL/InitializeDll.h",
      "SPIRV/GLSL.ext.AMD.h",
      "SPIRV/GLSL.ext.EXT.h",
      "SPIRV/GLSL.ext.KHR.h",
      "SPIRV/GLSL.ext.NV.h",
      "SPIRV/GLSL.ext.ARM.h",
      "SPIRV/GLSL.ext.QCOM.h",
      "SPIRV/GLSL.std.450.h",
      "SPIRV/GlslangToSpv.cpp",
      "SPIRV/GlslangToSpv.h",
      "SPIRV/InReadableOrder.cpp",
      "SPIRV/Logger.cpp",
      "SPIRV/Logger.h",
      "SPIRV/NonSemanticDebugPrintf.h",
      "SPIRV/NonSemanticShaderDebugInfo100.h",
      "SPIRV/SPVRemapper.cpp",
      "SPIRV/SPVRemapper.h",
      "SPIRV/SpvBuilder.cpp",
      "SPIRV/SpvBuilder.h",
      "SPIRV/SpvPostProcess.cpp",
      "SPIRV/SpvTools.h",
      "SPIRV/bitutils.h",
      "SPIRV/disassemble.cpp",
      "SPIRV/disassemble.h",
      "SPIRV/doc.cpp",
      "SPIRV/doc.h",
      "SPIRV/hex_float.h",
      "SPIRV/spirv.hpp",
      "SPIRV/spvIR.h",
      "glslang/GenericCodeGen/CodeGen.cpp",
      "glslang/GenericCodeGen/Link.cpp",
      "glslang/Include/BaseTypes.h",
      "glslang/Include/Common.h",
      "glslang/Include/ConstantUnion.h",
      "glslang/Include/InfoSink.h",
      "glslang/Include/InitializeGlobals.h",
      "glslang/Include/PoolAlloc.h",
      "glslang/Include/ResourceLimits.h",
      "glslang/Include/ShHandle.h",
      "glslang/Include/SpirvIntrinsics.h",
      "glslang/Include/Types.h",
      "glslang/Include/arrays.h",
      "glslang/Include/intermediate.h",
      "glslang/MachineIndependent/Constant.cpp",
      "glslang/MachineIndependent/InfoSink.cpp",
      "glslang/MachineIndependent/Initialize.cpp",
      "glslang/MachineIndependent/Initialize.h",
      "glslang/MachineIndependent/IntermTraverse.cpp",
      "glslang/MachineIndependent/Intermediate.cpp",
      "glslang/MachineIndependent/LiveTraverser.h",
      "glslang/MachineIndependent/ParseContextBase.cpp",
      "glslang/MachineIndependent/ParseHelper.cpp",
      "glslang/MachineIndependent/ParseHelper.h",
      "glslang/MachineIndependent/PoolAlloc.cpp",
      "glslang/MachineIndependent/RemoveTree.cpp",
      "glslang/MachineIndependent/RemoveTree.h",
      "glslang/MachineIndependent/Scan.cpp",
      "glslang/MachineIndependent/Scan.h",
      "glslang/MachineIndependent/ScanContext.h",
      "glslang/MachineIndependent/ShaderLang.cpp",
      "glslang/MachineIndependent/SpirvIntrinsics.cpp",
      "glslang/MachineIndependent/SymbolTable.cpp",
      "glslang/MachineIndependent/SymbolTable.h",
      "glslang/MachineIndependent/Versions.cpp",
      "glslang/MachineIndependent/Versions.h",
      "glslang/MachineIndependent/attribute.cpp",
      "glslang/MachineIndependent/attribute.h",
      "glslang/MachineIndependent/gl_types.h",
      "glslang/MachineIndependent/glslang_tab.cpp",
      "glslang/MachineIndependent/glslang_tab.cpp.h",
      "glslang/MachineIndependent/intermOut.cpp",
      "glslang/MachineIndependent/iomapper.cpp",
      "glslang/MachineIndependent/iomapper.h",
      "glslang/MachineIndependent/limits.cpp",
      "glslang/MachineIndependent/linkValidate.cpp",
      "glslang/MachineIndependent/localintermediate.h",
      "glslang/MachineIndependent/parseConst.cpp",
      "glslang/MachineIndependent/parseVersions.h",
      "glslang/MachineIndependent/preprocessor/Pp.cpp",
      "glslang/MachineIndependent/preprocessor/PpAtom.cpp",
      "glslang/MachineIndependent/preprocessor/PpContext.cpp",
      "glslang/MachineIndependent/preprocessor/PpContext.h",
      "glslang/MachineIndependent/preprocessor/PpScanner.cpp",
      "glslang/MachineIndependent/preprocessor/PpTokens.cpp",
      "glslang/MachineIndependent/preprocessor/PpTokens.h",
      "glslang/MachineIndependent/propagateNoContraction.cpp",
      "glslang/MachineIndependent/propagateNoContraction.h",
      "glslang/MachineIndependent/reflection.cpp",
      "glslang/MachineIndependent/reflection.h",
      "glslang/OSDependent/osinclude.h",
      "glslang/Public/ShaderLang.h",
    ]

    # Workaround gn issue complaining about these not being allowed even though GLSLANG_HLSL is not
    # defined.
    sources += [
      "glslang/HLSL/hlslParseHelper.h",
      "glslang/HLSL/hlslParseables.h",
      "glslang/HLSL/hlslScanContext.h",
      "glslang/HLSL/hlslTokens.h",
    ]

    if (invoker.enable_hlsl) {
      sources += [
        "glslang/HLSL/hlslAttributes.cpp",
        "glslang/HLSL/hlslAttributes.h",
        "glslang/HLSL/hlslGrammar.cpp",
        "glslang/HLSL/hlslGrammar.h",
        "glslang/HLSL/hlslOpMap.cpp",
        "glslang/HLSL/hlslOpMap.h",
        "glslang/HLSL/hlslParseHelper.cpp",
        "glslang/HLSL/hlslParseables.cpp",
        "glslang/HLSL/hlslScanContext.cpp",
        "glslang/HLSL/hlslTokenStream.cpp",
        "glslang/HLSL/hlslTokenStream.h",
      ]
    }

    defines = []
    if (invoker.enable_opt) {
      sources += [ "SPIRV/SpvTools.cpp" ]
      defines += [ "ENABLE_OPT=1" ]
    }

    if (is_win) {
      sources += [ "glslang/OSDependent/Windows/ossource.cpp" ]
      defines += [ "GLSLANG_OSINCLUDE_WIN32" ]
    } else {
      sources += [ "glslang/OSDependent/Unix/ossource.cpp" ]
      defines += [ "GLSLANG_OSINCLUDE_UNIX" ]
    }

    if (is_clang) {
      cflags = [
        "-Wno-extra-semi",
        "-Wno-ignored-qualifiers",
        "-Wno-implicit-fallthrough",
        "-Wno-inconsistent-missing-override",

        # TODO(rosasco): Fuchsia-only flags
        "-Wno-unused-variable",
        "-Wno-unknown-warning-option",
        "-Wno-extra-semi",

        "-Wno-missing-field-initializers",
        "-Wno-newline-eof",
        "-Wno-sign-compare",
        "-Wno-suggest-destructor-override",
        "-Wno-suggest-override",
        "-Wno-unused-variable",
      ]
    }

    if (is_win && !is_clang) {
      cflags = [
        "/wd4018",  # signed/unsigned mismatch
        "/wd4189",  # local variable is initialized but not referenced
      ]
    }

    include_dirs = [ "${target_gen_dir}/include" ]

    deps = [ ":glslang_build_info" ]

    if (invoker.enable_opt) {
      deps += [
        "${spirv_tools_dir}:spvtools_opt",
        "${spirv_tools_dir}:spvtools_val",
      ]
      include_dirs += [ "${spirv_tools_dir}/include" ]
    }

    configs -= _configs_to_remove
    configs += _configs_to_add
  }
}

glslang_sources_common("glslang_lib_sources") {
  enable_opt = true
  enable_hlsl = true
}

glslang_sources_common("glslang_sources") {
  enable_opt = true
  enable_hlsl = true
}

source_set("glslang_default_resource_limits_sources") {
  sources = [
    "glslang/ResourceLimits/ResourceLimits.cpp",
    "glslang/Public/ResourceLimits.h",
    "glslang/Include/ResourceLimits.h",
  ]
  public_configs = [ ":glslang_public" ]

  configs -= _configs_to_remove
  configs += _configs_to_add
}

executable("glslang_validator") {
  sources = [
    "StandAlone/DirStackFileIncluder.h",
    "StandAlone/StandAlone.cpp",
  ]
  if (!is_win) {
    cflags = [ "-Woverflow" ]
  }
  defines = [ "ENABLE_OPT=1" ]
  deps = [
    ":glslang_build_info",
    ":glslang_default_resource_limits_sources",
    ":glslang_extension_headers",
    ":glslang_sources",
  ]
  public_configs = [ ":glslang_hlsl" ]

  include_dirs = [
    "${target_gen_dir}/include",
    "${spirv_tools_dir}/include",
  ]

  configs -= _configs_to_remove
  configs += _configs_to_add
}

executable("spirv-remap") {
  sources = [ "StandAlone/spirv-remap.cpp" ]
  defines = [ "ENABLE_OPT=1" ]
  deps = [ ":glslang_sources" ]

  include_dirs = [ "${spirv_tools_dir}/include" ]

  configs -= _configs_to_remove
  configs += _configs_to_add
}
