chromium/components/zucchini/BUILD.gn

# Copyright 2017 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import("//build/buildflag_header.gni")
import("//chrome/process_version_rc_template.gni")
import("//testing/test.gni")

buildflag_header("buildflags") {
  header = "buildflags.h"

  # Disable DEX on Windows Official Builds.
  _enable_dex = !(is_win && is_official_build)
  _enable_elf = true
  _enable_win = true

  # Disable ZTF (Zucchini Text Format) on official builds it is for testing only.
  _enable_ztf = !is_official_build
  flags = [
    "ENABLE_DEX=$_enable_dex",
    "ENABLE_ELF=$_enable_elf",
    "ENABLE_WIN=$_enable_win",
    "ENABLE_ZTF=$_enable_ztf",
  ]
}

static_library("zucchini_lib") {
  sources = [
    "abs32_utils.cc",
    "abs32_utils.h",
    "address_translator.cc",
    "address_translator.h",
    "algorithm.h",
    "arm_utils.cc",
    "arm_utils.h",
    "binary_data_histogram.cc",
    "binary_data_histogram.h",
    "buffer_sink.cc",
    "buffer_sink.h",
    "buffer_source.cc",
    "buffer_source.h",
    "buffer_view.h",
    "crc32.cc",
    "crc32.h",
    "disassembler.cc",
    "disassembler.h",
    "disassembler_dex.cc",
    "disassembler_dex.h",
    "disassembler_elf.cc",
    "disassembler_elf.h",
    "disassembler_no_op.cc",
    "disassembler_no_op.h",
    "disassembler_win32.cc",
    "disassembler_win32.h",
    "disassembler_ztf.cc",
    "disassembler_ztf.h",
    "element_detection.cc",
    "element_detection.h",
    "encoded_view.cc",
    "encoded_view.h",
    "ensemble_matcher.cc",
    "ensemble_matcher.h",
    "equivalence_map.cc",
    "equivalence_map.h",
    "heuristic_ensemble_matcher.cc",
    "heuristic_ensemble_matcher.h",
    "image_index.cc",
    "image_index.h",
    "image_utils.h",
    "imposed_ensemble_matcher.cc",
    "imposed_ensemble_matcher.h",
    "io_utils.cc",
    "io_utils.h",
    "patch_reader.cc",
    "patch_reader.h",
    "patch_utils.h",
    "patch_writer.cc",
    "patch_writer.h",
    "reference_set.cc",
    "reference_set.h",
    "rel32_finder.cc",
    "rel32_finder.h",
    "rel32_utils.cc",
    "rel32_utils.h",
    "reloc_elf.cc",
    "reloc_elf.h",
    "reloc_win32.cc",
    "reloc_win32.h",
    "suffix_array.h",
    "target_pool.cc",
    "target_pool.h",
    "targets_affinity.cc",
    "targets_affinity.h",
    "type_dex.h",
    "type_elf.h",
    "type_win_pe.h",
    "typed_value.h",
    "version_info.h",
    "zucchini.h",
    "zucchini_apply.cc",
    "zucchini_apply.h",
    "zucchini_gen.cc",
    "zucchini_gen.h",
    "zucchini_tools.cc",
    "zucchini_tools.h",
  ]

  deps = [
    ":buildflags",
    "//base",
  ]
}

static_library("zucchini_io") {
  sources = [
    "mapped_file.cc",
    "mapped_file.h",
    "zucchini_integration.cc",
    "zucchini_integration.h",
  ]

  deps = [
    ":zucchini_lib",
    "//base",
  ]

  if (is_win) {
    sources += [
      "exception_filter_helper_win.cc",
      "exception_filter_helper_win.h",
    ]
  }
}

executable("zucchini") {
  sources = [
    "main_utils.cc",
    "main_utils.h",
    "zucchini_commands.cc",
    "zucchini_commands.h",
    "zucchini_main.cc",
  ]

  deps = [
    ":zucchini_io",
    ":zucchini_lib",
    "//base",
  ]

  if (is_win) {
    deps += [
      ":zucchini_exe_version",
      "//build/win:default_exe_manifest",
    ]
  }
}

