# Licensed to the Apache Software Foundation (ASF) under one # or more contributor 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. # # arrow_python # cmake_minimum_required(VERSION 3.5) # RPATH settings on macOS do not affect install_name. # https://cmake.org/cmake/help/latest/policy/CMP0068.html if(POLICY CMP0068) cmake_policy(SET CMP0068 NEW) endif() # # Define # CMAKE_MODULE_PATH: location of cmake_modules in python # get_filename_component(PYARROW_SOURCE_DIR ${CMAKE_SOURCE_DIR} DIRECTORY) get_filename_component(PYTHON_SOURCE_DIR ${PYARROW_SOURCE_DIR} DIRECTORY) get_filename_component(ARROW_SOURCE_DIR ${PYTHON_SOURCE_DIR} DIRECTORY) set(ARROW_CPP_SOURCE_DIR "${ARROW_SOURCE_DIR}/cpp") set(CMAKE_MODULE_PATH "${PYTHON_SOURCE_DIR}/cmake_modules") # normalize ARROW_HOME path file(TO_CMAKE_PATH "$ENV{ARROW_HOME}" ARROW_HOME) list(INSERT CMAKE_PREFIX_PATH 0 "${ARROW_HOME}") # # Arrow version # set(ARROW_PYTHON_VERSION "10.0.1") string(REGEX MATCH "^[0-9]+\\.[0-9]+\\.[0-9]+" ARROW_PYTHON_BASE_VERSION "${ARROW_PYTHON_VERSION}") # Need to set to ARRROW_VERSION before finding Arrow package! project(arrow_python VERSION "${ARROW_PYTHON_BASE_VERSION}") if(NOT DEFINED CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE Release) endif() # # Arrow # find_package(Arrow REQUIRED) # # Python # # 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") find_package(Python3Alt 3.7 REQUIRED) include_directories(SYSTEM ${NUMPY_INCLUDE_DIRS} ${PYTHON_INCLUDE_DIRS} ${ARROW_INCLUDE_DIR} ${CMAKE_SOURCE_DIR} src) add_custom_target(arrow_python) set(ARROW_PYTHON_SRCS arrow/python/arrow_to_pandas.cc arrow/python/benchmark.cc arrow/python/common.cc arrow/python/datetime.cc arrow/python/decimal.cc arrow/python/deserialize.cc arrow/python/extension_type.cc arrow/python/gdb.cc arrow/python/helpers.cc arrow/python/inference.cc arrow/python/init.cc arrow/python/io.cc arrow/python/ipc.cc arrow/python/numpy_convert.cc arrow/python/numpy_to_arrow.cc arrow/python/python_test.cc arrow/python/python_to_arrow.cc arrow/python/pyarrow.cc arrow/python/serialize.cc arrow/python/udf.cc) set_source_files_properties(init.cc PROPERTIES SKIP_PRECOMPILE_HEADERS ON SKIP_UNITY_BUILD_INCLUSION ON) # # Shared/static link libs # set(ARROW_PYTHON_SHARED_LINK_LIBS) set(ARROW_PYTHON_SHARED_PRIVATE_LINK_LIBS) set(ARROW_PYTHON_SHARED_INSTALL_INTERFACE_LIBS) set(ARROW_PYTHON_STATIC_LINK_LIBS) set(ARROW_PYTHON_STATIC_INSTALL_INTERFACE_LIBS) # # Arrow vs PyArrow C++ options # # Check all the options from Arrow and PyArrow C++ to be in line if(PYARROW_WITH_DATASET) find_package(ArrowDataset REQUIRED) list(APPEND ARROW_PYTHON_SHARED_LINK_LIBS ArrowDataset::arrow_dataset_shared) list(APPEND ARROW_PYTHON_SHARED_INSTALL_INTERFACE_LIBS ArrowDataset::arrow_dataset_shared) list(APPEND ARROW_PYTHON_STATIC_LINK_LIBS ArrowDataset::arrow_dataset_static) list(APPEND ARROW_PYTHON_STATIC_INSTALL_INTERFACE_LIBS ArrowDataset::arrow_dataset_static) endif() if(PYARROW_WITH_PARQUET_ENCRYPTION) if(PARQUET_REQUIRE_ENCRYPTION) list(APPEND ARROW_PYTHON_SRCS arrow/python/parquet_encryption.cc) find_package(Parquet REQUIRED) list(APPEND ARROW_PYTHON_SHARED_LINK_LIBS Parquet::parquet_shared) list(APPEND ARROW_PYTHON_SHARED_INSTALL_INTERFACE_LIBS Parquet::parquet_shared) list(APPEND ARROW_PYTHON_STATIC_LINK_LIBS Parquet::parquet_static) list(APPEND ARROW_PYTHON_STATIC_INSTALL_INTERFACE_LIBS Parquet::parquet_static) else() message(FATAL_ERROR "You must build Arrow C++ with PARQUET_REQUIRE_ENCRYPTION=ON") endif() endif() if(PYARROW_WITH_HDFS) if(NOT ARROW_HDFS) message(FATAL_ERROR "You must build Arrow C++ with ARROW_HDFS=ON") endif() endif() # Check for only Arrow C++ options if(ARROW_CSV) list(APPEND ARROW_PYTHON_SRCS arrow/python/csv.cc) endif() if(ARROW_FILESYSTEM) list(APPEND ARROW_PYTHON_SRCS arrow/python/filesystem.cc) endif() if(CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang" OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang") set_property(SOURCE pyarrow.cc APPEND_STRING PROPERTY COMPILE_FLAGS " -Wno-cast-qual ") endif() if(NOT ARROW_PYTHON_SHARED_LINK_LIBS) list(APPEND ARROW_PYTHON_SHARED_LINK_LIBS Arrow::arrow_shared) endif() if(NOT ARROW_PYTHON_SHARED_INSTALL_INTERFACE_LIBS) list(APPEND ARROW_PYTHON_SHARED_INSTALL_INTERFACE_LIBS Arrow::arrow_shared) endif() if(NOT ARROW_PYTHON_STATIC_LINK_LIBS) list(APPEND ARROW_PYTHON_STATIC_LINK_LIBS Arrow::arrow_static) endif() list(APPEND ARROW_PYTHON_STATIC_LINK_LIBS ${PYTHON_OTHER_LIBS}) if(NOT ARROW_PYTHON_STATIC_INSTALL_INTERFACE_LIBS) list(APPEND ARROW_PYTHON_STATIC_INSTALL_INTERFACE_LIBS Arrow::arrow_static) endif() if(WIN32) list(APPEND ARROW_PYTHON_SHARED_LINK_LIBS ${PYTHON_LIBRARIES} ${PYTHON_OTHER_LIBS}) endif() # # Compiler stuff # include(GNUInstallDirs) # This ensures that things like -std=gnu++... get passed correctly if(NOT DEFINED CMAKE_CXX_STANDARD) set(CMAKE_CXX_STANDARD 17) endif() # We require a C++17 compliant compiler set(CMAKE_CXX_STANDARD_REQUIRED ON) # Needed compiler flags include(SetupCxxFlags) # Add common flags set(CMAKE_CXX_FLAGS "${CXX_COMMON_FLAGS} ${CMAKE_CXX_FLAGS}") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${PYARROW_CXXFLAGS}") message(STATUS "CMAKE_C_FLAGS: ${CMAKE_C_FLAGS}") message(STATUS "CMAKE_CXX_FLAGS: ${CMAKE_CXX_FLAGS}") set(ARROW_PYTHON_INCLUDES ${NUMPY_INCLUDE_DIRS} ${PYTHON_INCLUDE_DIRS}) # Inlude macros needed to find and use add_arrow_lib function include(BuildUtils) include(CMakePackageConfigHelpers) # Set the output directory for CMake files # (CMAKE_INSTALL_PREFIX = python/build/dist! should be set in setup.py!) set(ARROW_CMAKE_DIR "${CMAKE_INSTALL_LIBDIR}/cmake") # Changing ARROW_SOURCE_DIR for sdist build # In this case cpp/cmake_modules doesn't exist if(NOT EXISTS "${ARROW_SOURCE_DIR}/cpp/cmake_modules") set(ARROW_SOURCE_DIR ${PYTHON_SOURCE_DIR}) endif() add_arrow_lib(arrow_python CMAKE_PACKAGE_NAME ArrowPython PKG_CONFIG_NAME arrow-python SOURCES ${ARROW_PYTHON_SRCS} PRECOMPILED_HEADERS "$<$:arrow/python/pch.h>" OUTPUTS ARROW_PYTHON_LIBRARIES SHARED_LINK_FLAGS ${ARROW_VERSION_SCRIPT_FLAGS} SHARED_LINK_LIBS ${ARROW_PYTHON_SHARED_LINK_LIBS} SHARED_PRIVATE_LINK_LIBS ${ARROW_PYTHON_SHARED_PRIVATE_LINK_LIBS} SHARED_INSTALL_INTERFACE_LIBS ${ARROW_PYTHON_SHARED_INSTALL_INTERFACE_LIBS} STATIC_LINK_LIBS ${ARROW_PYTHON_STATIC_LINK_LIBS} STATIC_INSTALL_INTERFACE_LIBS ${ARROW_PYTHON_STATIC_INSTALL_INTERFACE_LIBS} EXTRA_INCLUDES "${ARROW_PYTHON_INCLUDES}") add_dependencies(arrow_python ${ARROW_PYTHON_LIBRARIES}) foreach(LIB_TARGET ${ARROW_PYTHON_LIBRARIES}) target_compile_definitions(${LIB_TARGET} PRIVATE ARROW_PYTHON_EXPORTING) endforeach() if(ARROW_BUILD_STATIC AND MSVC) target_compile_definitions(arrow_python_static PUBLIC ARROW_STATIC) endif() if(PYARROW_WITH_FLIGHT AND ARROW_FLIGHT AND ARROW_BUILD_SHARED) # Must link to shared libarrow_flight: we don't want to link more than one # copy of gRPC into the eventual Cython shared object, otherwise gRPC calls # fail with weird errors due to multiple copies of global static state (The # other solution is to link gRPC shared everywhere instead of statically only # in Flight) find_package(ArrowFlight REQUIRED) set(FLIGHT_LINK_LIBS ArrowFlight::arrow_flight_shared) add_arrow_lib(arrow_python_flight CMAKE_PACKAGE_NAME ArrowPythonFlight PKG_CONFIG_NAME arrow-python-flight SOURCES arrow/python/flight.cc OUTPUTS ARROW_PYFLIGHT_LIBRARIES SHARED_LINK_FLAGS ${ARROW_VERSION_SCRIPT_FLAGS} SHARED_LINK_LIBS arrow_python_shared ArrowFlight::arrow_flight_shared SHARED_INSTALL_INTERFACE_LIBS ArrowPython::arrow_python_shared ArrowFlight::arrow_flight_shared STATIC_LINK_LIBS arrow_python_static ArrowFlight::arrow_flight_static STATIC_INSTALL_INTERFACE_LIBS ArrowPython::arrow_python_static ArrowFlight::arrow_flight_static EXTRA_INCLUDES "${ARROW_PYTHON_INCLUDES}" PRIVATE_INCLUDES "${Protobuf_INCLUDE_DIRS}") add_dependencies(arrow_python ${ARROW_PYFLIGHT_LIBRARIES}) foreach(LIB_TARGET ${ARROW_PYFLIGHT_LIBRARIES}) target_compile_definitions(${LIB_TARGET} PRIVATE ARROW_PYFLIGHT_EXPORTING) endforeach() if(ARROW_BUILD_STATIC AND MSVC) target_compile_definitions(arrow_python_flight_static PUBLIC ARROW_PYTHON_STATIC) endif() endif() if(CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang" OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang") # Clang, be quiet. Python C API has lots of macros set_property(SOURCE ${ARROW_PYTHON_SRCS} APPEND_STRING PROPERTY COMPILE_FLAGS -Wno-parentheses-equality) endif() add_subdirectory(arrow/python)