# Copyright 2017 The Fuchsia Authors
#
# Permission is hereby granted, free of charge, to any person obtaining a
# copy of this software and associated documentation files (the "Software"),
# to deal in the Software without restriction, including without limitation
# the rights to use, copy, modify, merge, publish, distribute, sublicense,
# and/or sell copies of the Software, and to permit persons to whom the
# Software is furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice (including the next
# paragraph) shall be included in all copies or substantial portions of the
# Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
# IN THE SOFTWARE.

config("spirv_warnings") {
  visibility = [ ":*" ]
  cflags_cc = [
    "-Wno-delete-non-virtual-dtor",
    "-Wno-conversion",
  ]
}

group("generate_include_files") {
  deps = [
    ":build_version_include_file",
    ":core_and_operands_1_0_include_files",
    ":core_and_operands_1_1_include_files",
    ":glsl_1_0_include_file",
    ":opencl_1_0_include_file",
  ]
}

action("build_version_include_file") {
  script = "utils/update_build_version.py"
  args = [
    rebase_path(".", root_build_dir),
    rebase_path("$target_gen_dir/build-version.inc", root_build_dir),
  ]
  sources = [
    "CHANGES",
  ]
  outputs = [
    "$target_gen_dir/build-version.inc",
  ]
}

action("opencl_1_0_include_file") {
  script = "utils/generate_grammar_tables.py"
  spirv_core_grammar =
      "external/spirv-headers/include/spirv/1.0/spirv.core.grammar.json"
  opencl_grammar = "source/extinst-1.0.opencl.std.grammar.json"
  output_file = "opencl.std.insts-1.0.inc"

  args = [
    "--spirv-core-grammar=" + rebase_path(spirv_core_grammar, root_build_dir),
    "--extinst-opencl-grammar=" + rebase_path(opencl_grammar, root_build_dir),
    "--opencl-insts-output=" +
        rebase_path("$target_gen_dir/$output_file", root_build_dir),
  ]
  sources = [
    opencl_grammar,
    spirv_core_grammar,
  ]
  outputs = [
    "$target_gen_dir/$output_file",
  ]
}

action("glsl_1_0_include_file") {
  script = "utils/generate_grammar_tables.py"
  spirv_core_grammar =
      "external/spirv-headers/include/spirv/1.0/spirv.core.grammar.json"
  glsl_grammar = "external/spirv-headers/include/spirv/1.0/extinst.glsl.std.450.grammar.json"
  output_file = "$target_gen_dir/glsl.std.450.insts-1.0.inc"

  args = [
    "--spirv-core-grammar=" + rebase_path(spirv_core_grammar, root_build_dir),
    "--extinst-glsl-grammar=" + rebase_path(glsl_grammar, root_build_dir),
    "--glsl-insts-output=" + rebase_path(output_file, root_build_dir),
  ]
  sources = [
    glsl_grammar,
    spirv_core_grammar,
  ]
  outputs = [
    output_file,
  ]
}

action("core_and_operands_1_0_include_files") {
  script = "utils/generate_grammar_tables.py"
  spirv_core_grammar =
      "external/spirv-headers/include/spirv/1.0/spirv.core.grammar.json"
  core_insts_output_file = "$target_gen_dir/core.insts-1.0.inc"
  operand_kinds_output_file = "$target_gen_dir/operand.kinds-1.0.inc"

  args = [
    "--spirv-core-grammar=" + rebase_path(spirv_core_grammar, root_build_dir),
    "--core-insts-output=" +
        rebase_path(core_insts_output_file, root_build_dir),
    "--operand-kinds-output=" +
        rebase_path(operand_kinds_output_file, root_build_dir),
  ]
  sources = [
    spirv_core_grammar,
  ]
  outputs = [
    core_insts_output_file,
    operand_kinds_output_file,
  ]
}

