# 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/python_action.gni")
import("$dir_pw_build/target_types.gni")

# Turns binary blobs into a C++ source_set library of hard-coded byte arrays.
#
#   blobs           A list of scopes, where each scope corresponds to a binary
#                   blob to be transformed from file to byte array. This is a
#                   required field. Blob fields include:
#
#                   symbol_name [required]: The C++ symbol for the byte array.
#
#                   file_path [required]: The file path for the binary blob.
#
#                   linker_section [optional]: If present, places the byte array
#                     in the specified linker section.
#
#   out_header      The header file to generate. Users will include this file
#                   exactly as it is written here to reference the byte arrays.
#
#   namespace       An optional (but highly recommended!) C++ namespace to place
#                   the generated blobs within.
template("pw_cc_blob_library") {
  assert(defined(invoker.blobs), "pw_cc_blob_library requires 'blobs'")
  assert(defined(invoker.out_header),
         "pw_cc_blob_library requires an 'out_header'")

  _blobs = []
  _blob_files = []
  foreach(blob, invoker.blobs) {
    assert(defined(blob.symbol_name), "Each 'blob' requires a 'symbol_name'")
    assert(defined(blob.file_path), "Each 'blob' requires a 'file_path'")
    blob.file_path = rebase_path(blob.file_path)
    _blobs += [ blob ]
    _blob_files += [ blob.file_path ]
  }

  _blob_json_file = "$target_gen_dir/$target_name.json"
  write_file(_blob_json_file, _blobs, "json")

  pw_python_action("$target_name._gen") {
    forward_variables_from(invoker,
                           [
                             "deps",
                             "public_deps",
                           ])
    module = "pw_build.generate_cc_blob_library"

    _header = "${target_gen_dir}/public/" + invoker.out_header
    _source =
        "${target_gen_dir}/" + get_path_info(invoker.out_header, "name") + ".cc"
    args = [
      "--blob-file",
      rebase_path(_blob_json_file, root_build_dir),
      "--out-header",
      rebase_path(_header),
      "--out-source",
      rebase_path(_source),
    ]

    if (defined(invoker.namespace)) {
      args += [
        "--namespace",
        invoker.namespace,
      ]
    }

    inputs = [ _blob_json_file ] + _blob_files
    outputs = [
      _header,
      _source,
    ]
  }

  config("$target_name._include_path") {
    include_dirs = [ "${target_gen_dir}/public" ]
    visibility = [ ":*" ]
  }

  pw_source_set(target_name) {
    sources = get_target_outputs(":$target_name._gen")
    public_configs = [ ":$target_name._include_path" ]
    deps = [ ":$target_name._gen" ]
    public_deps = [ "$dir_pw_preprocessor" ]
  }
}
