blob: 87d26d319dd7abc03dbef5c61cadeb2b5b5e6417 [file] [log] [blame]
# Licensed to the Apache Software Foundation (ASF) under one
# or more cod ntributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you 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.
#
# Includes code assembled from BSD/MIT/Apache-licensed code from some 3rd-party
# projects, including Kudu, Impala, and libdynd. See python/LICENSE.txt
cmake_minimum_required(VERSION 2.7)
project(pyarrow)
# Running from a Python sdist tarball
set(LOCAL_CMAKE_MODULES "${CMAKE_SOURCE_DIR}/cmake_modules")
if(EXISTS "${LOCAL_CMAKE_MODULES}")
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${LOCAL_CMAKE_MODULES})
endif()
# Running from a git source tree
set(CPP_CMAKE_MODULES "${CMAKE_SOURCE_DIR}/../cpp/cmake_modules")
if(EXISTS "${CPP_CMAKE_MODULES}")
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CPP_CMAKE_MODULES})
endif()
include(CMakeParseArguments)
# Compatibility with CMake 3.1
if(POLICY CMP0054)
# http://www.cmake.org/cmake/help/v3.1/policy/CMP0054.html
cmake_policy(SET CMP0054 NEW)
endif()
# Allow "make install" to not depend on all targets.
#
# Must be declared in the top-level CMakeLists.txt.
set(CMAKE_SKIP_INSTALL_ALL_DEPENDENCY true)
set(CMAKE_MACOSX_RPATH 1)
set(CMAKE_OSX_DEPLOYMENT_TARGET 10.9)
# Generate a Clang compile_commands.json "compilation database" file for use
# with various development tools, such as Vim's YouCompleteMe plugin.
# See http://clang.llvm.org/docs/JSONCompilationDatabase.html
if("$ENV{CMAKE_EXPORT_COMPILE_COMMANDS}" STREQUAL "1")
set(CMAKE_EXPORT_COMPILE_COMMANDS 1)
endif()
# Top level cmake dir
if("${CMAKE_SOURCE_DIR}" STREQUAL "${CMAKE_CURRENT_SOURCE_DIR}")
option(PYARROW_BUILD_CUDA "Build the PyArrow CUDA support" OFF)
option(PYARROW_BUILD_FLIGHT "Build the PyArrow Flight integration" OFF)
option(PYARROW_BUILD_GANDIVA "Build the PyArrow Gandiva integration" OFF)
option(PYARROW_BUILD_PARQUET "Build the PyArrow Parquet integration" OFF)
option(PYARROW_PARQUET_USE_SHARED "Rely on parquet shared libraries where relevant" ON)
option(PYARROW_BOOST_USE_SHARED
"Rely on boost shared libraries on linking static parquet" ON)
option(PYARROW_BUILD_PLASMA "Build the PyArrow Plasma integration" OFF)
option(PYARROW_USE_TENSORFLOW "Build PyArrow with TensorFlow support" OFF)
option(PYARROW_BUILD_ORC "Build the PyArrow ORC integration" OFF)
option(PYARROW_BUNDLE_ARROW_CPP "Bundle the Arrow C++ libraries" OFF)
option(PYARROW_BUNDLE_BOOST "Bundle the Boost libraries when we bundle Arrow C++" OFF)
option(PYARROW_GENERATE_COVERAGE "Build with Cython code coverage enabled" OFF)
set(PYARROW_CXXFLAGS "" CACHE STRING "Compiler flags to append when compiling Arrow")
endif()
find_program(CCACHE_FOUND ccache)
if(CCACHE_FOUND)
set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ccache)
set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK ccache)
endif(CCACHE_FOUND)
#
# Compiler flags
#
include(BuildUtils)
include(CompilerInfo)
# Cython generated code emits way to many warnings at CHECKIN and EVERYTHING
set(BUILD_WARNING_LEVEL "PRODUCTION")
include(SetupCxxFlags)
# Add common flags
set(CMAKE_CXX_FLAGS "${CXX_COMMON_FLAGS} ${CMAKE_CXX_FLAGS}")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${PYARROW_CXXFLAGS}")
if(NOT MSVC)
# Enable perf and other tools to work properly
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-omit-frame-pointer")
# Suppress Cython warnings
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-unused-variable -Wno-maybe-uninitialized")
else()
# MSVC version of -Wno-return-type-c-linkage
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4190")
# Cython generates some bitshift expressions that MSVC does not like in
# __Pyx_PyFloat_DivideObjC
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4293")
# Converting to/from C++ bool is pretty wonky in Cython. The C4800 warning
# seem harmless, and probably not worth the effort of working around it
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4800")
# See https://github.com/cython/cython/issues/2731. Change introduced in
# Cython 0.29.1 causes "unsafe use of type 'bool' in operation"
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4804")
endif()
if("${COMPILER_FAMILY}" STREQUAL "clang")
# Cython warnings in clang
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-parentheses-equality")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-constant-logical-operand")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-missing-declarations")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-sometimes-uninitialized")
# We have public Cython APIs which return C++ types, which are in an extern
# "C" blog (no symbol mangling) and clang doesn't like this
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-return-type-c-linkage")
endif()
# For any C code, use the same flags.
set(CMAKE_C_FLAGS "${CMAKE_CXX_FLAGS}")
# Add C++-only flags, like -std=c++11
set(CMAKE_CXX_FLAGS "${CXX_ONLY_FLAGS} ${CMAKE_CXX_FLAGS}")
if(MSVC)
# MSVC makes its own output directories based on the build configuration
set(BUILD_SUBDIR_NAME "")
else()
# Set compile output directory
string(TOLOWER ${CMAKE_BUILD_TYPE} BUILD_SUBDIR_NAME)
endif()
# If build in-source, create the latest symlink. If build out-of-source, which is
# preferred, simply output the binaries in the build folder
if(${CMAKE_SOURCE_DIR} STREQUAL ${CMAKE_CURRENT_BINARY_DIR})
set(BUILD_OUTPUT_ROOT_DIRECTORY
"${CMAKE_CURRENT_BINARY_DIR}/build/${BUILD_SUBDIR_NAME}")
# Link build/latest to the current build directory, to avoid developers
# accidentally running the latest debug build when in fact they're building
# release builds.
file(MAKE_DIRECTORY ${BUILD_OUTPUT_ROOT_DIRECTORY})
if(NOT APPLE)
set(MORE_ARGS "-T")
endif()
execute_process(COMMAND ln
${MORE_ARGS}
-sf
${BUILD_OUTPUT_ROOT_DIRECTORY}
${CMAKE_CURRENT_BINARY_DIR}/build/latest)
else()
set(BUILD_OUTPUT_ROOT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/${BUILD_SUBDIR_NAME}")
endif()
message(STATUS "Build output directory: ${BUILD_OUTPUT_ROOT_DIRECTORY}")
# where to put generated archives (.a files)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${BUILD_OUTPUT_ROOT_DIRECTORY}")
set(ARCHIVE_OUTPUT_DIRECTORY "${BUILD_OUTPUT_ROOT_DIRECTORY}")
# where to put generated libraries (.so files)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${BUILD_OUTPUT_ROOT_DIRECTORY}")
set(LIBRARY_OUTPUT_DIRECTORY "${BUILD_OUTPUT_ROOT_DIRECTORY}")
# where to put generated binaries
set(EXECUTABLE_OUTPUT_PATH "${BUILD_OUTPUT_ROOT_DIRECTORY}")
if(PYARROW_USE_TENSORFLOW)
# TensorFlow uses the old GLIBCXX ABI, so we have to use it too
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_GLIBCXX_USE_CXX11_ABI=0")
endif()
# Python and libraries
find_package(PythonLibsNew REQUIRED)
find_package(NumPy REQUIRED)
include(UseCython)
include_directories(SYSTEM ${NUMPY_INCLUDE_DIRS} ${PYTHON_INCLUDE_DIRS} src)
#
# Dependencies
#
if(PYARROW_BUILD_FLIGHT)
set(ARROW_FLIGHT TRUE)
endif()
# Arrow
find_package(Arrow REQUIRED)
include_directories(SYSTEM ${ARROW_INCLUDE_DIR})
function(bundle_arrow_lib library_path)
set(options)
set(one_value_args ABI_VERSION SO_VERSION)
set(multi_value_args)
cmake_parse_arguments(ARG
"${options}"
"${one_value_args}"
"${multi_value_args}"
${ARGN})
if(ARG_UNPARSED_ARGUMENTS)
message(SEND_ERROR "Error: unrecognized arguments: ${ARG_UNPARSED_ARGUMENTS}")
endif()
get_filename_component(LIBRARY_DIR ${${library_path}} DIRECTORY)
get_filename_component(LIBRARY_NAME ${${library_path}} NAME_WE)
configure_file(
${${library_path}}
${BUILD_OUTPUT_ROOT_DIRECTORY}/${LIBRARY_NAME}${CMAKE_SHARED_LIBRARY_SUFFIX} COPYONLY)
if(APPLE)
configure_file(
${LIBRARY_DIR}/${LIBRARY_NAME}.${ARG_ABI_VERSION}${CMAKE_SHARED_LIBRARY_SUFFIX}
${BUILD_OUTPUT_ROOT_DIRECTORY}/${LIBRARY_NAME}.${ARG_ABI_VERSION}${CMAKE_SHARED_LIBRARY_SUFFIX}
COPYONLY)
configure_file(
${LIBRARY_DIR}/${LIBRARY_NAME}.${ARG_SO_VERSION}${CMAKE_SHARED_LIBRARY_SUFFIX}
${BUILD_OUTPUT_ROOT_DIRECTORY}/${LIBRARY_NAME}.${ARG_SO_VERSION}${CMAKE_SHARED_LIBRARY_SUFFIX}
COPYONLY)
elseif(NOT MSVC)
configure_file(
${${library_path}}.${ARG_ABI_VERSION}
${BUILD_OUTPUT_ROOT_DIRECTORY}/${LIBRARY_NAME}${CMAKE_SHARED_LIBRARY_SUFFIX}.${ARG_ABI_VERSION}
COPYONLY)
configure_file(
${${library_path}}.${ARG_SO_VERSION}
${BUILD_OUTPUT_ROOT_DIRECTORY}/${LIBRARY_NAME}${CMAKE_SHARED_LIBRARY_SUFFIX}.${ARG_SO_VERSION}
COPYONLY)
endif()
endfunction(bundle_arrow_lib)
function(bundle_arrow_implib library_path)
get_filename_component(LIBRARY_DIR ${${library_path}} DIRECTORY)
get_filename_component(LIBRARY_NAME ${${library_path}} NAME_WE)
configure_file(${${library_path}} ${BUILD_OUTPUT_ROOT_DIRECTORY}/${LIBRARY_NAME}.lib
COPYONLY)
endfunction(bundle_arrow_implib)
function(bundle_boost_lib library_path)
get_filename_component(LIBRARY_NAME ${${library_path}} NAME)
get_filename_component(LIBRARY_NAME_WE ${${library_path}} NAME_WE)
configure_file(${${library_path}} ${BUILD_OUTPUT_ROOT_DIRECTORY}/${LIBRARY_NAME}
COPYONLY)
set(Boost_SO_VERSION
"${Boost_MAJOR_VERSION}.${Boost_MINOR_VERSION}.${Boost_SUBMINOR_VERSION}")
if(APPLE)
configure_file(
${${library_path}}
${BUILD_OUTPUT_ROOT_DIRECTORY}/${LIBRARY_NAME_WE}${CMAKE_SHARED_LIBRARY_SUFFIX}
COPYONLY)
else()
configure_file(
${${library_path}}
${BUILD_OUTPUT_ROOT_DIRECTORY}/${LIBRARY_NAME_WE}${CMAKE_SHARED_LIBRARY_SUFFIX}.${Boost_SO_VERSION}
COPYONLY)
endif()
endfunction()
function(bundle_arrow_dependency library_name shared_lib_name)
if(MSVC)
if(DEFINED ENV{CONDA_PREFIX})
set(SHARED_LIB_HOME "$ENV{CONDA_PREFIX}\\Library")
endif()
else()
if(DEFINED ENV{CONDA_PREFIX})
set(SHARED_LIB_HOME "$ENV{CONDA_PREFIX}")
endif()
endif()
if(DEFINED ENV{${library_name}_HOME})
set(SHARED_LIB_HOME "$ENV{${library_name}_HOME}")
endif()
unset(SHARED_LIB_PATH CACHE)
if("${SHARED_LIB_HOME}" STREQUAL "")
find_library(SHARED_LIB_PATH NAMES ${shared_lib_name})
else()
find_library(SHARED_LIB_PATH
NAMES ${shared_lib_name}
PATHS ${SHARED_LIB_HOME}
NO_DEFAULT_PATH
PATH_SUFFIXES "bin")
endif()
if(SHARED_LIB_PATH)
get_filename_component(SHARED_LIB_REALPATH ${SHARED_LIB_PATH} REALPATH)
get_filename_component(SHARED_LIB_NAME ${SHARED_LIB_PATH} NAME)
message(
STATUS
"Bundle dependency ${library_name}: ${SHARED_LIB_REALPATH} as ${SHARED_LIB_NAME}")
configure_file(${SHARED_LIB_REALPATH}
${BUILD_OUTPUT_ROOT_DIRECTORY}/${SHARED_LIB_NAME} COPYONLY)
else()
message(FATAL_ERROR "Unable to bundle dependency: ${library_name}")
endif()
endfunction()
# Always bundle includes
file(COPY ${ARROW_INCLUDE_DIR}/arrow DESTINATION ${BUILD_OUTPUT_ROOT_DIRECTORY}/include)
if(PYARROW_BUNDLE_ARROW_CPP)
# arrow
bundle_arrow_lib(ARROW_SHARED_LIB
ABI_VERSION
${ARROW_ABI_VERSION}
SO_VERSION
${ARROW_SO_VERSION})
bundle_arrow_lib(ARROW_PYTHON_SHARED_LIB
ABI_VERSION
${ARROW_ABI_VERSION}
SO_VERSION
${ARROW_SO_VERSION})
# boost
if(PYARROW_BOOST_USE_SHARED AND PYARROW_BUNDLE_BOOST)
set(Boost_USE_STATIC_LIBS OFF)
set(Boost_USE_MULTITHREADED ON)
if(MSVC AND ARROW_USE_STATIC_CRT)
set(Boost_USE_STATIC_RUNTIME ON)
endif()
set(Boost_ADDITIONAL_VERSIONS
"1.66.0"
"1.66"
"1.65.0"
"1.65"
"1.64.0"
"1.64"
"1.63.0"
"1.63"
"1.62.0"
"1.61"
"1.61.0"
"1.62"
"1.60.0"
"1.60")
list(GET Boost_ADDITIONAL_VERSIONS 0 BOOST_LATEST_VERSION)
string(REPLACE "." "_" BOOST_LATEST_VERSION_IN_PATH ${BOOST_LATEST_VERSION})
if(MSVC)
# disable autolinking in boost
add_definitions(-DBOOST_ALL_NO_LIB)
endif()
find_package(Boost COMPONENTS system filesystem regex REQUIRED)
bundle_boost_lib(Boost_REGEX_LIBRARY)
bundle_boost_lib(Boost_FILESYSTEM_LIBRARY)
bundle_boost_lib(Boost_SYSTEM_LIBRARY)
endif()
if(MSVC)
bundle_arrow_implib(ARROW_SHARED_IMP_LIB)
bundle_arrow_implib(ARROW_PYTHON_SHARED_IMP_LIB)
endif()
endif()
if(MSVC)
add_thirdparty_lib(arrow SHARED_LIB ${ARROW_SHARED_IMP_LIB})
add_thirdparty_lib(arrow_python SHARED_LIB ${ARROW_PYTHON_SHARED_IMP_LIB})
else()
add_thirdparty_lib(arrow SHARED_LIB ${ARROW_SHARED_LIB})
add_thirdparty_lib(arrow_python SHARED_LIB ${ARROW_PYTHON_SHARED_LIB})
endif()
#
# Subdirectories
#
if(UNIX)
set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE)
endif()
set(CYTHON_EXTENSIONS lib _csv _json)
set(LINK_LIBS arrow_shared arrow_python_shared)
if(PYARROW_BUILD_CUDA)
# Arrow CUDA
find_package(ArrowCuda)
if(NOT ARROW_CUDA_FOUND)
message(FATAL_ERROR "Unable to locate Arrow CUDA libraries")
else()
if(PYARROW_BUNDLE_ARROW_CPP)
bundle_arrow_lib(ARROW_CUDA_SHARED_LIB
ABI_VERSION
${ARROW_ABI_VERSION}
SO_VERSION
${ARROW_SO_VERSION})
if(MSVC)
bundle_arrow_implib(ARROW_CUDA_SHARED_IMP_LIB)
endif()
endif()
if(MSVC)
add_thirdparty_lib(arrow_cuda SHARED_LIB ${ARROW_CUDA_SHARED_IMP_LIB})
else()
add_thirdparty_lib(arrow_cuda SHARED_LIB ${ARROW_CUDA_SHARED_LIB})
endif()
set(LINK_LIBS ${LINK_LIBS} arrow_cuda_shared)
set(CYTHON_EXTENSIONS ${CYTHON_EXTENSIONS} _cuda)
endif()
endif()
if(PYARROW_BUILD_PARQUET)
# Parquet
find_package(Parquet)
if(NOT PARQUET_FOUND)
message(FATAL_ERROR "Unable to locate Parquet libraries")
endif()
include_directories(SYSTEM ${PARQUET_INCLUDE_DIR})
if(PYARROW_BUNDLE_ARROW_CPP)
file(COPY ${PARQUET_INCLUDE_DIR}/parquet
DESTINATION ${BUILD_OUTPUT_ROOT_DIRECTORY}/include)
endif()
if(PYARROW_PARQUET_USE_SHARED)
if(PYARROW_BUNDLE_ARROW_CPP)
bundle_arrow_lib(PARQUET_SHARED_LIB
ABI_VERSION
${PARQUET_ABI_VERSION}
SO_VERSION
${PARQUET_SO_VERSION})
if(MSVC)
bundle_arrow_implib(PARQUET_SHARED_IMP_LIB)
endif()
endif()
if(MSVC)
add_thirdparty_lib(parquet SHARED_LIB ${PARQUET_SHARED_IMP_LIB})
else()
add_thirdparty_lib(parquet SHARED_LIB ${PARQUET_SHARED_LIB})
endif()
set(LINK_LIBS ${LINK_LIBS} parquet_shared)
else()
find_package(Thrift)
if(PYARROW_BOOST_USE_SHARED)
set(Boost_USE_STATIC_LIBS OFF)
else()
set(Boost_USE_STATIC_LIBS ON)
endif()
find_package(Boost COMPONENTS regex REQUIRED)
add_thirdparty_lib(boost_regex STATIC_LIB ${Boost_REGEX_LIBRARY_RELEASE})
add_thirdparty_lib(parquet STATIC_LIB ${PARQUET_STATIC_LIB})
add_thirdparty_lib(thrift STATIC_LIB ${THRIFT_STATIC_LIB})
set(LINK_LIBS ${LINK_LIBS} parquet_static thrift_static boost_regex_static)
endif()
set(CYTHON_EXTENSIONS ${CYTHON_EXTENSIONS} _parquet)
endif()
# Plasma
if(PYARROW_BUILD_PLASMA)
find_package(Plasma)
if(NOT PLASMA_FOUND)
message(FATAL_ERROR "Unable to locate Plasma libraries")
endif()
include_directories(SYSTEM ${PLASMA_INCLUDE_DIR})
add_thirdparty_lib(libplasma SHARED_LIB ${PLASMA_SHARED_LIB})
file(COPY ${ARROW_INCLUDE_DIR}/plasma
DESTINATION ${BUILD_OUTPUT_ROOT_DIRECTORY}/include)
if(PYARROW_BUNDLE_ARROW_CPP)
bundle_arrow_lib(PLASMA_SHARED_LIB
ABI_VERSION
${ARROW_ABI_VERSION}
SO_VERSION
${ARROW_SO_VERSION})
endif()
set(LINK_LIBS ${LINK_LIBS} libplasma_shared)
set(CYTHON_EXTENSIONS ${CYTHON_EXTENSIONS} _plasma)
file(COPY ${PLASMA_EXECUTABLE} DESTINATION ${BUILD_OUTPUT_ROOT_DIRECTORY})
endif()
if(PYARROW_BUILD_ORC)
# ORC
set(CYTHON_EXTENSIONS ${CYTHON_EXTENSIONS} _orc)
endif()
# Flight
if(PYARROW_BUILD_FLIGHT)
# Arrow Flight
find_package(ArrowFlight)
if(NOT ARROW_FLIGHT_FOUND)
message(FATAL_ERROR "Unable to locate Arrow Flight libraries")
else()
if(PYARROW_BUNDLE_ARROW_CPP)
bundle_arrow_lib(ARROW_FLIGHT_SHARED_LIB
ABI_VERSION
${ARROW_ABI_VERSION}
SO_VERSION
${ARROW_SO_VERSION})
if(MSVC)
bundle_arrow_implib(ARROW_FLIGHT_SHARED_IMP_LIB)
bundle_arrow_dependency(cares cares.dll)
bundle_arrow_dependency(libprotobuf libprotobuf.dll)
# XXX Hardcoded library names because CMake is too stupid to give us
# the shared library paths.
# https://gitlab.kitware.com/cmake/cmake/issues/16210
bundle_arrow_dependency(libcrypto-1_1-x64 libcrypto-1_1-x64.dll)
bundle_arrow_dependency(libssl-1_1-x64 libssl-1_1-x64.dll)
endif()
endif()
if(MSVC)
add_thirdparty_lib(arrow_flight SHARED_LIB ${ARROW_FLIGHT_SHARED_IMP_LIB})
else()
add_thirdparty_lib(arrow_flight SHARED_LIB ${ARROW_FLIGHT_SHARED_LIB})
endif()
set(LINK_LIBS ${LINK_LIBS} arrow_flight_shared)
set(CYTHON_EXTENSIONS ${CYTHON_EXTENSIONS} _flight)
endif()
endif()
# Gandiva
if(PYARROW_BUILD_GANDIVA)
find_package(Gandiva)
if(NOT GANDIVA_FOUND)
message(FATAL_ERROR "Unable to locate Gandiva libraries")
endif()
include_directories(SYSTEM ${GANDIVA_INCLUDE_DIR})
if(PYARROW_BUNDLE_ARROW_CPP)
file(COPY ${GANDIVA_INCLUDE_DIR}/gandiva
DESTINATION ${BUILD_OUTPUT_ROOT_DIRECTORY}/include)
bundle_arrow_lib(GANDIVA_SHARED_LIB
ABI_VERSION
${ARROW_ABI_VERSION}
SO_VERSION
${ARROW_SO_VERSION})
if(MSVC)
bundle_arrow_implib(GANDIVA_SHARED_IMP_LIB)
endif()
endif()
if(MSVC)
add_thirdparty_lib(gandiva SHARED_LIB ${GANDIVA_SHARED_IMP_LIB})
else()
add_thirdparty_lib(gandiva SHARED_LIB ${GANDIVA_SHARED_LIB})
endif()
set(LINK_LIBS ${LINK_LIBS} gandiva_shared)
set(CYTHON_EXTENSIONS ${CYTHON_EXTENSIONS} gandiva)
endif()
#
# Setup and build Cython modules
#
if(PYARROW_GENERATE_COVERAGE)
set(CYTHON_FLAGS "${CYTHON_FLAGS}" "-Xlinetrace=True")
endif()
foreach(module ${CYTHON_EXTENSIONS})
string(REPLACE "." ";" directories ${module})
list(GET directories -1 module_name)
list(REMOVE_AT directories -1)
string(REPLACE "." "/" module_root "${module}")
set(module_SRC pyarrow/${module_root}.pyx)
set_source_files_properties(${module_SRC} PROPERTIES CYTHON_IS_CXX 1)
cython_add_module(${module_name} ${module_name}_pyx ${module_name}_output ${module_SRC})
if(directories)
string(REPLACE ";" "/" module_output_directory ${directories})
set_target_properties(${module_name}
PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${module_output_directory})
endif()
if(PYARROW_BUNDLE_ARROW_CPP)
# In the event that we are bundling the shared libraries (e.g. in a
# manylinux1 wheel), we need to set the RPATH of the extensions to the
# root of the pyarrow/ package so that libarrow/libarrow_python are able
# to be loaded properly
if(APPLE)
set(module_install_rpath "@loader_path/")
else()
set(module_install_rpath "\$ORIGIN")
endif()
# XXX(wesm): ARROW-2326 this logic is only needed when we have Cython
# modules in interior directories. Since all of our C extensions and
# bundled libraries are in the same place, we can skip this part
# list(LENGTH directories i)
# while(${i} GREATER 0)
# set(module_install_rpath "${module_install_rpath}/..")
# math(EXPR i "${i} - 1" )
# endwhile(${i} GREATER 0)
set_target_properties(${module_name} PROPERTIES INSTALL_RPATH ${module_install_rpath})
endif()
if(PYARROW_GENERATE_COVERAGE)
set_target_properties(${module_name}
PROPERTIES COMPILE_DEFINITIONS
"CYTHON_TRACE=1;CYTHON_TRACE_NOGIL=1")
endif()
target_link_libraries(${module_name} ${LINK_LIBS})
# Generated files will be moved to the right directory by setup.py.
endforeach(module)