action("core_and_operands_1_1_include_files") {
  script = "utils/generate_grammar_tables.py"
  spirv_core_grammar =
      "external/spirv-headers/include/spirv/1.1/spirv.core.grammar.json"
  core_insts_output_file = "$target_gen_dir/core.insts-1.1.inc"
  operand_kinds_output_file = "$target_gen_dir/operand.kinds-1.1.inc"

  args = [
    "--spirv-core-grammar=" + rebase_path(spirv_core_grammar, root_build_dir),
    "--core-insts-output=" +
        rebase_path(core_insts_output_file, root_build_dir),
    "--operand-kinds-output=" +
        rebase_path(operand_kinds_output_file, root_build_dir),
  ]
  sources = [
    spirv_core_grammar,
  ]
  outputs = [
    core_insts_output_file,
    operand_kinds_output_file,
  ]
}

config("include_config") {
  include_dirs = [
    "external/spirv-headers/include",
    "include",
    "source",
    ".",
    target_gen_dir,
  ]
}

group("spirv-deps") {
  public_configs = [ ":include_config" ]
  deps = [
    ":generate_include_files",
  ]
}

static_library("spirv-tools") {
  configs += [ ":spirv_warnings" ]
  deps = [
    ":spirv-deps",
  ]
  sources = [
    "source/assembly_grammar.cpp",
    "source/binary.cpp",
    "source/diagnostic.cpp",
    "source/disassemble.cpp",
    "source/ext_inst.cpp",
    "source/libspirv.cpp",
    "source/message.cpp",
    "source/name_mapper.cpp",
    "source/opcode.cpp",
    "source/operand.cpp",
    "source/parsed_operand.cpp",
    "source/print.cpp",
    "source/software_version.cpp",
    "source/spirv_endian.cpp",
    "source/spirv_target_env.cpp",
    "source/table.cpp",
    "source/text.cpp",
    "source/text_handler.cpp",
    "source/util/parse_number.cpp",
    "source/val/basic_block.cpp",
    "source/val/construct.cpp",
    "source/val/function.cpp",
    "source/val/instruction.cpp",
    "source/val/validation_state.cpp",
    "source/validate.cpp",
    "source/validate_cfg.cpp",
    "source/validate_datarules.cpp",
    "source/validate_id.cpp",
    "source/validate_instruction.cpp",
    "source/validate_layout.cpp",
  ]
}

static_library("spirv-tools-opt") {
  configs += [ ":spirv_warnings" ]
  deps = [
    ":spirv-tools",
    ":spirv-deps",
  ]
  sources = [
    "source/opt/build_module.cpp",
    "source/opt/def_use_manager.cpp",
    "source/opt/eliminate_dead_constant_pass.cpp",
    "source/opt/fold_spec_constant_op_and_composite_pass.cpp",
    "source/opt/freeze_spec_constant_value_pass.cpp",
    "source/opt/function.cpp",
    "source/opt/instruction.cpp",
    "source/opt/ir_loader.cpp",
    "source/opt/module.cpp",
    "source/opt/optimizer.cpp",
    "source/opt/pass_manager.cpp",
    "source/opt/set_spec_constant_default_value_pass.cpp",
    "source/opt/strip_debug_info_pass.cpp",
    "source/opt/type_manager.cpp",
    "source/opt/types.cpp",
    "source/opt/unify_const_pass.cpp",
  ]
}

executable("spirv-opt") {
  deps = [
    ":spirv-tools-opt",
    ":spirv-deps",
    ":spirv-tools",
  ]
  sources = [
    "tools/opt/opt.cpp",
  ]
}

executable("spirv-dis") {
  deps = [
    ":spirv-tools",
    ":spirv-deps",
  ]
  sources = [
    "tools/dis/dis.cpp",
  ]
}

executable("spirv-cfg") {
  deps = [
    ":spirv-tools",
    ":spirv-deps",
  ]
  sources = [
    "tools/cfg/bin_to_dot.cpp",
    "tools/cfg/cfg.cpp",
  ]
}

executable("spirv-val") {
  deps = [
    ":spirv-tools",
    ":spirv-deps",
  ]
  sources = [
    "tools/val/val.cpp",
  ]
}

executable("spirv-as") {
  deps = [
    ":spirv-tools",
    ":spirv-deps",
  ]
  sources = [
    "tools/as/as.cpp",
  ]
}

executable("spirv-tools-cpp-example") {
  deps = [
    ":spirv-tools",
    ":spirv-tools-opt",
  ]
  include_dirs = [ "include" ]
  sources = [
    "examples/cpp-interface/main.cpp",
  ]
}
