# 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("//build/config/compiler/compiler.gni")
import("//testing/test.gni")

static_library("courgette_lib") {
  sources = [
    "adjustment_method.cc",
    "adjustment_method.h",
    "adjustment_method_2.cc",
    "assembly_program.cc",
    "assembly_program.h",
    "consecutive_range_visitor.h",
    "courgette.h",
    "courgette_flow.cc",
    "courgette_flow.h",
    "difference_estimator.cc",
    "difference_estimator.h",
    "disassembler.cc",
    "disassembler.h",
    "disassembler_elf_32.cc",
    "disassembler_elf_32.h",
    "disassembler_elf_32_x86.cc",
    "disassembler_elf_32_x86.h",
    "disassembler_win32.cc",
    "disassembler_win32.h",
    "disassembler_win32_x64.cc",
    "disassembler_win32_x64.h",
    "disassembler_win32_x86.cc",
    "disassembler_win32_x86.h",
    "encoded_program.cc",
    "encoded_program.h",
    "ensemble.cc",
    "ensemble.h",
    "ensemble_apply.cc",
    "ensemble_create.cc",
    "image_utils.h",
    "instruction_utils.h",
    "label_manager.cc",
    "label_manager.h",
    "patch_generator_x86_32.h",
    "patcher_x86_32.h",
    "program_detector.cc",
    "program_detector.h",
    "rel32_finder.cc",
    "rel32_finder.h",
    "rel32_finder_x64.cc",
    "rel32_finder_x64.h",
    "rel32_finder_x86.cc",
    "rel32_finder_x86.h",
    "simple_delta.cc",
    "simple_delta.h",
    "types_elf.h",
    "types_win_pe.h",
  ]

  deps = [
    "//base",
    "//third_party/lzma_sdk",
  ]

  public_deps = [
    ":bsdiff",
    ":courgette_common",
  ]
}

source_set("courgette_common") {
  sources = [
    "crc.cc",
    "crc.h",
    "memory_allocator.cc",
    "memory_allocator.h",
    "region.h",
    "streams.cc",
    "streams.h",
  ]
  deps = [
    "//base",
    "//third_party/lzma_sdk",
  ]
}

source_set("paged_array") {
  sources = [ "third_party/bsdiff/paged_array.h" ]
  deps = [ "//base" ]
}

source_set("bsdiff") {
  sources = [
    "third_party/bsdiff/bsdiff.h",
    "third_party/bsdiff/bsdiff_apply.cc",
    "third_party/bsdiff/bsdiff_create.cc",
    "third_party/bsdiff/bsdiff_search.h",
  ]
  deps = [
    ":courgette_common",
    "//base",
  ]
  public_deps = [
    ":divsufsort",
    ":paged_array",
  ]
}

source_set("divsufsort") {
  sources = [
    "third_party/divsufsort/divsufsort.cc",
    "third_party/divsufsort/divsufsort.h",
    "third_party/divsufsort/divsufsort_private.h",
    "third_party/divsufsort/sssort.cc",
    "third_party/divsufsort/trsort.cc",
  ]
  deps = [
    ":courgette_common",
    ":paged_array",
    "//base",
  ]
  configs += [ "//build/config/compiler:no_shorten_64_warnings" ]
}

if (!is_ios) {
  executable("courgette") {
    if (is_win && current_cpu == "x64") {
      # The build infrastructure needs courgette to be named courgette64.
      output_name = "courgette64"
    }

    sources = [ "courgette_tool.cc" ]

    if (is_win) {
      ldflags = [ "/LARGEADDRESSAWARE" ]
    }

    deps = [
      ":courgette_lib",
      "//base",
      "//build/win:default_exe_manifest",
    ]
  }

  executable("courgette_minimal_tool") {
    sources = [ "courgette_minimal_tool.cc" ]

    deps = [
      ":courgette_lib",
      "//base",
      "//build/win:default_exe_manifest",
    ]
  }

  if (is_win) {
    if (current_cpu == "x64") {
      # TODO(sebmarchand): The official build scripts expect courgette.exe to be
      # in the official build archives, remove this once they have been updated.
      # https://crbug.com/629243
      copy("copy_courgette_binaries") {
        sources = [ "$root_out_dir/courgette64.exe" ]
        outputs = [ "$root_out_dir/courgette.exe" ]
        deps = [ ":courgette" ]
      }
    } else {
      # Make sure that we have a copy of courgette64.exe(.pdb) in the root out
      # directory.
      if (is_clang) {
        courgette64_toolchain = "//build/toolchain/win:win_clang_x64"
      } else {
        courgette64_toolchain = "//build/toolchain/win:x64"
      }
      courgette64_label = ":courgette($courgette64_toolchain)"

      courgette64_out_dir = get_label_info(courgette64_label, "root_out_dir")

      if (symbol_level > 0) {
        copy("copy_courgette_pdb") {
          visibility = [ ":copy_courgette_binaries" ]
          sources = [ "$courgette64_out_dir/courgette64.exe.pdb" ]
          outputs = [ "$root_out_dir/{{source_file_part}}" ]
          deps = [ courgette64_label ]
        }
      }

      copy("copy_courgette_binaries") {
        sources = [ "$courgette64_out_dir/courgette64.exe" ]
        outputs = [ "$root_out_dir/{{source_file_part}}" ]
        deps = [ courgette64_label ]
        if (symbol_level > 0) {
          deps += [ ":copy_courgette_pdb" ]
        }
      }
    }
  }
}

test("courgette_unittests") {
  sources = [
    "adjustment_method_unittest.cc",
    "base_test_unittest.cc",
    "base_test_unittest.h",
    "bsdiff_memory_unittest.cc",
    "consecutive_range_visitor_unittest.cc",
    "difference_estimator_unittest.cc",
    "disassembler_elf_32_x86_unittest.cc",
    "disassembler_win32_x64_unittest.cc",
    "disassembler_win32_x86_unittest.cc",
    "encode_decode_unittest.cc",
    "encoded_program_unittest.cc",
    "ensemble_unittest.cc",
    "image_utils_unittest.cc",
    "label_manager_unittest.cc",
    "memory_allocator_unittest.cc",
    "program_detector_unittest.cc",
    "rel32_finder_unittest.cc",
    "streams_unittest.cc",
    "third_party/bsdiff/bsdiff_search_unittest.cc",
    "third_party/bsdiff/paged_array_unittest.cc",
    "third_party/divsufsort/divsufsort_unittest.cc",
    "typedrva_unittest.cc",
    "versioning_unittest.cc",
  ]

  # TODO(jschuh): crbug.com/167187 fix size_t to int truncations.
  configs += [ "//build/config/compiler:no_size_t_to_int_warning" ]

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

  data = [ "testdata/" ]
}

test("courgette_fuzz") {
  sources = [
    "base_test_unittest.cc",
    "base_test_unittest.h",
    "encoded_program_fuzz_unittest.cc",
  ]
  deps = [
    ":courgette_lib",
    "//base",
    "//base:i18n",
    "//base/test:test_support",
    "//testing/gtest",
  ]
}
