From ffab1f8f870b3f6780ac00eb0004df8061240a31 Mon Sep 17 00:00:00 2001 From: "philip.liard@gmail.com" Date: Thu, 13 Dec 2012 14:33:48 +0000 Subject: CPP: Build a separate library for geocoding. 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 | 188 ++++++++++++++------- .../geocoding/geocoding_test_program.cc | 43 +++++ 2 files changed, 173 insertions(+), 58 deletions(-) create mode 100644 cpp/test/phonenumbers/geocoding/geocoding_test_program.cc diff --git a/cpp/CMakeLists.txt b/cpp/CMakeLists.txt index 0b782ed..cee2a53 100644 --- a/cpp/CMakeLists.txt +++ b/cpp/CMakeLists.txt @@ -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 index 0000000..dec55a4 --- /dev/null +++ b/cpp/test/phonenumbers/geocoding/geocoding_test_program.cc @@ -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 +#include +#include + +#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; +} -- cgit v1.2.3