if (is_win) {
  process_version_rc_template("zucchini_exe_version") {
    template_file = "zucchini_exe_version.rc.version"
    output = "$target_gen_dir/zucchini_exe_version.rc"
  }

  if (current_cpu != "x64") {
    # For 32-bit, zucchini64 is built using the 64-bit toolchain, then copied
    # from the 64-bit toolchain outdir to the main outdir.
    zucchini64_toolchain = "//build/toolchain/win:win_clang_x64"
    zucchini64_label = ":zucchini($zucchini64_toolchain)"
  } else {
    zucchini64_label = ":zucchini"
  }

  zucchini64_out_dir = get_label_info(zucchini64_label, "root_out_dir")

  copy("copy_zucchini_pdb") {
    visibility = [ ":zucchini64" ]
    sources = [ "$zucchini64_out_dir/zucchini.exe.pdb" ]
    outputs = [ "$root_out_dir/zucchini64.exe.pdb" ]
    deps = [ zucchini64_label ]
  }

  copy("zucchini64") {
    sources = [ "$zucchini64_out_dir/zucchini.exe" ]
    outputs = [ "$root_out_dir/zucchini64.exe" ]
    deps = [ zucchini64_label ]
    deps += [ ":copy_zucchini_pdb" ]
  }
}

test("zucchini_unittests") {
  sources = [
    "abs32_utils_unittest.cc",
    "address_translator_unittest.cc",
    "algorithm_unittest.cc",
    "arm_utils_unittest.cc",
    "binary_data_histogram_unittest.cc",
    "buffer_sink_unittest.cc",
    "buffer_source_unittest.cc",
    "buffer_view_unittest.cc",
    "crc32_unittest.cc",
    "disassembler_dex_unittest.cc",
    "disassembler_elf_unittest.cc",
    "disassembler_ztf_unittest.cc",
    "element_detection_unittest.cc",
    "encoded_view_unittest.cc",
    "equivalence_map_unittest.cc",
    "image_index_unittest.cc",
    "image_utils_unittest.cc",
    "imposed_ensemble_matcher_unittest.cc",
    "io_utils_unittest.cc",
    "mapped_file_unittest.cc",
    "patch_read_write_unittest.cc",
    "patch_utils_unittest.cc",
    "reference_set_unittest.cc",
    "rel32_finder_unittest.cc",
    "rel32_utils_unittest.cc",
    "reloc_elf_unittest.cc",
    "reloc_win32_unittest.cc",
    "suffix_array_unittest.cc",
    "target_pool_unittest.cc",
    "targets_affinity_unittest.cc",
    "test_disassembler.cc",
    "test_disassembler.h",
    "test_reference_reader.cc",
    "test_reference_reader.h",
    "test_utils.cc",
    "test_utils.h",
    "typed_value_unittest.cc",
    "zucchini_apply_unittest.cc",
    "zucchini_gen_unittest.cc",
  ]

  deps = [
    ":zucchini_io",
    ":zucchini_lib",
    "//base",
    "//base/test:run_all_unittests",
    "//base/test:test_support",
    "//testing/gtest",
  ]

  if (is_win) {
    sources += [ "exception_filter_helper_win_unittest.cc" ]
  }
}

test("zucchini_integration_test") {
  sources = [ "integration_test.cc" ]

  deps = [
    ":zucchini_lib",
    "//base",
    "//base/test:run_all_unittests",
    "//base/test:test_support",
    "//testing/gtest",
  ]

  data = [ "testdata" ]
}

# Group to build and depend on all the Zucchini related fuzzers.
group("zucchini_fuzzers") {
  testonly = true
  deps = [
    "//components/zucchini/fuzzers:zucchini_disassembler_dex_fuzzer",
    "//components/zucchini/fuzzers:zucchini_disassembler_win32_fuzzer",
    "//components/zucchini/fuzzers:zucchini_patch_fuzzer",
  ]

  # Ensure protoc is available.
  # Disabled on Windows due to crbug/844826.
  if (current_toolchain == host_toolchain && !is_win) {
    deps += [
      "//components/zucchini/fuzzers:zucchini_apply_fuzzer",
      "//components/zucchini/fuzzers:zucchini_imposed_ensemble_matcher_fuzzer",
      "//components/zucchini/fuzzers:zucchini_raw_gen_fuzzer",
      "//components/zucchini/fuzzers:zucchini_ztf_gen_fuzzer",
    ]
  }
}