# Copyright 2019 Google LLC
#
# 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.

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

OS_SRCS = select({
    "@bazel_tools//src/conditions:windows": [
        "glslang/OSDependent/Windows/ossource.cpp",
    ],
    "//conditions:default": [
        "glslang/OSDependent/Unix/ossource.cpp",
    ],
})

OS_DEFINES = select({
    "@bazel_tools//src/conditions:windows": [
    ],
    "//conditions:default": [
        "GLSLANG_OSINCLUDE_UNIX",
    ],
})

OS_LINKOPTS = select({
    "@bazel_tools//src/conditions:windows": [
    ],
    "//conditions:default": [
        "-lpthread",
    ],
})

cc_library(
    name = "glslang",
    srcs = glob(
        [
            "glslang/GenericCodeGen/*.cpp",
            "glslang/MachineIndependent/*.cpp",
            "glslang/MachineIndependent/preprocessor/*.cpp",
            "hlsl/*.cpp",
        ],
        exclude = [
            "glslang/MachineIndependent/pch.cpp",
            "glslang/MachineIndependent/pch.h",
            "hlsl/pch.cpp",
            "hlsl/pch.h",
        ],
    ) + [
        "OGLCompilersDLL/InitializeDll.cpp",
    ] + OS_SRCS,
    hdrs = glob([
        "glslang/Include/*.h",
        "glslang/MachineIndependent/*.h",
        "glslang/MachineIndependent/preprocessor/*.h",
        "hlsl/*.h",
    ]) + [
        "OGLCompilersDLL/InitializeDll.h",
        "StandAlone/DirStackFileIncluder.h",
        "glslang/OSDependent/osinclude.h",
        "glslang/Public/ShaderLang.h",
    ],
    includes = ["glslang/MachineIndependent"],
    defines = [
        "AMD_EXTENSIONS",
        "ENABLE_HLSL",
        "ENABLE_OPT=1",
        "NV_EXTENSIONS",
    ] + OS_DEFINES,
    linkstatic = 1,
)

cc_library(
    name = "SPIRV_headers",
    hdrs = [
        "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/spirv.hpp",
    ],
    includes = ["."],
    linkstatic = 1,
)

cc_library(
    name = "SPIRV",
    srcs = glob(["SPIRV/*.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",
    ],
    linkstatic = 1,
    deps = [
        ":SPIRV_headers",
        ":glslang",
        "@spirv_tools//:spirv_tools_opt",
    ],
)

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

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