# 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.

if (!is_starboard) {
  import("//testing/libfuzzer/fuzzer_test.gni")
}

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

config("includes") {
  if (is_starboard) {
    include_dirs = [ "c/include" ]
  } else {
    include_dirs = [ "include" ]
  }
}

static_library("headers") {
  if (is_starboard) {
    sources = [
      "c/include/brotli/decode.h",
      "c/include/brotli/encode.h",
      "c/include/brotli/port.h",
      "c/include/brotli/types.h",
    ]
  } else {
    sources = [
      "include/brotli/decode.h",
      "include/brotli/encode.h",
      "include/brotli/port.h",
      "include/brotli/types.h",
    ]
  }
}

if (is_starboard) {
  common_sources = [
    "c/common/constants.h",
    "c/common/dictionary.c",
    "c/common/dictionary.h",
    "c/common/platform.h",
    "c/common/version.h",
  ]
} else {
  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" ]
}

if (is_starboard) {
  dec_sources = [
    "c/dec/bit_reader.c",
    "c/dec/bit_reader.h",
    "c/dec/context.h",
    "c/dec/decode.c",
    "c/dec/huffman.c",
    "c/dec/huffman.h",
    "c/dec/prefix.h",
    "c/dec/state.c",
    "c/dec/state.h",
    "c/dec/transform.h",
  ]
} else {
  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_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" ]

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