# Copyright 2021 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("//build/host.gni")
import("//build/python/python_binary.gni")
import("//build/python/python_host_test.gni")

assert(is_host, "Only include assembly build scripts via the host toolchain")

python_binary("generated_assembly_inputs") {
  main_source = "generated_assembly_inputs.py"
  deps = [ "//build/python/modules/assembly" ]
}

python_binary("check_size_hermetic_inputs") {
  main_source = "check_size_hermetic_inputs.py"
  deps = [ "//build/python/modules/assembly" ]
}

python_host_test("compare_json_list_test") {
  main_source = "compare_json_list_test.py"
  sources = [ "compare_json_list.py" ]
  libraries = [ "//third_party/parameterized" ]
}

python_host_test("convert_size_limits_test") {
  main_source = "convert_size_limits_test.py"
  sources = [ "convert_size_limits.py" ]
  libraries = [ "//third_party/parameterized" ]
}

python_host_test("check_size_hermetic_inputs_test") {
  main_source = "check_size_hermetic_inputs_test.py"
  sources = [ "check_size_hermetic_inputs.py" ]
  libraries = [
    "//build/python/modules/assembly",
    "//third_party/parameterized",
  ]
}

python_binary("hermetic_inputs_for_image_assembly") {
  main_source = "hermetic_inputs_for_image_assembly.py"
  deps = [
    "//build/python/modules/assembly",
    "//build/python/modules/depfile",
  ]
}

python_binary("hermetic_inputs_for_update_and_flash") {
  main_source = "hermetic_inputs_for_update_and_flash.py"
}

python_binary("make_legacy_config") {
  main_source = "make_legacy_config.py"
  deps = [
    "//build/python/modules/assembly",
    "//build/python/modules/depfile",
    "//build/python/modules/serialization",
  ]
}

python_binary("package_list") {
  main_source = "package_list.py"
}

python_host_test("test_make_legacy_config") {
  main_source = "test_make_legacy_config.py"
  sources = [ "make_legacy_config.py" ]
  libraries = [
    "//build/python/modules/assembly",
    "//build/python/modules/serialization",
    "//build/python/tests/fast_copy_mock",
  ]
}

python_binary("assembly_input_bundle_tool") {
  main_source = "assembly_input_bundle_tool.py"
  deps = [
    "//build/python/modules/assembly",
    "//build/python/modules/depfile",
  ]
}

python_binary("compare_image_assembly_configs") {
  main_source = "compare_image_assembly_config_contents.py"
  deps = [
    "//build/python/modules/assembly",
    "//build/python/modules/depfile",
    "//build/python/modules/serialization",
  ]
}

# The standard `install_host_tools()` template doesn't work for this, because it
# assumes that all binaries are at `${root_build_dir}/<tool>`, and the
# `python_binary()` uses `$target_out_dir/<tool>`.  But the import is still
# needed to have `${host_tools_dir}` defined.
#
copy("assembly_input_bundle_tool_install") {
  deps = [ ":assembly_input_bundle_tool" ]
  outputs = [ "${host_tools_dir}/assembly_input_bundle_tool" ]
  sources = [ "${target_out_dir}/assembly_input_bundle_tool.pyz" ]
}

python_binary("product_def_gn_arg_validator") {
  main_source = "validate_product_defs.py"
  deps = [ "//build/python/modules/depfile" ]
}

group("tests") {
  testonly = true
  deps = [
    ":check_size_hermetic_inputs_test",
    ":compare_json_list_test",
    ":convert_size_limits_test",
    ":test_make_legacy_config",
  ]
}
