# Copyright 2016 Google Inc.
#
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import("../../gn/skia.gni")
import("../third_party.gni")
import("icu.gni")

declare_args() {
  skia_use_system_icu = is_official_build
}

if (skia_use_system_icu) {
  system("icu") {
    libs = [ "icuuc" ]
    defines = [ "U_USING_ICU_NAMESPACE=0" ]
  }
} else {
  if (target_cpu == "wasm") {
    data_assembly = "$target_gen_dir/icudtl_dat.cpp"
  } else {
    data_assembly = "$target_gen_dir/icudtl_dat.S"
  }
  data_dir = "../externals/icu/"
  if (target_cpu == "wasm") {
    # Use a super super super stripped down version for wasm,
    # which is the same thing flutter is using.
    data_dir += "flutter"
  } else if (is_android) {
    data_dir += "android"
  } else if (is_ios) {
    data_dir += "ios"
  } else {
    data_dir += "common"
  }
  action("make_data_assembly") {
    if (target_cpu == "wasm") {
      _u_icu_version_major_num =
          "65"  # defined in source/common/unicode/uvernum.h
      script = "make_data_cpp.py"
      inputs = [ "$data_dir/icudtl.dat" ]
      outputs = [ data_assembly ]
      args = [
        "icudt${_u_icu_version_major_num}_dat",
        rebase_path(inputs[0], root_build_dir),
        rebase_path(data_assembly, root_build_dir),
      ]
    } else {
      script = "../externals/icu/scripts/make_data_assembly.py"
      inputs = [ "$data_dir/icudtl.dat" ]
      outputs = [ "$data_assembly" ]
      args = [
        rebase_path(inputs[0], root_build_dir),
        rebase_path(data_assembly, root_build_dir),
      ]
      if (is_mac || is_ios) {
        args += [ "--mac" ]
      }
    }
  }

  third_party("icu") {
    public_include_dirs = [
      "../externals/icu/source/common",
      "../externals/icu/source/i18n",
      ".",
    ]
    public_defines = [
      "U_USING_ICU_NAMESPACE=0",
      "SK_USING_THIRD_PARTY_ICU",
    ]
    configs -= [ "//gn:no_rtti" ]
    defines = [
      # http://userguide.icu-project.org/howtouseicu
      "U_COMMON_IMPLEMENTATION",
      "U_STATIC_IMPLEMENTATION",
      "U_ENABLE_DYLOAD=0",
      "U_I18N_IMPLEMENTATION",
    ]
    if (target_cpu == "wasm") {
      # Tell ICU that we are a 32 bit platform, otherwise,
      # double-conversion-utils.h doesn't know how to operate.
      defines += [ "__i386__" ]
    }
    sources = icu_sources
    if (is_win) {
      deps = [ ":icudata" ]
      public_defines += [
        "U_NOEXCEPT=",
        "U_STATIC_IMPLEMENTATION",
      ]
      libs = [ "Advapi32.lib" ]
      sources += [
        "../externals/icu/source/stubdata/stubdata.cpp",
        "SkLoadICU.cpp",
      ]
    } else {
      sources += [ "$data_assembly" ]
      deps = [ ":make_data_assembly" ]
    }
  }

  copy("icudata") {
    sources = [ "../externals/icu/common/icudtl.dat" ]
    outputs = [ "$root_out_dir/icudtl.dat" ]
    data = [ "$root_out_dir/icudtl.dat" ]
  }
}
