# 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("$dir_pw_toolchain/traits.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" ]
}

# This config contains warnings that are enabled for upstream Pigweed.
# This config MUST NOT be used downstream to allow for warnings to be
# added in the future without breaking downstream.
config("internal_strict_warnings") {
  cflags_cc = [ "-Wextra-semi" ]
}

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",
  ]
}

config("cpp20") {
  cflags_cc = [
    "-std=c++20",
    "-Wno-register",
  ]
}

# Selects the C++ standard to used based on the pw_toolchain_CXX_STANDARD
# toolchain trait.
config("toolchain_cpp_standard") {
  if (pw_toolchain_CXX_STANDARD == pw_toolchain_STANDARD.CXX14) {
    configs = [ ":cpp14" ]
  } else if (pw_toolchain_CXX_STANDARD == pw_toolchain_STANDARD.CXX17) {
    configs = [ ":cpp17" ]
  } else if (pw_toolchain_CXX_STANDARD == pw_toolchain_STANDARD.CXX20) {
    configs = [ ":cpp20" ]
  } else {
    assert(false,
           "Unexpected pw_toolchain_CXX_STANDARD value: " +
               pw_toolchain_CXX_STANDARD)
  }
}

# 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",
  ]
}
