This is an automated email from the ASF dual-hosted git repository. kou pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/arrow.git
commit 9fc896e44900909181c4a141f5cadec0760e898f Author: Pindikura Ravindra <[email protected]> AuthorDate: Thu Oct 4 06:56:37 2018 -0400 ARROW-3331: [Gandiva][C++] Add re2 to toolchain Author: Pindikura Ravindra <[email protected]> Closes #2695 from pravindra/re2 and squashes the following commits: 4408b85e3 <Pindikura Ravindra> ARROW-3331: Add re2 to toolchain --- cpp/cmake_modules/FindRE2.cmake | 51 +++++++++++++++++------------ cpp/cmake_modules/GandivaBuildUtils.cmake | 10 ++++-- cpp/cmake_modules/ThirdpartyToolchain.cmake | 46 ++++++++++++++++++++++++-- cpp/src/gandiva/CMakeLists.txt | 5 +++ cpp/thirdparty/versions.txt | 1 + 5 files changed, 87 insertions(+), 26 deletions(-) diff --git a/cpp/cmake_modules/FindRE2.cmake b/cpp/cmake_modules/FindRE2.cmake index 6450b22..f2a4670 100644 --- a/cpp/cmake_modules/FindRE2.cmake +++ b/cpp/cmake_modules/FindRE2.cmake @@ -22,48 +22,57 @@ # This module defines # RE2_INCLUDE_DIR, directory containing headers # RE2_STATIC_LIB, path to libre2.a -# re2 imported static library # RE2_FOUND, whether re2 has been found -set(RE2_SEARCH_HEADER_PATHS ${RE2_HOME}/include) - -set(RE2_SEARCH_LIB_PATHS ${RE2_HOME}/lib) +if( NOT "${RE2_HOME}" STREQUAL "") + file (TO_CMAKE_PATH "${RE2_HOME}" _re2_path) +endif() +message (STATUS "RE2_HOME: ${RE2_HOME}") find_path(RE2_INCLUDE_DIR re2/re2.h - PATHS ${RE2_SEARCH_HEADER_PATHS} - NO_DEFAULT_PATH + HINTS ${_re2_path} + NO_DEFAULT_PATH + PATH_SUFFIXES "include" DOC "Google's re2 regex header path" ) -find_library(RE2_LIBS NAMES re2 - PATHS ${RE2_SEARCH_LIB_PATHS} - NO_DEFAULT_PATH - DOC "Google's re2 regex library" -) +set (lib_dirs "lib") +if (EXISTS "${_re2_path}/lib64") + set (lib_dirs "lib64" ${lib_dirs}) +endif () +if (EXISTS "${_re2_path}/lib/${CMAKE_LIBRARY_ARCHITECTURE}") + set (lib_dirs "lib/${CMAKE_LIBRARY_ARCHITECTURE}" ${lib_dirs}) +endif () find_library(RE2_STATIC_LIB NAMES libre2${CMAKE_STATIC_LIBRARY_SUFFIX} - PATHS ${RE2_SEARCH_LIB_PATHS} + PATHS ${_re2_path} NO_DEFAULT_PATH + PATH_SUFFIXES ${lib_dirs} DOC "Google's re2 regex static library" ) message(STATUS ${RE2_INCLUDE_DIR}) -if (NOT RE2_INCLUDE_DIR OR NOT RE2_LIBS OR - NOT RE2_STATIC_LIB) +if (NOT RE2_INCLUDE_DIR OR NOT RE2_STATIC_LIB) set(RE2_FOUND FALSE) - message(FATAL_ERROR "Re2 includes and libraries NOT found. " - "Looked for headers in ${RE2_SEARCH_HEADER_PATHS}, " - "and for libs in ${RE2_SEARCH_LIB_PATHS}") + if (_re2_path) + set (RE2_ERR_MSG "Could not find re2. Looked in ${_re2_path}.") + else () + set (RE2_ERR_MSG "Could not find re2 in system search paths.") + endif() + + if (RE2_FIND_REQUIRED) + message(FATAL_ERROR "${RE2_ERR_MSG})") + else () + message (STATUS "${RE2_ERR_MSG}") + endif () else() set(RE2_FOUND TRUE) - add_library(re2 STATIC IMPORTED) - set_target_properties(re2 PROPERTIES IMPORTED_LOCATION "${RE2_STATIC_LIB}") + message(STATUS "Found the RE2 headers : ${RE2_INCLUDE_DIR}") + message(STATUS "Found the RE2 static library : ${RE2_STATIC_LIB}") endif() mark_as_advanced( RE2_INCLUDE_DIR - RE2_LIBS RE2_STATIC_LIB - re2 ) diff --git a/cpp/cmake_modules/GandivaBuildUtils.cmake b/cpp/cmake_modules/GandivaBuildUtils.cmake index c247b2b..a1ed48e 100644 --- a/cpp/cmake_modules/GandivaBuildUtils.cmake +++ b/cpp/cmake_modules/GandivaBuildUtils.cmake @@ -19,6 +19,7 @@ function(build_gandiva_lib TYPE ARROW) string(TOUPPER ${TYPE} TYPE_UPPER_CASE) add_library(gandiva_${TYPE} ${TYPE_UPPER_CASE} $<TARGET_OBJECTS:gandiva_obj_lib>) + add_dependencies(gandiva_${TYPE} arrow_dependencies) target_include_directories(gandiva_${TYPE} PUBLIC @@ -60,9 +61,9 @@ function(build_gandiva_lib TYPE ARROW) endfunction(build_gandiva_lib TYPE) set(GANDIVA_TEST_LINK_LIBS - ${GTEST_STATIC_LIB} - ${GTEST_MAIN_STATIC_LIB} - ${RE2_STATIC_LIB}) + gtest + gtest_main + re2) if (PTHREAD_LIBRARY) set(GANDIVA_TEST_LINK_LIBS @@ -82,6 +83,9 @@ function(add_gandiva_unit_test REL_TEST_NAME) target_link_libraries(${TEST_NAME} PRIVATE LLVM::LLVM_INTERFACE) endif() + # Require toolchain to be built + add_dependencies(${TEST_NAME} arrow_dependencies) + target_include_directories(${TEST_NAME} PRIVATE ${CMAKE_SOURCE_DIR}/include ${CMAKE_SOURCE_DIR}/src diff --git a/cpp/cmake_modules/ThirdpartyToolchain.cmake b/cpp/cmake_modules/ThirdpartyToolchain.cmake index 1c7cd62..2e2f7d1 100644 --- a/cpp/cmake_modules/ThirdpartyToolchain.cmake +++ b/cpp/cmake_modules/ThirdpartyToolchain.cmake @@ -230,6 +230,12 @@ else() set(PROTOBUF_SOURCE_URL "https://github.com/protocolbuffers/protobuf/releases/download/${PROTOBUF_VERSION}/protobuf-all-${STRIPPED_PROTOBUF_VERSION}.tar.gz") endif() +if (DEFINED ENV{ARROW_RE2_URL}) + set(RE2_SOURCE_URL "$ENV{ARROW_RE2_URL}") +else() + set(RE2_SOURCE_URL "https://github.com/google/re2/archive/${RE2_VERSION}.tar.gz") +endif() + set(RAPIDJSON_SOURCE_MD5 "badd12c511e081fec6c89c43a7027bce") if (DEFINED ENV{ARROW_RAPIDJSON_URL}) set(RAPIDJSON_SOURCE_URL "$ENV{ARROW_RAPIDJSON_URL}") @@ -1057,11 +1063,47 @@ if (ARROW_WITH_ZSTD) endif() endif() +# ---------------------------------------------------------------------- +# RE2 (required for Gandiva) +if (ARROW_GANDIVA) + # re2 + if ("${RE2_HOME}" STREQUAL "") + set (RE2_PREFIX "${CMAKE_CURRENT_BINARY_DIR}/re2_ep-install") + set (RE2_HOME "${RE2_PREFIX}") + set (RE2_INCLUDE_DIR "${RE2_PREFIX}/include") + set (RE2_STATIC_LIB "${RE2_PREFIX}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}re2${CMAKE_STATIC_LIBRARY_SUFFIX}") + + set(RE2_CMAKE_ARGS + "-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}" + "-DCMAKE_CXX_FLAGS=${EP_CXX_FLAGS}" + "-DCMAKE_CXX_FLAGS_${UPPERCASE_BUILD_TYPE}=${EP_CXX_FLAGS}" + "-DCMAKE_INSTALL_PREFIX=${RE2_PREFIX}") + ExternalProject_Add(re2_ep + ${EP_LOG_OPTIONS} + INSTALL_DIR ${RE2_PREFIX} + URL ${RE2_SOURCE_URL} + CMAKE_ARGS ${RE2_CMAKE_ARGS} + BUILD_BYPRODUCTS "${RE2_STATIC_LIB}") + set (RE2_VENDORED 1) + else () + find_package (RE2 REQUIRED) + set (RE2_VENDORED 0) + endif () + + include_directories (SYSTEM ${RE2_INCLUDE_DIR}) + ADD_THIRDPARTY_LIB(re2 + STATIC_LIB ${RE2_STATIC_LIB}) + + if (RE2_VENDORED) + add_dependencies (arrow_dependencies re2_ep) + endif () +endif () + # ---------------------------------------------------------------------- -# Protocol Buffers (required for ORC and Flight libraries) +# Protocol Buffers (required for ORC and Flight and Gandiva libraries) -if (ARROW_ORC OR ARROW_FLIGHT) +if (ARROW_ORC OR ARROW_FLIGHT OR ARROW_GANDIVA) # protobuf if ("${PROTOBUF_HOME}" STREQUAL "") set (PROTOBUF_PREFIX "${THIRDPARTY_DIR}/protobuf_ep-install") diff --git a/cpp/src/gandiva/CMakeLists.txt b/cpp/src/gandiva/CMakeLists.txt index a22c1cb..91f851f 100644 --- a/cpp/src/gandiva/CMakeLists.txt +++ b/cpp/src/gandiva/CMakeLists.txt @@ -71,7 +71,10 @@ set(SRC_FILES annotator.cc ${SHARED_HELPER_FILES} ${BC_FILE_PATH_CC}) +# TODO(wesm): Replace this with ADD_ARROW_LIB which deals with objlib/no-objlib +# (not supported on Windows), dependencies, etc. add_library(gandiva_obj_lib OBJECT ${SRC_FILES}) +add_dependencies(gandiva_obj_lib arrow_dependencies) # set PIC so that object library can be included in shared libs. set_target_properties(gandiva_obj_lib PROPERTIES POSITION_INDEPENDENT_CODE 1) @@ -104,6 +107,8 @@ add_library(gandiva_helpers SHARED ${SHARED_HELPER_FILES} function_holder_stubs.cc) +add_dependencies(gandiva_helpers arrow_dependencies) + target_compile_definitions(gandiva_helpers PRIVATE -DGDV_HELPERS ) diff --git a/cpp/thirdparty/versions.txt b/cpp/thirdparty/versions.txt index 4e96fcc..8fbfb38 100644 --- a/cpp/thirdparty/versions.txt +++ b/cpp/thirdparty/versions.txt @@ -35,3 +35,4 @@ SNAPPY_VERSION=1.1.3 THRIFT_VERSION=0.11.0 ZLIB_VERSION=1.2.8 ZSTD_VERSION=v1.2.0 +RE2_VERSION=2018-10-01
