import("//clang-tools-extra/clangd/xpc/enable.gni")
import("//clang/lib/StaticAnalyzer/Frontend/enable.gni")
import("//llvm/triples.gni")
import("//llvm/utils/gn/build/write_cmake_config.gni")
import("clang_tools_extra_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_TOOLS_BINARY_DIR=" +
          rebase_path(get_label_info("//clang-tools-extra", "target_out_dir")),
      "CLANG_TOOLS_SOURCE_DIR=" + rebase_path("//clang-tools-extra"),
      "LLVM_LIBS_DIR=",  # needed only for shared builds
      "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-tools-extra/test/lit.site.cfg.py.in"
  output = clang_tools_extra_lit_site_cfg_file

  extra_values = [
    "CLANG_TOOLS_DIR=" + rebase_path("$root_out_dir/bin"),
    "LLVM_LIT_TOOLS_DIR=",  # Intentionally empty, matches cmake build.
    "LLVM_TOOLS_DIR=" + rebase_path("$root_out_dir/bin"),
    "PYTHON_EXECUTABLE=$python_path",
  ]

  if (clangd_build_xpc) {
    extra_values += [ "CLANGD_BUILD_XPC=1" ]
  } else {
    extra_values += [ "CLANGD_BUILD_XPC=0" ]
  }

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

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

# This target should contain all dependencies of check-clang-tools.
# //: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-tools-extra/clang-apply-replacements/tool:clang-apply-replacements",
    "//clang-tools-extra/clang-change-namespace/tool:clang-change-namespace",
    "//clang-tools-extra/clang-doc/tool:clang-doc",
    "//clang-tools-extra/clang-include-fixer/find-all-symbols/tool:find-all-symbols",
    "//clang-tools-extra/clang-include-fixer/tool:clang-include-fixer",
    "//clang-tools-extra/clang-move/tool:clang-move",
    "//clang-tools-extra/clang-query/tool:clang-query",
    "//clang-tools-extra/clang-reorder-fields/tool:clang-reorder-fields",
    "//clang-tools-extra/clang-tidy/tool:clang-tidy",
    "//clang-tools-extra/clangd/index/dex/dexp",
    "//clang-tools-extra/clangd/indexer:clangd-indexer",
    "//clang-tools-extra/clangd/tool:clangd",
    "//clang-tools-extra/modularize",
    "//clang-tools-extra/pp-trace",
    "//clang-tools-extra/unittests",
    "//clang/lib/Headers",
    "//clang/tools/c-index-test",
    "//clang/tools/clang-rename",
    "//clang/tools/driver:symlinks",
    "//llvm/tools/llvm-bcanalyzer",
    "//llvm/utils/FileCheck",
    "//llvm/utils/count",
    "//llvm/utils/llvm-lit",
    "//llvm/utils/not",
  ]
  if (clangd_build_xpc) {
    deps +=
        [ "//clang-tools-extra/clangd/xpc/test-client:clangd-xpc-test-client" ]
  }
  testonly = true
}

action("check-clang-tools") {
  script = "$root_out_dir/bin/llvm-lit"
  if (host_os == "win") {
    script += ".py"
  }
  args = [
    "-sv",
    "--param",
    "clang_site_config=" +
        rebase_path(clang_tools_extra_lit_site_cfg_file, root_out_dir),
    "--param",
    "clang_unit_site_config=" +
        rebase_path(clang_tools_extra_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-tools 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"
}
