| # Copyright 2020 The Fuchsia Authors. All rights reserved. | 
 | # Use of this source code is governed by a BSD-style license that can be | 
 | # found in the LICENSE file. | 
 | import("config/config.gni") | 
 | assert(is_fuchsia) | 
 |  | 
 | # Creates a .build-id dir of unstripped binaries, structured according to the | 
 | # ".build_id" convention used by the symbolizer and GNU GDB. | 
 | # | 
 | # The .build-id dir will be constructed from ids.txt files which are passed | 
 | # through deps specifying 'ids_txt_paths' metadata values. If an unstripped binary | 
 | # is found, it is added to the archive. If the matching file is not found in any | 
 | # of the build-id directories, the directory of ids.txt is checked for | 
 | # an unstripped file matching the filename. | 
 | # | 
 | # If the .build-id dir already exists, it will be deleted prior to re-creation | 
 | # such that stale binaries are removed. | 
 | # | 
 | # Parameters: | 
 | #   output_path | 
 | #     Specifies the path to the output .build-id directory. | 
 | # | 
 | #     Type: directory path | 
 | # | 
 | #   build_id_dirs: [Optional] | 
 | #       List of paths to .build-id directories to search for the binary | 
 | #       in addition to  $root_out_dir/.build-id and the fuchsia SDK .build-id | 
 | #       directory. | 
 | # | 
 | #       Type: list of directories | 
 | # | 
 | #   Standard parameters: | 
 | #     deps | 
 | #     public_deps | 
 | #     testonly | 
 | #     visibility | 
 | # | 
 | template("build_id_dir") { | 
 |   assert(defined(invoker.deps) || defined(invoker.public_deps), | 
 |          "deps or public_deps are required") | 
 |  | 
 |   _all_ids_txt_path = "$target_gen_dir/all_ids_txt.txt" | 
 |   _all_ids_txt_target_name = "${target_name}_ids_txt" | 
 |   _target_name_label = ":${target_name}" | 
 |  | 
 |   _build_id_paths = [ | 
 |     "${root_out_dir}/.build-id", | 
 |     "${fuchsia_sdk}/.build-id", | 
 |   ] | 
 |   if (defined(invoker.build_id_dirs)) { | 
 |     _build_id_paths += invoker.build_id_dirs | 
 |   } | 
 |  | 
 |   generated_file(_all_ids_txt_target_name) { | 
 |     forward_variables_from(invoker, | 
 |                            [ | 
 |                              "deps", | 
 |                              "public_deps", | 
 |                              "testonly", | 
 |                            ]) | 
 |     data_keys = [ "ids_txt_paths" ] | 
 |     outputs = [ _all_ids_txt_path ] | 
 |     rebase = root_build_dir | 
 |     visibility = [ _target_name_label ] | 
 |   } | 
 |  | 
 |   action(target_name) { | 
 |     forward_variables_from(invoker, | 
 |                            [ | 
 |                              "output_path", | 
 |                              "public_deps", | 
 |                              "testonly", | 
 |                              "visibility", | 
 |                            ]) | 
 |     script = "${fuchsia_sdk}/build/populate_build_id_dir.py" | 
 |     inputs = [ _all_ids_txt_path ] | 
 |     _stamp = "$target_gen_dir/$target_name.stamp" | 
 |     outputs = [ | 
 |       _stamp, | 
 |       output_path, | 
 |     ] | 
 |     depfile = "$target_gen_dir/$target_name.d" | 
 |     deps = invoker.deps + [ ":${_all_ids_txt_target_name}" ] | 
 |  | 
 |     args = [ | 
 |       rebase_path(_all_ids_txt_path, root_build_dir), | 
 |       "--output_dir", | 
 |       rebase_path(output_path, root_build_dir), | 
 |       "--depfile", | 
 |       rebase_path(depfile, root_build_dir), | 
 |       "--stamp", | 
 |       rebase_path(_stamp, root_build_dir), | 
 |     ] | 
 |     foreach(dir, _build_id_paths) { | 
 |       args += [ | 
 |         "--build-id-dir", | 
 |         rebase_path(dir, root_build_dir), | 
 |       ] | 
 |     } | 
 |   } | 
 | } |