# 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/context.h",
  "common/dictionary.c",
  "common/dictionary.h",
  "common/platform.h",
  "common/transform.c",
  "common/transform.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/decode.c",
  "dec/huffman.c",
  "dec/huffman.h",
  "dec/prefix.h",
  "dec/state.c",
  "dec/state.h",
]

enc_sources = [
  "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/dictionary_hash.c",
  "enc/dictionary_hash.h",
  "enc/encode.c",
  "enc/encoder_dict.c",
  "enc/encoder_dict.h",
  "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_composite_inc.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_rolling_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/params.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",
]

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" ]
}

static_library("enc") {
  sources = enc_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" ]
}

if (current_toolchain == host_toolchain) {
  executable("brotli") {
    sources = [
      "tools/brotli.c",
    ]
    public_configs = [ ":includes" ]

    deps = [
      ":common",
      ":dec",
      ":enc",
      ":headers",
      "//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" ]
}
