# 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")

# The GYP build supports system harfbuzz for non-official builds when using
# pangoft2 1.31.0 or greater (which pulls it in).
# TODO(brettw) we can consider doing this as well, although the benefit is
# unclear and requires shelling out to a script to check the version.
#
# ChromeOS uses an up-to-date system one that we have control over, so we
# don't want to bloat the binary more by including another copy.

declare_args() {
  # Since version 1.31.0, pangoft2 which we depend on pulls in harfbuzz
  # anyways. However, we want to have control of the version of harfbuzz
  # we use, so don't use system harfbuzz unless we are building for
  # chrome os, where we have the system harfbuzz under control.
  use_system_harfbuzz =
      is_linux && is_chromeos && exec_script(pkg_config_script,
                                             pkg_config_args + [
                                                   "--atleast-version=1.31.0",
                                                   "pangoft2",
                                                 ],
                                             "value")
}

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