# Copyright 2020 The Pigweed Authors
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may not
# use this file except in compliance with the License. You may obtain a copy of
# the License at
#
#     https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations under
# the License.

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

import("$dir_pw_build/python.gni")
import("$dir_pw_build/relative_source_file_names.gni")
import("$dir_pw_docgen/docs.gni")
import("target_types.gni")

# IMPORTANT: The compilation flags in this file must be kept in sync with
#            the CMake flags pw_build/CMakeLists.txt.

config("colorize_output") {
  cflags = [
    # Colorize output. Ninja's Clang invocation disables color by default.
    "-fdiagnostics-color",
  ]
  ldflags = cflags
}

config("debugging") {
  # Enable debug symbol generation. This has no effect on final code size.
  cflags = [ "-g" ]
}

config("extra_debugging") {
  # Include things like macro expansion in debug info.
  cflags = [ "-g3" ]
}

# Optimization levels
config("optimize_debugging") {
  cflags = [ "-Og" ]
  ldflags = cflags
}

config("optimize_speed") {
  cflags = [ "-O2" ]
  ldflags = cflags
}

config("optimize_more_speed") {
  cflags = [ "-O3" ]
  ldflags = cflags
}

config("optimize_size") {
  cflags = [ "-Os" ]
  ldflags = cflags
}

# Standard compiler flags to reduce output binary size.
config("reduced_size") {
  cflags = [
    "-fno-common",
    "-fno-exceptions",
    "-ffunction-sections",
    "-fdata-sections",
  ]
  cflags_cc = [ "-fno-rtti" ]

  if (current_os == "mac" || current_os == "ios") {
    # Delete unreferenced sections. Helpful with -ffunction-sections.
    ldflags = [ "-Wl,-dead_strip" ]
  } else {
    # Delete unreferenced sections. Helpful with -ffunction-sections.
    ldflags = [ "-Wl,--gc-sections" ]
  }
}

config("strict_warnings") {
  cflags = [
    "-Wall",
    "-Wextra",
    "-Wimplicit-fallthrough",
    "-Wcast-qual",
    "-Wundef",
    "-Wpointer-arith",

    # Make all warnings errors, except for the exemptions below.
    "-Werror",
    "-Wno-error=cpp",  # preprocessor #warning statement
    "-Wno-error=deprecated-declarations",  # [[deprecated]] attribute
  ]
  cflags_cc = [ "-Wnon-virtual-dtor" ]
}

# Thread safety warnings are only supported by Clang.
config("clang_thread_safety_warnings") {
  cflags = [ "-Wthread-safety" ]
  defines = [ "_LIBCPP_ENABLE_THREAD_SAFETY_ANNOTATIONS=1" ]
}

# This config contains warnings that we don't necessarily recommend projects
# enable, but are enabled for upstream Pigweed for maximum project
# compatibility.
config("extra_strict_warnings") {
  cflags = [
    "-Wshadow",
    "-Wredundant-decls",
  ]
  cflags_c = [ "-Wstrict-prototypes" ]
}

config("cpp14") {
  cflags_cc = [ "-std=c++14" ]
}

config("cpp17") {
  cflags_cc = [
    "-std=c++17",

    # Allow uses of the register keyword, which may appear in C headers.
    "-Wno-register",
  ]
}

# Removes system-dependent prefixes from macros like __FILE__ and debug symbols.
config("relative_paths") {
  _transformations = [
    # Remap absolute paths to the build directory to "out", in case absolute
    # paths to files in the build directory are created.
    #
    # Clang and GCC apply these flags in opposite order. The build directory is
    # often nested under //. To ensure that both compilers removed it before
    # removing the absolute path to //, apply the option both first and last.
    rebase_path(root_build_dir) + "=out",

    # Remove absolute paths to the repo root.
    rebase_path("//") + "=",

    # Remove relative paths from the build directory to the source tree.
    rebase_path("//", root_build_dir) + "=",

    # Repeat option to remap absolute paths to the build directory.
    rebase_path(root_build_dir) + "=out",
  ]
  cflags = []

  foreach(transform, _transformations) {
    cflags += [ "-ffile-prefix-map=" + transform ]
  }

  # Write the transformations to a well known path so that other utilities
  # that need to present file names that match the compiler's __FILE__
  # macro can apply the same transformation.
  write_file(pw_build_RELATIVE_PATH_TRANSFORM_JSON, _transformations, "json")
}

# This group is linked into all pw_executable, pw_static_library, and
# pw_shared_library targets. This makes it possible to ensure symbols are
# defined without a dependency on them.
#
# pw_build_LINK_DEPS should only be used when necessary. For example,
# pw_assert relies on pw_build_LINK_DEPS to avoid circular dependencies
# in GN. In almost all other cases, build targets should explicitly depend on
# the other targets they use.
group("link_deps") {
  deps = pw_build_LINK_DEPS
}

# This empty target is used as the default value for module configurations.
# Projects may set pw_build_DEFAULT_MODULE_CONFIG to a different GN target that
# overrides modules' configuration options via macro definitions or a header
# forcibly included with `-include`.
group("empty") {
}

# Requirements for the pw_python_package lint targets.
pw_python_requirements("python_lint") {
  requirements = [
    "build",

    # NOTE: mypy needs to stay in sync with mypy-protobuf
    # Currently using mypy 0.910 and mypy-protobuf 2.9
    "mypy==0.910",

    # typeshed packages (required by mypy > 0.9)
    "types-setuptools",
    "pylint==2.9.3",
  ]
}

pw_doc_group("docs") {
  sources = [
    "docs.rst",
    "python.rst",
  ]
}
