From 98cb8bd7cd879589540398612e95080e997ce438 Mon Sep 17 00:00:00 2001 From: Lysandros Nikolaou Date: Wed, 7 Aug 2024 14:07:15 +0000 Subject: [PATCH 1/3] GH-43536: [Python] Declare support for free-threading in Cython This is done by passing an extra flag when building the Cython extension modules. It is needed so that the GIL is not dynamically reenabled when importing `pyarrow.lib`. --- cpp/cmake_modules/UseCython.cmake | 20 ++++++++++++++++++++ python/CMakeLists.txt | 5 +++++ 2 files changed, 25 insertions(+) diff --git a/cpp/cmake_modules/UseCython.cmake b/cpp/cmake_modules/UseCython.cmake index e15ac59490c..18594853d6d 100644 --- a/cpp/cmake_modules/UseCython.cmake +++ b/cpp/cmake_modules/UseCython.cmake @@ -184,4 +184,24 @@ function(cython_add_module _name pyx_target_name generated_files) add_dependencies(${_name} ${pyx_target_name}) endfunction() +execute_process(COMMAND ${PYTHON_EXECUTABLE} -m cython --version + OUTPUT_VARIABLE CYTHON_version_output + ERROR_VARIABLE CYTHON_version_error + RESULT_VARIABLE CYTHON_version_result + OUTPUT_STRIP_TRAILING_WHITESPACE + ERROR_STRIP_TRAILING_WHITESPACE) +if(NOT ${CYTHON_version_result} EQUAL 0) + set(_error_msg "Command \"${PYTHON_EXECUTABLE} -m cython --version\" failed with") + set(_error_msg "${_error_msg} output:\n${CYTHON_version_error}") + message(SEND_ERROR "${_error_msg}") +else() + if("${CYTHON_version_output}" MATCHES "^[Cc]ython version ([^,]+)") + set(CYTHON_VERSION "${CMAKE_MATCH_1}") + else() + if("${CYTHON_version_error}" MATCHES "^[Cc]ython version ([^,]+)") + set(CYTHON_VERSION "${CMAKE_MATCH_1}") + endif() + endif() +endif() + include(CMakeParseArguments) diff --git a/python/CMakeLists.txt b/python/CMakeLists.txt index a90dee70584..ab4b5a06413 100644 --- a/python/CMakeLists.txt +++ b/python/CMakeLists.txt @@ -260,6 +260,7 @@ message(STATUS "Found NumPy version: ${Python3_NumPy_VERSION}") message(STATUS "NumPy include dir: ${NUMPY_INCLUDE_DIRS}") include(UseCython) +message(STATUS "Found Cython version: ${CYTHON_VERSION}") # Arrow C++ and set default PyArrow build options include(GNUInstallDirs) @@ -855,6 +856,10 @@ set(CYTHON_FLAGS "${CYTHON_FLAGS}" "--warning-errors") # undocumented Cython feature. set(CYTHON_FLAGS "${CYTHON_FLAGS}" "--no-c-in-traceback") +if(CYTHON_VERSION VERSION_GREATER_EQUAL "3.1.0a0") + set(CYTHON_FLAGS "${CYTHON_FLAGS}" "-Xfreethreading_compatible=True") +endif() + foreach(module ${CYTHON_EXTENSIONS}) string(REPLACE "." ";" directories ${module}) list(GET directories -1 module_name) From cd9d2c1af652a82b8fc0274ddf7c7f3670ed0e08 Mon Sep 17 00:00:00 2001 From: Lysandros Nikolaou Date: Thu, 8 Aug 2024 13:16:10 +0200 Subject: [PATCH 2/3] Apply suggestions from code review Co-authored-by: Sutou Kouhei --- cpp/cmake_modules/UseCython.cmake | 21 +++++---------------- python/CMakeLists.txt | 2 +- 2 files changed, 6 insertions(+), 17 deletions(-) diff --git a/cpp/cmake_modules/UseCython.cmake b/cpp/cmake_modules/UseCython.cmake index 18594853d6d..9bdafb5cfe4 100644 --- a/cpp/cmake_modules/UseCython.cmake +++ b/cpp/cmake_modules/UseCython.cmake @@ -185,23 +185,12 @@ function(cython_add_module _name pyx_target_name generated_files) endfunction() execute_process(COMMAND ${PYTHON_EXECUTABLE} -m cython --version - OUTPUT_VARIABLE CYTHON_version_output - ERROR_VARIABLE CYTHON_version_error - RESULT_VARIABLE CYTHON_version_result - OUTPUT_STRIP_TRAILING_WHITESPACE - ERROR_STRIP_TRAILING_WHITESPACE) -if(NOT ${CYTHON_version_result} EQUAL 0) - set(_error_msg "Command \"${PYTHON_EXECUTABLE} -m cython --version\" failed with") - set(_error_msg "${_error_msg} output:\n${CYTHON_version_error}") - message(SEND_ERROR "${_error_msg}") + OUTPUT_VARIABLE CYTHON_VERSION_OUTPUT + OUTPUT_STRIP_TRAILING_WHITESPACE) +if(CYTHON_VERSION_OUTPUT MATCHES "^Cython version (.+)") + set(CYTHON_VERSION "${CMAKE_MATCH_1}") else() - if("${CYTHON_version_output}" MATCHES "^[Cc]ython version ([^,]+)") - set(CYTHON_VERSION "${CMAKE_MATCH_1}") - else() - if("${CYTHON_version_error}" MATCHES "^[Cc]ython version ([^,]+)") - set(CYTHON_VERSION "${CMAKE_MATCH_1}") - endif() - endif() + set(CYTHON_VERSION "") endif() include(CMakeParseArguments) diff --git a/python/CMakeLists.txt b/python/CMakeLists.txt index ab4b5a06413..5d5eeaf8157 100644 --- a/python/CMakeLists.txt +++ b/python/CMakeLists.txt @@ -857,7 +857,7 @@ set(CYTHON_FLAGS "${CYTHON_FLAGS}" "--warning-errors") set(CYTHON_FLAGS "${CYTHON_FLAGS}" "--no-c-in-traceback") if(CYTHON_VERSION VERSION_GREATER_EQUAL "3.1.0a0") - set(CYTHON_FLAGS "${CYTHON_FLAGS}" "-Xfreethreading_compatible=True") + list(APPEND CYTHON_FLAGS "-Xfreethreading_compatible=True") endif() foreach(module ${CYTHON_EXTENSIONS}) From 1da4fb971647137fa7b5f76e917cf30d8c5fe359 Mon Sep 17 00:00:00 2001 From: Lysandros Nikolaou Date: Tue, 13 Aug 2024 08:44:03 +0000 Subject: [PATCH 3/3] Use Cython.Compiler.Version.version to avoid regex --- cpp/cmake_modules/UseCython.cmake | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/cpp/cmake_modules/UseCython.cmake b/cpp/cmake_modules/UseCython.cmake index 9bdafb5cfe4..7d88daa4fad 100644 --- a/cpp/cmake_modules/UseCython.cmake +++ b/cpp/cmake_modules/UseCython.cmake @@ -184,13 +184,9 @@ function(cython_add_module _name pyx_target_name generated_files) add_dependencies(${_name} ${pyx_target_name}) endfunction() -execute_process(COMMAND ${PYTHON_EXECUTABLE} -m cython --version +execute_process(COMMAND ${PYTHON_EXECUTABLE} -c "from Cython.Compiler.Version import version; print(version)" OUTPUT_VARIABLE CYTHON_VERSION_OUTPUT OUTPUT_STRIP_TRAILING_WHITESPACE) -if(CYTHON_VERSION_OUTPUT MATCHES "^Cython version (.+)") - set(CYTHON_VERSION "${CMAKE_MATCH_1}") -else() - set(CYTHON_VERSION "") -endif() +set(CYTHON_VERSION "${CYTHON_VERSION_OUTPUT}") include(CMakeParseArguments)