CPP: Build a separate library for geocoding.
authorphilip.liard@gmail.com <philip.liard@gmail.com@ee073f10-1060-11df-b6a4-87a95322a99c>
Thu, 13 Dec 2012 14:33:48 +0000 (14:33 +0000)
committerphilip.liard@gmail.com <philip.liard@gmail.com@ee073f10-1060-11df-b6a4-87a95322a99c>
Thu, 13 Dec 2012 14:33:48 +0000 (14:33 +0000)
Review URL: https://codereview.appspot.com/6820067

git-svn-id: http://libphonenumber.googlecode.com/svn/trunk@549 ee073f10-1060-11df-b6a4-87a95322a99c

cpp/CMakeLists.txt
cpp/test/phonenumbers/geocoding/geocoding_test_program.cc [new file with mode: 0644]

index 0b782ed..cee2a53 100644 (file)
@@ -69,6 +69,7 @@ function (find_required_program NAME FILENAME DESCRIPTION)
 endfunction (find_required_program)
 
 # Options that can be passed to CMake using 'cmake -DKEY=VALUE'.
+option ("BUILD_GEOCODER" "Build the offline phone number geocoder" "ON")
 option ("USE_ICU_REGEXP" "Use ICU regexp engine" "ON")
 option ("USE_LITE_METADATA" "Use lite metadata" "OFF")
 option ("USE_RE2" "Use RE2" "OFF")
@@ -99,8 +100,8 @@ check_library_version (PC_ICU_UC icu-uc>=4.4)
 
 set (ICU_INCLUDE_DIR ${ICU_UC_INCLUDE_DIR})
 set (ICU_LIB ${ICU_UC_LIB})
-# If ICU regexp engine is used, use icui18n as well.
-if (${USE_ICU_REGEXP} STREQUAL "ON")
+# If ICU regexp engine is used or if the geocoder is built, use icui18n as well.
+if (${USE_ICU_REGEXP} STREQUAL "ON" OR ${BUILD_GEOCODER} STREQUAL "ON")
   find_required_library (ICU_I18N unicode/regex.h icui18n "ICU")
   check_library_version (PC_ICU_I18N icu-i18n>=4.4)
   list (APPEND ICU_INCLUDE_DIR ${ICU_I18N_INCLUDE_DIR})
@@ -149,43 +150,34 @@ add_custom_command (
   DEPENDS ${PROTOBUF_SOURCES}
 )
 
-add_custom_target (
-  generate-sources
-
-  DEPENDS ${PROTOBUF_OUTPUT}
-  COMMENT "Generating Protocol Buffers code"
-)
-
-# Geocoding data cpp file generation
-set (TOOLS_DIR "${CMAKE_CURRENT_BINARY_DIR}/tools")
-add_subdirectory("${CMAKE_SOURCE_DIR}/../tools/cpp" "${TOOLS_DIR}")
+if (${BUILD_GEOCODER} STREQUAL "ON")
+  # Geocoding data cpp file generation
+  set (TOOLS_DIR "${CMAKE_CURRENT_BINARY_DIR}/tools")
+  add_subdirectory("${CMAKE_SOURCE_DIR}/../tools/cpp" "${TOOLS_DIR}")
 
-set (GEOCODING_DIR "${RESOURCES_DIR}/geocoding")
-file (GLOB_RECURSE GEOCODING_SOURCES "${GEOCODING_DIR}/*.txt")
+  set (GEOCODING_DIR "${RESOURCES_DIR}/geocoding")
+  file (GLOB_RECURSE GEOCODING_SOURCES "${GEOCODING_DIR}/*.txt")
 
-set (GEOCODING_DATA_OUTPUT
-  "${CMAKE_SOURCE_DIR}/src/phonenumbers/geocoding/geocoding_data.cc"
-)
+  set (GEOCODING_DATA_OUTPUT
+    "${CMAKE_SOURCE_DIR}/src/phonenumbers/geocoding/geocoding_data.cc"
+  )
 
