                  C++ version of the libphonenumber project
                  =========================================

This library is a port of the Java version.

This project uses some third-party code:
  - src/phonenumbers/utf/ sources come from lib9 which is also used in Go.


Installing the library on GNU/Linux
-----------------------------------
In recent Debian-based distributions you may be able to simply install the
libphonenumber library directly.

Installing the binary packages:
  - Use this if you just need to use or link against the library:
    $ sudo apt-get install libphonenumber8 libphonenumber-dev

Installing the source package:
  - Use this if you wish to develop or debug the library:
    $ sudo apt-get source libphonenumber

The latest packages can be found on the Debian packages site:
  https://packages.debian.org/search?searchon=names&keywords=libphonenumber


Manually installing the library on GNU/Linux
--------------------------------------------
You should only need these instructions if the above instructions do not work.

The example command lines below assume that you have a Debian-based GNU/Linux
distribution. Other distributions and packaging systems will differ.

Quickstart:
  - In recent Debian-based distributions, it should be sufficient to run:
    $ sudo apt-get install \
      cmake cmake-curses-gui libprotobuf-dev libgtest-dev libre2-dev \
      libicu-dev libboost-dev libboost-thread-dev libboost-system-dev \
      protobuf-compiler

If any of these packages fails to install correctly, follow the instructions
in the appropriate section below.

