# Copyright 2016 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

# The yasm build process creates a slew of small C subprograms that
# dynamically generate files at various point in the build process.  This makes
# the build integration moderately complex.
#
# There are three classes of dynamically generated files:
#   1) C source files that should be included in the build (eg., lc3bid.c)
#   2) C source files that are #included by static C sources (eg., license.c)
#   3) Intermediate files that are used as input by other subprograms to
#      further generate files in category #1 or #2.  (eg., version.mac)
#
# This structure is represented with the following targets:
#   1) yasm -- Sources, flags for the main yasm executable. Also has most of
#              of the actions and rules that invoke the subprograms.
#   2) yasm_config -- General build configuration including setting a
#              inputs listing the checked in version of files
#              generated by manually running configure. These manually
#              generated files are used by all binaries.
#   3) yasm_utils -- Object files with memory management and hashing utilities
#              shared between yasm and the genperf subprogram.
#   4) genmacro, genmodule, etc. -- One executable target for each subprogram.
#   5) generate_license, generate_module, etc. -- Actions that invoke programs
#              built in #4 to generate .c files.
#   6) compile_gperf, compile_re2c, etc. -- Actions that invoke programs that
#              turn intermediate files into .c files.

if (current_toolchain == host_toolchain) {
  # Various files referenced by multiple targets.
  yasm_gen_include_dir = "$target_gen_dir/include"
  config_makefile = "config/$host_os/Makefile"
  version_file = "version.mac"

  import("//build/compiled_action.gni")

  config("yasm_config") {
    include_dirs = [
      "config/$host_os",
      ".",
    ]
    defines = [ "HAVE_CONFIG_H" ]
    cflags = [ "-std=gnu99" ]
  }

  executable("genmacro") {
    sources = [
      "tools/genmacro/genmacro.c",
    ]
    configs += [ ":yasm_config" ]
  }

  executable("genmodule") {
    sources = [
      "libyasm/genmodule.c",
    ]
    configs += [ ":yasm_config" ]
  }

  executable("genperf") {
    sources = [
      "tools/genperf/genperf.c",
      "tools/genperf/perfect.c",
    ]

    configs += [ ":yasm_config" ]

    deps = [
      ":yasm_utils",
    ]
  }

  # Used by both yasm and genperf binaries.
  static_library("yasm_utils") {
    sources = [
      "libyasm/phash.c",
      "libyasm/xmalloc.c",
      "libyasm/xstrdup.c",
    ]

    configs += [ ":yasm_config" ]
  }

  executable("genstring") {
    sources = [
      "genstring.c",
    ]
    configs += [ ":yasm_config" ]
  }

  executable("genversion") {
    sources = [
      "modules/preprocs/nasm/genversion.c",
    ]
    configs += [ ":yasm_config" ]
  }

  config("re2c_warnings") {
    # re2c is missing CLOSEVOP from one switch.
    if (is_clang) {
      cflags = [
        # re2c is missing CLOSEVOP from one switch.
        "-Wno-switch",

        # re2c contains many static functions in headers (because it's
        # a C library predating C99.)
        "-Wno-unused-function",
      ]
    }
  }

  executable("re2c") {
    sources = [
      "tools/re2c/actions.c",
      "tools/re2c/code.c",
      "tools/re2c/dfa.c",
      "tools/re2c/main.c",
      "tools/re2c/mbo_getopt.c",
      "tools/re2c/parser.c",
      "tools/re2c/scanner.c",
      "tools/re2c/substr.c",
      "tools/re2c/translate.c",
    ]

    configs += [
      ":yasm_config",
      ":re2c_warnings",
    ]
  }

  config("yasm_warnings") {
    if (is_clang) {
      cflags = [
        # reg3264type in x86expr.c is unused.
        "-Wno-unused-local-typedef",
      ]
    }
  }

  executable("yasm") {
    sources = [
      "frontends/yasm/yasm-options.c",
      "frontends/yasm/yasm.c",
      "libyasm/assocdat.c",
      "libyasm/bc-align.c",
      "libyasm/bc-data.c",
      "libyasm/bc-incbin.c",
      "libyasm/bc-org.c",
      "libyasm/bc-reserve.c",
      "libyasm/bitvect.c",
      "libyasm/bytecode.c",
      "libyasm/errwarn.c",
      "libyasm/expr.c",
      "libyasm/file.c",
      "libyasm/floatnum.c",
      "libyasm/hamt.c",
      "libyasm/insn.c",
      "libyasm/intnum.c",
      "libyasm/inttree.c",
      "libyasm/linemap.c",
      "libyasm/md5.c",
      "libyasm/mergesort.c",
      "libyasm/section.c",
      "libyasm/strcasecmp.c",
      "libyasm/strsep.c",
      "libyasm/symrec.c",
      "libyasm/valparam.c",
      "libyasm/value.c",
      "modules/arch/lc3b/lc3barch.c",
      "modules/arch/lc3b/lc3bbc.c",
      "modules/arch/x86/x86arch.c",
      "modules/arch/x86/x86bc.c",
      "modules/arch/x86/x86expr.c",
      "modules/arch/x86/x86id.c",
      "modules/dbgfmts/codeview/cv-dbgfmt.c",
      "modules/dbgfmts/codeview/cv-symline.c",
      "modules/dbgfmts/codeview/cv-type.c",
      "modules/dbgfmts/dwarf2/dwarf2-aranges.c",
      "modules/dbgfmts/dwarf2/dwarf2-dbgfmt.c",
      "modules/dbgfmts/dwarf2/dwarf2-info.c",
      "modules/dbgfmts/dwarf2/dwarf2-line.c",
      "modules/dbgfmts/null/null-dbgfmt.c",
      "modules/dbgfmts/stabs/stabs-dbgfmt.c",
      "modules/listfmts/nasm/nasm-listfmt.c",
      "modules/objfmts/bin/bin-objfmt.c",
      "modules/objfmts/coff/coff-objfmt.c",
      "modules/objfmts/coff/win64-except.c",
      "modules/objfmts/dbg/dbg-objfmt.c",
      "modules/objfmts/elf/elf-objfmt.c",
      "modules/objfmts/elf/elf-x86-amd64.c",
      "modules/objfmts/elf/elf-x86-x32.c",
      "modules/objfmts/elf/elf-x86-x86.c",
      "modules/objfmts/elf/elf.c",
      "modules/objfmts/macho/macho-objfmt.c",
      "modules/objfmts/rdf/rdf-objfmt.c",
      "modules/objfmts/xdf/xdf-objfmt.c",
      "modules/parsers/gas/gas-parse-intel.c",
      "modules/parsers/gas/gas-parse.c",
      "modules/parsers/gas/gas-parser.c",
      "modules/parsers/nasm/nasm-parse.c",
      "modules/parsers/nasm/nasm-parser.c",
      "modules/preprocs/cpp/cpp-preproc.c",
      "modules/preprocs/nasm/nasm-eval.c",
      "modules/preprocs/nasm/nasm-pp.c",
      "modules/preprocs/nasm/nasm-preproc.c",
      "modules/preprocs/nasm/nasmlib.c",
      "modules/preprocs/raw/raw-preproc.c",

      # Files generated by compile_gperf
      "$target_gen_dir/x86cpu.c",
      "$target_gen_dir/x86regtmod.c",

      # Files generated by compile_re2c
      "$target_gen_dir/gas-token.c",
      "$target_gen_dir/nasm-token.c",

      # File generated by compile_re2c_lc3b
      "$target_gen_dir/lc3bid.c",

      # File generated by generate_module
      "$target_gen_dir/module.c",
    ]

    configs += [
      ":yasm_config",
      ":yasm_warnings",
    ]

    # Yasm generates a bunch of .c files which its source file #include.
    # Add the |target_gen_dir| into the include path so it can find them.
    # Ideally, these generated .c files would be placed into a separate
    # directory, but the gen_x86_insn.py script does not make this easy.
    include_dirs = [ yasm_gen_include_dir ]

    cflags = [
      "-std=c89",
      "-pedantic",
    ]

    # TODO(ajwong): This should take most of the generated output as
    # inputs.
    deps = [
      ":compile_gperf",
      ":compile_gperf_for_include",
      ":compile_nasm_macros",
      ":compile_nasm_version",
      ":compile_re2c",
      ":compile_re2c_lc3b",
      ":compile_win64_gas",
      ":compile_win64_nasm",
      ":generate_license",
      ":generate_module",
      ":generate_version",
      ":yasm_utils",
    ]
  }

  compiled_action_foreach("compile_gperf") {
    tool = ":genperf"
    sources = [
      "modules/arch/x86/x86cpu.gperf",
      "modules/arch/x86/x86regtmod.gperf",
    ]

    outputs = [
      "$target_gen_dir/{{source_name_part}}.c",
    ]
    args = [
      "{{source}}",
      rebase_path(target_gen_dir, root_build_dir) + "/{{source_name_part}}.c",
    ]
    deps = [
      ":generate_x86_insn",
    ]
  }

  # This differs from |compile_gperf| in where it places it output files.
  compiled_action_foreach("compile_gperf_for_include") {
    tool = ":genperf"
    sources = [
      # Make sure the generated gperf files in $target_gen_dir are synced with
      # the outputs for the related generate_*_insn actions in the
      # generate_files target below.
      #
      # The output for these two are #included by
      #   modules/arch/x86/x86id.c
      "$yasm_gen_include_dir/x86insn_gas.gperf",
      "$yasm_gen_include_dir/x86insn_nasm.gperf",
    ]

    outputs = [
      "$yasm_gen_include_dir/{{source_name_part}}.c",
    ]
    args = [
      "{{source}}",
      rebase_path(yasm_gen_include_dir, root_build_dir) +
          "/{{source_name_part}}.c",
    ]
    deps = [
      ":generate_x86_insn",
    ]
  }

  template("compile_macro") {
    compiled_action(target_name) {
      tool = ":genmacro"

      # Output #included by frontends/yasm/yasm.c.
      inputs = invoker.sources
      outputs = invoker.outputs
      args = [
        rebase_path(outputs[0], root_build_dir),
        invoker.macro_varname,
        rebase_path(inputs[0], root_build_dir),
      ]
      if (defined(invoker.deps)) {
        deps = invoker.deps
      }
    }
  }

  compile_macro("compile_nasm_macros") {
    # Output #included by
    #   modules/preprocs/nasm/nasm-parser.c
    sources = [
      "modules/parsers/nasm/nasm-std.mac",
    ]
    outputs = [
      "$yasm_gen_include_dir/nasm-macros.c",
    ]
    macro_varname = "nasm_standard_mac"
  }

  compile_macro("compile_nasm_version") {
    # Output #included by
    #   modules/preprocs/nasm/nasm-preproc.c
    sources = [
      "$target_gen_dir/$version_file",
    ]
    outputs = [
      "$yasm_gen_include_dir/nasm-version.c",
    ]
    macro_varname = "nasm_version_mac"
    deps = [
      ":generate_version",
    ]
  }

  compile_macro("compile_win64_gas") {
    # Output #included by frontends/yasm/yasm.c.
    sources = [
      "modules/objfmts/coff/win64-gas.mac",
    ]
    outputs = [
      "$yasm_gen_include_dir/win64-gas.c",
    ]
    macro_varname = "win64_gas_stdmac"
  }

  compile_macro("compile_win64_nasm") {
    # Output #included by frontends/yasm/yasm.c.
    sources = [
      "modules/objfmts/coff/win64-nasm.mac",
    ]
    outputs = [
      "$yasm_gen_include_dir/win64-nasm.c",
    ]
    macro_varname = "win64_nasm_stdmac"
  }

  compiled_action_foreach("compile_re2c") {
    tool = ":re2c"
    sources = [
      "modules/parsers/gas/gas-token.re",
      "modules/parsers/nasm/nasm-token.re",
    ]
    outputs = [
      "$target_gen_dir/{{source_name_part}}.c",
    ]
    args = [
      "-b",
      "-o",
      rebase_path(target_gen_dir, root_build_dir) + "/{{source_name_part}}.c",
      "{{source}}",
    ]
  }

  # This call doesn't fit into the re2c template above.
  compiled_action("compile_re2c_lc3b") {
    tool = ":re2c"
    inputs = [
      "modules/arch/lc3b/lc3bid.re",
    ]
    outputs = [
      "$target_gen_dir/lc3bid.c",
    ]
    args = [
      "-s",
      "-o",
      rebase_path(outputs[0], root_build_dir),
      rebase_path(inputs[0], root_build_dir),
    ]
  }

  compiled_action("generate_license") {
    tool = ":genstring"

    # Output #included by frontends/yasm/yasm.c.
    inputs = [
      "COPYING",
    ]
    outputs = [
      "$yasm_gen_include_dir/license.c",
    ]
    args = [
      "license_msg",
      rebase_path(outputs[0], root_build_dir),
      rebase_path(inputs[0], root_build_dir),
    ]
  }

  compiled_action("generate_module") {
    tool = ":genmodule"
    inputs = [
      "libyasm/module.in",
      config_makefile,
    ]
    outputs = [
      "$target_gen_dir/module.c",
    ]
    args = [
      rebase_path(inputs[0], root_build_dir),
      rebase_path(config_makefile, root_build_dir),
      rebase_path(outputs[0], root_build_dir),
    ]
  }

  compiled_action("generate_version") {
    tool = ":genversion"
    outputs = [
      "$target_gen_dir/$version_file",
    ]
    args = [ rebase_path(outputs[0], root_build_dir) ]
  }

  action("generate_x86_insn") {
    script = "modules/arch/x86/gen_x86_insn.py"

    # Output eventually #included by frontends/yasm/x86id.c
    outputs = [
      "$yasm_gen_include_dir/x86insns.c",
      "$yasm_gen_include_dir/x86insn_gas.gperf",
      "$yasm_gen_include_dir/x86insn_nasm.gperf",
    ]
    args = [ rebase_path(yasm_gen_include_dir, root_build_dir) ]
  }
}
