# 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/cc_blob_library.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("$dir_pw_unit_test/test.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
}

config("optimize_size_clang") {
  cflags = [ "-Oz" ]
  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("rust_edition_2015") {
  rustflags = [ "--edition=2015" ]
}

config("rust_edition_2018") {
  rustflags = [ "--edition=2018" ]
}

config("rust_edition_2021") {
  rustflags = [ "--edition=2021" ]
}

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 = [ "-Wswitch-enum" ]
  cflags_cc = [ "-Wextra-semi" ]

  # TODO(b/243069432): Enable pedantic warnings on Windows when they pass.
  if (host_os != "win") {
    configs = [ ":pedantic_warnings" ]
  }
}

config("pedantic_warnings") {
  cflags = [
    # Enable -Wpedantic, but disable a few warnings.
    "-Wpedantic",

    # Allow designated initializers, which were added in C++20 but widely
    # supported prior and permitted by the Google style guide.
    "-Wno-c++20-designator",

    # Allow empty ... arguments in macros, which are permitted in C++20 but
    # widely supported prior.
    "-Wno-gnu-zero-variadic-macro-arguments",
  ]

  if (pw_toolchain_CXX_STANDARD < pw_toolchain_STANDARD.CXX17) {
    # Allow C++17 attributes in C++14, since Pigweed targets C++17 or newer.
    cflags += [ "-Wno-c++17-attribute-extensions" ]
  }
}

# Numeric conversion warnings.
#
# Originally Pigweed didn't enable this, but we ultimately decided to turn it
# on since it caused issues with downstream project that enable this warning.
#
# b/259746255 tracks converting everything to build with this warning.
config("conversion_warnings") {
  # TODO(b/260629756): Remove Windows restriction once fixed for Windows + GCC.
  if (host_os != "win") {
    cflags = [ "-Wconversion" ]
  }
}

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.
#
# All compilation is relative to root_build_dir. The root_build_dir path is
# arbitrary, so it must be removed to make builds reproducible. This config
# remaps paths as if compilation occurred from the repository root instead of
# root_build_dir. Paths that include root_build_dir are updated to standardize
# on out/ as the build directory.
#
# If an ELF is built from a directory other than "out/", debuggers will be able
# to locate in-tree sources, but may have issues finding generated sources in
# the output directory. This can be worked around in a few ways:
#
#   - Use GDB's `set substitute-path <from> <to>` option to remap paths.
#   - Rebuild from out/.
#   - Symlink out/ to the build directory.
#   - Temporarily disable these transformations.
#
# If an ELF is built from "out/", debuggers will be able to locate all sources,
# including generated sources, when run from the repo root.
config("relative_paths") {
  # Apply a series of file-prefix-map transformations. Only the first matching
  # option applies.
  #
  # GCC applies these in reverse order due to building iterating through a
  # recursively constructed linked list:
  # inclusive-language: disable
  # https://github.com/gcc-mirror/gcc/blob/master/gcc/file-prefix-map.cc#L41.
  # inclusive-language: enable
  #
  # Clang currently does not have a set forwards or backwards application order
  # due to storing them in a std::map (that reorders lexicogrpahically by key):
  # https://github.com/llvm/llvm-project/blob/main/clang/include/clang/Basic/CodeGenOptions.h#L209.
  #
  # TODO(b/278906020): Tracks merging in an upstream change to LLVM to that will
  # enforce clang applying these transformations in order. Until then, there
  # will be issues with the debug and coverage information while using build
  # directories that are more than a single directory from the root project
  # directory. This is due to "=out/" always being applied first due to the
  # left-hand side of the = being "", which is always ordered first in the
  # std::map.
  _transformations = [
    # Remap absolute prefixes for files in the output directory to out/.
    rebase_path(root_build_dir) + "/=out/",

    # Remove the path to the out directory so the ELF is relative to the root.
    rebase_path(root_build_dir) + "=",

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

    # Remove the relative path from the build directory to the root, which is
    # the prefix of in-tree sources.
    rebase_path("//", root_build_dir) + "=",

    # Prepend out/ to any unmatched files, which are in the output directory.
    "=out/",

    # Repeat the replacements in reverse order since GCC applies them backwards.
    rebase_path("//", root_build_dir) + "=",
    rebase_path("//") + "=",
    rebase_path(root_build_dir) + "=",
    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") {
}

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

# Pigweed upstream does not use the default toolchain, but other projects may
# use it. To support using pw_build from the default toolchain without fully
# configuring the Pigweed build, only instantiate the pw_build tests for a
# non-default toolchain.
if (current_toolchain != default_toolchain) {
  pw_test("cc_blob_library_test") {
    sources = [ "cc_blob_library_test.cc" ]
    deps = [ ":test_blob" ]
  }

  pw_cc_blob_library("test_blob") {
    out_header = "pw_build/test_blob.h"
    namespace = "test::ns"
    blobs = [
      {
        file_path = "test_blob_0123.bin"
        symbol_name = "kFirstBlob0123"
        alignas = 512
      },
      {
        file_path = "test_blob_0123.bin"
        symbol_name = "kSecondBlob0123"
      },
    ]
    visibility = [ ":*" ]
  }

  # file_prefix_map_test verifies that the -ffile-prefix-map option is applied
  # correctly.

  # File paths should be relative to the root of the GN build.
  _test_header = rebase_path("pw_build_private/file_prefix_map_test.h", "//")
  _path_test_define = [ "PW_BUILD_EXPECTED_HEADER_PATH=\"$_test_header\"" ]

  pw_test("file_prefix_map_test") {
    _source_path = rebase_path("file_prefix_map_test.cc", "//")

    sources = [ "file_prefix_map_test.cc" ]

    defines = _path_test_define +
              [ "PW_BUILD_EXPECTED_SOURCE_PATH=\"$_source_path\"" ]

    deps = [ ":file_prefix_map_generated_file" ]
  }

  # Generated file paths should be relative to the build directory.
  copy("generate_file_prefix_map_test_source") {
    sources = [ "file_prefix_map_test.cc" ]
    outputs = [ get_label_info(":file_prefix_map_test", "target_gen_dir") +
                "/file_prefix_map_test_generated.cc" ]
    visibility = [ ":*" ]
  }

  pw_source_set("file_prefix_map_generated_file") {
    public = [ "pw_build_private/file_prefix_map_test.h" ]
    sources = get_target_outputs(":generate_file_prefix_map_test_source")
    deps = [ ":generate_file_prefix_map_test_source" ]

    _source_path = rebase_path(sources[0], root_build_dir)

    # The source file is prefixed with out/ since it's generated.
    defines = _path_test_define +
              [ "PW_BUILD_EXPECTED_SOURCE_PATH=\"out/$_source_path\"" ]
    include_dirs = [ "." ]  # Allow accessing file_prefix_map_test.h
    visibility = [ ":*" ]
  }

  pw_test_group("tests") {
    tests = [
      ":cc_blob_library_test",
      ":file_prefix_map_test",
    ]
  }
}