-add_custom_command (
-  COMMAND generate_geocoding_data "${GEOCODING_DIR}" "${GEOCODING_DATA_OUTPUT}"
+  add_custom_command (
+    COMMAND generate_geocoding_data "${GEOCODING_DIR}"
+      "${GEOCODING_DATA_OUTPUT}"
 
-  OUTPUT ${GEOCODING_DATA_OUTPUT}
-  DEPENDS ${GEOCODING_SOURCES}
-          generate_geocoding_data
-  COMMENT "Generating geocoding data code"
-)
+    OUTPUT ${GEOCODING_DATA_OUTPUT}
+    DEPENDS ${GEOCODING_SOURCES}
+            generate_geocoding_data
+    COMMENT "Generating geocoding data code"
+  )
+endif ()
 
 set (
   SOURCES
   "src/base/string_piece.cc"
   "src/phonenumbers/asyoutypeformatter.cc"
   "src/phonenumbers/default_logger.cc"
-  "src/phonenumbers/geocoding/area_code_map.cc"
-  "src/phonenumbers/geocoding/default_map_storage.cc"
-  "src/phonenumbers/geocoding/geocoding_data.cc"
-  "src/phonenumbers/geocoding/mapping_file_provider.cc"
-  "src/phonenumbers/geocoding/phonenumber_offline_geocoder.cc"
   "src/phonenumbers/logger.cc"
   "src/phonenumbers/phonemetadata.pb.cc" # Generated by Protocol Buffers.
   "src/phonenumbers/phonenumber.cc"
@@ -201,6 +193,17 @@ set (
   "src/phonenumbers/utf/unilib.cc"
 )
 
+if (${BUILD_GEOCODER} STREQUAL "ON")
+  set (
+    GEOCODING_SOURCES
+    "src/phonenumbers/geocoding/area_code_map.cc"
+    "src/phonenumbers/geocoding/default_map_storage.cc"
+    "src/phonenumbers/geocoding/geocoding_data.cc"
+    "src/phonenumbers/geocoding/mapping_file_provider.cc"
+    "src/phonenumbers/geocoding/phonenumber_offline_geocoder.cc"
+  )
+endif ()
+
 # Add regexp engine-dependent sources. ICU is used by default.
 if (${USE_RE2} STREQUAL "ON")
   # Add a flag to select the right regexp factory implementation used by
@@ -221,8 +224,12 @@ if (${USE_ICU_REGEXP} STREQUAL "ON")
 endif ()
 
 # Library sources excluding the metadata files, since special metadata is used
-# for unit-testing.
+# for unit-testing. Note that a single testing library is built for both
+# libphonenumber and geocoding.
 set (TESTING_LIBRARY_SOURCES ${SOURCES})
+if (${BUILD_GEOCODER} STREQUAL "ON")
+  list (APPEND TESTING_LIBRARY_SOURCES ${GEOCODING_SOURCES})
+endif ()
 
 # Add metadata code generation targets.
 
@@ -304,11 +311,23 @@ include_directories ("src")
 
 # Build a static library (without -fPIC).
 add_library (phonenumber STATIC ${SOURCES})
-add_dependencies (phonenumber generate-sources ${METADATA_TARGET})
 if (${USE_ICU_REGEXP} STREQUAL "ON")
   add_dependencies (phonenumber ${ALT_FORMAT_METADATA_TARGET})
 endif ()
 
+if (${BUILD_GEOCODER} STREQUAL "ON")
+  add_library (geocoding STATIC ${GEOCODING_SOURCES})
+  # The geocoder doesn't use RE2 so there is no reason not to build a shared
+  # library for it.
+  add_library (geocoding-shared SHARED ${GEOCODING_SOURCES})
+  set_target_properties (geocoding-shared
+    PROPERTIES
+      OUTPUT_NAME "geocoding"
+      PREFIX "lib"
+      SOVERSION ${libphonenumber_VERSION_MAJOR}
+      VERSION ${libphonenumber_VERSION_MAJOR}.${libphonenumber_VERSION_MINOR})
+endif ()
+
 # Build a shared library (with -fPIC).
 set (BUILD_SHARED_LIB true)
 
@@ -324,7 +343,6 @@ endif ()
 
 if (BUILD_SHARED_LIB)
   add_library (phonenumber-shared SHARED ${SOURCES})
-  add_dependencies (phonenumber-shared generate-sources ${METADATA_TARGET})
   if (${USE_ICU_REGEXP} STREQUAL "ON")
     add_dependencies (phonenumber ${ALT_FORMAT_METADATA_TARGET})
   endif ()
@@ -336,51 +354,61 @@ if (BUILD_SHARED_LIB)
       VERSION ${libphonenumber_VERSION_MAJOR}.${libphonenumber_VERSION_MINOR})
 endif ()
 
-set (LIBRARY_DEPS ${PROTOBUF_LIB} ${ICU_LIB} ${Boost_LIBRARIES})
+# Libraries used by both libphonenumber and libgeocoding.
+set (COMMON_DEPS ${ICU_LIB})
+
+set (LIBRARY_DEPS ${PROTOBUF_LIB} ${Boost_LIBRARIES})
 
 if (${USE_RE2} STREQUAL "ON")
   list (APPEND LIBRARY_DEPS ${RE2_LIB})
 endif ()
 
 if (APPLE)
