# 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/linux/pkg_config.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() {
  if (is_linux && (!is_official_build || is_chromeos)) {
    # 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 for official builds, unless we
    # are building for chrome os, where we have the system harfbuzz under
    # control as well.
    use_system_harfbuzz = exec_script(pkg_config_script,
                                      pkg_config_args + [
                                            "--atleast-version=1.31.0",
                                            "pangoft2",
                                          ],
                                      "value")
  } else {
    use_system_harfbuzz = false
  }
  if (is_linux && cpu_arch == "arm" && !is_chromeos) {
    # Override use_system_harfbuzz for ARM cross compiling so system
    # harfbuzz is not used because the corresponding package is not
    # available.
    use_system_harfbuzz = false
  }
}

if (use_system_harfbuzz) {
  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" ]
  }

  static_library("harfbuzz-ng") {
    sources = [
      "src/hb-atomic-private.hh",
      "src/hb-blob.cc",
      "src/hb-blob.h",
      "src/hb-buffer.cc",
      "src/hb-buffer-deserialize-json.hh",
      "src/hb-buffer-deserialize-text.hh",
      "src/hb-buffer.h",
      "src/hb-buffer-private.hh",
      "src/hb-buffer-serialize.cc",
      "src/hb-cache-private.hh",
      "src/hb-common.cc",
      "src/hb-common.h",
      "src/hb-deprecated.h",
      "src/hb-face.cc",
      "src/hb-face.h",
      "src/hb-face-private.hh",
      "src/hb-fallback-shape.cc",
      "src/hb-font.cc",
      "src/hb-font.h",
      "src/hb-font-private.hh",
      "src/hb.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.h",
      "src/hb-ot-head-table.hh",
      "src/hb-ot-hhea-table.hh",
      "src/hb-ot-hmtx-table.hh",
      "src/hb-ot-layout.cc",
      "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-gsubgpos-private.hh",
      "src/hb-ot-layout-gsub-table.hh",
      "src/hb-ot-layout.h",
      "src/hb-ot-layout-private.hh",
      "src/hb-ot-map.cc",
      "src/hb-ot-map-private.hh",
      "src/hb-ot-maxp-table.hh",
      "src/hb-ot-name-table.hh",
      "src/hb-ot-shape.cc",
      "src/hb-ot-shape-complex-arabic.cc",
      "src/hb-ot-shape-complex-arabic-fallback.hh",
      "src/hb-ot-shape-complex-arabic-table.hh",
      "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.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-myanmar.cc",
      "src/hb-ot-shape-complex-myanmar-machine.hh",
      "src/hb-ot-shape-complex-private.hh",
      "src/hb-ot-shape-complex-sea.cc",
      "src/hb-ot-shape-complex-sea-machine.hh",
      "src/hb-ot-shape-complex-thai.cc",
      "src/hb-ot-shape-complex-tibetan.cc",
      "src/hb-ot-shape-fallback.cc",
      "src/hb-ot-shape-fallback-private.hh",
      "src/hb-ot-shape.h",
      "src/hb-ot-shape-normalize.cc",
      "src/hb-ot-shape-normalize-private.hh",
      "src/hb-ot-shape-private.hh",
      "src/hb-ot-tag.cc",
      "src/hb-ot-tag.h",
      "src/hb-private.hh",
      "src/hb-set.cc",
      "src/hb-set.h",
      "src/hb-set-private.hh",
      "src/hb-shape.cc",
      "src/hb-shape.h",
      "src/hb-shape-plan.cc",
      "src/hb-shape-plan.h",
      "src/hb-shape-plan-private.hh",
      "src/hb-shaper.cc",
      "src/hb-shaper-impl-private.hh",
      "src/hb-shaper-list.hh",
      "src/hb-shaper-private.hh",
      "src/hb-unicode.cc",
      "src/hb-unicode.h",
      "src/hb-unicode-private.hh",
      "src/hb-utf-private.hh",
      "src/hb-version.h",
      "src/hb-warning.cc",
    ]

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

    configs -= [ "//build/config/compiler:chromium_code" ]
    configs += [ "//build/config/compiler:no_chromium_code" ]
    public_configs = [ ":harfbuzz-ng_config" ]

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

    cflags = []
    if (is_clang) {
      cflags += [ "-Wno-unused-value" ]
    }
    if (is_win) {
      cflags += [
        "/wd4267",  # size_t to 'type' converion.
        "/wd4334",  # Result of 32-bit shift implicitly converted to 64 bits.
      ]
    }
    if (is_mac) {
      sources += [
        "src/hb-coretext.cc",
        "src/hb-coretext.h",
      ]
      defines += [ "HAVE_CORETEXT" ]
    }
  }
}
