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

Reply via email to