-  list (APPEND LIBRARY_DEPS ${COREFOUNDATION_LIB} ${FOUNDATION_LIB})
+  list (APPEND COMMON_DEPS ${COREFOUNDATION_LIB} ${FOUNDATION_LIB})
 endif ()
 
+list (APPEND LIBRARY_DEPS ${COMMON_DEPS})
+
 target_link_libraries (phonenumber ${LIBRARY_DEPS})
 
 if (BUILD_SHARED_LIB)
   target_link_libraries (phonenumber-shared ${LIBRARY_DEPS})
 endif ()
 
+if (${BUILD_GEOCODER} STREQUAL "ON")
+  list (APPEND GEOCODER_DEPS ${COMMON_DEPS})
+  # Note that the subset of base/ on which the geocoder relies is implemented
+  # on top of Boost header-only libraries (e.g. scoped_ptr.hpp).
+  target_link_libraries (geocoding ${LIBRARY_DEPS})
+  target_link_libraries (geocoding-shared ${LIBRARY_DEPS})
+endif ()
+
 # Build a specific library for testing purposes.
 add_library (phonenumber_testing STATIC ${TESTING_LIBRARY_SOURCES})
 target_link_libraries (phonenumber_testing ${LIBRARY_DEPS})
-add_dependencies (phonenumber_testing generate-sources ${TEST_METADATA_TARGET})
 
-# Test geocoding data cpp files generation
-set (GEOCODING_TEST_DIR "${RESOURCES_DIR}/test/geocoding")
-file (GLOB_RECURSE GEOCODING_TEST_SOURCES "${GEOCODING_TEST_DIR}/*.txt")
+if (${BUILD_GEOCODER} STREQUAL "ON")
+  # Test geocoding data cpp files generation.
+  set (GEOCODING_TEST_DIR "${RESOURCES_DIR}/test/geocoding")
+  file (GLOB_RECURSE GEOCODING_TEST_SOURCES "${GEOCODING_TEST_DIR}/*.txt")
 
-set (GEOCODING_TEST_DATA_OUTPUT
-  "${CMAKE_SOURCE_DIR}/test/phonenumbers/geocoding/geocoding_test_data.cc"
-)
+  set (GEOCODING_TEST_DATA_OUTPUT
+    "${CMAKE_SOURCE_DIR}/test/phonenumbers/geocoding/geocoding_test_data.cc"
+  )
 
