Add support for linking user provided ICU lib

This patch adds support for linking a user provided ICU library using
the @org_unicode_icuuc//:common target by setting :system_icu to false.

Signed-off-by: Dhi Aurrahman <dio@tetrate.io>
Change-Id: Ie38f01afb537f7d4cfe7b185b00185e175d0a983
diff --git a/.bazelversion b/.bazelversion
new file mode 100644
index 0000000..47b322c
--- /dev/null
+++ b/.bazelversion
@@ -0,0 +1 @@
+3.4.1
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..a6ef824
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+/bazel-*
diff --git a/base/BUILD b/base/BUILD
index 74b721d..00c6c91 100644
--- a/base/BUILD
+++ b/base/BUILD
@@ -2,6 +2,7 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 load("//build_config:build_config.bzl", "build_config")
+load("@rules_cc//cc:defs.bzl", "cc_library")
 
 cc_library(
     name = "base",
diff --git a/base/strings/BUILD b/base/strings/BUILD
index 604cc81..c76b35a 100644
--- a/base/strings/BUILD
+++ b/base/strings/BUILD
@@ -2,17 +2,17 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 load("//build_config:build_config.bzl", "build_config")
+load("@rules_cc//cc:defs.bzl", "cc_library")
 
 cc_library(
     name = "strings",
     srcs = [
-        "string16.cc",
         "string_piece.cc",
         "string_util.cc",
         "string_util_constants.cc",
         "utf_string_conversion_utils.cc",
         "utf_string_conversions.cc",
-    ],
+    ] + build_config.strings_srcs,
     hdrs = [
         "char_traits.h",
         "string16.h",
@@ -20,10 +20,9 @@
         "string_piece_forward.h",
         "string_util.h",
         "string_util_internal.h",
-        "string_util_posix.h",
         "utf_string_conversion_utils.h",
         "utf_string_conversions.h",
-    ],
+    ] + build_config.strings_hdrs,
     copts = build_config.default_copts,
     visibility = ["//visibility:public"],
     deps = [
diff --git a/build/BUILD b/build/BUILD
index db115d4..79fa1dd 100644
--- a/build/BUILD
+++ b/build/BUILD
@@ -2,6 +2,7 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 load("//build_config:build_config.bzl", "build_config")
+load("@rules_cc//cc:defs.bzl", "cc_library")
 
 cc_library(
     name = "build_config",
diff --git a/build_config/BUILD b/build_config/BUILD
index 9ce06a8..78ac01d 100644
--- a/build_config/BUILD
+++ b/build_config/BUILD
@@ -1 +1,20 @@
-# dummy
+load("//build_config:common_settings.bzl", "bool_flag")
+
+licenses(["notice"])
+
+config_setting(
+    name = "windows_x86_64",
+    values = {"cpu": "x64_windows"},
+)
+
+bool_flag(
+    name = "system_icu",
+    build_setting_default = True,
+)
+
+config_setting(
+    name = "with_system_icu",
+    flag_values = {
+        ":system_icu": "True",
+    },
+)
diff --git a/build_config/build_config.bzl b/build_config/build_config.bzl
index d5fca65..9357584 100644
--- a/build_config/build_config.bzl
+++ b/build_config/build_config.bzl
@@ -1,8 +1,41 @@
-_default_copts = [
-    "-std=c++14",
-    "-fno-strict-aliasing",
-]
+"""This module provides common build config options"""
+
+_default_copts = select({
+    "//build_config:windows_x86_64": [
+        "/std:c++17",
+    ],
+    "//conditions:default": [
+        "-std=c++17",
+        "-fno-strict-aliasing",
+    ],
+})
+
+_strings_srcs = select({
+    "//build_config:windows_x86_64": [],
+    "//conditions:default": ["string16.cc"],
+})
+
+_strings_hdrs = select({
+    "//build_config:windows_x86_64": ["string_util_win.h"],
+    "//conditions:default": ["string_util_posix.h"],
+})
+
+_url_linkopts = select({
+    "//build_config:with_system_icu": ["-licuuc"],
+    "//conditions:default": [],
+})
+
+_icuuc_deps = select({
+    "//build_config:with_system_icu": [],
+
+    # If we don't link against system ICU library, we must provide "@org_unicode_icuuc//:common".
+    "//conditions:default": ["@org_unicode_icuuc//:common"],
+})
 
 build_config = struct(
     default_copts = _default_copts,
+    url_linkopts = _url_linkopts,
+    strings_srcs = _strings_srcs,
+    strings_hdrs = _strings_hdrs,
+    icuuc_deps = _icuuc_deps,
 )
diff --git a/build_config/common_settings.bzl b/build_config/common_settings.bzl
new file mode 100644
index 0000000..adbee68
--- /dev/null
+++ b/build_config/common_settings.bzl
@@ -0,0 +1,26 @@
+# Copyright 2019 The Bazel Authors. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#    http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""This is a modified version of
+https://github.com/bazelbuild/bazel-skylib/blob/2b38b2f8bd4b8603d610cfc651fcbb299498147f/rules/common_settings.bzl"""
+
+BuildSettingInfo = provider(fields = ["value"])
+
+def _impl(ctx):
+    return BuildSettingInfo(value = ctx.build_setting_value)
+
+bool_flag = rule(
+    implementation = _impl,
+    build_setting = config.bool(flag = True),
+)
diff --git a/test/BUILD b/test/BUILD
index 59210a8..16b1a42 100644
--- a/test/BUILD
+++ b/test/BUILD
@@ -2,6 +2,7 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 load("//build_config:build_config.bzl", "build_config")
+load("@rules_cc//cc:defs.bzl", "cc_test")
 
 cc_test(
     name = "basic_test",
diff --git a/url/BUILD b/url/BUILD
index e9081d9..f2ec8da 100644
--- a/url/BUILD
+++ b/url/BUILD
@@ -2,6 +2,7 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 load("//build_config:build_config.bzl", "build_config")
+load("@rules_cc//cc:defs.bzl", "cc_library")
 
 cc_library(
     name = "url",
@@ -43,11 +44,11 @@
         "url_util.h",
     ],
     copts = build_config.default_copts,
-    linkopts = ["-licuuc"],
+    linkopts = build_config.url_linkopts,
     visibility = ["//visibility:public"],
     deps = [
         "//base",
         "//base/strings",
         "//polyfills",
-    ],
+    ] + build_config.icuuc_deps,
 )