# 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_overrides/glslang.gni")

spirv_tools_dir = glslang_spirv_tools_dir

config("glslang_public") {
  include_dirs = [ "." ]
}

source_set("glslang_sources") {
  public_configs = [ ":glslang_public" ]

  sources = [
    "OGLCompilersDLL/InitializeDll.cpp",
    "OGLCompilersDLL/InitializeDll.h",
    "SPIRV/GLSL.ext.EXT.h",
    "SPIRV/GLSL.ext.KHR.h",
    "SPIRV/GLSL.std.450.h",
    "SPIRV/GlslangToSpv.cpp",
    "SPIRV/GlslangToSpv.h",
    "SPIRV/InReadableOrder.cpp",
    "SPIRV/Logger.cpp",
    "SPIRV/Logger.h",
    "SPIRV/SPVRemapper.cpp",
    "SPIRV/SPVRemapper.h",
    "SPIRV/SpvBuilder.cpp",
    "SPIRV/SpvBuilder.h",
    "SPIRV/SpvPostProcess.cpp",
    "SPIRV/SpvTools.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/Types.h",
    "glslang/Include/arrays.h",
    "glslang/Include/intermediate.h",
    "glslang/Include/revision.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/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",
  ]

  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_cc = [
      "-Wno-extra-semi",
      "-Wno-ignored-qualifiers",
      "-Wno-implicit-fallthrough",
      "-Wno-inconsistent-missing-override",
      "-Wno-sign-compare",
      "-Wno-unused-variable",
      "-Wno-missing-field-initializers",
    ]
  }
  if (is_win && !is_clang) {
    cflags = [
      "/wd4018", # signed/unsigned mismatch
      "/wd4189", # local variable is initialized but not referenced
    ]
  }

  deps = [
    "${spirv_tools_dir}:spvtools_opt",
    "${spirv_tools_dir}:spvtools_val",
  ]
}

source_set("glslang_default_resource_limits_sources") {
  sources = [
    "StandAlone/ResourceLimits.cpp",
    "StandAlone/ResourceLimits.h",
  ]
  deps = [ ":glslang_sources" ]
  public_configs = [ ":glslang_public" ]
}

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

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