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

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