-add_custom_command (
-  COMMAND generate_geocoding_data "${GEOCODING_TEST_DIR}"
-    "${GEOCODING_TEST_DATA_OUTPUT}" "_test"
+  add_custom_command (
+    COMMAND generate_geocoding_data "${GEOCODING_TEST_DIR}"
+      "${GEOCODING_TEST_DATA_OUTPUT}" "_test"
+
+    OUTPUT ${GEOCODING_TEST_DATA_OUTPUT}
+    DEPENDS ${GEOCODING_TEST_SOURCES} generate_geocoding_data
+    COMMENT "Generating geocoding test data code"
+  )
+endif ()
 
-  OUTPUT ${GEOCODING_TEST_DATA_OUTPUT}
-  DEPENDS ${GEOCODING_TEST_SOURCES} generate_geocoding_data
-  COMMENT "Generating geocoding test data code"
-)
 
 set (TEST_SOURCES
   "test/phonenumbers/asyoutypeformatter_test.cc"
-  "test/phonenumbers/geocoding/area_code_map_test.cc"
-  "test/phonenumbers/geocoding/geocoding_data_test.cc"
-  "test/phonenumbers/geocoding/geocoding_test_data.cc"
-  "test/phonenumbers/geocoding/mapping_file_provider_test.cc"
-  "test/phonenumbers/geocoding/phonenumber_offline_geocoder_test.cc"
   "test/phonenumbers/logger_test.cc"
   "test/phonenumbers/phonenumberutil_test.cc"
   "test/phonenumbers/regexp_adapter_test.cc"
@@ -392,6 +420,18 @@ set (TEST_SOURCES
   "test/phonenumbers/unicodestring_test.cc"
   "test/phonenumbers/utf/unicodetext_test.cc"
 )
+
+if (${BUILD_GEOCODER} STREQUAL "ON")
+  set (GEOCODING_TEST_SOURCES
+    "test/phonenumbers/geocoding/area_code_map_test.cc"
+    "test/phonenumbers/geocoding/geocoding_data_test.cc"
+    "test/phonenumbers/geocoding/geocoding_test_data.cc"
+    "test/phonenumbers/geocoding/mapping_file_provider_test.cc"
+    "test/phonenumbers/geocoding/phonenumber_offline_geocoder_test.cc"
+  )
+  list (APPEND TEST_SOURCES ${GEOCODING_TEST_SOURCES})
+endif ()
+
 if (${USE_ICU_REGEXP} STREQUAL "ON")
   # Add the phone number matcher tests.
   list (APPEND TEST_SOURCES "test/phonenumbers/phonenumbermatch_test.cc")
@@ -408,12 +448,21 @@ if (NOT WIN32)
 endif ()
 
 target_link_libraries (libphonenumber_test ${TEST_LIBS})
-add_custom_target (test
-  COMMAND generate_geocoding_data_test
-  COMMAND libphonenumber_test
 
-  DEPENDS generate_geocoding_data_test libphonenumber_test
-)
+# Unfortunately add_custom_target() can't accept a single command provided as a
+# list of commands.
+if (${BUILD_GEOCODER} STREQUAL "ON")
+  add_custom_target (test
+    COMMAND generate_geocoding_data_test
+    COMMAND libphonenumber_test
+    DEPENDS generate_geocoding_data_test libphonenumber_test
+  )
+else ()
+  add_custom_target (test
+    COMMAND libphonenumber_test
+    DEPENDS libphonenumber_test
+  )
+endif ()
 
 # Install rules.
 install (FILES
@@ -443,6 +492,13 @@ if (${USE_ICU_REGEXP} STREQUAL "ON")
   )
 endif ()
 
+if (${BUILD_GEOCODER} STREQUAL "ON")
+  install (FILES
+    "src/phonenumbers/geocoding/phonenumber_offline_geocoder.h"
+    DESTINATION include/phonenumbers/geocoding
+  )
+endif ()
+
 install (FILES "src/base/basictypes.h" DESTINATION include/base/)
 
 install (FILES
@@ -460,3 +516,19 @@ if (BUILD_SHARED_LIB)
   install (TARGETS phonenumber-shared LIBRARY DESTINATION lib/ ARCHIVE
            DESTINATION lib/)
 endif ()
+
+if (${BUILD_GEOCODER} STREQUAL "ON")
+  install (TARGETS geocoding LIBRARY DESTINATION lib/ ARCHIVE DESTINATION lib/)
+  install (TARGETS geocoding-shared LIBRARY DESTINATION lib/ ARCHIVE
+           DESTINATION lib/)
+endif ()
+
+# Build an example program using geocoding, mainly to make sure that both
+# libraries are built properly.
+if (${BUILD_GEOCODER} STREQUAL "ON")
+  add_executable (
+    geocoding_test_program
+    "test/phonenumbers/geocoding/geocoding_test_program.cc"
+  )
+  target_link_libraries (geocoding_test_program geocoding phonenumber)
+endif ()
diff --git a/cpp/test/phonenumbers/geocoding/geocoding_test_program.cc b/cpp/test/phonenumbers/geocoding/geocoding_test_program.cc
new file mode 100644 (file)
index 0000000..dec55a4
--- /dev/null
@@ -0,0 +1,43 @@
+// Copyright (C) 2012 The Libphonenumber Authors
+//
+// 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.
+
+// Sample program using the geocoding functionality. This is used to test that
+// the geocoding library is compiled correctly.
+
+#include <cassert>
+#include <iostream>
+#include <string>
+
+#include "phonenumbers/geocoding/phonenumber_offline_geocoder.h"
+#include "phonenumbers/phonenumber.pb.h"
+#include "phonenumbers/phonenumberutil.h"
+
+using i18n::phonenumbers::PhoneNumber;
+using i18n::phonenumbers::PhoneNumberOfflineGeocoder;
+using i18n::phonenumbers::PhoneNumberUtil;
+
+int main() {
+  PhoneNumber number;
+  const PhoneNumberUtil& phone_util = *PhoneNumberUtil::GetInstance();
+  const PhoneNumberUtil::ErrorType status = phone_util.Parse(
+      "16502530000", "US", &number);
+  assert(status == PhoneNumberUtil::NO_PARSING_ERROR);
+
+  const std::string description =
+      PhoneNumberOfflineGeocoder().GetDescriptionForNumber(
+          number, icu::Locale("en", "GB"));
+  std::cout << description << std::endl;
+  assert(description == "Mountain View, CA");
+  return 0;
+}