| 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. |