import("//clang/lib/ARCMigrate/enable.gni")
import("//clang/lib/StaticAnalyzer/Frontend/enable.gni")
import("//llvm/lib/Target/targets.gni")
import("//llvm/triples.gni")
import("//llvm/utils/gn/build/libs/zlib/enable.gni")
import("//llvm/utils/gn/build/write_cmake_config.gni")
import("clang_lit_site_cfg_files.gni")

template("write_lit_config") {
  write_cmake_config(target_name) {
    input = invoker.input
    output = invoker.output
    values = [
      "LIT_SITE_CFG_IN_HEADER=## Autogenerated from $input, do not edit",
      "CLANG_BINARY_DIR=" +
          rebase_path(get_label_info("//clang", "target_out_dir")),
      "CLANG_SOURCE_DIR=" + rebase_path("//clang"),
      "ENABLE_SHARED=0",
      "LLVM_BINARY_DIR=" +
          rebase_path(get_label_info("//llvm", "target_out_dir")),
      "LLVM_LIBS_DIR=",  # needed only for shared builds
      "LLVM_SOURCE_DIR=" + rebase_path("//llvm"),
      "LLVM_TOOLS_DIR=" + rebase_path("$root_out_dir/bin"),
      "TARGET_TRIPLE=$llvm_target_triple",
    ]
    if (host_os == "win") {
      # See comment for Windows solink in llvm/utils/gn/build/toolchain/BUILD.gn
      values += [ "SHLIBDIR=" + rebase_path("$root_out_dir/bin") ]
    } else {
      values += [ "SHLIBDIR=" + rebase_path("$root_out_dir/lib") ]
    }
    values += invoker.extra_values
  }
}

write_lit_config("lit_site_cfg") {
  # Fully-qualified instead of relative for LIT_SITE_CFG_IN_HEADER.
  input = "//clang/test/lit.site.cfg.py.in"
  output = clang_lit_site_cfg_file

  extra_values = [
    "LLVM_WITH_Z3=",  # Must be empty, not 0.
    "CLANG_BUILD_EXAMPLES=0",
    "CLANG_DEFAULT_CXX_STDLIB=",  # Empty string means "default value" here.
    "CLANG_TOOLS_DIR=" + rebase_path("$root_out_dir/bin"),

    # This is only used if LLVM_USE_SANITIZER includes lsan and the host
    # OS is macOS. Since the GN build currently never uses LLVM_USE_SANITIZER,
    # this is never read.  If it's ever needed,
    # utils/gn/build/toolchain/BUILD.gn should get the compiler from a variable
    # that's also read here -- but that should happen after multi-toolchain
    # builds exist, to make sure it's a toolchain var.
    "CMAKE_CXX_COMPILER=c++",
    "ENABLE_BACKTRACES=1",
    "LLVM_HOST_TRIPLE=$llvm_current_triple",
    "LLVM_LIT_TOOLS_DIR=",  # Intentionally empty, matches cmake build.
    "LLVM_USE_SANITIZER=",
    "PYTHON_EXECUTABLE=$python_path",
    "USE_Z3_SOLVER=",
  ]

  if (clang_enable_arcmt) {
    extra_values += [ "CLANG_ENABLE_ARCMT=1" ]
  } else {
    extra_values += [ "CLANG_ENABLE_ARCMT=0" ]
  }

  if (clang_enable_static_analyzer) {
    extra_values += [ "CLANG_ENABLE_STATIC_ANALYZER=1" ]
  } else {
    extra_values += [ "CLANG_ENABLE_STATIC_ANALYZER=0" ]
  }

  if (llvm_enable_zlib) {
    extra_values += [ "HAVE_LIBZ=1" ]
  } else {
    extra_values += [ "HAVE_LIBZ=0" ]  # Must be 0.
  }

  if (host_cpu == "x64") {
    extra_values += [ "HOST_ARCH=x86_64" ]
  } else {
    assert(false, "unimplemented host_cpu " + host_cpu)
  }

  if (host_os == "mac") {
    extra_values += [ "LLVM_PLUGIN_EXT=.dylib" ]
  } else if (host_os == "win") {
    extra_values += [ "LLVM_PLUGIN_EXT=.dll" ]
  } else {
    extra_values += [ "LLVM_PLUGIN_EXT=.so" ]
  }
}

write_lit_config("lit_unit_site_cfg") {
  # Fully-qualified instead of relative for LIT_SITE_CFG_IN_HEADER.
  input = "//clang/test/Unit/lit.site.cfg.py.in"
  output = clang_lit_unit_site_cfg_file
  extra_values = [ "LLVM_BUILD_MODE=." ]
}

# This target should contain all dependencies of check-clang.
# //:default depends on it, so that ninja's default target builds all
# prerequisites for check-clang but doesn't run check-clang itself.
group("test") {
  deps = [
    ":lit_site_cfg",
    ":lit_unit_site_cfg",
    "//clang/lib/Headers",
    "//clang/tools/c-index-test",
    "//clang/tools/clang-diff",
    "//clang/tools/clang-format",
    "//clang/tools/clang-import-test",
    "//clang/tools/clang-offload-bundler",
    "//clang/tools/clang-refactor",
    "//clang/tools/clang-rename",
    "//clang/tools/diagtool",
    "//clang/tools/driver:symlinks",
    "//clang/unittests",
    "//clang/utils/TableGen:clang-tblgen",
    "//clang/utils/hmaptool",
    "//llvm/tools/llc",
    "//llvm/tools/llvm-bcanalyzer",
    "//llvm/tools/llvm-cat",
    "//llvm/tools/llvm-config",
    "//llvm/tools/llvm-dis",
    "//llvm/tools/llvm-lto",
    "//llvm/tools/llvm-lto2",
    "//llvm/tools/llvm-modextract",
    "//llvm/tools/llvm-nm:symlinks",
    "//llvm/tools/llvm-objdump:symlinks",
    "//llvm/tools/llvm-profdata",
    "//llvm/tools/llvm-readobj:symlinks",
    "//llvm/tools/llvm-symbolizer:symlinks",
    "//llvm/tools/opt",
    "//llvm/utils/FileCheck",
    "//llvm/utils/count",
    "//llvm/utils/llvm-lit",
    "//llvm/utils/not",
  ]
  if (clang_enable_arcmt) {
    deps += [
      "//clang/tools/arcmt-test",
      "//clang/tools/c-arcmt-test",
    ]
  }
  if (clang_enable_static_analyzer) {
    deps += [
      "//clang/tools/clang-check",
      "//clang/tools/clang-extdef-mapping",
    ]
  }

  # FIXME: clang_build_examples
  testonly = true
}

action("check-clang") {
  script = "$root_out_dir/bin/llvm-lit"
  if (host_os == "win") {
    script += ".py"
  }
  args = [
    "-sv",
    "--param",
    "clang_site_config=" + rebase_path(clang_lit_site_cfg_file, root_out_dir),
    "--param",
    "clang_unit_site_config=" +
        rebase_path(clang_lit_unit_site_cfg_file, root_out_dir),
    rebase_path(".", root_out_dir),
  ]
  outputs = [
    "$target_gen_dir/run-lit",  # Non-existing, so that ninja runs it each time.
  ]

  # Since check-clang is always dirty, //:default doesn't depend on it so that
  # it's not part of the default ninja target.  Hence, check-clang shouldn't
  # have any deps except :test. so that the default target is sure to build
  # all the deps.
  deps = [
    ":test",
  ]
  testonly = true

  pool = "//:console"
}
