# Copyright (C) 2020 The Khronos Group 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 The Khronos Group 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.

package(
    default_visibility = ["//visibility:public"],
)

# Description:
#
# Khronos reference front-end for GLSL and ESSL, and sample SPIR-V generator.

licenses(["notice"])

exports_files(["LICENSE"])

# Build information generation script
py_binary(
    name = "build_info",
    srcs = ["build_info.py"],
)

genrule(
    name = "gen_build_info_h",
    srcs = ["CHANGES.md", "build_info.h.tmpl"],
    outs = ["glslang/build_info.h"],
    cmd = "$(location build_info) $$(dirname $(location CHANGES.md)) -i $(location build_info.h.tmpl) -o $(location glslang/build_info.h)",
    tools = [":build_info"],
)

COMMON_COPTS = select({
    "@bazel_tools//src/conditions:windows": [""],
    "//conditions:default": [
        "-Wall",
        "-Wuninitialized",
        "-Wunused",
        "-Wunused-local-typedefs",
        "-Wunused-parameter",
        "-Wunused-value",
        "-Wunused-variable",
        "-Wno-reorder",
        "-std=c++11",
        "-fvisibility=hidden",
        "-fvisibility-inlines-hidden",
        "-fno-exceptions",
        "-fno-rtti",
    ],
})

cc_library(
    name = "glslang",
    srcs = glob(
        [
            "glslang/GenericCodeGen/*.cpp",
            "glslang/HLSL/*.cpp",
            "glslang/MachineIndependent/*.cpp",
            "glslang/MachineIndependent/preprocessor/*.cpp",
        ],
        exclude = [
            "glslang/HLSL/pch.h",
            "glslang/MachineIndependent/pch.h",
        ],
    ) + [
        "OGLCompilersDLL/InitializeDll.cpp",
    ] + select({
        "@bazel_tools//src/conditions:windows":
            ["glslang/OSDependent/Windows/ossource.cpp"],
        "//conditions:default":
            ["glslang/OSDependent/Unix/ossource.cpp"],
    }),
    hdrs = glob([
        "glslang/HLSL/*.h",
        "glslang/Include/*.h",
        "glslang/MachineIndependent/*.h",
        "glslang/MachineIndependent/preprocessor/*.h",
    ]) + [
        "OGLCompilersDLL/InitializeDll.h",
        "StandAlone/DirStackFileIncluder.h",
        "glslang/OSDependent/osinclude.h",
        "glslang/Public/ShaderLang.h",
        ":gen_build_info_h",
    ],
    copts = COMMON_COPTS,
    defines = [
        "AMD_EXTENSIONS",
        "ENABLE_HLSL=0",
        "ENABLE_OPT=0",
        "NV_EXTENSIONS",
    ],
    linkopts = select({
        "@bazel_tools//src/conditions:windows": [""],
        "//conditions:default": ["-lm", "-lpthread"],
    }),
    linkstatic = 1,
)

genrule(
    name = "export_spirv_headers",
    srcs = [
        "SPIRV/GLSL.ext.AMD.h",
        "SPIRV/GLSL.ext.EXT.h",
        "SPIRV/GLSL.ext.KHR.h",
        "SPIRV/GLSL.ext.NV.h",
        "SPIRV/GLSL.std.450.h",
        "SPIRV/NonSemanticDebugPrintf.h",
        "SPIRV/spirv.hpp",
    ],
    outs = [
        "include/SPIRV/GLSL.ext.AMD.h",
        "include/SPIRV/GLSL.ext.EXT.h",
        "include/SPIRV/GLSL.ext.KHR.h",
        "include/SPIRV/GLSL.ext.NV.h",
        "include/SPIRV/GLSL.std.450.h",
        "include/SPIRV/NonSemanticDebugPrintf.h",
        "include/SPIRV/spirv.hpp",
    ],
    cmd = "mkdir -p $(@D)/include/SPIRV && cp $(SRCS) $(@D)/include/SPIRV/",
)

