Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
63 changes: 33 additions & 30 deletions src/cython_cmake/cmake/UseCython.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,13 @@
# using cython.
#
# Cython_compile_pyx(<pyx_file1> [<pyx_file2> ...]
# [TARGET_LANGUAGE C | CXX]
# [LANGUAGE C | CXX]
# [LANGUAGE_LEVEL 2 | 3 | 3str]
# [OUTPUT_VAR <OutputVar>])
# [OUTPUT_VARIABLE <OutputVariable>])
#
# Options:
#
# ``TARGET_LANGUAGE [C | CXX]``
# ``LANGUAGE [C | CXX]``
# Force the generation of either a C or C++ file. By default, a C file is
# generated, unless the C language is not enabled for the project; in this
# case, a C++ file is generated by default.
Expand All @@ -28,14 +28,17 @@
# Using the Python-3str syntax and semantics means there cython does not assume
# unicode is used by by default for string literals under Python 2
#
# ``OUTPUT_VAR <OutputVar>``
# Set the variable ``<OutputVar>`` in the parent scope to the path to the
# ``CYTHON_ARGS <args>``
# Specify additional arguments for the cythonization process.
#
# ``OUTPUT_VARIABLE <OutputVariable>``
# Set the variable ``<OutputVariable>`` in the parent scope to the path to the
# generated source file. By default, ``<Name>`` is used as the output
# variable name.
#
# Defined variables:
#
# ``<OutputVar>``
# ``<OutputVariable>``
# The path of the generated source file.
#
# Usage example:
Expand All @@ -45,7 +48,7 @@
# find_package(Cython)
#
# Cython_compile_pyx(_hello.pyx
# OUTPUT_VAR _hello_source_files
# OUTPUT_VARIABLE _hello_source_files
# )
#
# Python_add_library(_hello
Expand Down Expand Up @@ -162,10 +165,10 @@ function(add_cython_target _name)
mark_as_advanced(CYTHON_ANNOTATE CYTHON_FLAGS)

if(_args_C)
set(_target_language "C")
set(_language "C")
endif()
if(_args_CXX)
set(_target_language "CXX")
set(_language "CXX")
endif()

if(_args_PY2)
Expand Down Expand Up @@ -215,10 +218,10 @@ function(add_cython_target _name)
endif()

Cython_compile_pyx(
TARGET_LANGUAGE ${_target_language}
LANGUAGE ${_language}
LANGUAGE_LEVEL ${_language_level}
CYTHON_ARGS ${_cython_args}
OUTPUT_VAR ${_args_OUTPUT_VAR}
OUTPUT_VARIABLE ${_args_OUTPUT_VAR}
${_source_file}
)

Expand All @@ -229,7 +232,7 @@ endfunction()

function(Cython_compile_pyx)
set(_options )
set(_one_value LANGUAGE_LEVEL TARGET_LANGUAGE OUTPUT_VAR)
set(_one_value LANGUAGE_LEVEL LANGUAGE OUTPUT_VARIABLE)
set(_multi_value CYTHON_ARGS)

cmake_parse_arguments(_args
Expand All @@ -244,26 +247,26 @@ function(Cython_compile_pyx)

# Set target language
get_property(_languages GLOBAL PROPERTY ENABLED_LANGUAGES)
set(_target_language ${_args_TARGET_LANGUAGE})
if(NOT _target_language)
set(_language ${_args_LANGUAGE})
if(NOT _language)
if("C" IN_LIST _languages)
set(_target_language "C")
set(_language "C")
elseif("CXX" IN_LIST _languages)
set(_target_language "CXX")
set(_language "CXX")
endif()
else()
if(NOT _target_language MATCHES "^(C|CXX)$")
message(FATAL_ERROR "TARGET_LANGUAGE must be one of C or CXX")
if(NOT _language MATCHES "^(C|CXX)$")
message(FATAL_ERROR "LANGUAGE must be one of C or CXX")
endif()
endif()

set(_target_language_C_arg "")
set(_target_language_C_extension "c")
set(_target_language_CXX_arg "--cplus")
set(_target_language_CXX_extension "cxx")
set(_language_C_arg "")
set(_language_C_extension "c")
set(_language_CXX_arg "--cplus")
set(_language_CXX_extension "cxx")

set(_target_language_arg ${_target_language_${_target_language}_arg})
set(_target_language_extension ${_target_language_${_target_language}_extension})
set(_language_arg ${_language_${_language}_arg})
set(_language_extension ${_language_${_language}_extension})

# Set language level
set(_language_level ${_args_LANGUAGE_LEVEL})
Expand All @@ -290,13 +293,13 @@ function(Cython_compile_pyx)

foreach(_source_file IN LISTS _source_files)
cmake_path(GET _source_file STEM _name)
set(generated_file "${CMAKE_CURRENT_BINARY_DIR}/${_name}.${_target_language_extension}")
set(generated_file "${CMAKE_CURRENT_BINARY_DIR}/${_name}.${_language_extension}")
set_source_files_properties(${generated_file} PROPERTIES GENERATED TRUE)

file(RELATIVE_PATH generated_file_relative
${CMAKE_BINARY_DIR} ${generated_file})

set(comment "Generating ${_target_language} source ${generated_file_relative}")
set(comment "Generating ${_language} source ${generated_file_relative}")

get_source_file_property(pyx_location ${_source_file} LOCATION)

Expand All @@ -305,7 +308,7 @@ function(Cython_compile_pyx)
OUTPUT ${generated_file}
COMMAND ${CYTHON_EXECUTABLE}
ARGS
${_target_language_arg}
${_language_arg}
${_language_level_arg}
${_args_CYTHON_ARGS}
${_depfile_arg}
Expand All @@ -321,9 +324,9 @@ function(Cython_compile_pyx)
list(APPEND generated_files ${generated_file})
endforeach()

if(_args_OUTPUT_VAR)
set(_output_var ${_args_OUTPUT_VAR})
set(${_output_var} ${generated_files} PARENT_SCOPE)
if(_args_OUTPUT_VARIABLE)
set(_output_variable ${_args_OUTPUT_VARIABLE})
set(${_output_variable} ${generated_files} PARENT_SCOPE)
endif()

endfunction()
2 changes: 1 addition & 1 deletion tests/packages/simple/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ find_package(
REQUIRED)
find_package(Cython MODULE REQUIRED VERSION 3.0)

cython_compile_pyx(simple.pyx TARGET_LANGUAGE C OUTPUT_VAR simple_c)
cython_compile_pyx(simple.pyx LANGUAGE C OUTPUT_VARIABLE simple_c)

python_add_library(simple MODULE "${simple_c}" WITH_SOABI)

Expand Down