# 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.c",
  "common/constants.h",
  "common/context.c",
  "common/context.h",
  "common/dictionary.c",
  "common/dictionary.h",
  "common/platform.c",
  "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",
]

if (!is_starboard) {
enc_sources = [
  "enc/backward_references_hq.c",
  "enc/backward_references_hq.h",
  "enc/backward_references_inc.h",
  "enc/backward_references.c",
  "enc/backward_references.h",
  "enc/bit_cost_inc.h",
  "enc/bit_cost.c",
  "enc/bit_cost.h",
  "enc/block_encoder_inc.h",
  "enc/block_splitter_inc.h",
  "enc/block_splitter.c",
  "enc/block_splitter.h",
  "enc/brotli_bit_stream.c",
  "enc/brotli_bit_stream.h",
  "enc/cluster_inc.h",
  "enc/cluster.c",
  "enc/cluster.h",
  "enc/command.c",
  "enc/command.h",
  "enc/compress_fragment_two_pass.c",
  "enc/compress_fragment_two_pass.h",
  "enc/compress_fragment.c",
  "enc/compress_fragment.h",
  "enc/dictionary_hash.c",
  "enc/dictionary_hash.h",
  "enc/encode.c",
  "enc/encoder_dict.c",
  "enc/encoder_dict.h",
  "enc/entropy_encode_static.h",
  "enc/entropy_encode.c",
  "enc/entropy_encode.h",
  "enc/fast_log.c",
  "enc/fast_log.h",
  "enc/find_match_length.h",
  "enc/hash_composite_inc.h",
  "enc/hash_forgetful_chain_inc.h",
  "enc/hash_longest_match_inc.h",
  "enc/hash_longest_match_quickly_inc.h",
  "enc/hash_longest_match64_inc.h",
  "enc/hash_rolling_inc.h",
  "enc/hash_to_binary_tree_inc.h",
  "enc/hash.h",
  "enc/histogram_inc.h",
  "enc/histogram.c",
  "enc/histogram.h",
  "enc/literal_cost.c",
  "enc/literal_cost.h",
  "enc/memory.c",
  "enc/memory.h",
  "enc/metablock_inc.h",
  "enc/metablock.c",
  "enc/metablock.h",
  "enc/params.h",
  "enc/prefix.h",
  "enc/quality.h",
  "enc/ringbuffer.h",
  "enc/static_dict_lut.h",
  "enc/static_dict.c",
  "enc/static_dict.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" ]

if (is_starboard) {
  configs -= [ "//starboard/build/config:size" ]
  configs += [ "//starboard/build/config:speed" ]
  configs += [ "//build/config/compiler:no_chromium_code" ]
} else {
  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" ]

if (is_starboard) {
  configs -= [ "//starboard/build/config:size" ]
  configs += [ "//starboard/build/config:speed" ]
  configs += [ "//build/config/compiler:no_chromium_code" ]
} else {
  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 (!is_starboard) {
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" ]
}
}
