# 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 =
          "69"  # 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",
      "U_DISABLE_RENAMING",
      "SK_USING_THIRD_PARTY_ICU",
    ]
    configs = [ "//gn/portable:add_rtti" ]
    defines = [
      # http://userguide.icu-project.org/howtouseicu
      "U_COMMON_IMPLEMENTATION",
      "U_STATIC_IMPLEMENTATION",
      "U_ENABLE_DYLOAD=0",
      "U_I18N_IMPLEMENTATION",

      # If we don't set this to zero, ICU will set it to 600,
      # which makes Macs set _POSIX_C_SOURCE=200112L,
      # which makes Macs set __DARWIN_C_LEVEL=_POSIX_C_SOURCE instead of =__DARWIN_C_FULL,
      # which makes <time.h> not expose timespec_get,
      # which makes recent libc++ <ctime> not #include-able with -std=c++17.
      "_XOPEN_SOURCE=0",
    ]
    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" ]
  }
}
