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

declare_args() {
  # Set this to false if you'd like to disable -Werror.
  enable_werror = true

  # Set this to false if you want to disable Large File Support (LFS).
  enable_lfs = true
}

_cflags_no_exceptions = [
  "-fno-exceptions",
  "-fno-unwind-tables",
  "-fno-asynchronous-unwind-tables",
]

config("no_exceptions") {
  cflags_cc = _cflags_no_exceptions
  cflags_c = _cflags_no_exceptions
}

_gcc_cflags = [ "-Wno-psabi" ]

config("gcc_cflags_c") {
  cflags_c = _gcc_cflags
}
config("gcc_cflags_cc") {
  cflags_cc = _gcc_cflags
}

# Note: DO NOT USE THIS.  Use brillo/brillo_export.h instead to export symbols.
#
# Symbol visibility is set to be internal by default. Add this to your target's
# configs to make its symbols visible.
# Setting "-fvisibility=default" directly in your target's cflags doesn't work
# because it will be overwritten by the "-fvisibility=internal" in the
# compiler_defaults' cflags.
config("visibility_default") {
  # gnlint: disable=GnLintVisibilityFlags
  cflags = [ "-fvisibility=default" ]
}

config("compiler_defaults") {
  defines = []
  libs = []

  include_dirs = [
    "${root_gen_dir}/include",
    "${platform2_root}",
  ]
  cflags = [
    "-Wall",
    "-Wunused",
    "-Wbool-operation",
    "-Wfree-nonheap-object",
    "-Wint-in-bool-context",
    "-Wstring-compare",
    "-Wstring-plus-int",
    "-Wxor-used-as-pow",

    # We use C99 array designators in C++ code.  Our compilers support this
    # extension since C++ has no equivalent yet (as of C++20).
    "-Wno-c99-designator",
    "-Wno-unused-parameter",
    "-Wunreachable-code",
    "-Wunreachable-code-return",
    "-ggdb3",
    "-fstack-protector-strong",
    "-Wformat=2",
    "-fvisibility=internal",
    "-Wa,--noexecstack",
    "-Wimplicit-fallthrough",
  ]
  cflags_c = [ "-std=gnu11" ] + external_cppflags + external_cxxflags
  cflags_cc = [ "-std=gnu++17" ] + external_cppflags + external_cxxflags
  ldflags = external_ldflags + [
              "-Wl,-z,relro",
              "-Wl,-z,noexecstack",
              "-Wl,-z,now",
              "-Wl,--as-needed",
            ]
  if (enable_werror) {
    cflags += [ "-Werror" ]
  }
  if (use.cros_host) {
    defines += [ "NDEBUG" ]
  }
  if (enable_lfs) {
    defines += [
      # Enable support for new LFS funcs (ftello/etc...).
      "_LARGEFILE_SOURCE",

      # Enable support for 64bit variants (off64_t/fseeko64/etc...).
      "_LARGEFILE64_SOURCE",

      # Default to 64bit variants (off_t is defined as off64_t).
      "_FILE_OFFSET_BITS=64",
    ]
  }

  # We only rely on `enable_exceptions` arg to control no_exceptions flags
  # (see BUILDCONFIG.gn) and ignore if the given external flags contain these
  # flags. As removing non-existing flags causes error on GN, we add them before
  # its removal to unconditionally remove them.
  cflags_cc += _cflags_no_exceptions
  cflags_c += _cflags_no_exceptions
  cflags_cc -= _cflags_no_exceptions
  cflags_c -= _cflags_no_exceptions

  if (!use.cros_host) {
    include_dirs += [ "${sysroot}/usr/include" ]
    cflags += [ "--sysroot=${sysroot}" ]
    ldflags += [ "--sysroot=${sysroot}" ]
  }
  if (use.profiling) {
    cflags += [
      "-fprofile-instr-generate",
      "-fcoverage-mapping",
    ]
    ldflags += [
      "-fprofile-instr-generate",
      "-fcoverage-mapping",
    ]
  }
  if (use.tcmalloc) {
    libs += [ "tcmalloc" ]
  }
}

# Generates position independent executable.
# This is a default config for executables and static libraries.
config("pie") {
  cflags = [ "-fPIE" ]

  # ldflags are not pushed to dependents, so applying ldflags to source sets or
  # static libraries will be a no-op. You can just remove "pie" config from an
  # executable to make the executable not position independent.
  ldflags = [ "-pie" ]
}

# Use thin archive. It makes sense only for static libraries.
# This is a default config for static libraries.
# Remove this and add ":nouse_thin_archive" to unuse thin archive.
config("use_thin_archive") {
  arflags = [ "rcsT" ]
}

# Don't use thin archive. It makes sense only for static libraries.
config("nouse_thin_archive") {
  arflags = [ "rcs" ]
}

# Generates position independent code.
# This is a default config for shared libraries.
config("pic") {
  cflags = [ "-fPIC" ]
}

# This config should be at the top in the configs list, especially before
# the config for libchrome-${libbase-ver} to avoid weird heap-buffer-overflow
# error from happening when ASAN is enabled.
# TODO(crbug.com/887845): Remove this note after library order issue is resolved.
config("test") {
  # Don't worry about overlinking, ld.gold's --as-needed will
  # deal with that.
  # TODO(crbug.com/912432): Consider use {gtest,gmock}-config --ldflags.
  # '--ldflags' is not used here. It adds, e.g., -L/usr/lib64,
  # so the test executable will be linked against host libraries if exists.
  # Specifically, libchrome for host is linked. For host, it is built with
  # -DNDEBUG, but the target built without, which causes a link error.
  # cf) BaseInitLoggingImpl definition in
  #     aosp/external/libchrome/base/logging.h
  # gtest-config and gmock-config are not installed by gtest-1.8.1.
  ldflags = [
    "-pthread",

    # Allow unit tests of a shared library to link against the depended .so
    # under the output directory, instead of the ones installed in the system
    # dir. -rpath and -rpath-link has higher priority than the system library
    # directory.
    "-Wl,-rpath=\$ORIGIN/lib/",
    "-Wl,-rpath-link=lib/",
  ]

  # gnlint: disable=GnLintCommonTesting
  libs = [
    "gmock",
    "gtest",
    "pthread",
  ]
}
