# 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("//testing/libfuzzer/fuzzer_test.gni")

if (is_win) {
  import("//build/config/win/visual_studio_version.gni")
}

config("includes") {
  include_dirs = [ "include" ]
}

source_set("headers") {
  sources = [
    "include/brotli/decode.h",
    "include/brotli/encode.h",
    "include/brotli/port.h",
    "include/brotli/types.h",
  ]
}

common_sources = [
  "common/constants.h",
  "common/dictionary.c",
  "common/dictionary.h",
  "common/version.h",
]

static_library("common") {
  sources = common_sources
  public_configs = [ ":includes" ]
  deps = [
    ":headers",
  ]
}

static_library("common_no_dictionary_data") {
  sources = common_sources
  public_configs = [ ":includes" ]
  deps = [
    ":headers",
  ]
  defines = [ "BROTLI_EXTERNAL_DICTIONARY_DATA" ]
}

dec_sources = [
  "dec/bit_reader.c",
  "dec/bit_reader.h",
  "dec/context.h",
  "dec/decode.c",
  "dec/huffman.c",
  "dec/huffman.h",
  "dec/port.h",
  "dec/prefix.h",
  "dec/state.c",
  "dec/state.h",
  "dec/transform.h",
]

static_library("dec") {
  sources = dec_sources
  public_configs = [ ":includes" ]
  public_deps = [
    ":headers",
  ]
  deps = [
    ":common",
  ]

  configs -= [ "//build/config/compiler:chromium_code" ]
  configs += [ "//build/config/compiler:no_chromium_code" ]

  # Since we never debug brotli, freeze the optimizations to -O2.
  configs -= [ "//build/config/compiler:default_optimization" ]
  configs += [ "//build/config/compiler:optimize_max" ]
}

static_library("dec_no_dictionary_data") {
  sources = dec_sources
  public_configs = [ ":includes" ]
  public_deps = [
    ":headers",
  ]
  deps = [
    ":common_no_dictionary_data",
  ]

  configs -= [ "//build/config/compiler:chromium_code" ]
  configs += [ "//build/config/compiler:no_chromium_code" ]

  # Since we never debug brotli, freeze the optimizations to -O2.
  configs -= [ "//build/config/compiler:default_optimization" ]
  configs += [ "//build/config/compiler:optimize_max" ]
}

if (current_toolchain == host_toolchain) {
  executable("brotli") {
    sources = [
      "common/constants.h",
      "enc/backward_references.c",
      "enc/backward_references.h",
      "enc/backward_references_hq.c",
      "enc/backward_references_hq.h",
      "enc/backward_references_inc.h",
      "enc/bit_cost.c",
      "enc/bit_cost.h",
      "enc/bit_cost_inc.h",
      "enc/block_encoder_inc.h",
      "enc/block_splitter.c",
      "enc/block_splitter.h",
      "enc/block_splitter_inc.h",
      "enc/brotli_bit_stream.c",
      "enc/brotli_bit_stream.h",
      "enc/cluster.c",
      "enc/cluster.h",
      "enc/cluster_inc.h",
      "enc/command.h",
      "enc/compress_fragment.c",
      "enc/compress_fragment.h",
      "enc/compress_fragment_two_pass.c",
      "enc/compress_fragment_two_pass.h",
      "enc/context.h",
      "enc/dictionary_hash.c",
      "enc/dictionary_hash.h",
      "enc/encode.c",
      "enc/entropy_encode.c",
      "enc/entropy_encode.h",
      "enc/entropy_encode_static.h",
      "enc/fast_log.h",
      "enc/find_match_length.h",
      "enc/hash.h",
      "enc/hash_forgetful_chain_inc.h",
      "enc/hash_longest_match64_inc.h",
      "enc/hash_longest_match_inc.h",
      "enc/hash_longest_match_quickly_inc.h",
      "enc/hash_to_binary_tree_inc.h",
      "enc/histogram.c",
      "enc/histogram.h",
      "enc/histogram_inc.h",
      "enc/literal_cost.c",
      "enc/literal_cost.h",
      "enc/memory.c",
      "enc/memory.h",
      "enc/metablock.c",
      "enc/metablock.h",
      "enc/metablock_inc.h",
      "enc/port.h",
      "enc/prefix.h",
      "enc/quality.h",
      "enc/ringbuffer.h",
      "enc/static_dict.c",
      "enc/static_dict.h",
      "enc/static_dict_lut.h",
      "enc/utf8_util.c",
      "enc/utf8_util.h",
      "enc/write_bits.h",
      "tools/brotli.c",
    ]
    public_configs = [ ":includes" ]

    if (is_win) {
      # Work around incremental linking randomly creating corrupt binaries,
      # crbug.com/644525.
      configs -= [ "//build/config/win:default_incremental_linking" ]
      configs += [ "//build/config/win:no_incremental_linking" ]
    }

    deps = [
      ":common",
      ":dec",
      ":headers",
      "//build/config:exe_and_shlib_deps",
      "//build/win:default_exe_manifest",
    ]

    if (is_win && visual_studio_version == "2015") {
      # Disabling "result of 32-bit shift implicitly converted to 64 bits",
      # caused by code like: foo |= (1 << i);   // warning 4334
      cflags = [ "/wd4334" ]
    }

    # Always build release since this is a build tool.
    if (is_debug) {
      configs -= [ "//build/config:debug" ]
      configs += [ "//build/config:release" ]
    }
  }
}

fuzzer_test("brotli_fuzzer") {
  sources = [
    "fuzz/decode_fuzzer.cc",
  ]
  deps = [
    ":dec",
  ]
  libfuzzer_options = [ "max_len=1280" ]
}
