summaryrefslogtreecommitdiffstats
path: root/src/arrow/python/CMakeLists.txt
diff options
context:
space:
mode:
Diffstat (limited to 'src/arrow/python/CMakeLists.txt')
-rw-r--r--src/arrow/python/CMakeLists.txt636
1 files changed, 636 insertions, 0 deletions
diff --git a/src/arrow/python/CMakeLists.txt b/src/arrow/python/CMakeLists.txt
new file mode 100644
index 000000000..5996589eb
--- /dev/null
+++ b/src/arrow/python/CMakeLists.txt
@@ -0,0 +1,636 @@
+# 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 3.2)
+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)
+
+# Only interpret if() arguments as variables or keywords when unquoted.
+# https://www.cmake.org/cmake/help/latest/policy/CMP0054.html
+cmake_policy(SET CMP0054 NEW)
+
+# Use the first Python installation on PATH, not the newest one
+set(Python3_FIND_STRATEGY "LOCATION")
+# On Windows, use registry last, not first
+set(Python3_FIND_REGISTRY "LAST")
+# On macOS, use framework last, not first
+set(Python3_FIND_FRAMEWORK "LAST")
+
+# 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)
+if(DEFINED ENV{MACOSX_DEPLOYMENT_TARGET})
+ set(CMAKE_OSX_DEPLOYMENT_TARGET $ENV{MACOSX_DEPLOYMENT_TARGET})
+else()
+ set(CMAKE_OSX_DEPLOYMENT_TARGET 10.9)
+endif()
+
+# 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_DATASET "Build the PyArrow Dataset 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)
+
+# Cython generated code emits way to many warnings at CHECKIN and EVERYTHING
+set(BUILD_WARNING_LEVEL "PRODUCTION")
+
+# This must be synchronized with the definition in
+# cpp/cmake_modules/DefineOptions.cmake.
+if(NOT DEFINED ARROW_SIMD_LEVEL)
+ set(ARROW_SIMD_LEVEL
+ "DEFAULT"
+ CACHE STRING "Compile time SIMD optimization level")
+endif()
+if(NOT DEFINED ARROW_RUNTIME_SIMD_LEVEL)
+ set(ARROW_RUNTIME_SIMD_LEVEL
+ "MAX"
+ CACHE STRING "Max runtime SIMD optimization level")
+endif()
+if(NOT DEFINED ARROW_ARMV8_ARCH)
+ set(ARROW_ARMV8_ARCH
+ "armv8-a"
+ CACHE STRING "Arm64 arch and extensions: armv8-a, armv8-a or armv8-a+crc+crypto")
+endif()
+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(MSVC)
+ # 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")
+else()
+ # 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")
+
+ if(CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang" OR CMAKE_CXX_COMPILER_ID 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()
+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 "Generator: ${CMAKE_GENERATOR}")
+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 Numpy libraries
+find_package(Python3Alt 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(ArrowPython REQUIRED)
+include_directories(SYSTEM ${ARROW_INCLUDE_DIR})
+
+function(bundle_arrow_lib library_path)
+ set(options)
+ set(one_value_args 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)
+
+ # Only copy the shared library with ABI version on Linux and macOS
+
+ if(MSVC)
+ configure_file(${${library_path}}
+ ${BUILD_OUTPUT_ROOT_DIRECTORY}/${LIBRARY_NAME}${CMAKE_SHARED_LIBRARY_SUFFIX}
+ COPYONLY)
+ elseif(APPLE)
+ 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)
+ else()
+ 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_import_lib 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_import_lib)
+
+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)
+ if(MSVC)
+ if(DEFINED ENV{CONDA_PREFIX})
+ file(TO_CMAKE_PATH "$ENV{CONDA_PREFIX}\\Library" SHARED_LIB_HOME)
+ endif()
+ else()
+ if(DEFINED ENV{CONDA_PREFIX})
+ file(TO_CMAKE_PATH "$ENV{CONDA_PREFIX}" SHARED_LIB_HOME)
+ endif()
+ endif()
+ if(DEFINED ENV{${library_name}_HOME})
+ file(TO_CMAKE_PATH "$ENV{${library_name}_HOME}" SHARED_LIB_HOME)
+ endif()
+ arrow_build_shared_library_name(shared_lib_name "${library_name}")
+ unset(SHARED_LIB_PATH CACHE)
+ if(MSVC)
+ set(CMAKE_SHARED_LIBRARY_SUFFIXES_ORIGINAL ${CMAKE_FIND_LIBRARY_SUFFIXES})
+ # .dll isn't found by find_library with MSVC because .dll isn't included in
+ # CMAKE_FIND_LIBRARY_SUFFIXES.
+ list(APPEND CMAKE_FIND_LIBRARY_SUFFIXES "${CMAKE_SHARED_LIBRARY_SUFFIX}")
+ endif()
+ if(SHARED_LIB_HOME)
+ find_library(SHARED_LIB_PATH
+ NAMES "${shared_lib_name}"
+ PATHS "${SHARED_LIB_HOME}"
+ PATH_SUFFIXES ${ARROW_SEARCH_LIB_PATH_SUFFIXES}
+ NO_DEFAULT_PATH)
+ else()
+ find_library(SHARED_LIB_PATH
+ NAMES "${shared_lib_name}"
+ PATH_SUFFIXES ${ARROW_SEARCH_LIB_PATH_SUFFIXES})
+ endif()
+ if(MSVC)
+ set(CMAKE_SHARED_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES_ORIGINAL})
+ 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
+get_filename_component(ARROW_INCLUDE_REALPATH "${ARROW_INCLUDE_DIR}/arrow" REALPATH)
+file(COPY ${ARROW_INCLUDE_REALPATH} DESTINATION ${BUILD_OUTPUT_ROOT_DIRECTORY}/include)
+
+if(PYARROW_BUNDLE_ARROW_CPP)
+ # arrow
+ bundle_arrow_lib(ARROW_SHARED_LIB SO_VERSION ${ARROW_SO_VERSION})
+ bundle_arrow_lib(ARROW_PYTHON_SHARED_LIB 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 regex
+ REQUIRED)
+ bundle_boost_lib(Boost_REGEX_LIBRARY)
+ endif()
+
+ if(MSVC)
+ # TODO(kszucs): locate msvcp140.dll in a portable fashion and bundle it
+ bundle_arrow_import_lib(ARROW_IMPORT_LIB)
+ bundle_arrow_import_lib(ARROW_PYTHON_IMPORT_LIB)
+ endif()
+endif()
+
+#
+# Subdirectories
+#
+
+if(UNIX)
+ set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE)
+endif()
+
+set(CYTHON_EXTENSIONS
+ lib
+ _compute
+ _csv
+ _feather
+ _fs
+ _hdfsio
+ _json)
+
+set(LINK_LIBS arrow_shared arrow_python_shared)
+
+if(PYARROW_BUILD_S3)
+ set(CYTHON_EXTENSIONS ${CYTHON_EXTENSIONS} _s3fs)
+endif()
+
+if(PYARROW_BUILD_HDFS)
+ set(CYTHON_EXTENSIONS ${CYTHON_EXTENSIONS} _hdfs)
+endif()
+
+if(PYARROW_BUILD_CUDA)
+ # Arrow CUDA
+ find_package(ArrowCUDA REQUIRED)
+
+ if(PYARROW_BUNDLE_ARROW_CPP)
+ bundle_arrow_lib(ARROW_CUDA_SHARED_LIB SO_VERSION ${ARROW_SO_VERSION})
+ if(MSVC)
+ bundle_arrow_import_lib(ARROW_CUDA_IMPORT_LIB)
+ endif()
+ endif()
+ set(CUDA_LINK_LIBS arrow_cuda_shared)
+ set(CYTHON_EXTENSIONS ${CYTHON_EXTENSIONS} _cuda)
+endif()
+
+# Dataset
+if(PYARROW_BUILD_DATASET)
+ # Arrow Dataset
+ find_package(ArrowDataset REQUIRED)
+
+ if(PYARROW_BUNDLE_ARROW_CPP)
+ bundle_arrow_lib(ARROW_DATASET_SHARED_LIB SO_VERSION ${ARROW_SO_VERSION})
+ if(MSVC)
+ bundle_arrow_import_lib(ARROW_DATASET_IMPORT_LIB)
+ endif()
+ endif()
+
+ set(DATASET_LINK_LIBS arrow_dataset_shared)
+ set(CYTHON_EXTENSIONS ${CYTHON_EXTENSIONS} _dataset)
+endif()
+
+if(PYARROW_BUILD_PARQUET)
+ # Parquet
+ find_package(Parquet REQUIRED)
+
+ 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 SO_VERSION ${PARQUET_SO_VERSION})
+ if(MSVC)
+ bundle_arrow_import_lib(PARQUET_IMPORT_LIB)
+ endif()
+ endif()
+ set(PARQUET_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(thrift STATIC_LIB ${THRIFT_STATIC_LIB})
+ set(PARQUET_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 REQUIRED)
+
+ include_directories(SYSTEM ${PLASMA_INCLUDE_DIR})
+
+ file(COPY ${ARROW_INCLUDE_DIR}/plasma
+ DESTINATION ${BUILD_OUTPUT_ROOT_DIRECTORY}/include)
+
+ if(PYARROW_BUNDLE_ARROW_CPP)
+ bundle_arrow_lib(PLASMA_SHARED_LIB SO_VERSION ${PLASMA_SO_VERSION})
+ endif()
+ set(PLASMA_LINK_LIBS plasma_shared)
+ set(CYTHON_EXTENSIONS ${CYTHON_EXTENSIONS} _plasma)
+ file(COPY ${PLASMA_STORE_SERVER} DESTINATION ${BUILD_OUTPUT_ROOT_DIRECTORY})
+endif()
+
+if(PYARROW_BUILD_ORC)
+ # ORC
+ set(CYTHON_EXTENSIONS ${CYTHON_EXTENSIONS} _orc)
+ if(PYARROW_BUILD_DATASET)
+ set(CYTHON_EXTENSIONS ${CYTHON_EXTENSIONS} _dataset_orc)
+ endif()
+endif()
+
+# Flight
+if(PYARROW_BUILD_FLIGHT)
+ # Arrow Flight
+ find_package(ArrowPythonFlight REQUIRED)
+
+ if(PYARROW_BUNDLE_ARROW_CPP)
+ bundle_arrow_lib(ARROW_FLIGHT_SHARED_LIB SO_VERSION ${ARROW_SO_VERSION})
+ bundle_arrow_lib(ARROW_PYTHON_FLIGHT_SHARED_LIB SO_VERSION ${ARROW_SO_VERSION})
+ if(MSVC)
+ bundle_arrow_import_lib(ARROW_FLIGHT_IMPORT_LIB)
+ bundle_arrow_import_lib(ARROW_PYTHON_FLIGHT_IMPORT_LIB)
+ # 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)
+ # bundle_arrow_dependency(libssl-1_1-x64)
+ endif()
+ endif()
+
+ set(FLIGHT_LINK_LIBS arrow_flight_shared arrow_python_flight_shared)
+ set(CYTHON_EXTENSIONS ${CYTHON_EXTENSIONS} _flight)
+endif()
+
+# Gandiva
+if(PYARROW_BUILD_GANDIVA)
+ find_package(Gandiva REQUIRED)
+
+ 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 SO_VERSION ${ARROW_SO_VERSION})
+
+ if(MSVC)
+ bundle_arrow_import_lib(GANDIVA_IMPORT_LIB)
+ endif()
+ endif()
+
+ set(GANDIVA_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} PRIVATE ${LINK_LIBS})
+
+ # Generated files will be moved to the right directory by setup.py.
+endforeach(module)
+
+# Additional link libraries
+
+if(PYARROW_BUILD_CUDA)
+ target_link_libraries(_cuda PRIVATE ${CUDA_LINK_LIBS})
+endif()
+
+if(PYARROW_BUILD_FLIGHT)
+ target_link_libraries(_flight PRIVATE ${FLIGHT_LINK_LIBS})
+endif()
+
+if(PYARROW_BUILD_DATASET)
+ target_link_libraries(_dataset PRIVATE ${DATASET_LINK_LIBS})
+ if(PYARROW_BUILD_ORC)
+ target_link_libraries(_dataset_orc PRIVATE ${DATASET_LINK_LIBS})
+ endif()
+endif()
+
+if(PYARROW_BUILD_GANDIVA)
+ target_link_libraries(gandiva PRIVATE ${GANDIVA_LINK_LIBS})
+endif()
+
+if(PYARROW_BUILD_PARQUET)
+ target_link_libraries(_parquet PRIVATE ${PARQUET_LINK_LIBS})
+endif()
+
+if(PYARROW_BUILD_PLASMA)
+ target_link_libraries(_plasma PRIVATE ${PLASMA_LINK_LIBS})
+endif()