//
// Copyright (C) 2018 The Android Open Source Project
//
// 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
//
//      http://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.
//

// SPIRV Tools

// genrules were obtained from the CMake build:
// $ cmake .. -G Ninja -DCMAKE_BUILD_TYPE=Debug
// $ ninja -v -j 1 >log.log
// Find Python invocations.
// Use regex replacements to get "cmd:" lines below.

genrule {
    name: "swiftshader_spvtools_generate_grammar_tables",
    out: [
        "core.insts-unified1.inc",
        "debuginfo.insts.inc",
        "enum_string_mapping.inc",
        "extension_enum.inc",
        "glsl.std.450.insts.inc",
        "opencl.debuginfo.100.insts.inc",
        "opencl.std.insts.inc",
        "operand.kinds-unified1.inc",
        "spv-amd-gcn-shader.insts.inc",
        "spv-amd-shader-ballot.insts.inc",
        "spv-amd-shader-explicit-vertex-parameter.insts.inc",
        "spv-amd-shader-trinary-minmax.insts.inc",
    ],
    srcs: [
        ":swiftshader_spirv_headers_unified1_extinst.glsl.std.450.grammar.json",
        ":swiftshader_spirv_headers_unified1_extinst.opencl.std.100.grammar.json",
        ":swiftshader_spirv_headers_unified1_spirv.core.grammar.json",
        "source/extinst.debuginfo.grammar.json",
        "source/extinst.opencl.debuginfo.100.grammar.json",
        "source/extinst.spv-amd-gcn-shader.grammar.json",
        "source/extinst.spv-amd-shader-ballot.grammar.json",
        "source/extinst.spv-amd-shader-explicit-vertex-parameter.grammar.json",
        "source/extinst.spv-amd-shader-trinary-minmax.grammar.json",
    ],
    tool_files: ["utils/generate_grammar_tables.py"],
    cmd:
        "$(location) --extinst-vendor-grammar=$(location source/extinst.spv-amd-gcn-shader.grammar.json) --vendor-insts-output=$(location spv-amd-gcn-shader.insts.inc) --vendor-operand-kind-prefix=; "+
        "$(location) --spirv-core-grammar=$(location :swiftshader_spirv_headers_unified1_spirv.core.grammar.json) --extinst-debuginfo-grammar=$(location source/extinst.debuginfo.grammar.json) --extinst-cldebuginfo100-grammar=$(location source/extinst.opencl.debuginfo.100.grammar.json) --core-insts-output=$(location core.insts-unified1.inc) --operand-kinds-output=$(location operand.kinds-unified1.inc); "+
        "$(location) --extinst-vendor-grammar=$(location source/extinst.debuginfo.grammar.json) --vendor-insts-output=$(location debuginfo.insts.inc) --vendor-operand-kind-prefix=; "+
        "$(location) --extinst-vendor-grammar=$(location source/extinst.spv-amd-shader-ballot.grammar.json) --vendor-insts-output=$(location spv-amd-shader-ballot.insts.inc) --vendor-operand-kind-prefix=; "+
        "$(location) --extinst-vendor-grammar=$(location source/extinst.spv-amd-shader-explicit-vertex-parameter.grammar.json) --vendor-insts-output=$(location spv-amd-shader-explicit-vertex-parameter.insts.inc) --vendor-operand-kind-prefix=; "+
        "$(location) --extinst-vendor-grammar=$(location source/extinst.spv-amd-shader-trinary-minmax.grammar.json) --vendor-insts-output=$(location spv-amd-shader-trinary-minmax.insts.inc) --vendor-operand-kind-prefix=; "+
        "$(location) --extinst-vendor-grammar=$(location source/extinst.opencl.debuginfo.100.grammar.json) --vendor-insts-output=$(location opencl.debuginfo.100.insts.inc) --vendor-operand-kind-prefix=CLDEBUG100_; "+
        "$(location) --spirv-core-grammar=$(location :swiftshader_spirv_headers_unified1_spirv.core.grammar.json) --extinst-debuginfo-grammar=$(location source/extinst.debuginfo.grammar.json) --extinst-cldebuginfo100-grammar=$(location source/extinst.opencl.debuginfo.100.grammar.json) --extension-enum-output=$(location extension_enum.inc) --enum-string-mapping-output=$(location enum_string_mapping.inc); "+
        "$(location) --extinst-opencl-grammar=$(location :swiftshader_spirv_headers_unified1_extinst.opencl.std.100.grammar.json) --opencl-insts-output=$(location opencl.std.insts.inc); "+
        "$(location) --extinst-glsl-grammar=$(location :swiftshader_spirv_headers_unified1_extinst.glsl.std.450.grammar.json) --glsl-insts-output=$(location glsl.std.450.insts.inc); "
}


genrule {
    name: "swiftshader_spvtools_generate_language_headers",
    out: [
        "DebugInfo.h",
        "OpenCLDebugInfo100.h",
    ],
    srcs: [
        "source/extinst.debuginfo.grammar.json",
        "source/extinst.opencl.debuginfo.100.grammar.json",
    ],
    tool_files: ["utils/generate_language_headers.py"],
    cmd: 
        "$(location) --extinst-name=DebugInfo --extinst-grammar=$(location source/extinst.debuginfo.grammar.json) --extinst-output-base=$$(dirname $(location DebugInfo.h))/DebugInfo; "+
        "$(location) --extinst-name=OpenCLDebugInfo100 --extinst-grammar=$(location source/extinst.opencl.debuginfo.100.grammar.json) --extinst-output-base=$$(dirname $(location OpenCLDebugInfo100.h))/OpenCLDebugInfo100; "
}

genrule {
    name: "swiftshader_spvtools_generate_registry_tables",
    out: [
        "generators.inc"
    ],
    srcs: [
        ":swiftshader_spirv_headers_spir-v.xml"
    ],
    tool_files: ["utils/generate_registry_tables.py"],
    cmd: "$(location) --xml=$(location :swiftshader_spirv_headers_spir-v.xml) --generator-output=$(location generators.inc)",
}

genrule { // FIXME this relies on `git` which is no good on build machines
    name: "swiftshader_spvtools_update_build_version",
    out: ["build-version.inc"],
    srcs: ["CHANGES"],
    tool_files: ["utils/update_build_version.py"],
    cmd: "$(location) $$(dirname $(location CHANGES)) " +
         "$(location build-version.inc)",
}

cc_library_static {
    name: "swiftshader_spirv-tools",
    vendor_available: true,
    srcs: [
        "source/*.cpp",
        "source/util/*.cpp",
        "source/val/*.cpp",
        "source/opt/*.cpp",
    ],
    local_include_dirs: [
        "source",
    ],
    export_include_dirs: [
        "include",
    ],
    include_dirs: [
        "external/swiftshader/third_party/SPIRV-Headers/include"
    ],
    generated_headers: [
        "swiftshader_spvtools_generate_grammar_tables",
        "swiftshader_spvtools_generate_language_headers",
        "swiftshader_spvtools_update_build_version",
        "swiftshader_spvtools_generate_registry_tables",
    ],
    stl: "libc++_static",
    cppflags: [
        "-Wno-implicit-fallthrough"
    ],
}
