3030#
3131# Options:
3232#
33- # ``C | CXX``
33+ # ``TARGET_LANGUAGE [C | CXX]``
34+ # Force the generation of either a C or C++ file. By default, a C file is
35+ # generated, unless the C language is not enabled for the project; in this
36+ # case, a C++ file is generated by default.
37+ #
38+ # ``C | CXX`` (deprecated)
3439# Force the generation of either a C or C++ file. By default, a C file is
3540# generated, unless the C language is not enabled for the project; in this
3641# case, a C++ file is generated by default.
@@ -97,23 +102,29 @@ set(CYTHON_FLAGS "" CACHE STRING
97102 "Extra flags to the cython compiler." )
98103mark_as_advanced (CYTHON_ANNOTATE CYTHON_FLAGS)
99104
100- set (CYTHON_CXX_EXTENSION "cxx" )
101- set (CYTHON_C_EXTENSION "c" )
102-
103- get_property (languages GLOBAL PROPERTY ENABLED_LANGUAGES )
104-
105105function (add_cython_target _name)
106- set (_options C CXX PY2 PY3)
107- set (_one_value OUTPUT_VAR)
106+ seT (_deprecated_options C CXX)
107+ set (_options PY2 PY3)
108+ set (_one_value TARGET_LANGUAGE OUTPUT_VAR)
108109 set (_multi_value )
109110
110111 cmake_parse_arguments (_args
111- "${_options} "
112+ "${_options} ${_deprecated_options} "
112113 "${_one_value} "
113114 "${_multi_value} "
114115 ${ARGN}
115116 )
116117
118+ # Support deprecated options: C, CXX
119+ if (NOT _args_TARGET_LANGUAGE)
120+ if (_args_C)
121+ set (_args_TARGET_LANGUAGE "C" )
122+ endif ()
123+ if (_args_CXX)
124+ set (_args_TARGET_LANGUAGE "CXX" )
125+ endif ()
126+ endif ()
127+
117128 list (GET _args_UNPARSED_ARGUMENTS 0 _arg0)
118129
119130 # if provided, use _arg0 as the input file path
@@ -135,22 +146,28 @@ function(add_cython_target _name)
135146 endif ()
136147 endif ()
137148
138-
139- if ("C" IN_LIST languages)
140- set (target_language "C" )
141- elseif ("CXX" IN_LIST languages)
142- set (target_language "CXX" )
149+ # Set target language
150+ get_property (_languages GLOBAL PROPERTY ENABLED_LANGUAGES )
151+ set (_target_language ${_args_TARGET_LANGUAGE} )
152+ if (NOT _target_language)
153+ if ("C" IN_LIST _languages)
154+ set (_target_language "C" )
155+ elseif ("CXX" IN_LIST _languages)
156+ set (_target_language "CXX" )
157+ endif ()
143158 else ()
144- message (FATAL_ERROR "Either C or CXX must be enabled to use Cython" )
159+ if (NOT _target_language MATCHES "^(C|CXX)$" )
160+ message (FATAL_ERROR "TARGET_LANGUAGE must be one of C or CXX" )
161+ endif ()
145162 endif ()
146163
147- if (_args_C)
148- set (target_language "C" )
149- endif ()
164+ set (_target_language_C_arg "" )
165+ set (_target_language_C_extension "c" )
166+ set (_target_language_CXX_arg "--cplus" )
167+ set (_target_language_CXX_extension "cxx" )
150168
151- if (_args_CXX)
152- set (target_language "CXX" )
153- endif ()
169+ set (_target_language_arg ${_target_language_${_target_language} _arg})
170+ set (_target_language_extension ${_target_language_${_target_language} _extension})
154171
155172 # Doesn't select an input syntax - Cython
156173 # defaults to 2 for Cython 2 and 3 for Cython 3
@@ -164,21 +181,14 @@ function(add_cython_target _name)
164181 set (_input_syntax "PY3" )
165182 endif ()
166183
167- set (cxx_arg "" )
168- set (extension "c" )
169- if (target_language STREQUAL "CXX" )
170- set (cxx_arg "--cplus" )
171- set (extension "cxx" )
172- endif ()
173-
174184 set (language_level_arg "" )
175185 if (_input_syntax STREQUAL "PY2" )
176186 set (language_level_arg "-2" )
177187 elseif (_input_syntax STREQUAL "PY3" )
178188 set (language_level_arg "-3" )
179189 endif ()
180190
181- set (generated_file "${CMAKE_CURRENT_BINARY_DIR} /${_name} .${extension } " )
191+ set (generated_file "${CMAKE_CURRENT_BINARY_DIR} /${_name} .${_target_language_extension } " )
182192 set_source_files_properties (${generated_file} PROPERTIES GENERATED TRUE )
183193
184194 set (_output_var ${_name} )
@@ -190,7 +200,7 @@ function(add_cython_target _name)
190200 file (RELATIVE_PATH generated_file_relative
191201 ${CMAKE_BINARY_DIR} ${generated_file} )
192202
193- set (comment "Generating ${target_language } source ${generated_file_relative} " )
203+ set (comment "Generating ${_target_language } source ${generated_file_relative} " )
194204 set (cython_include_directories "" )
195205 set (pxd_dependencies "" )
196206 set (c_header_dependencies "" )
@@ -354,7 +364,7 @@ function(add_cython_target _name)
354364 OUTPUT ${generated_file}
355365 COMMAND ${CYTHON_EXECUTABLE}
356366 ARGS
357- ${cxx_arg }
367+ ${_target_language_arg }
358368 ${include_directory_arg}
359369 ${language_level_arg}
360370 ${annotate_arg}
@@ -367,7 +377,7 @@ function(add_cython_target _name)
367377 ${_source_file}
368378 ${pxd_dependencies}
369379 IMPLICIT_DEPENDS
370- ${target_language }
380+ ${_target_language }
371381 ${c_header_dependencies}
372382 COMMENT ${comment}
373383 )
0 commit comments