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

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("cpp11") {
  cflags_cc = [ "-std=c++11" ]
}

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

# 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") {
}

pool("pip_pool") {
  depth = 1
}

pool("copy_from_cipd_pool") {
  depth = 1
}

# Requirements for the pw_python_package lint targets.
pw_python_requirements("python_lint") {
  requirements = [
    "build",
    "mypy==0.800",
    "pylint==2.6.0",
  ]
}

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

# Pool to limit a single thread to download external Go packages at a time.
pool("go_download_pool") {
  depth = 1
}
