# Copyright 2014 The Chromium 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.gni")

assert(relocation_packing_supported)

if (target_arch == "arm") {
  target_define = "TARGET_ARM"
} else if (target_arch == "arm64") {
  target_define = "TARGET_ARM64"
}

if (current_toolchain == host_toolchain) {
  # GYP: //tools/relocation_packer/relocation_packer.gyp:lib_relocation_packer
  source_set("lib_relocation_packer") {
    defines = [ target_define ]
    deps = [
      "//third_party/elfutils:libelf",
    ]
    configs -= [ "//build/config/compiler:chromium_code" ]
    configs += [ "//build/config/compiler:no_chromium_code" ]
    sources = [
      "src/debug.cc",
      "src/delta_encoder.cc",
      "src/elf_file.cc",
      "src/leb128.cc",
      "src/packer.cc",
      "src/sleb128.cc",
      "src/run_length_encoder.cc",
    ]
  }

  # GYP: //tools/relocation_packer/relocation_packer.gyp:relocation_packer
  executable("relocation_packer") {
    defines = [ target_define ]
    deps = [
      ":lib_relocation_packer",
      "//third_party/elfutils:libelf",
    ]
    sources = [
      "src/main.cc",
    ]
  }

  # GYP: //tools/relocation_packer/relocation_packer.gyp:relocation_packer_unittests
  test("relocation_packer_unittests") {
    sources = [
      "src/debug_unittest.cc",
      "src/delta_encoder_unittest.cc",
      "src/elf_file_unittest.cc",
      "src/leb128_unittest.cc",
      "src/packer_unittest.cc",
      "src/sleb128_unittest.cc",
      "src/run_length_encoder_unittest.cc",
      "src/run_all_unittests.cc",
    ]
    rebased_test_data = rebase_path("test_data", root_build_dir)
    data = [
      "test_data/elf_file_unittest_relocs_arm32.so",
      "test_data/elf_file_unittest_relocs_arm32_packed.so",
      "test_data/elf_file_unittest_relocs_arm64.so",
      "test_data/elf_file_unittest_relocs_arm64_packed.so",
    ]
    defines = [
      target_define,
      "INTERMEDIATE_DIR=\"$rebased_test_data\"",
    ]
    include_dirs = [ "//" ]
    deps = [
      ":lib_relocation_packer",
      ":relocation_packer_test_data",
      "//testing:gtest",
    ]
  }
}

if (current_toolchain == default_toolchain &&
    (target_arch == "arm" || target_arch == "arm64")) {
  # Targets to build test data.  These participate only in building test
  # data for use with elf_file_unittest.cc, and are not part of the main
  # relocation packer build.  Unit test data files are checked in to the
  # source tree as 'golden' data, and are not generated 'on the fly' by
  # the build.
  #
  # See test_data/generate_elf_file_unittest_relocs.sh for instructions.

  # GYP: //tools/relocation_packer/relocation_packer.gyp:relocation_packer_test_data
  shared_library("relocation_packer_test_data") {
    cflags = [
      "-O0",
      "-g0",
    ]
    sources = [
      "test_data/elf_file_unittest_relocs.cc",
    ]
  }

  # GYP: //tools/relocation_packer/relocation_packer.gyp:relocation_packer_unittests_test_data
  action("relocation_packer_unittests_test_data") {
    script = "test_data/generate_elf_file_unittest_relocs.py"
    test_file = "$root_build_dir/librelocation_packer_test_data.so"
    if (target_arch == "arm") {
      added_section = ".android.rel.dyn"
      packed_output = "elf_file_unittest_relocs_arm32_packed.so"
      unpacked_output = "elf_file_unittest_relocs_arm32.so"
    } else if (target_arch == "arm64") {
      added_section = ".android.rela.dyn"
      packed_output = "elf_file_unittest_relocs_arm64_packed.so"
      unpacked_output = "elf_file_unittest_relocs_arm64.so"
    } else {
      assert(false, "Unsupported target arch for relocation packer")
    }

    packed_output = "$root_build_dir/$packed_output"
    unpacked_output = "$root_build_dir/$unpacked_output"

    inputs = [
      test_file,
    ]

    deps = [
      ":relocation_packer_test_data",
      ":relocation_packer($host_toolchain)",
    ]

    outputs = [
      packed_output,
      unpacked_output,
    ]

    args = [
      "--android-pack-relocations",
      rebase_path(relocation_packer_exe, root_build_dir),
      "--android-objcopy",
      rebase_path(android_objcopy, root_build_dir),
      "--added-section=$added_section",
      "--test-file",
      rebase_path(test_file, root_build_dir),
      "--packed-output",
      rebase_path(packed_output, root_build_dir),
      "--unpacked-output",
      rebase_path(unpacked_output, root_build_dir),
    ]
  }
}
