BUILD.gn 5.53 KB
import("//llvm/utils/gn/build/buildflags.gni")
import("//llvm/utils/gn/build/mac_sdk.gni")
import("//llvm/utils/gn/build/toolchain/compiler.gni")
import("//llvm/utils/gn/build/toolchain/target_flags.gni")

declare_args() {
  # Whether to build everything with coverage information.
  # After building with this, run tests and then run
  #    llvm/utils/prepare-code-coverage-artifact.py  \
  #        .../llvm-profdata .../llvm-cov out/gn/profiles/ report/ \
  #        out/gn/bin/llvm-undname ...`
  # to generate a HTML report for the binaries passed in the last line.
  llvm_build_instrumented_coverage = false
}

assert(!llvm_build_instrumented_coverage || is_clang,
       "llvm_build_instrumented_coverage requires clang as host compiler")

config("compiler_defaults") {
  defines = []

  if (!llvm_enable_assertions) {
    defines += [ "NDEBUG" ]
  }

  asmflags = target_flags
  cflags = target_flags
  ldflags = target_flags + target_ldflags

  if (host_os == "mac" && clang_base_path != "") {
    cflags += [
      "-isysroot",
      mac_sdk_path,
    ]
  }

  if (host_os != "win") {
    if (is_debug) {
      cflags += [ "-g" ]
    }
    if (is_optimized) {
      cflags += [ "-O3" ]
    }
    cflags += [ "-fdiagnostics-color" ]
    if (use_lld) {
      ldflags += [ "-Wl,--color-diagnostics" ]
    }
    cflags_cc = [
      "-std=c++14",
      "-fvisibility-inlines-hidden",
    ]
  } else {
    if (is_debug) {
      cflags += [
        "/Zi",
        "/FS",
      ]
      ldflags += [ "/DEBUG" ]
    }
    if (is_optimized) {
      cflags += [
        "/O2",
        "/Gw",
        "/Zc:inline",
      ]
      ldflags += [
        "/OPT:REF",
        "/OPT:ICF",
      ]
    }
    defines += [
      "_CRT_SECURE_NO_DEPRECATE",
      "_CRT_SECURE_NO_WARNINGS",
      "_CRT_NONSTDC_NO_DEPRECATE",
      "_CRT_NONSTDC_NO_WARNINGS",
      "_SCL_SECURE_NO_DEPRECATE",
      "_SCL_SECURE_NO_WARNINGS",

      "_HAS_EXCEPTIONS=0",
      "_UNICODE",
      "UNICODE",
    ]
    cflags += [ "/EHs-c-" ]

    # The MSVC default value (1 MB) is not enough for parsing recursive C++
    # templates in Clang.
    ldflags += [ "/STACK:10000000" ]
  }

  # Warning setup.
  if (host_os == "win" && !is_clang) {
    cflags += [
      # Suppress ''modifier' : used more than once' (__forceinline and inline).
      "-wd4141",

      # Suppress 'conversion from 'type1' to 'type2', possible loss of data'.
      "-wd4244",

      # Suppress 'conversion from 'size_t' to 'type', possible loss of data'.
      "-wd4267",

      # Suppress 'no matching operator delete found'.
      "-wd4291",

      # Suppress 'noexcept used with no exception handling mode specified'.
      "-wd4577",

      # Suppress 'destructor was implicitly defined as deleted'.
      "-wd4624",

      # Suppress 'unsafe mix of type <type> and type <type> in operation'.
      "-wd4805",
    ]
  } else {
    if (host_os == "win") {
      cflags += [ "/W4" ]
    } else {
      cflags += [
        "-Wall",
        "-Wextra",
      ]
    }
    cflags += [ "-Wno-unused-parameter" ]
    if (is_clang) {
      cflags += [
        "-Wdelete-non-virtual-dtor",
        "-Wstring-conversion",
      ]
    } else {
      cflags += [
        # GCC's -Wcomment complains about // comments ending with '\' if the
        # next line is also a // comment.
        "-Wno-comment",

        # Disable gcc's potentially uninitialized use analysis as it presents
        # lots of false positives.
        "-Wno-maybe-uninitialized",
      ]
      cflags_cc += [
        # The LLVM libraries have no stable C++ API, so -Wnoexcept-type is not
        # useful.
        "-Wno-noexcept-type",
      ]
    }
    if (is_clang && use_goma) {
      # goma converts all paths to lowercase on the server, breaking this
      # warning.
      cflags += [ "-Wno-nonportable-include-path" ]
    }
  }

  # On Windows, the linker is not invoked through the compiler driver.
  if (use_lld && host_os != "win") {
    ldflags += [ "-fuse-ld=lld" ]
  }

  if (llvm_build_instrumented_coverage) {
    cflags += [
      "-fcoverage-mapping",

      # Using an absolute path here is lame, but it's used at test execution
      # time to generate the profiles, and lit doesn't specify a fixed folder
      # for test execution -- so this is the only way to get all profiles into
      # a single folder like llvm/utils/prepare-code-coverage-artifact.py
      # expects.
      "-fprofile-instr-generate=" +
          rebase_path("$root_build_dir/profiles/%4m.profraw"),
    ]
    ldflags += [ "-fprofile-instr-generate" ]
  }
}

config("no_exceptions") {
  if (host_os != "win") {
    cflags_cc = [ "-fno-exceptions" ]
  }
}

config("no_rtti") {
  if (current_os == "win") {
    cflags_cc = [ "/GR-" ]
  } else {
    cflags_cc = [ "-fno-rtti" ]
  }
}

# To make an archive that can be distributed, you need to remove this config and
# set complete_static_lib.
config("thin_archive") {
  if (current_os != "win" && current_os != "mac") {
    arflags = [ "-T" ]
  }
}

config("llvm_code") {
  include_dirs = [
    "//llvm/include",
    "$root_gen_dir/llvm/include",
  ]
}

config("lld_code") {
  include_dirs = [
    "//lld/include",
    "$root_gen_dir/lld/include",
  ]
}

config("clang_code") {
  if (host_os != "win") {
    cflags = [ "-fno-strict-aliasing" ]
  }
  include_dirs = [
    "//clang/include",
    "$root_gen_dir/clang/include",
  ]
}

config("crt_code") {
  include_dirs = [ "//compiler-rt/lib" ]
  cflags = [
    "-fPIC",
    "-funwind-tables",
    "-gline-tables-only",
    "-fvisibility=hidden",
  ]
}

config("warn_covered_switch_default") {
  if (is_clang) {
    cflags = [ "-Wcovered-switch-default" ]
  }
}