# Copyright 2021 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/target_types.gni")
import("$dir_pw_docgen/docs.gni")

config("linker_script") {
  inputs = [ "build_id_linker_snippet.ld" ]

  # Automatically add the gnu build ID linker sections when building for Linux.
  # macOS and Windows executables are not supported, and embedded targets must
  # manually add the snippet to their linker script in a read-only section.
  if (current_os == "linux") {
    # When building for Linux, the linker provides a default linker script.
    # The add_build_id_to_default_script.ld wrapper includes the
    # build_id_linker_snippet.ld script in a way that appends to the the
    # default linker script instead of overriding it.
    ldflags = [
      "-T",
      rebase_path("add_build_id_to_default_script.ld", root_build_dir),
    ]
    lib_dirs = [ "." ]

    inputs += [ "add_build_id_to_default_script.ld" ]
  }
  visibility = [ ":*" ]
}

config("gnu_build_id") {
  ldflags = [ "-Wl,--build-id=sha1" ]
}

config("public_include_path") {
  include_dirs = [ "public" ]
  visibility = [ ":*" ]
}

# GNU build IDs aren't supported by Windows and macOS.
if (current_os != "mac" && current_os != "win") {
  pw_source_set("build_id") {
    all_dependent_configs = [
      ":gnu_build_id",
      ":linker_script",
    ]
    public_configs = [ ":public_include_path" ]
    cflags = [
      "-Wno-array-bounds",
      "-Wno-stringop-overflow",
    ]
    public = [ "public/pw_build_info/build_id.h" ]
    sources = [ "build_id.cc" ]
    deps = [ dir_pw_preprocessor ]
  }
}

pw_doc_group("docs") {
  sources = [ "docs.rst" ]
  inputs = [ "build_id_linker_snippet.ld" ]
}
