Browse Source

CPP: Build a separate library for geocoding.

Review URL: https://codereview.appspot.com/6820067
pull/567/head
Philippe Liard 13 years ago
committed by Mihaela Rosca
parent
commit
fe98320cc9
2 changed files with 173 additions and 58 deletions
  1. +130
    -58
      cpp/CMakeLists.txt
  2. +43
    -0
      cpp/test/phonenumbers/geocoding/geocoding_test_program.cc

+ 130
- 58
cpp/CMakeLists.txt View File

@ -69,6 +69,7 @@ function (find_required_program NAME FILENAME DESCRIPTION)
endfunction (find_required_program) endfunction (find_required_program)
# Options that can be passed to CMake using 'cmake -DKEY=VALUE'. # 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_ICU_REGEXP" "Use ICU regexp engine" "ON")
option ("USE_LITE_METADATA" "Use lite metadata" "OFF") option ("USE_LITE_METADATA" "Use lite metadata" "OFF")
option ("USE_RE2" "Use RE2" "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_INCLUDE_DIR ${ICU_UC_INCLUDE_DIR})
set (ICU_LIB ${ICU_UC_LIB}) 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") find_required_library (ICU_I18N unicode/regex.h icui18n "ICU")
check_library_version (PC_ICU_I18N icu-i18n>=4.4) check_library_version (PC_ICU_I18N icu-i18n>=4.4)
list (APPEND ICU_INCLUDE_DIR ${ICU_I18N_INCLUDE_DIR}) list (APPEND ICU_INCLUDE_DIR ${ICU_I18N_INCLUDE_DIR})
@ -149,43 +150,34 @@ add_custom_command (
DEPENDS ${PROTOBUF_SOURCES} 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 ( set (
SOURCES SOURCES
"src/base/string_piece.cc" "src/base/string_piece.cc"
"src/phonenumbers/asyoutypeformatter.cc" "src/phonenumbers/asyoutypeformatter.cc"
"src/phonenumbers/default_logger.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/logger.cc"
"src/phonenumbers/phonemetadata.pb.cc" # Generated by Protocol Buffers. "src/phonenumbers/phonemetadata.pb.cc" # Generated by Protocol Buffers.
"src/phonenumbers/phonenumber.cc" "src/phonenumbers/phonenumber.cc"
@ -201,6 +193,17 @@ set (
"src/phonenumbers/utf/unilib.cc" "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. # Add regexp engine-dependent sources. ICU is used by default.
if (${USE_RE2} STREQUAL "ON") if (${USE_RE2} STREQUAL "ON")
# Add a flag to select the right regexp factory implementation used by # Add a flag to select the right regexp factory implementation used by
@ -221,8 +224,12 @@ if (${USE_ICU_REGEXP} STREQUAL "ON")
endif () endif ()
# Library sources excluding the metadata files, since special metadata is used # 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}) set (TESTING_LIBRARY_SOURCES ${SOURCES})
if (${BUILD_GEOCODER} STREQUAL "ON")
list (APPEND TESTING_LIBRARY_SOURCES ${GEOCODING_SOURCES})
endif ()
# Add metadata code generation targets. # Add metadata code generation targets.
@ -304,11 +311,23 @@ include_directories ("src")
# Build a static library (without -fPIC). # Build a static library (without -fPIC).
add_library (phonenumber STATIC ${SOURCES}) add_library (phonenumber STATIC ${SOURCES})
add_dependencies (phonenumber generate-sources ${METADATA_TARGET})
if (${USE_ICU_REGEXP} STREQUAL "ON") if (${USE_ICU_REGEXP} STREQUAL "ON")
add_dependencies (phonenumber ${ALT_FORMAT_METADATA_TARGET}) add_dependencies (phonenumber ${ALT_FORMAT_METADATA_TARGET})
endif () 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). # Build a shared library (with -fPIC).
set (BUILD_SHARED_LIB true) set (BUILD_SHARED_LIB true)
@ -324,7 +343,6 @@ endif ()
if (BUILD_SHARED_LIB) if (BUILD_SHARED_LIB)
add_library (phonenumber-shared SHARED ${SOURCES}) add_library (phonenumber-shared SHARED ${SOURCES})
add_dependencies (phonenumber-shared generate-sources ${METADATA_TARGET})
if (${USE_ICU_REGEXP} STREQUAL "ON") if (${USE_ICU_REGEXP} STREQUAL "ON")
add_dependencies (phonenumber ${ALT_FORMAT_METADATA_TARGET}) add_dependencies (phonenumber ${ALT_FORMAT_METADATA_TARGET})
endif () endif ()
@ -336,51 +354,61 @@ if (BUILD_SHARED_LIB)
VERSION ${libphonenumber_VERSION_MAJOR}.${libphonenumber_VERSION_MINOR}) VERSION ${libphonenumber_VERSION_MAJOR}.${libphonenumber_VERSION_MINOR})
endif () 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") if (${USE_RE2} STREQUAL "ON")
list (APPEND LIBRARY_DEPS ${RE2_LIB}) list (APPEND LIBRARY_DEPS ${RE2_LIB})
endif () endif ()
if (APPLE) if (APPLE)
list (APPEND LIBRARY_DEPS ${COREFOUNDATION_LIB} ${FOUNDATION_LIB})
list (APPEND COMMON_DEPS ${COREFOUNDATION_LIB} ${FOUNDATION_LIB})
endif () endif ()
list (APPEND LIBRARY_DEPS ${COMMON_DEPS})
target_link_libraries (phonenumber ${LIBRARY_DEPS}) target_link_libraries (phonenumber ${LIBRARY_DEPS})
if (BUILD_SHARED_LIB) if (BUILD_SHARED_LIB)
target_link_libraries (phonenumber-shared ${LIBRARY_DEPS}) target_link_libraries (phonenumber-shared ${LIBRARY_DEPS})
endif () 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. # Build a specific library for testing purposes.
add_library (phonenumber_testing STATIC ${TESTING_LIBRARY_SOURCES}) add_library (phonenumber_testing STATIC ${TESTING_LIBRARY_SOURCES})
target_link_libraries (phonenumber_testing ${LIBRARY_DEPS}) 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 set (TEST_SOURCES
"test/phonenumbers/asyoutypeformatter_test.cc" "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/logger_test.cc"
"test/phonenumbers/phonenumberutil_test.cc" "test/phonenumbers/phonenumberutil_test.cc"
"test/phonenumbers/regexp_adapter_test.cc" "test/phonenumbers/regexp_adapter_test.cc"
@ -392,6 +420,18 @@ set (TEST_SOURCES
"test/phonenumbers/unicodestring_test.cc" "test/phonenumbers/unicodestring_test.cc"
"test/phonenumbers/utf/unicodetext_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") if (${USE_ICU_REGEXP} STREQUAL "ON")
# Add the phone number matcher tests. # Add the phone number matcher tests.
list (APPEND TEST_SOURCES "test/phonenumbers/phonenumbermatch_test.cc") list (APPEND TEST_SOURCES "test/phonenumbers/phonenumbermatch_test.cc")
@ -408,12 +448,21 @@ if (NOT WIN32)
endif () endif ()
target_link_libraries (libphonenumber_test ${TEST_LIBS}) 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 rules.
install (FILES install (FILES
@ -443,6 +492,13 @@ if (${USE_ICU_REGEXP} STREQUAL "ON")
) )
endif () 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 "src/base/basictypes.h" DESTINATION include/base/)
install (FILES install (FILES
@ -460,3 +516,19 @@ if (BUILD_SHARED_LIB)
install (TARGETS phonenumber-shared LIBRARY DESTINATION lib/ ARCHIVE install (TARGETS phonenumber-shared LIBRARY DESTINATION lib/ ARCHIVE
DESTINATION lib/) DESTINATION lib/)
endif () 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 ()

+ 43
- 0
cpp/test/phonenumbers/geocoding/geocoding_test_program.cc View File

@ -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;
}

Loading…
Cancel
Save