Add BUILD.gn to build library/executables on Fuchsia
Change-Id: I5b55757d36367a33adbc3d402c7f8c1778c8282c
diff --git a/.gitignore b/.gitignore
index 5295aef..283df0d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,4 +1,4 @@
-/build*
+/build/*
.ycm_extra_conf.py*
compile_commands.json
/external/googletest/
diff --git a/BUILD.gn b/BUILD.gn
new file mode 100644
index 0000000..46a31cf
--- /dev/null
+++ b/BUILD.gn
@@ -0,0 +1,290 @@
+# 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.
+
+import("//magma/gnbuild/magma.gni")
+
+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") {
+ deps = [
+ ":spirv-tools_src($magma_shared_toolchain)",
+ ]
+}
+
+source_set("spirv-tools_src") {
+ 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") {
+ deps = [
+ ":spirv-tools",
+ ":spirv-tools-opt_src($magma_shared_toolchain)",
+ ]
+}
+
+source_set("spirv-tools-opt_src") {
+ deps = [
+ ":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",
+ ]
+}