# 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("//build/config/chrome_build.gni")
import("//build/config/linux/pkg_config.gni")
import("//build/config/ui.gni")

declare_args() {
  # Blink uses a cutting-edge version of Harfbuzz; most Linux distros do not
  # contain a new enough version of the code to work correctly. However,
  # ChromeOS chroots (i.e, real ChromeOS builds for devices) do contain a
  # new enough version of the library, and so this variable exists so that
  # ChromeOS can build against the system lib and keep binary sizes smaller.
  use_system_harfbuzz = false
}

if (use_system_harfbuzz) {
  assert(!is_starboard,
         "System harfbuzz should never be used for Cobalt/Starboard")
  import("//build/config/linux/pkg_config.gni")
  pkg_config("harfbuzz_pkgconfig") {
    packages = [ "harfbuzz" ]
  }
  group("harfbuzz-ng") {
    public_configs = [ ":harfbuzz_pkgconfig" ]
  }
} else {
  config("harfbuzz-ng_config") {
    include_dirs = [ "src" ]
  }

  config("harfbuzz_warnings") {
    cflags = []
    if (is_clang) {
      cflags += [
        "-Wno-unused-value",

        # Harfbuzz uses unused typedefs for its static asserts (and its
        # static asserts are strange enough that they can't be replaced
        # by static_assert).
        "-Wno-unused-local-typedef",
      ]
    }
    if (is_win) {
      if (is_starboard) {
        # On amd64, size_t -> int, size_t -> unsigned int.
        cflags += [ "/wd4267" ]
      }
      # Result of 32-bit shift implicitly converted to 64 bits.
      cflags += [ "/wd4334" ]
    }
  }

  if (!is_starboard) {
    # See also chrome/browser/ui/libgtk2ui/BUILD.gn which pulls this.
    config("pangoft2_link_hack") {
        if (is_linux && use_pango && !is_chromeos && !is_official_build &&
            current_cpu != "arm" && current_cpu != "mipsel" && !is_component_build) {
        # These symbols are referenced from libpangoft2, which will be
        # dynamically linked later.
        ldflags = [ "-Wl,-uhb_ft_face_create_cached,-uhb_glib_get_unicode_funcs" ]
        }
    }
  }

  static_library("harfbuzz-ng") {
    sources = [
      "src/hb-atomic-private.hh",
      "src/hb-blob.cc",
      "src/hb-blob.h",
      "src/hb-buffer-deserialize-json.hh",
      "src/hb-buffer-deserialize-text.hh",
      "src/hb-buffer-private.hh",
      "src/hb-buffer-serialize.cc",
      "src/hb-buffer.cc",
      "src/hb-buffer.h",
      "src/hb-cache-private.hh",
      "src/hb-common.cc",
      "src/hb-common.h",
      "src/hb-deprecated.h",
      "src/hb-face-private.hh",
      "src/hb-face.cc",
      "src/hb-face.h",
      "src/hb-fallback-shape.cc",
      "src/hb-font-private.hh",
      "src/hb-font.cc",
      "src/hb-font.h",
      "src/hb-icu.cc",
      "src/hb-icu.h",
      "src/hb-mutex-private.hh",
      "src/hb-object-private.hh",
      "src/hb-open-file-private.hh",
      "src/hb-open-type-private.hh",
      "src/hb-ot-font.cc",
      "src/hb-ot-font.h",
      "src/hb-ot-head-table.hh",
      "src/hb-ot-hhea-table.hh",
      "src/hb-ot-hmtx-table.hh",
      "src/hb-ot-layout-common-private.hh",
      "src/hb-ot-layout-gdef-table.hh",
      "src/hb-ot-layout-gpos-table.hh",
      "src/hb-ot-layout-gsub-table.hh",
      "src/hb-ot-layout-gsubgpos-private.hh",
      "src/hb-ot-layout-private.hh",
      "src/hb-ot-layout.cc",
      "src/hb-ot-layout.h",
      "src/hb-ot-map-private.hh",
      "src/hb-ot-map.cc",
      "src/hb-ot-maxp-table.hh",
      "src/hb-ot-name-table.hh",
      "src/hb-ot-shape-complex-arabic-fallback.hh",
      "src/hb-ot-shape-complex-arabic-private.hh",
      "src/hb-ot-shape-complex-arabic-table.hh",
      "src/hb-ot-shape-complex-arabic.cc",
      "src/hb-ot-shape-complex-default.cc",
      "src/hb-ot-shape-complex-hangul.cc",
      "src/hb-ot-shape-complex-hebrew.cc",
      "src/hb-ot-shape-complex-indic-machine.hh",
      "src/hb-ot-shape-complex-indic-private.hh",
      "src/hb-ot-shape-complex-indic-table.cc",
      "src/hb-ot-shape-complex-indic.cc",
      "src/hb-ot-shape-complex-myanmar-machine.hh",
      "src/hb-ot-shape-complex-myanmar.cc",
      "src/hb-ot-shape-complex-private.hh",
      "src/hb-ot-shape-complex-thai.cc",
      "src/hb-ot-shape-complex-tibetan.cc",
      "src/hb-ot-shape-complex-use-machine.hh",
      "src/hb-ot-shape-complex-use-private.hh",
      "src/hb-ot-shape-complex-use-table.cc",
      "src/hb-ot-shape-complex-use.cc",
      "src/hb-ot-shape-fallback-private.hh",
      "src/hb-ot-shape-fallback.cc",
      "src/hb-ot-shape-normalize-private.hh",
      "src/hb-ot-shape-normalize.cc",
      "src/hb-ot-shape-private.hh",
      "src/hb-ot-shape.cc",
      "src/hb-ot-shape.h",
      "src/hb-ot-tag.cc",
      "src/hb-ot-tag.h",
      "src/hb-ot.h",
      "src/hb-private.hh",
      "src/hb-set-private.hh",
      "src/hb-set.cc",
      "src/hb-set.h",
      "src/hb-shape-plan-private.hh",
      "src/hb-shape-plan.cc",
      "src/hb-shape-plan.h",
      "src/hb-shape.cc",
      "src/hb-shape.h",
      "src/hb-shaper-impl-private.hh",
      "src/hb-shaper-list.hh",
      "src/hb-shaper-private.hh",
      "src/hb-shaper.cc",
      "src/hb-unicode-private.hh",
      "src/hb-unicode.cc",
      "src/hb-unicode.h",
      "src/hb-utf-private.hh",
      "src/hb-version.h",
      "src/hb-warning.cc",
      "src/hb.h",
    ]

    defines = [
      "HAVE_OT",
      "HAVE_ICU",
      "HAVE_ICU_BUILTIN",
      "HB_NO_MT",
    ]

    if (is_starboard) {
      # Ensure the below -= is ok even if chromium_code wasn't already added.
      # The subsequent -= will remove all copies of the config.
      configs += [ "//build/config/compiler:chromium_code" ]
    }
    configs -= [ "//build/config/compiler:chromium_code" ]
    configs += [
      "//build/config/compiler:no_chromium_code",

      # Must be after no_chromium_code for warning flags to be ordered
      # correctly.
      ":harfbuzz_warnings",
    ]
    public_configs = [ ":harfbuzz-ng_config" ]

    deps = [
      "//third_party/icu:icuuc",
    ]

    if (!is_starboard) {
      if (is_mac) {
        sources += [
          "src/hb-coretext.cc",
          "src/hb-coretext.h",
        ]
        defines += [ "HAVE_CORETEXT" ]
      }


      # When without -fvisibility=hidden for pango to use the harfbuzz
      # in the tree, all symbols pango needs must be included, or
      # pango uses mixed versions of harfbuzz and leads to crash.
      # See crbug.com/462689.
      if (is_linux && use_pango && !is_chromeos && !is_official_build &&
          current_cpu != "arm" && current_cpu != "mipsel") {
        deps += [ "//build/linux:freetype2" ]
        configs -= [ "//build/config/gcc:symbol_visibility_hidden" ]
        configs += [ "//build/config/linux:glib" ]
        sources += [
          "src/hb-ft.cc",
          "src/hb-ft.h",
          "src/hb-glib.cc",
          "src/hb-glib.h",
        ]
      }
    }
  }
}