cc_library(
    name = "SPIRV_headers",
    hdrs = [":export_spirv_headers"],
    copts = COMMON_COPTS,
    includes = [
        "include",
        "include/SPIRV",
    ],
    linkstatic = 1,
)

cc_library(
    name = "SPIRV",
    srcs = glob(
        ["SPIRV/*.cpp"],
        exclude = [
            "SPIRV/SpvTools.cpp",
        ],
    ),
    hdrs = [
        "SPIRV/GlslangToSpv.h",
        "SPIRV/Logger.h",
        "SPIRV/SPVRemapper.h",
        "SPIRV/SpvBuilder.h",
        "SPIRV/SpvTools.h",
        "SPIRV/bitutils.h",
        "SPIRV/disassemble.h",
        "SPIRV/doc.h",
        "SPIRV/hex_float.h",
        "SPIRV/spvIR.h",
    ],
    copts = COMMON_COPTS,
    includes = ["SPIRV"],
    linkopts = select({
        "@bazel_tools//src/conditions:windows": [""],
        "//conditions:default": ["-lm"],
    }),
    linkstatic = 1,
    deps = [
        ":SPIRV_headers",
        ":glslang",
    ],
)

cc_library(
    name = "glslang-default-resource-limits",
    srcs = ["StandAlone/ResourceLimits.cpp"],
    hdrs = ["StandAlone/ResourceLimits.h"],
    copts = COMMON_COPTS,
    linkstatic = 1,
    deps = [":glslang"],
)

cc_binary(
    name = "glslangValidator",
    srcs = [
        "StandAlone/StandAlone.cpp",
        "StandAlone/Worklist.h",
    ],
    copts = COMMON_COPTS,
    deps = [
        ":SPIRV",
        ":glslang",
        ":glslang-default-resource-limits",
    ],
)

cc_binary(
    name = "spirv-remap",
    srcs = ["StandAlone/spirv-remap.cpp"],
    copts = COMMON_COPTS,
    deps = [
        ":SPIRV",
        ":glslang",
        ":glslang-default-resource-limits",
    ],
)

filegroup(
    name = "test_files",
    srcs = glob(
        ["Test/**"],
        exclude = [
            "Test/bump",
            "Test/glslangValidator",
            "Test/runtests",
        ],
    ),
)

cc_library(
    name = "glslang_test_lib",
    testonly = 1,
    srcs = [
        "gtests/HexFloat.cpp",
        "gtests/Initializer.h",
        "gtests/Settings.cpp",
        "gtests/Settings.h",
        "gtests/TestFixture.cpp",
        "gtests/TestFixture.h",
        "gtests/main.cpp",
    ],
    copts = COMMON_COPTS,
    data = [":test_files"],
    defines = select({
        # Unfortunately we can't use $(location) in cc_library at the moment.
        # See https://github.com/bazelbuild/bazel/issues/1023
        # So we'll specify the path manually.
        "@bazel_tools//src/conditions:windows":
            ["GLSLANG_TEST_DIRECTORY='\"../../../../../Test\"'"],
        "//conditions:default":
            ["GLSLANG_TEST_DIRECTORY='\"Test\"'"],
    }),
    linkstatic = 1,
    deps = [
        ":SPIRV",
        ":glslang",
        ":glslang-default-resource-limits",
        "@com_google_googletest//:gtest",
    ],
)

GLSLANG_TESTS = glob(
    ["gtests/*.FromFile.cpp"],
    # Since we are not building the SPIRV-Tools dependency, the following tests
    # cannot be performed.
    exclude = [
        "gtests/Hlsl.FromFile.cpp",
        "gtests/Spv.FromFile.cpp",
    ],
)

[cc_test(
    name = test_file.replace("gtests/", "").replace(".FromFile.cpp", "") + "_test",
    srcs = [test_file],
    copts = COMMON_COPTS,
    data = [
        ":test_files",
    ],
    deps = [
        ":SPIRV",
        ":glslang",
        ":glslang_test_lib",
    ],
) for test_file in GLSLANG_TESTS]