Requirements:
  - CMake build system
    http://www.cmake.org

    Installation:
    $ sudo apt-get install cmake

    Additionally it is recommended you install the ccmake configuration tool:
    $ sudo apt-get install cmake-curses-gui

  - Protocol Buffers
    http://github.com/google/protobuf/
    Version 3.6.1 or more recent is required (this is available by default for
    recent Debian-based GNU/Linux distributions).

    You can check which version is available:
    $ apt-cache show libprotobuf-dev
    Package: libprotobuf-dev
    Source: protobuf
    Version: 3.6.1-9ubuntu1   <-- This must be >= 3.6.1
    ...

    Installation:
    $ sudo apt-get install libprotobuf-dev

    Note: if your GNU/Linux distribution doesn't provide the needed package,
          please download and install it manually:
    More details can be found at its official page:
    https://github.com/protocolbuffers/protobuf

  - Google Test
    http://github.com/google/googletest

    Installation:
    $ sudo apt-get install libgtest-dev

  - RE2
    http://github.com/google/re2

    Installation:
    $ sudo apt-get install libre2-dev

    Note that some distributions (notably Ubuntu 10.4) may not include this,
    so you might need to download and install it manually.

    Find and download the Debian packages for your system. For example:
    https://packages.ubuntu.com/search?keywords=libre2-9
    https://packages.ubuntu.com/search?keywords=libre2-dev

    You need to download both the libre2-dev and libre2-1 packages.
    Once downloaded, install them with:
    $ sudo dpkg -i libre2*.deb

  - ICU
    Installation:
    $ sudo apt-get install libicu-dev

    Otherwise you need to download the source tarball for the latest version
    from:
      http://site.icu-project.org/download
    And then extract it via:
    $ tar xzf icu4c-*-src.tgz

    Alternatively you can export the SVN repository to the current directory
    via:
    $ svn export http://source.icu-project.org/repos/icu/icu/tags/release-XX-y-z/

    Having acquired the latest sources, make and install it via:
    $ cd icu/source
    $ ./configure && make && sudo make install

  - A thread synchronization solution or more recent is required if you need
    libphonenumber to be thread-safe. Supported solution are:
	- Boost Version 1.40 or more recent
	- Posix Thread. Linux or Apple (ios/mac) detection is automatic. On other
        Posix environnement, uses -DUSE_POSIX_THREAD = ON
    - C++ 2011 (and later) std::mutex. Uses -DUSE_STDMUTEX = ON to enable
        automatic C++ 2011 detection (if you prefer Posix or Win32 solution).
    - Windows Win32 synchronization API.		

	If you access libphonenumber from a single thread, you don't need one of
    these solutions.

    You can install it very easily on a Debian-based GNU/Linux distribution:
    $ sudo apt-get install libboost-dev libboost-thread-dev libboost-system-dev

    Note: Boost Thread is the only library needed at link time.


  - abseil-cpp
    As this dependency package might not be very common, we are downloading,
    building and linking this library as part of the regular build process i.e
    part of CMake/Make instructions. If you wish to install this C++ developer
    library at your system level and avoid building every time, you can try
    below instruction set.

    Installation:
    - Official [installation guide](https://abseil.io/docs/cpp/tools/cmake-installs).
      Something that we followed in Linux system.
      $ git clone https://github.com/abseil/abseil-cpp.git
      $ cd abseil-cpp
      $ cmake . -DCMAKE_INSTALL_PREFIX="$HOME/lpn-deps" -DCMAKE_POSITION_INDEPENDENT_CODE=ON
      $ cmake --build . --target install
    - When building libphonenumber library, if abseil-cpp is still getting downloaded and
      built, use flags like ```CMAKE_PREFIX_PATH="$HOME/lpn-deps"```
    - Notes:
      - We are cloning only a particular version of the abseil-cpp so that we
	are not commiting to catch up with new build requirements of that
	library. Eg: After the above tag version C++14 is made as minimum
	version to build abseil-cpp library.
      - libphonenumber is presently using C++11 by default, you can always
	change it by passing ```CMAKE_CXX_STANDARD``` flag.

Building and testing the library
--------------------------------
  $ cd libphonenumber/cpp
  $ mkdir build
  $ cd build
  $ cmake ..
  $ make
  $ ./libphonenumber_test


Manually installing the library on Mac
--------------------------------------

You can easily install dependencies on Mac using a package manager. In these
instructions we use Homebrew (http://brew.sh).

Install Homebrew package manager and use it to install dependencies:
  $ /usr/bin/ruby -e "$(curl -fsSL \
    https://raw.githubusercontent.com/Homebrew/install/master/install)"
  $ brew install boost cmake icu4c pkg-config protobuf wget

See https://github.com/Homebrew/homebrew/issues/14099 - homebrew does not have
gtest. We don't need to install gtest, we only copy sources. For example:
  $ mkdir ~/googletest_clone
  $ cd ~/googletest_clone
  $ git clone https://github.com/google/googletest.git

Get the libphonenumber source. For example:
  $ mkdir ~/libphonenumber_clone
  $ cd ~/libphonenumber_clone
  $ git clone https://github.com/google/libphonenumber.git

Build and test the library:
  $ cd libphonenumber/cpp
  $ mkdir build
  $ cd build
  Replace XXX in the commands below with the appropriate version number:
  $ cmake \
    -DGTEST_SOURCE_DIR=~/googletest_clone/googletest/googletest/ \
    -DGTEST_INCLUDE_DIR=~/googletest_clone/googletest/googletest/include/ \
    -DICU_UC_INCLUDE_DIR=/usr/local/Cellar/icu4c/XXX/include/ \
    -DICU_UC_LIB=/usr/local/Cellar/icu4c/XXX/lib/libicuuc.dylib \
    -DICU_I18N_INCLUDE_DIR=/usr/local/Cellar/icu4c/XXX/include/ \
    -DICU_I18N_LIB=/usr/local/Cellar/icu4c/XXX/lib/libicui18n.dylib \
    -DUSE_STD_MAP=ON \
    ..
  $ make
  $ ./libphonenumber_test

Optional: Deleting & uninstalling everything again:
  $ cd
  $ rm -rf ~/libphonenumber_clone ~/googletest_clone

  openssl is a dependency of wget and installed with it by Homebrew. If you had
  openssl before installing wget don't uninstall here.
  $ brew uninstall boost cmake icu4c openssl pkg-config protobuf wget

  $ /usr/bin/ruby -e "$(curl -fsSL \
    https://raw.githubusercontent.com/Homebrew/install/master/uninstall)"

  Homebrew will have changed permissions at installation. See output of previous
  command for how to change them back, for example:
  $ sudo chmod 0755 /usr/local
  $ sudo chgrp wheel /usr/local


Troubleshooting CMake via ccmake
--------------------------------
  Follow these instructions if the build steps above don't work for you.

  - Incorrect protocol buffer library issues
    If the build process complains that the version of protoc being used is too
    old or that it cannot find the correct libprotobuf library, you may need to
    change the library path of the project.

    This issue should typically only occur in cases where you have two (or more)
    versions of the protocol buffer libraries installed on your system. This
    step assumes that you have already manually downloaded and installed the
    protocol buffer libraries into /usr/local (as described above).

    To make cmake use the manually installed version of the protocol buffer
    libraries, install cmake-curses-gui and use ccmake as follows.

    From within libphonenumber/cpp/build:
    $ ccmake .

    You should set the following values:
      PROTOBUF_INCLUDE_DIR         /usr/local/include
      PROTOBUF_LIB                 /usr/local/lib/libprotobuf.dylib
      PROTOC_BIN                   /usr/local/bin/protoc

    Now press 'c' then 'g' to configure the new parameters and exit ccmake.
    Finally regenerate the make files and rebuild via:
    $ cmake ..
    $ make

  - Protoc binary not executing properly
    If you still have issues with the protoc binary tool in /usr/local/bin not
    running correctly (cannot find libprotobuf.so.x) then you may need to
    configure the LD_LIBRARY_PATH. To do this, as a superuser, add the following
    file:
      /etc/ld.so.conf.d/libprotobuf.conf

    with the contents:
      # Use the manually installed version of the protocol buffer libraries.
      /usr/local/lib

    And then run:
      $ sudo chmod 644 /etc/ld.so.conf.d/libprotobuf.conf
      $ sudo ldconfig

  - Incorrect ICU library issues
    Similar to the protocol buffer library issue above, it is possible that your
    build may fail if you have two conflicting versions of the ICU libraries
    installed on your system. This step assumes that you have already manually
    downloaded and installed a recent version of the ICU libraries into
    /usr/local.

    Install and run the ccmake tool (as described above) and set the following
    values:
      ICU_I18N_INCLUDE_DIR         /usr/local/include
      ICU_I18N_LIB                 /usr/local/lib/libicui18n.so
      ICU_UC_INCLUDE_DIR           /usr/local/include
      ICU_UC_LIB                   /usr/local/lib/libicuuc.so

    Now press 'c' then 'g' to configure the new parameters and exit ccmake.
    Finally regenerate the make files and rebuild via:
    $ cmake ..
    $ make


Building the library on Windows (Visual Studio)
-----------------------------------------------
We recommend that libphonenumber on Windows be built with Visual Studio 2015
Update 2 (https://www.visualstudio.com/en-us/news/releasenotes/vs2015-update2-vs)
or later.

This enables support of plain UTF-8 source files, for which you also need to specify
the /utf-8 option in build files; see "New Options in VS2015 Update 2" at
https://blogs.msdn.microsoft.com/vcblog/2016/02/22/new-options-for-managing-character-sets-in-the-microsoft-cc-compiler/,
or a Chrome patch for an example:
https://codereview.chromium.org/2488853002/diff/80001/build/config/compiler/BUILD.gn

Without this version and the option, your compilation will have warnings when
setting the codepage for non-Unicode applications on Windows to one of the CJK
code pages, since libphonenumber has UTF-8 strings in source files. While these
are only comments (as opposed to string literals) the warnings can be
suppressed, but we reserve the right to introduce UTF-8 string literals.

The library was tested with Visual Studio 2010.

You will need to manually fetch and install the following dependencies:
  - CMake (tested with v2.8.6):
    http://cmake.org/cmake/resources/software.html
    * Download and install the Win32 installer.

  - Boost (tested with v1.44) from BoostPro:
    http://www.boostpro.com/download/
    * Select all the variants and Boost DateTime and Boost Thread during the
      installation process.
    See Linux instructions for information about thread-safety.

  - GTest (tested with v1.6.0):
    http://code.google.com/p/googletest/downloads/list
    * Open msvc/gtest-md.sln with Visual Studio and build the whole solution.

  - ICU (MSVC binaries, tested with v4.8.1):
    http://site.icu-project.org/download/48#ICU4C-Download
    * Simply extract the archive.

  - Protocol Buffers:
    http://code.google.com/p/protobuf/downloads/list
    * Open vsprojects/protobuf.sln with Visual Studio and build the whole
      solution.

Then run cmake-gui and specify the path to the libphonenumber's cpp directory
and its build directory which must be created (e.g. cpp/build).

When clicking on "Configure", specify the appropriate Visual Studio version
(tested with 2010).

Then CMake will need your help to locate the dependencies. You will have to set
the following variables (this example assumes that you extracted the
dependencies to C:/).

GTEST_INCLUDE_DIR         C:/gtest-1.6.0/include
GTEST_LIB                 C:/gtest-1.6.0/msvc/gtest-md/Release/gtest.lib

ICU_I18N_INCLUDE_DIR      C:/icu/include
ICU_I18N_LIB              C:/icu/lib/icuin.lib

ICU_UC_INCLUDE_DIR        C:/icu/include
ICU_UC_LIB                C:/icu/lib/icuuc.lib

PROTOBUF_INCLUDE_DIR      C:/protobuf-3.6.1/src
PROTOBUF_LIB              C:/protobuf-3.6.1/vsprojects/Release/libprotobuf.lib
PROTOC_BIN                C:/protobuf-3.6.1/vsprojects/Release/protoc.exe

Then you can click on "Configure" again. CMake should have located all the
dependencies.
Then click on "Generate" to generate the appropriate Visual Studio project.
Then open cpp/build/libphonenumber.sln with Visual Studio and build the INSTALL
target.

As a result the library's headers and binaries should have been installed to
C:/Program Files/libphonenumber/.
Note that this path can be set by overriding the CMAKE_INSTALL_PREFIX variable
with cmake-gui.


Supported build parameters
--------------------------
  Build parameters can be specified invoking CMake with '-DKEY=VALUE' or using a
  CMake user interface (ccmake or cmake-gui).

  USE_ALTERNATE_FORMATS = ON | OFF [ON]  -- Use alternate formats for the phone
                                            number matcher.
  USE_BOOST             = ON | OFF [ON]  -- Use Boost. This is only needed in
                                            multi-threaded environments that
                                            are not Linux and Mac.
                                            Libphonenumber relies on Boost for
                                            non-POSIX, non-Windows and non-C++ 2011
                                            multi-threading.
  USE_ICU_REGEXP        = ON | OFF [ON]  -- Use ICU regexp engine.
  USE_LITE_METADATA     = ON | OFF [OFF] -- Generates smaller metadata that
                                            doesn't include example numbers.
  USE_POSIX_THREAD      = ON | OFF [OFF] -- Use Posix thread for multi-threading.
  USE_RE2               = ON | OFF [OFF] -- Use RE2.
  USE_STD_MAP           = ON | OFF [OFF] -- Force the use of std::map.
  USE_STDMUTEX          = ON | OFF [OFF] -- Detect and use C++2011 for multi-threading.
  REGENERATE_METADATA   = ON | OFF [ON]  -- When this is set to OFF it will skip
                                            regenerating the metadata with
                                            BuildMetadataCppFromXml. Since the
                                            metadata is included in the source
                                            tree anyway, it is beneficial for
                                            packagers to turn this OFF: it saves
                                            some time, and it also makes it
                                            unnecessary to have java in the build
                                            environment. 
