summaryrefslogtreecommitdiffstats
path: root/src/arrow/cpp/cmake_modules/UseCython.cmake
diff options
context:
space:
mode:
Diffstat (limited to 'src/arrow/cpp/cmake_modules/UseCython.cmake')
-rw-r--r--src/arrow/cpp/cmake_modules/UseCython.cmake187
1 files changed, 187 insertions, 0 deletions
diff --git a/src/arrow/cpp/cmake_modules/UseCython.cmake b/src/arrow/cpp/cmake_modules/UseCython.cmake
new file mode 100644
index 000000000..f2025efb4
--- /dev/null
+++ b/src/arrow/cpp/cmake_modules/UseCython.cmake
@@ -0,0 +1,187 @@
+# Define a function to create Cython modules.
+#
+# For more information on the Cython project, see http://cython.org/.
+# "Cython is a language that makes writing C extensions for the Python language
+# as easy as Python itself."
+#
+# This file defines a CMake function to build a Cython Python module.
+# To use it, first include this file.
+#
+# include( UseCython )
+#
+# Then call cython_add_module to create a module.
+#
+# cython_add_module( <target_name> <pyx_target_name> <output_files> <src1> <src2> ... <srcN> )
+#
+# Where <module_name> is the desired name of the target for the resulting Python module,
+# <pyx_target_name> is the desired name of the target that runs the Cython compiler
+# to generate the needed C or C++ files, <output_files> is a variable to hold the
+# files generated by Cython, and <src1> <src2> ... are source files
+# to be compiled into the module, e.g. *.pyx, *.c, *.cxx, etc.
+# only one .pyx file may be present for each target
+# (this is an inherent limitation of Cython).
+#
+# The sample paths set with the CMake include_directories() command will be used
+# for include directories to search for *.pxd when running the Cython compiler.
+#
+# Cache variables that effect the behavior include:
+#
+# CYTHON_ANNOTATE
+# CYTHON_NO_DOCSTRINGS
+# CYTHON_FLAGS
+#
+# Source file properties that effect the build process are
+#
+# CYTHON_IS_CXX
+# CYTHON_IS_PUBLIC
+# CYTHON_IS_API
+#
+# If this is set of a *.pyx file with CMake set_source_files_properties()
+# command, the file will be compiled as a C++ file.
+#
+# See also FindCython.cmake
+
+#=============================================================================
+# Copyright 2011 Kitware, Inc.
+#
+# Licensed 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.
+#=============================================================================
+
+# Configuration options.
+set(CYTHON_ANNOTATE OFF CACHE BOOL "Create an annotated .html file when compiling *.pyx.")
+set(CYTHON_NO_DOCSTRINGS OFF CACHE BOOL "Strip docstrings from the compiled module.")
+set(CYTHON_FLAGS "" CACHE STRING "Extra flags to the cython compiler.")
+mark_as_advanced(CYTHON_ANNOTATE CYTHON_NO_DOCSTRINGS CYTHON_FLAGS)
+
+find_package(Python3Alt REQUIRED)
+
+# (using another C++ extension breaks coverage)
+set(CYTHON_CXX_EXTENSION "cpp")
+set(CYTHON_C_EXTENSION "c")
+
+# Create a *.c or *.cpp file from a *.pyx file.
+# Input the generated file basename. The generate files will put into the variable
+# placed in the "generated_files" argument. Finally all the *.py and *.pyx files.
+function(compile_pyx
+ _name
+ pyx_target_name
+ generated_files
+ pyx_file)
+ # Default to assuming all files are C.
+ set(cxx_arg "")
+ set(extension ${CYTHON_C_EXTENSION})
+ set(pyx_lang "C")
+ set(comment "Compiling Cython C source for ${_name}...")
+
+ get_filename_component(pyx_file_basename "${pyx_file}" NAME_WE)
+
+ # Determine if it is a C or C++ file.
+ get_source_file_property(property_is_cxx ${pyx_file} CYTHON_IS_CXX)
+ if(${property_is_cxx})
+ set(cxx_arg "--cplus")
+ set(extension ${CYTHON_CXX_EXTENSION})
+ set(pyx_lang "CXX")
+ set(comment "Compiling Cython CXX source for ${_name}...")
+ endif()
+ get_source_file_property(pyx_location ${pyx_file} LOCATION)
+
+ set(output_file "${_name}.${extension}")
+
+ # Set additional flags.
+ if(CYTHON_ANNOTATE)
+ set(annotate_arg "--annotate")
+ endif()
+
+ if(CYTHON_NO_DOCSTRINGS)
+ set(no_docstrings_arg "--no-docstrings")
+ endif()
+
+ if(NOT WIN32)
+ string( TOLOWER "${CMAKE_BUILD_TYPE}" build_type )
+ if("${build_type}" STREQUAL "debug"
+ OR "${build_type}" STREQUAL "relwithdebinfo")
+ set(cython_debug_arg "--gdb")
+ endif()
+ endif()
+
+ # Determining generated file names.
+ get_source_file_property(property_is_public ${pyx_file} CYTHON_PUBLIC)
+ get_source_file_property(property_is_api ${pyx_file} CYTHON_API)
+ if(${property_is_api})
+ set(_generated_files "${output_file}" "${_name}.h" "${name}_api.h")
+ elseif(${property_is_public})
+ set(_generated_files "${output_file}" "${_name}.h")
+ else()
+ set(_generated_files "${output_file}")
+ endif()
+ set_source_files_properties(${_generated_files} PROPERTIES GENERATED TRUE)
+
+ if(NOT WIN32)
+ # Cython creates a lot of compiler warning detritus on clang
+ set_source_files_properties(${_generated_files} PROPERTIES COMPILE_FLAGS
+ -Wno-unused-function)
+ endif()
+
+ set(${generated_files} ${_generated_files} PARENT_SCOPE)
+
+ # Add the command to run the compiler.
+ add_custom_target(
+ ${pyx_target_name}
+ COMMAND ${PYTHON_EXECUTABLE}
+ -m
+ cython
+ ${cxx_arg}
+ ${annotate_arg}
+ ${no_docstrings_arg}
+ ${cython_debug_arg}
+ ${CYTHON_FLAGS}
+ # Necessary for autodoc of function arguments
+ --directive embedsignature=True
+ # Necessary for Cython code coverage
+ --working
+ ${CMAKE_CURRENT_SOURCE_DIR}
+ --output-file
+ "${CMAKE_CURRENT_BINARY_DIR}/${output_file}"
+ "${CMAKE_CURRENT_SOURCE_DIR}/${pyx_file}"
+ DEPENDS ${pyx_location}
+ # Do not specify byproducts for now since they don't work with the older
+ # version of cmake available in the apt repositories.
+ #BYPRODUCTS ${_generated_files}
+ COMMENT ${comment})
+
+ # Remove their visibility to the user.
+ set(corresponding_pxd_file "" CACHE INTERNAL "")
+ set(header_location "" CACHE INTERNAL "")
+ set(pxd_location "" CACHE INTERNAL "")
+endfunction()
+
+# cython_add_module( <name> src1 src2 ... srcN )
+# Build the Cython Python module.
+function(cython_add_module _name pyx_target_name generated_files)
+ set(pyx_module_source "")
+ set(other_module_sources "")
+ foreach(_file ${ARGN})
+ if(${_file} MATCHES ".*\\.py[x]?$")
+ list(APPEND pyx_module_source ${_file})
+ else()
+ list(APPEND other_module_sources ${_file})
+ endif()
+ endforeach()
+ compile_pyx(${_name} ${pyx_target_name} _generated_files ${pyx_module_source})
+ set(${generated_files} ${_generated_files} PARENT_SCOPE)
+ include_directories(${PYTHON_INCLUDE_DIRS})
+ python_add_module(${_name} ${_generated_files} ${other_module_sources})
+ add_dependencies(${_name} ${pyx_target_name})
+endfunction()
+
+include(CMakeParseArguments)