# This setups the actions for generated header file headers used by the clang
# libs. The below are heavily influenced by LLVM.

import("//build_overrides/clspv.gni")

# Based on below files
#   `clang/include/clang/Config/BUILD.gn`
#   `clang/include/clang/Basic/BUILD.gn`
#   `clang/lib/Basic/BUILD.gn`
import(
    "//$clspv_llvm_dir/llvm/utils/gn/secondary/clang/lib/StaticAnalyzer/Frontend/enable.gni")
import("//$clspv_llvm_dir/llvm/utils/gn/secondary/llvm/version.gni")
import("../../write_cmake_config.gni")
import("../../write_vcsrevision.gni")

# from include/clang/Basic
write_cmake_config("version") {
  input = "//$clspv_llvm_dir/clang/include/clang/Basic/Version.inc.in"
  output = "$root_gen_dir/$clspv_llvm_dir/clang/Basic/Version.inc"
  values = [
    "CLANG_VERSION=$llvm_version",
    "CLANG_VERSION_MAJOR=$llvm_version_major",
    "CLANG_VERSION_MINOR=$llvm_version_minor",
    "CLANG_VERSION_PATCHLEVEL=$llvm_version_patch",
    "MAX_CLANG_ABI_COMPAT_VERSION=$llvm_version_major",
  ]
}

# from clang/lib/Basic
config("write_vcsrevision_config") {
  # To pick up the generated inc file.
  include_dirs = [ "$root_gen_dir/$clspv_llvm_dir/clang/lib/Basic" ]
  visibility = [ ":write_vcsversion" ]
}

write_vcsrevision("write_vcsversion") {
  header = "$root_gen_dir/$clspv_llvm_dir/clang/lib/Basic/VCSVersion.inc"
  names = [
    "LLVM",
    "CLANG",
  ]
  public_configs = [ ":write_vcsrevision_config" ]
}

write_cmake_config("Config") {
  input = "//$clspv_llvm_dir/clang/include/clang/Config/config.h.cmake"
  output = "$root_gen_dir/$clspv_llvm_dir/clang/Config/config.h"
  values = [
    "BUG_REPORT_URL=https://github.com/llvm/llvm-project/issues/",
    "CLANG_DEFAULT_PIE_ON_LINUX=1",
    "CLANG_DEFAULT_LINKER=",
    "CLANG_DEFAULT_CXX_STDLIB=",
    "CLANG_DEFAULT_RTLIB=",
    "CLANG_DEFAULT_OBJCOPY=objcopy",
    "CLANG_DEFAULT_OPENMP_RUNTIME=libomp",
    "CLANG_DEFAULT_UNWINDLIB=",
    "CLANG_INSTALL_LIBDIR_BASENAME=lib",
    "CLANG_RESOURCE_DIR=",
    "C_INCLUDE_DIRS=",
    "CLANG_CONFIG_FILE_SYSTEM_DIR=",
    "CLANG_CONFIG_FILE_USER_DIR=",
    "CLANG_SPAWN_CC1=",
    "DEFAULT_SYSROOT=",
    "GCC_INSTALL_PREFIX=",
    "ENABLE_LINKER_BUILD_ID=",
    "ENABLE_X86_RELAX_RELOCATIONS=1",
    "CLANG_ENABLE_OBJC_REWRITER=1",  # FIXME: flag?
    "CLANG_ENABLE_CIR=",
    "CLANG_SYSTEMZ_DEFAULT_ARCH=z10",
    "PPC_LINUX_DEFAULT_IEEELONGDOUBLE=",
  ]

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

  if (host_os != "win") {
    values += [
      "CLANG_HAVE_DLADDR=1",
      "CLANG_HAVE_DLFCN_H=1",
      "CLANG_HAVE_RLIMITS=1",
    ]
  } else {
    values += [
      "CLANG_HAVE_DLADDR=",
      "CLANG_HAVE_DLFCN_H=",
      "CLANG_HAVE_RLIMITS=",
    ]
  }

  if (llvm_enable_libxml2) {
    values += [ "CLANG_HAVE_LIBXML=1" ]
  } else {
    values += [ "CLANG_HAVE_LIBXML=" ]
  }

  if (host_os == "mac") {
    # FIXME: Hardcoding this isn't great, but assuming that the host ld version
    # has anything to do with the ld version where the built clang will run
    # isn't either. Probably want to make this a declare_args.
    values += [ "HOST_LINK_VERSION=305" ]
  } else {
    values += [ "HOST_LINK_VERSION=" ]
  }
}
