]>
Commit | Line | Data |
---|---|---|
9f95a23c TL |
1 | # Distributed under the OSI-approved BSD 3-Clause License. See accompanying |
2 | # file Copyright.txt or https://cmake.org/licensing for details. | |
3 | ||
4 | # | |
5 | # This file is a "template" file used by various FindPython modules. | |
6 | # | |
7 | ||
8 | cmake_policy (VERSION 3.5) | |
9 | ||
10 | # | |
11 | # Initial configuration | |
12 | # | |
13 | if (NOT DEFINED _PYTHON_PREFIX) | |
14 | message (FATAL_ERROR "FindPython: INTERNAL ERROR") | |
15 | endif() | |
16 | if (NOT DEFINED _${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR) | |
17 | message (FATAL_ERROR "FindPython: INTERNAL ERROR") | |
18 | endif() | |
19 | if (_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR EQUAL 3) | |
20effc67 | 20 | set(_${_PYTHON_PREFIX}_VERSIONS 3.10 3.9 3.8 3.7 3.6 3.5 3.4 3.3 3.2 3.1 3.0) |
9f95a23c TL |
21 | elseif (_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR EQUAL 2) |
22 | set(_${_PYTHON_PREFIX}_VERSIONS 2.7 2.6 2.5 2.4 2.3 2.2 2.1 2.0) | |
23 | else() | |
24 | message (FATAL_ERROR "FindPython: INTERNAL ERROR") | |
25 | endif() | |
26 | ||
27 | get_property(_${_PYTHON_PREFIX}_CMAKE_ROLE GLOBAL PROPERTY CMAKE_ROLE) | |
28 | if (NOT DEFINED _${_PYTHON_PREFIX}_CMAKE_ROLE) | |
29 | # CMake 3.14 introduced CMAKE_ROLE | |
30 | set(_${_PYTHON_PREFIX}_CMAKE_ROLE "PROJECT") | |
31 | endif() | |
32 | ||
33 | ||
34 | # | |
35 | # helper commands | |
36 | # | |
37 | macro (_PYTHON_DISPLAY_FAILURE _PYTHON_MSG) | |
38 | if (${_PYTHON_PREFIX}_FIND_REQUIRED) | |
39 | message (FATAL_ERROR "${_PYTHON_MSG}") | |
40 | else() | |
41 | if (NOT ${_PYTHON_PREFIX}_FIND_QUIETLY) | |
42 | message(STATUS "${_PYTHON_MSG}") | |
43 | endif () | |
44 | endif() | |
45 | ||
46 | set (${_PYTHON_PREFIX}_FOUND FALSE) | |
47 | string (TOUPPER "${_PYTHON_PREFIX}" _${_PYTHON_PREFIX}_UPPER_PREFIX) | |
48 | set (${_PYTHON_UPPER_PREFIX}_FOUND FALSE) | |
49 | return() | |
50 | endmacro() | |
51 | ||
52 | ||
53 | macro (_PYTHON_FIND_FRAMEWORKS) | |
54 | set (${_PYTHON_PREFIX}_FRAMEWORKS) | |
55 | if (APPLE) | |
56 | set (_pff_frameworks ${CMAKE_FRAMEWORK_PATH} | |
57 | $ENV{CMAKE_FRAMEWORK_PATH} | |
58 | ~/Library/Frameworks | |
59 | /usr/local/Frameworks | |
60 | ${CMAKE_SYSTEM_FRAMEWORK_PATH}) | |
61 | list (REMOVE_DUPLICATES _pff_frameworks) | |
62 | foreach (_pff_framework IN LISTS _pff_frameworks) | |
63 | if (EXISTS ${_pff_framework}/Python.framework) | |
64 | list (APPEND ${_PYTHON_PREFIX}_FRAMEWORKS ${_pff_framework}/Python.framework) | |
65 | endif() | |
66 | endforeach() | |
67 | unset (_pff_frameworks) | |
68 | unset (_pff_framework) | |
69 | endif() | |
70 | endmacro() | |
71 | ||
72 | function (_PYTHON_GET_FRAMEWORKS _PYTHON_PGF_FRAMEWORK_PATHS _PYTHON_VERSION) | |
73 | set (_PYTHON_FRAMEWORK_PATHS) | |
74 | foreach (_PYTHON_FRAMEWORK IN LISTS ${_PYTHON_PREFIX}_FRAMEWORKS) | |
75 | list (APPEND _PYTHON_FRAMEWORK_PATHS | |
76 | "${_PYTHON_FRAMEWORK}/Versions/${_PYTHON_VERSION}") | |
77 | endforeach() | |
78 | set (${_PYTHON_PGF_FRAMEWORK_PATHS} ${_PYTHON_FRAMEWORK_PATHS} PARENT_SCOPE) | |
79 | endfunction() | |
80 | ||
81 | ||
82 | function (_PYTHON_VALIDATE_INTERPRETER) | |
83 | if (NOT ${_PYTHON_PREFIX}_EXECUTABLE) | |
84 | return() | |
85 | endif() | |
86 | ||
87 | if (ARGC EQUAL 1) | |
88 | set (expected_version ${ARGV0}) | |
89 | else() | |
90 | unset (expected_version) | |
91 | endif() | |
92 | ||
93 | get_filename_component (python_name "${${_PYTHON_PREFIX}_EXECUTABLE}" NAME) | |
94 | ||
95 | if (expected_version AND NOT python_name STREQUAL "python${expected_version}${CMAKE_EXECUTABLE_SUFFIX}") | |
96 | # executable found must have a specific version | |
97 | execute_process (COMMAND "${${_PYTHON_PREFIX}_EXECUTABLE}" -c | |
98 | "import sys; sys.stdout.write('.'.join([str(x) for x in sys.version_info[:2]]))" | |
99 | RESULT_VARIABLE result | |
100 | OUTPUT_VARIABLE version | |
101 | ERROR_QUIET | |
102 | OUTPUT_STRIP_TRAILING_WHITESPACE) | |
103 | if (result OR NOT version EQUAL expected_version) | |
104 | # interpreter not usable or has wrong major version | |
105 | set (${_PYTHON_PREFIX}_EXECUTABLE ${_PYTHON_PREFIX}_EXECUTABLE-NOTFOUND CACHE INTERNAL "" FORCE) | |
106 | return() | |
107 | endif() | |
108 | else() | |
109 | if (NOT python_name STREQUAL "python${_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR}${CMAKE_EXECUTABLE_SUFFIX}") | |
110 | # executable found do not have version in name | |
111 | # ensure major version is OK | |
112 | execute_process (COMMAND "${${_PYTHON_PREFIX}_EXECUTABLE}" -c | |
113 | "import sys; sys.stdout.write(str(sys.version_info[0]))" | |
114 | RESULT_VARIABLE result | |
115 | OUTPUT_VARIABLE version | |
116 | ERROR_QUIET | |
117 | OUTPUT_STRIP_TRAILING_WHITESPACE) | |
118 | if (result OR NOT version EQUAL _${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR) | |
119 | # interpreter not usable or has wrong major version | |
120 | set (${_PYTHON_PREFIX}_EXECUTABLE ${_PYTHON_PREFIX}_EXECUTABLE-NOTFOUND CACHE INTERNAL "" FORCE) | |
121 | return() | |
122 | endif() | |
123 | endif() | |
124 | endif() | |
125 | ||
126 | if (CMAKE_SIZEOF_VOID_P AND "Development" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS | |
127 | AND NOT CMAKE_CROSSCOMPILING) | |
128 | # In this case, interpreter must have same architecture as environment | |
129 | execute_process (COMMAND "${${_PYTHON_PREFIX}_EXECUTABLE}" -c | |
130 | "import sys, struct; sys.stdout.write(str(struct.calcsize(\"P\")))" | |
131 | RESULT_VARIABLE result | |
132 | OUTPUT_VARIABLE size | |
133 | ERROR_QUIET | |
134 | OUTPUT_STRIP_TRAILING_WHITESPACE) | |
135 | if (result OR NOT size EQUAL CMAKE_SIZEOF_VOID_P) | |
136 | # interpreter not usable or has wrong architecture | |
137 | set (${_PYTHON_PREFIX}_EXECUTABLE ${_PYTHON_PREFIX}_EXECUTABLE-NOTFOUND CACHE INTERNAL "" FORCE) | |
138 | return() | |
139 | endif() | |
140 | endif() | |
141 | endfunction() | |
142 | ||
143 | ||
144 | function (_PYTHON_VALIDATE_COMPILER expected_version) | |
145 | if (NOT ${_PYTHON_PREFIX}_COMPILER) | |
146 | return() | |
147 | endif() | |
148 | ||
149 | # retrieve python environment version from compiler | |
150 | set (working_dir "${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/PythonCompilerVersion.dir") | |
151 | file (WRITE "${working_dir}/version.py" "import sys; sys.stdout.write('.'.join([str(x) for x in sys.version_info[:2]]))\n") | |
152 | execute_process (COMMAND "${${_PYTHON_PREFIX}_COMPILER}" /target:exe /embed "${working_dir}/version.py" | |
153 | WORKING_DIRECTORY "${working_dir}" | |
154 | OUTPUT_QUIET | |
155 | ERROR_QUIET | |
156 | OUTPUT_STRIP_TRAILING_WHITESPACE) | |
157 | execute_process (COMMAND "${working_dir}/version" | |
158 | WORKING_DIRECTORY "${working_dir}" | |
159 | RESULT_VARIABLE result | |
160 | OUTPUT_VARIABLE version | |
161 | ERROR_QUIET) | |
162 | file (REMOVE_RECURSE "${_${_PYTHON_PREFIX}_VERSION_DIR}") | |
163 | ||
164 | if (result OR NOT version EQUAL expected_version) | |
165 | # Compiler not usable or has wrong major version | |
166 | set (${_PYTHON_PREFIX}_COMPILER ${_PYTHON_PREFIX}_COMPILER-NOTFOUND CACHE INTERNAL "" FORCE) | |
167 | endif() | |
168 | endfunction() | |
169 | ||
170 | ||
171 | function (_PYTHON_FIND_RUNTIME_LIBRARY _PYTHON_LIB) | |
172 | string (REPLACE "_RUNTIME" "" _PYTHON_LIB "${_PYTHON_LIB}") | |
173 | # look at runtime part on systems supporting it | |
174 | if (CMAKE_SYSTEM_NAME STREQUAL "Windows" OR | |
175 | (CMAKE_SYSTEM_NAME MATCHES "MSYS|CYGWIN" | |
176 | AND ${_PYTHON_LIB} MATCHES "${CMAKE_IMPORT_LIBRARY_SUFFIX}$")) | |
177 | set (CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_SHARED_LIBRARY_SUFFIX}) | |
178 | # MSYS has a special syntax for runtime libraries | |
179 | if (CMAKE_SYSTEM_NAME MATCHES "MSYS") | |
180 | list (APPEND CMAKE_FIND_LIBRARY_PREFIXES "msys-") | |
181 | endif() | |
182 | find_library (${ARGV}) | |
183 | endif() | |
184 | endfunction() | |
185 | ||
186 | ||
187 | function (_PYTHON_SET_LIBRARY_DIRS _PYTHON_SLD_RESULT) | |
188 | unset (_PYTHON_DIRS) | |
189 | set (_PYTHON_LIBS ${ARGV}) | |
190 | list (REMOVE_AT _PYTHON_LIBS 0) | |
191 | foreach (_PYTHON_LIB IN LISTS _PYTHON_LIBS) | |
192 | if (${_PYTHON_LIB}) | |
193 | get_filename_component (_PYTHON_DIR "${${_PYTHON_LIB}}" DIRECTORY) | |
194 | list (APPEND _PYTHON_DIRS "${_PYTHON_DIR}") | |
195 | endif() | |
196 | endforeach() | |
197 | if (_PYTHON_DIRS) | |
198 | list (REMOVE_DUPLICATES _PYTHON_DIRS) | |
199 | endif() | |
200 | set (${_PYTHON_SLD_RESULT} ${_PYTHON_DIRS} PARENT_SCOPE) | |
201 | endfunction() | |
202 | ||
203 | ||
204 | # If major version is specified, it must be the same as internal major version | |
205 | if (DEFINED ${_PYTHON_PREFIX}_FIND_VERSION_MAJOR | |
206 | AND NOT ${_PYTHON_PREFIX}_FIND_VERSION_MAJOR VERSION_EQUAL _${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR) | |
207 | _python_display_failure ("Could NOT find ${_PYTHON_PREFIX}: Wrong major version specified is \"${${_PYTHON_PREFIX}_FIND_VERSION_MAJOR}\", but expected major version is \"${_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR}\"") | |
208 | endif() | |
209 | ||
210 | ||
211 | # handle components | |
212 | if (NOT ${_PYTHON_PREFIX}_FIND_COMPONENTS) | |
213 | set (${_PYTHON_PREFIX}_FIND_COMPONENTS Interpreter) | |
214 | set (${_PYTHON_PREFIX}_FIND_REQUIRED_Interpreter TRUE) | |
215 | endif() | |
216 | if ("NumPy" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS) | |
217 | list (APPEND ${_PYTHON_PREFIX}_FIND_COMPONENTS "Interpreter" "Development") | |
218 | list (REMOVE_DUPLICATES ${_PYTHON_PREFIX}_FIND_COMPONENTS) | |
219 | endif() | |
220 | foreach (_${_PYTHON_PREFIX}_COMPONENT IN LISTS ${_PYTHON_PREFIX}_FIND_COMPONENTS) | |
221 | set (${_PYTHON_PREFIX}_${_${_PYTHON_PREFIX}_COMPONENT}_FOUND FALSE) | |
222 | endforeach() | |
223 | unset (_${_PYTHON_PREFIX}_FIND_VERSIONS) | |
224 | ||
225 | # Set versions to search | |
226 | ## default: search any version | |
227 | set (_${_PYTHON_PREFIX}_FIND_VERSIONS ${_${_PYTHON_PREFIX}_VERSIONS}) | |
228 | ||
229 | if (${_PYTHON_PREFIX}_FIND_VERSION_COUNT GREATER 1) | |
230 | if (${_PYTHON_PREFIX}_FIND_VERSION_EXACT) | |
231 | set (_${_PYTHON_PREFIX}_FIND_VERSIONS ${${_PYTHON_PREFIX}_FIND_VERSION_MAJOR}.${${_PYTHON_PREFIX}_FIND_VERSION_MINOR}) | |
232 | else() | |
233 | unset (_${_PYTHON_PREFIX}_FIND_VERSIONS) | |
234 | # add all compatible versions | |
235 | foreach (_${_PYTHON_PREFIX}_VERSION IN LISTS _${_PYTHON_PREFIX}_VERSIONS) | |
236 | if (NOT _${_PYTHON_PREFIX}_VERSION VERSION_LESS ${_PYTHON_PREFIX}_FIND_VERSION) | |
237 | list (APPEND _${_PYTHON_PREFIX}_FIND_VERSIONS ${_${_PYTHON_PREFIX}_VERSION}) | |
238 | endif() | |
239 | endforeach() | |
240 | endif() | |
241 | endif() | |
242 | ||
243 | # Python and Anaconda distributions: define which architectures can be used | |
244 | if (CMAKE_SIZEOF_VOID_P) | |
245 | # In this case, search only for 64bit or 32bit | |
246 | math (EXPR _${_PYTHON_PREFIX}_ARCH "${CMAKE_SIZEOF_VOID_P} * 8") | |
247 | set (_${_PYTHON_PREFIX}_ARCH2 ${_${_PYTHON_PREFIX}_ARCH}) | |
248 | else() | |
249 | # architecture unknown, search for both 64bit and 32bit | |
250 | set (_${_PYTHON_PREFIX}_ARCH 64) | |
251 | set (_${_PYTHON_PREFIX}_ARCH2 32) | |
252 | endif() | |
253 | ||
254 | # IronPython support | |
255 | if (CMAKE_SIZEOF_VOID_P) | |
256 | # In this case, search only for 64bit or 32bit | |
257 | math (EXPR _${_PYTHON_PREFIX}_ARCH "${CMAKE_SIZEOF_VOID_P} * 8") | |
258 | set (_${_PYTHON_PREFIX}_IRON_PYTHON_NAMES ipy${_${_PYTHON_PREFIX}_ARCH} ipy) | |
259 | else() | |
260 | # architecture unknown, search for natural interpreter | |
261 | set (_${_PYTHON_PREFIX}_IRON_PYTHON_NAMES ipy) | |
262 | endif() | |
263 | set (_${_PYTHON_PREFIX}_IRON_PYTHON_PATH_SUFFIXES net45 net40) | |
264 | ||
265 | # Apple frameworks handling | |
266 | _python_find_frameworks () | |
267 | ||
268 | # Save CMAKE_FIND_APPBUNDLE | |
269 | if (DEFINED CMAKE_FIND_APPBUNDLE) | |
270 | set (_${_PYTHON_PREFIX}_CMAKE_FIND_APPBUNDLE ${CMAKE_FIND_APPBUNDLE}) | |
271 | else() | |
272 | unset (_${_PYTHON_PREFIX}_CMAKE_FIND_APPBUNDLE) | |
273 | endif() | |
274 | # To avoid app bundle lookup | |
275 | set (CMAKE_FIND_APPBUNDLE "NEVER") | |
276 | ||
277 | # Save CMAKE_FIND_FRAMEWORK | |
278 | if (DEFINED CMAKE_FIND_FRAMEWORK) | |
279 | set (_${_PYTHON_PREFIX}_CMAKE_FIND_FRAMEWORK ${CMAKE_FIND_FRAMEWORK}) | |
280 | if (CMAKE_FIND_FRAMEWORK STREQUAL "ONLY") | |
281 | message (AUTHOR_WARNING "Find${_PYTHON_PREFIX}: CMAKE_FIND_FRAMEWORK: 'ONLY' value is not supported. 'FIRST' will be used instead.") | |
282 | set (_${_PYTHON_PREFIX}_FIND_FRAMEWORK "FIRST") | |
283 | else() | |
284 | set (_${_PYTHON_PREFIX}_FIND_FRAMEWORK ${CMAKE_FIND_FRAMEWORK}) | |
285 | endif() | |
286 | else() | |
287 | unset (_${_PYTHON_PREFIX}_CMAKE_FIND_FRAMEWORK) | |
288 | set (_${_PYTHON_PREFIX}_FIND_FRAMEWORK "FIRST") | |
289 | endif() | |
290 | # To avoid framework lookup | |
291 | set (CMAKE_FIND_FRAMEWORK "NEVER") | |
292 | ||
293 | # Windows Registry handling | |
294 | if (DEFINED ${_PYTHON_PREFIX}_FIND_REGISTRY) | |
295 | if (NOT ${_PYTHON_PREFIX}_FIND_REGISTRY MATCHES "^(FIRST|LAST|NEVER)$") | |
296 | message (AUTHOR_WARNING "Find${_PYTHON_PREFIX}: ${${_PYTHON_PREFIX}_FIND_REGISTRY}: invalid value for '${_PYTHON_PREFIX}_FIND_REGISTRY'. 'FIRST', 'LAST' or 'NEVER' expected.") | |
297 | set (_${_PYTHON_PREFIX}_FIND_REGISTRY "FIRST") | |
298 | else() | |
299 | set (_${_PYTHON_PREFIX}_FIND_REGISTRY ${${_PYTHON_PREFIX}_FIND_REGISTRY}) | |
300 | endif() | |
301 | else() | |
302 | set (_${_PYTHON_PREFIX}_FIND_REGISTRY "FIRST") | |
303 | endif() | |
304 | ||
305 | ||
306 | unset (_${_PYTHON_PREFIX}_REQUIRED_VARS) | |
307 | unset (_${_PYTHON_PREFIX}_CACHED_VARS) | |
308 | ||
309 | ||
310 | # first step, search for the interpreter | |
311 | if ("Interpreter" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS) | |
312 | list (APPEND _${_PYTHON_PREFIX}_CACHED_VARS ${_PYTHON_PREFIX}_EXECUTABLE) | |
313 | if (${_PYTHON_PREFIX}_FIND_REQUIRED_Interpreter) | |
314 | list (APPEND _${_PYTHON_PREFIX}_REQUIRED_VARS ${_PYTHON_PREFIX}_EXECUTABLE) | |
315 | endif() | |
316 | ||
317 | set (_${_PYTHON_PREFIX}_HINTS "${${_PYTHON_PREFIX}_ROOT_DIR}" ENV ${_PYTHON_PREFIX}_ROOT_DIR) | |
318 | ||
319 | # look-up for various versions and locations | |
320 | foreach (_${_PYTHON_PREFIX}_VERSION IN LISTS _${_PYTHON_PREFIX}_FIND_VERSIONS) | |
321 | string (REPLACE "." "" _${_PYTHON_PREFIX}_VERSION_NO_DOTS ${_${_PYTHON_PREFIX}_VERSION}) | |
322 | ||
323 | _python_get_frameworks (_${_PYTHON_PREFIX}_FRAMEWORK_PATHS ${_${_PYTHON_PREFIX}_VERSION}) | |
324 | ||
325 | # Apple frameworks handling | |
326 | if (APPLE AND _${_PYTHON_PREFIX}_FIND_FRAMEWORK STREQUAL "FIRST") | |
327 | find_program (${_PYTHON_PREFIX}_EXECUTABLE | |
328 | NAMES python${_${_PYTHON_PREFIX}_VERSION} | |
329 | python${_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR} | |
330 | NAMES_PER_DIR | |
331 | PATHS ${_${_PYTHON_PREFIX}_FRAMEWORK_PATHS} | |
332 | PATH_SUFFIXES bin | |
333 | NO_CMAKE_PATH | |
334 | NO_CMAKE_ENVIRONMENT_PATH | |
335 | NO_SYSTEM_ENVIRONMENT_PATH | |
336 | NO_CMAKE_SYSTEM_PATH) | |
337 | endif() | |
338 | ||
339 | # Windows registry | |
340 | if (WIN32 AND _${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "FIRST") | |
341 | find_program (${_PYTHON_PREFIX}_EXECUTABLE | |
342 | NAMES python${_${_PYTHON_PREFIX}_VERSION} | |
343 | python${_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR} | |
344 | python | |
345 | ${_${_PYTHON_PREFIX}_IRON_PYTHON_NAMES} | |
346 | NAMES_PER_DIR | |
347 | HINTS ${_${_PYTHON_PREFIX}_HINTS} | |
348 | PATHS [HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\${_${_PYTHON_PREFIX}_VERSION}-${_${_PYTHON_PREFIX}_ARCH}\\InstallPath] | |
349 | [HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\${_${_PYTHON_PREFIX}_VERSION}-${_${_PYTHON_PREFIX}_ARCH2}\\InstallPath] | |
350 | [HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\${_${_PYTHON_PREFIX}_VERSION}\\InstallPath] | |
351 | [HKEY_CURRENT_USER\\SOFTWARE\\Python\\ContinuumAnalytics\\Anaconda${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}-${_${_PYTHON_PREFIX}_ARCH}\\InstallPath] | |
352 | [HKEY_CURRENT_USER\\SOFTWARE\\Python\\ContinuumAnalytics\\Anaconda${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}-${_${_PYTHON_PREFIX}_ARCH2}\\InstallPath] | |
353 | [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\${_${_PYTHON_PREFIX}_VERSION}-${_${_PYTHON_PREFIX}_ARCH}\\InstallPath] | |
354 | [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\${_${_PYTHON_PREFIX}_VERSION}-${_${_PYTHON_PREFIX}_ARCH2}\\InstallPath] | |
355 | [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\${_${_PYTHON_PREFIX}_VERSION}\\InstallPath] | |
356 | [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\ContinuumAnalytics\\Anaconda${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}-${_${_PYTHON_PREFIX}_ARCH}\\InstallPath] | |
357 | [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\ContinuumAnalytics\\Anaconda${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}-${_${_PYTHON_PREFIX}_ARCH2}\\InstallPath] | |
358 | [HKEY_LOCAL_MACHINE\\SOFTWARE\\IronPython\\${_${_PYTHON_PREFIX}_VERSION}\\InstallPath] | |
359 | PATH_SUFFIXES bin ${_${_PYTHON_PREFIX}_IRON_PYTHON_PATH_SUFFIXES} | |
360 | NO_SYSTEM_ENVIRONMENT_PATH | |
361 | NO_CMAKE_SYSTEM_PATH) | |
362 | endif() | |
363 | ||
364 | # try using HINTS | |
365 | find_program (${_PYTHON_PREFIX}_EXECUTABLE | |
366 | NAMES python${_${_PYTHON_PREFIX}_VERSION} | |
367 | python${_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR} | |
368 | python | |
369 | ${_${_PYTHON_PREFIX}_IRON_PYTHON_NAMES} | |
370 | NAMES_PER_DIR | |
371 | HINTS ${_${_PYTHON_PREFIX}_HINTS} | |
372 | PATH_SUFFIXES bin ${_${_PYTHON_PREFIX}_IRON_PYTHON_PATH_SUFFIXES} | |
373 | NO_SYSTEM_ENVIRONMENT_PATH | |
374 | NO_CMAKE_SYSTEM_PATH) | |
375 | # try using standard paths. | |
376 | if (WIN32) | |
377 | find_program (${_PYTHON_PREFIX}_EXECUTABLE | |
378 | NAMES python${_${_PYTHON_PREFIX}_VERSION} | |
379 | python${_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR} | |
380 | python | |
381 | ${_${_PYTHON_PREFIX}_IRON_PYTHON_NAMES} | |
382 | NAMES_PER_DIR) | |
383 | else() | |
384 | find_program (${_PYTHON_PREFIX}_EXECUTABLE | |
385 | NAMES python${_${_PYTHON_PREFIX}_VERSION} | |
386 | python${_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR} | |
387 | NAMES_PER_DIR) | |
388 | endif() | |
389 | ||
390 | # Apple frameworks handling | |
391 | if (APPLE AND _${_PYTHON_PREFIX}_FIND_FRAMEWORK STREQUAL "LAST") | |
392 | find_program (${_PYTHON_PREFIX}_EXECUTABLE | |
393 | NAMES python${_${_PYTHON_PREFIX}_VERSION} | |
394 | python${_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR} | |
395 | NAMES_PER_DIR | |
396 | PATHS ${_${_PYTHON_PREFIX}_FRAMEWORK_PATHS} | |
397 | PATH_SUFFIXES bin | |
398 | NO_DEFAULT_PATH) | |
399 | endif() | |
400 | ||
401 | # Windows registry | |
402 | if (WIN32 AND _${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "LAST") | |
403 | find_program (${_PYTHON_PREFIX}_EXECUTABLE | |
404 | NAMES python${_${_PYTHON_PREFIX}_VERSION} | |
405 | python${_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR} | |
406 | python | |
407 | ${_${_PYTHON_PREFIX}_IRON_PYTHON_NAMES} | |
408 | NAMES_PER_DIR | |
409 | PATHS [HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\${_${_PYTHON_PREFIX}_VERSION}-${_${_PYTHON_PREFIX}_ARCH}\\InstallPath] | |
410 | [HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\${_${_PYTHON_PREFIX}_VERSION}-${_${_PYTHON_PREFIX}_ARCH2}\\InstallPath] | |
411 | [HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\${_${_PYTHON_PREFIX}_VERSION}\\InstallPath] | |
412 | [HKEY_CURRENT_USER\\SOFTWARE\\Python\\ContinuumAnalytics\\Anaconda${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}-${_${_PYTHON_PREFIX}_ARCH}\\InstallPath] | |
413 | [HKEY_CURRENT_USER\\SOFTWARE\\Python\\ContinuumAnalytics\\Anaconda${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}-${_${_PYTHON_PREFIX}_ARCH2}\\InstallPath] | |
414 | [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\${_${_PYTHON_PREFIX}_VERSION}-${_${_PYTHON_PREFIX}_ARCH}\\InstallPath] | |
415 | [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\${_${_PYTHON_PREFIX}_VERSION}-${_${_PYTHON_PREFIX}_ARCH2}\\InstallPath] | |
416 | [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\${_${_PYTHON_PREFIX}_VERSION}\\InstallPath] | |
417 | [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\ContinuumAnalytics\\Anaconda${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}-${_${_PYTHON_PREFIX}_ARCH}\\InstallPath] | |
418 | [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\ContinuumAnalytics\\Anaconda${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}-${_${_PYTHON_PREFIX}_ARCH2}\\InstallPath] | |
419 | [HKEY_LOCAL_MACHINE\\SOFTWARE\\IronPython\\${_${_PYTHON_PREFIX}_VERSION}\\InstallPath] | |
420 | PATH_SUFFIXES bin ${_${_PYTHON_PREFIX}_IRON_PYTHON_PATH_SUFFIXES} | |
421 | NO_DEFAULT_PATH) | |
422 | endif() | |
423 | ||
424 | _python_validate_interpreter (${_${_PYTHON_PREFIX}_VERSION}) | |
425 | if (${_PYTHON_PREFIX}_EXECUTABLE) | |
426 | break() | |
427 | endif() | |
428 | endforeach() | |
429 | ||
430 | if (NOT ${_PYTHON_PREFIX}_EXECUTABLE) | |
431 | # No specific version found. Retry with generic names | |
432 | # try using HINTS | |
433 | find_program (${_PYTHON_PREFIX}_EXECUTABLE | |
434 | NAMES python${_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR} | |
435 | python | |
436 | ${_${_PYTHON_PREFIX}_IRON_PYTHON_NAMES} | |
437 | NAMES_PER_DIR | |
438 | HINTS ${_${_PYTHON_PREFIX}_HINTS} | |
439 | PATH_SUFFIXES bin ${_${_PYTHON_PREFIX}_IRON_PYTHON_PATH_SUFFIXES} | |
440 | NO_SYSTEM_ENVIRONMENT_PATH | |
441 | NO_CMAKE_SYSTEM_PATH) | |
442 | # try using standard paths. | |
443 | # NAMES_PER_DIR is not defined on purpose to have a chance to find | |
444 | # expected version. | |
445 | # For example, typical systems have 'python' for version 2.* and 'python3' | |
446 | # for version 3.*. So looking for names per dir will find, potentially, | |
447 | # systematically 'python' (i.e. version 2) even if version 3 is searched. | |
448 | find_program (${_PYTHON_PREFIX}_EXECUTABLE | |
449 | NAMES python${_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR} | |
450 | python | |
451 | ${_${_PYTHON_PREFIX}_IRON_PYTHON_NAMES}) | |
452 | ||
453 | _python_validate_interpreter () | |
454 | endif() | |
455 | ||
456 | # retrieve exact version of executable found | |
457 | if (${_PYTHON_PREFIX}_EXECUTABLE) | |
458 | execute_process (COMMAND "${${_PYTHON_PREFIX}_EXECUTABLE}" -c | |
459 | "import sys; sys.stdout.write('.'.join([str(x) for x in sys.version_info[:3]]))" | |
460 | RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT | |
461 | OUTPUT_VARIABLE ${_PYTHON_PREFIX}_VERSION | |
462 | ERROR_QUIET | |
463 | OUTPUT_STRIP_TRAILING_WHITESPACE) | |
464 | if (NOT _${_PYTHON_PREFIX}_RESULT) | |
465 | string (REGEX MATCHALL "[0-9]+" _${_PYTHON_PREFIX}_VERSIONS "${${_PYTHON_PREFIX}_VERSION}") | |
466 | list (GET _${_PYTHON_PREFIX}_VERSIONS 0 ${_PYTHON_PREFIX}_VERSION_MAJOR) | |
467 | list (GET _${_PYTHON_PREFIX}_VERSIONS 1 ${_PYTHON_PREFIX}_VERSION_MINOR) | |
468 | list (GET _${_PYTHON_PREFIX}_VERSIONS 2 ${_PYTHON_PREFIX}_VERSION_PATCH) | |
469 | else() | |
470 | # Interpreter is not usable | |
471 | set (${_PYTHON_PREFIX}_EXECUTABLE ${_PYTHON_PREFIX}_EXECUTABLE-NOTFOUND CACHE INTERNAL "" FORCE) | |
472 | unset (${_PYTHON_PREFIX}_VERSION) | |
473 | endif() | |
474 | endif() | |
475 | ||
476 | if (${_PYTHON_PREFIX}_EXECUTABLE | |
477 | AND ${_PYTHON_PREFIX}_VERSION_MAJOR VERSION_EQUAL _${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR) | |
478 | set (${_PYTHON_PREFIX}_Interpreter_FOUND TRUE) | |
479 | # Use interpreter version for future searches to ensure consistency | |
480 | set (_${_PYTHON_PREFIX}_FIND_VERSIONS ${${_PYTHON_PREFIX}_VERSION_MAJOR}.${${_PYTHON_PREFIX}_VERSION_MINOR}) | |
481 | endif() | |
482 | ||
483 | if (${_PYTHON_PREFIX}_Interpreter_FOUND) | |
484 | if (NOT CMAKE_SIZEOF_VOID_P) | |
485 | # determine interpreter architecture | |
486 | execute_process (COMMAND "${${_PYTHON_PREFIX}_EXECUTABLE}" -c "import sys; print(sys.maxsize > 2**32)" | |
487 | RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT | |
488 | OUTPUT_VARIABLE ${_PYTHON_PREFIX}_IS64BIT | |
489 | ERROR_VARIABLE ${_PYTHON_PREFIX}_IS64BIT) | |
490 | if (NOT _${_PYTHON_PREFIX}_RESULT) | |
491 | if (${_PYTHON_PREFIX}_IS64BIT) | |
492 | set (_${_PYTHON_PREFIX}_ARCH 64) | |
493 | set (_${_PYTHON_PREFIX}_ARCH2 64) | |
494 | else() | |
495 | set (_${_PYTHON_PREFIX}_ARCH 32) | |
496 | set (_${_PYTHON_PREFIX}_ARCH2 32) | |
497 | endif() | |
498 | endif() | |
499 | endif() | |
500 | ||
501 | # retrieve interpreter identity | |
502 | execute_process (COMMAND "${${_PYTHON_PREFIX}_EXECUTABLE}" -V | |
503 | RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT | |
504 | OUTPUT_VARIABLE ${_PYTHON_PREFIX}_INTERPRETER_ID | |
505 | ERROR_VARIABLE ${_PYTHON_PREFIX}_INTERPRETER_ID) | |
506 | if (NOT _${_PYTHON_PREFIX}_RESULT) | |
507 | if (${_PYTHON_PREFIX}_INTERPRETER_ID MATCHES "Anaconda") | |
508 | set (${_PYTHON_PREFIX}_INTERPRETER_ID "Anaconda") | |
509 | elseif (${_PYTHON_PREFIX}_INTERPRETER_ID MATCHES "Enthought") | |
510 | set (${_PYTHON_PREFIX}_INTERPRETER_ID "Canopy") | |
511 | else() | |
512 | string (REGEX REPLACE "^([^ ]+).*" "\\1" ${_PYTHON_PREFIX}_INTERPRETER_ID "${${_PYTHON_PREFIX}_INTERPRETER_ID}") | |
513 | if (${_PYTHON_PREFIX}_INTERPRETER_ID STREQUAL "Python") | |
514 | # try to get a more precise ID | |
515 | execute_process (COMMAND "${${_PYTHON_PREFIX}_EXECUTABLE}" -c "import sys; print(sys.copyright)" | |
516 | RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT | |
517 | OUTPUT_VARIABLE ${_PYTHON_PREFIX}_COPYRIGHT | |
518 | ERROR_QUIET) | |
519 | if (${_PYTHON_PREFIX}_COPYRIGHT MATCHES "ActiveState") | |
520 | set (${_PYTHON_PREFIX}_INTERPRETER_ID "ActivePython") | |
521 | endif() | |
522 | endif() | |
523 | endif() | |
524 | else() | |
525 | set (${_PYTHON_PREFIX}_INTERPRETER_ID Python) | |
526 | endif() | |
527 | else() | |
528 | unset (${_PYTHON_PREFIX}_INTERPRETER_ID) | |
529 | endif() | |
530 | ||
531 | # retrieve various package installation directories | |
532 | execute_process (COMMAND "${${_PYTHON_PREFIX}_EXECUTABLE}" -c "import sys; from distutils import sysconfig;sys.stdout.write(';'.join([sysconfig.get_python_lib(plat_specific=False,standard_lib=True),sysconfig.get_python_lib(plat_specific=True,standard_lib=True),sysconfig.get_python_lib(plat_specific=False,standard_lib=False),sysconfig.get_python_lib(plat_specific=True,standard_lib=False)]))" | |
533 | ||
534 | RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT | |
535 | OUTPUT_VARIABLE _${_PYTHON_PREFIX}_LIBPATHS | |
536 | ERROR_QUIET) | |
537 | if (NOT _${_PYTHON_PREFIX}_RESULT) | |
538 | list (GET _${_PYTHON_PREFIX}_LIBPATHS 0 ${_PYTHON_PREFIX}_STDLIB) | |
539 | list (GET _${_PYTHON_PREFIX}_LIBPATHS 1 ${_PYTHON_PREFIX}_STDARCH) | |
540 | list (GET _${_PYTHON_PREFIX}_LIBPATHS 2 ${_PYTHON_PREFIX}_SITELIB) | |
541 | list (GET _${_PYTHON_PREFIX}_LIBPATHS 3 ${_PYTHON_PREFIX}_SITEARCH) | |
542 | else() | |
543 | unset (${_PYTHON_PREFIX}_STDLIB) | |
544 | unset (${_PYTHON_PREFIX}_STDARCH) | |
545 | unset (${_PYTHON_PREFIX}_SITELIB) | |
546 | unset (${_PYTHON_PREFIX}_SITEARCH) | |
547 | endif() | |
548 | ||
549 | mark_as_advanced (${_PYTHON_PREFIX}_EXECUTABLE) | |
550 | endif() | |
551 | ||
552 | ||
553 | # second step, search for compiler (IronPython) | |
554 | if ("Compiler" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS) | |
555 | list (APPEND _${_PYTHON_PREFIX}_CACHED_VARS ${_PYTHON_PREFIX}_COMPILER) | |
556 | if (${_PYTHON_PREFIX}_FIND_REQUIRED_Compiler) | |
557 | list (APPEND _${_PYTHON_PREFIX}_REQUIRED_VARS ${_PYTHON_PREFIX}_COMPILER) | |
558 | endif() | |
559 | ||
560 | # IronPython specific artifacts | |
561 | # If IronPython interpreter is found, use its path | |
562 | unset (_${_PYTHON_PREFIX}_IRON_ROOT) | |
563 | if (${_PYTHON_PREFIX}_Interpreter_FOUND AND ${_PYTHON_PREFIX}_INTERPRETER_ID STREQUAL "IronPython") | |
564 | get_filename_component (_${_PYTHON_PREFIX}_IRON_ROOT "${${_PYTHON_PREFIX}_EXECUTABLE}" DIRECTORY) | |
565 | endif() | |
566 | ||
567 | # try using root dir and registry | |
568 | foreach (_${_PYTHON_PREFIX}_VERSION IN LISTS _${_PYTHON_PREFIX}_FIND_VERSIONS) | |
569 | if (_${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "FIRST") | |
570 | find_program (${_PYTHON_PREFIX}_COMPILER | |
571 | NAMES ipyc | |
572 | HINTS ${_${_PYTHON_PREFIX}_IRON_ROOT} ${_${_PYTHON_PREFIX}_HINTS} | |
573 | PATHS [HKEY_LOCAL_MACHINE\\SOFTWARE\\IronPython\\${_${_PYTHON_PREFIX}_VERSION}\\InstallPath] | |
574 | PATH_SUFFIXES ${_${_PYTHON_PREFIX}_IRON_PYTHON_PATH_SUFFIXES} | |
575 | NO_SYSTEM_ENVIRONMENT_PATH | |
576 | NO_CMAKE_SYSTEM_PATH) | |
577 | endif() | |
578 | ||
579 | find_program (${_PYTHON_PREFIX}_COMPILER | |
580 | NAMES ipyc | |
581 | HINTS ${_${_PYTHON_PREFIX}_IRON_ROOT} ${_${_PYTHON_PREFIX}_HINTS} | |
582 | PATH_SUFFIXES ${_${_PYTHON_PREFIX}_IRON_PYTHON_PATH_SUFFIXES} | |
583 | NO_SYSTEM_ENVIRONMENT_PATH | |
584 | NO_CMAKE_SYSTEM_PATH) | |
585 | ||
586 | if (_${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "LAST") | |
587 | find_program (${_PYTHON_PREFIX}_COMPILER | |
588 | NAMES ipyc | |
589 | PATHS [HKEY_LOCAL_MACHINE\\SOFTWARE\\IronPython\\${_${_PYTHON_PREFIX}_VERSION}\\InstallPath] | |
590 | PATH_SUFFIXES ${_${_PYTHON_PREFIX}_IRON_PYTHON_PATH_SUFFIXES} | |
591 | NO_DEFAULT_PATH) | |
592 | endif() | |
593 | ||
594 | _python_validate_compiler (${_${_PYTHON_PREFIX}_VERSION}) | |
595 | if (${_PYTHON_PREFIX}_COMPILER) | |
596 | break() | |
597 | endif() | |
598 | endforeach() | |
599 | ||
600 | # no specific version found, re-try in standard paths | |
601 | find_program (${_PYTHON_PREFIX}_COMPILER | |
602 | NAMES ipyc | |
603 | HINTS ${_${_PYTHON_PREFIX}_IRON_ROOT} ${_${_PYTHON_PREFIX}_HINTS} | |
604 | PATH_SUFFIXES ${_${_PYTHON_PREFIX}_IRON_PYTHON_PATH_SUFFIXES}) | |
605 | ||
606 | if (${_PYTHON_PREFIX}_COMPILER) | |
607 | # retrieve python environment version from compiler | |
608 | set (_${_PYTHON_PREFIX}_VERSION_DIR "${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/PythonCompilerVersion.dir") | |
609 | file (WRITE "${_${_PYTHON_PREFIX}_VERSION_DIR}/version.py" "import sys; sys.stdout.write('.'.join([str(x) for x in sys.version_info[:3]]))\n") | |
610 | execute_process (COMMAND "${${_PYTHON_PREFIX}_COMPILER}" /target:exe /embed "${_${_PYTHON_PREFIX}_VERSION_DIR}/version.py" | |
611 | WORKING_DIRECTORY "${_${_PYTHON_PREFIX}_VERSION_DIR}" | |
612 | OUTPUT_QUIET | |
613 | ERROR_QUIET) | |
614 | execute_process (COMMAND "${_${_PYTHON_PREFIX}_VERSION_DIR}/version" | |
615 | WORKING_DIRECTORY "${_${_PYTHON_PREFIX}_VERSION_DIR}" | |
616 | RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT | |
617 | OUTPUT_VARIABLE _${_PYTHON_PREFIX}_VERSION | |
618 | ERROR_QUIET) | |
619 | if (NOT _${_PYTHON_PREFIX}_RESULT) | |
620 | string (REGEX MATCHALL "[0-9]+" _${_PYTHON_PREFIX}_VERSIONS "${_${_PYTHON_PREFIX}_VERSION}") | |
621 | list (GET _${_PYTHON_PREFIX}_VERSIONS 0 _${_PYTHON_PREFIX}_VERSION_MAJOR) | |
622 | list (GET _${_PYTHON_PREFIX}_VERSIONS 1 _${_PYTHON_PREFIX}_VERSION_MINOR) | |
623 | list (GET _${_PYTHON_PREFIX}_VERSIONS 2 _${_PYTHON_PREFIX}_VERSION_PATCH) | |
624 | ||
625 | if (NOT ${_PYTHON_PREFIX}_Interpreter_FOUND) | |
626 | # set public version information | |
627 | set (${_PYTHON_PREFIX}_VERSION ${_${_PYTHON_PREFIX}_VERSION}) | |
628 | set (${_PYTHON_PREFIX}_VERSION_MAJOR ${_${_PYTHON_PREFIX}_VERSION_MAJOR}) | |
629 | set (${_PYTHON_PREFIX}_VERSION_MINOR ${_${_PYTHON_PREFIX}_VERSION_MINOR}) | |
630 | set (${_PYTHON_PREFIX}_VERSION_PATCH ${_${_PYTHON_PREFIX}_VERSION_PATCH}) | |
631 | endif() | |
632 | else() | |
633 | # compiler not usable | |
634 | set (${_PYTHON_PREFIX}_COMPILER ${_PYTHON_PREFIX}_COMPILER-NOTFOUND CACHE INTERNAL "" FORCE) | |
635 | endif() | |
636 | file (REMOVE_RECURSE "${_${_PYTHON_PREFIX}_VERSION_DIR}") | |
637 | endif() | |
638 | ||
639 | if (${_PYTHON_PREFIX}_COMPILER) | |
640 | if (${_PYTHON_PREFIX}_Interpreter_FOUND) | |
641 | # Compiler must be compatible with interpreter | |
642 | if (${_${_PYTHON_PREFIX}_VERSION_MAJOR}.${_${_PYTHON_PREFIX}_VERSION_MINOR} VERSION_EQUAL ${${_PYTHON_PREFIX}_VERSION_MAJOR}.${${_PYTHON_PREFIX}_VERSION_MINOR}) | |
643 | set (${_PYTHON_PREFIX}_Compiler_FOUND TRUE) | |
644 | endif() | |
645 | elseif (${_PYTHON_PREFIX}_VERSION_MAJOR VERSION_EQUAL _${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR) | |
646 | set (${_PYTHON_PREFIX}_Compiler_FOUND TRUE) | |
647 | # Use compiler version for future searches to ensure consistency | |
648 | set (_${_PYTHON_PREFIX}_FIND_VERSIONS ${${_PYTHON_PREFIX}_VERSION_MAJOR}.${${_PYTHON_PREFIX}_VERSION_MINOR}) | |
649 | endif() | |
650 | endif() | |
651 | ||
652 | if (${_PYTHON_PREFIX}_Compiler_FOUND) | |
653 | set (${_PYTHON_PREFIX}_COMPILER_ID IronPython) | |
654 | else() | |
655 | unset (${_PYTHON_PREFIX}_COMPILER_ID) | |
656 | endif() | |
657 | ||
658 | mark_as_advanced (${_PYTHON_PREFIX}_COMPILER) | |
659 | endif() | |
660 | ||
661 | ||
662 | # third step, search for the development artifacts | |
663 | ## Development environment is not compatible with IronPython interpreter | |
664 | if ("Development" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS | |
665 | AND NOT ${_PYTHON_PREFIX}_INTERPRETER_ID STREQUAL "IronPython") | |
666 | list (APPEND _${_PYTHON_PREFIX}_CACHED_VARS ${_PYTHON_PREFIX}_LIBRARY | |
667 | ${_PYTHON_PREFIX}_LIBRARY_RELEASE | |
668 | ${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE | |
669 | ${_PYTHON_PREFIX}_LIBRARY_DEBUG | |
670 | ${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DEBUG | |
671 | ${_PYTHON_PREFIX}_INCLUDE_DIR) | |
672 | if (${_PYTHON_PREFIX}_FIND_REQUIRED_Development) | |
673 | list (APPEND _${_PYTHON_PREFIX}_REQUIRED_VARS ${_PYTHON_PREFIX}_LIBRARY | |
674 | ${_PYTHON_PREFIX}_INCLUDE_DIR) | |
675 | endif() | |
676 | ||
677 | # Support preference of static libs by adjusting CMAKE_FIND_LIBRARY_SUFFIXES | |
678 | unset (_${_PYTHON_PREFIX}_CMAKE_FIND_LIBRARY_SUFFIXES) | |
679 | if (DEFINED ${_PYTHON_PREFIX}_USE_STATIC_LIBS AND NOT WIN32) | |
680 | set(_${_PYTHON_PREFIX}_CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES}) | |
681 | if(${_PYTHON_PREFIX}_USE_STATIC_LIBS) | |
682 | set (CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_STATIC_LIBRARY_SUFFIX}) | |
683 | else() | |
684 | list (REMOVE_ITEM CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_STATIC_LIBRARY_SUFFIX}) | |
685 | endif() | |
686 | else() | |
687 | endif() | |
688 | ||
689 | # if python interpreter is found, use its location and version to ensure consistency | |
690 | # between interpreter and development environment | |
691 | unset (_${_PYTHON_PREFIX}_PREFIX) | |
692 | if (${_PYTHON_PREFIX}_Interpreter_FOUND) | |
693 | execute_process (COMMAND "${${_PYTHON_PREFIX}_EXECUTABLE}" -c | |
694 | "import sys; from distutils import sysconfig; sys.stdout.write(sysconfig.PREFIX)" | |
695 | RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT | |
696 | OUTPUT_VARIABLE _${_PYTHON_PREFIX}_PREFIX | |
697 | ERROR_QUIET | |
698 | OUTPUT_STRIP_TRAILING_WHITESPACE) | |
699 | if (_${_PYTHON_PREFIX}_RESULT) | |
700 | unset (_${_PYTHON_PREFIX}_PREFIX) | |
701 | endif() | |
702 | endif() | |
703 | set (_${_PYTHON_PREFIX}_HINTS "${_${_PYTHON_PREFIX}_PREFIX}" "${${_PYTHON_PREFIX}_ROOT_DIR}" ENV ${_PYTHON_PREFIX}_ROOT_DIR) | |
704 | ||
705 | foreach (_${_PYTHON_PREFIX}_VERSION IN LISTS _${_PYTHON_PREFIX}_FIND_VERSIONS) | |
706 | string (REPLACE "." "" _${_PYTHON_PREFIX}_VERSION_NO_DOTS ${_${_PYTHON_PREFIX}_VERSION}) | |
707 | ||
708 | # try to use pythonX.Y-config tool | |
709 | set (_${_PYTHON_PREFIX}_CONFIG_NAMES) | |
710 | if (DEFINED CMAKE_LIBRARY_ARCHITECTURE) | |
711 | set (_${_PYTHON_PREFIX}_CONFIG_NAMES "${CMAKE_LIBRARY_ARCHITECTURE}-python${_${_PYTHON_PREFIX}_VERSION}-config") | |
712 | endif() | |
713 | list (APPEND _${_PYTHON_PREFIX}_CONFIG_NAMES "python${_${_PYTHON_PREFIX}_VERSION}-config") | |
714 | find_program (_${_PYTHON_PREFIX}_CONFIG | |
715 | NAMES ${_${_PYTHON_PREFIX}_CONFIG_NAMES} | |
716 | NAMES_PER_DIR | |
717 | HINTS ${_${_PYTHON_PREFIX}_HINTS} | |
718 | PATH_SUFFIXES bin) | |
719 | unset (_${_PYTHON_PREFIX}_CONFIG_NAMES) | |
720 | ||
721 | if (NOT _${_PYTHON_PREFIX}_CONFIG) | |
722 | continue() | |
723 | endif() | |
724 | if (DEFINED CMAKE_LIBRARY_ARCHITECTURE) | |
725 | # check that config tool match library architecture | |
726 | execute_process (COMMAND "${_${_PYTHON_PREFIX}_CONFIG}" --configdir | |
727 | RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT | |
728 | OUTPUT_VARIABLE _${_PYTHON_PREFIX}_CONFIGDIR | |
729 | ERROR_QUIET | |
730 | OUTPUT_STRIP_TRAILING_WHITESPACE) | |
731 | if (_${_PYTHON_PREFIX}_RESULT) | |
732 | unset (_${_PYTHON_PREFIX}_CONFIG CACHE) | |
733 | continue() | |
734 | endif() | |
735 | string(FIND "${_${_PYTHON_PREFIX}_CONFIGDIR}" "${CMAKE_LIBRARY_ARCHITECTURE}" _${_PYTHON_PREFIX}_RESULT) | |
736 | if (_${_PYTHON_PREFIX}_RESULT EQUAL -1) | |
737 | unset (_${_PYTHON_PREFIX}_CONFIG CACHE) | |
738 | continue() | |
739 | endif() | |
740 | endif() | |
741 | ||
742 | # retrieve root install directory | |
743 | execute_process (COMMAND "${_${_PYTHON_PREFIX}_CONFIG}" --prefix | |
744 | RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT | |
745 | OUTPUT_VARIABLE _${_PYTHON_PREFIX}_PREFIX | |
746 | ERROR_QUIET | |
747 | OUTPUT_STRIP_TRAILING_WHITESPACE) | |
748 | if (_${_PYTHON_PREFIX}_RESULT) | |
749 | # python-config is not usable | |
750 | unset (_${_PYTHON_PREFIX}_CONFIG CACHE) | |
751 | continue() | |
752 | endif() | |
753 | set (_${_PYTHON_PREFIX}_HINTS "${_${_PYTHON_PREFIX}_PREFIX}" "${${_PYTHON_PREFIX}_ROOT_DIR}" ENV ${_PYTHON_PREFIX}_ROOT_DIR) | |
754 | ||
755 | # retrieve library | |
756 | execute_process (COMMAND "${_${_PYTHON_PREFIX}_CONFIG}" --ldflags | |
757 | RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT | |
758 | OUTPUT_VARIABLE _${_PYTHON_PREFIX}_FLAGS | |
759 | ERROR_QUIET | |
760 | OUTPUT_STRIP_TRAILING_WHITESPACE) | |
761 | if (NOT _${_PYTHON_PREFIX}_RESULT) | |
762 | # retrieve library directory | |
763 | string (REGEX MATCHALL "-L[^ ]+" _${_PYTHON_PREFIX}_LIB_DIRS "${_${_PYTHON_PREFIX}_FLAGS}") | |
764 | string (REPLACE "-L" "" _${_PYTHON_PREFIX}_LIB_DIRS "${_${_PYTHON_PREFIX}_LIB_DIRS}") | |
765 | list (REMOVE_DUPLICATES _${_PYTHON_PREFIX}_LIB_DIRS) | |
766 | # retrieve library name | |
767 | string (REGEX MATCHALL "-lpython[^ ]+" _${_PYTHON_PREFIX}_LIB_NAMES "${_${_PYTHON_PREFIX}_FLAGS}") | |
768 | string (REPLACE "-l" "" _${_PYTHON_PREFIX}_LIB_NAMES "${_${_PYTHON_PREFIX}_LIB_NAMES}") | |
769 | list (REMOVE_DUPLICATES _${_PYTHON_PREFIX}_LIB_NAMES) | |
770 | ||
771 | find_library (${_PYTHON_PREFIX}_LIBRARY_RELEASE | |
772 | NAMES ${_${_PYTHON_PREFIX}_LIB_NAMES} | |
773 | NAMES_PER_DIR | |
774 | HINTS ${_${_PYTHON_PREFIX}_HINTS} ${_${_PYTHON_PREFIX}_LIB_DIRS} | |
775 | PATH_SUFFIXES lib | |
776 | NO_SYSTEM_ENVIRONMENT_PATH | |
777 | NO_CMAKE_SYSTEM_PATH) | |
778 | # retrieve runtime library | |
779 | if (${_PYTHON_PREFIX}_LIBRARY_RELEASE) | |
780 | get_filename_component (_${_PYTHON_PREFIX}_PATH "${${_PYTHON_PREFIX}_LIBRARY_RELEASE}" DIRECTORY) | |
781 | get_filename_component (_${_PYTHON_PREFIX}_PATH2 "${_${_PYTHON_PREFIX}_PATH}" DIRECTORY) | |
782 | _python_find_runtime_library (${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE | |
783 | NAMES ${_${_PYTHON_PREFIX}_LIB_NAMES} | |
784 | NAMES_PER_DIR | |
785 | HINTS "${_${_PYTHON_PREFIX}_PATH}" "${_${_PYTHON_PREFIX}_PATH2}" ${_${_PYTHON_PREFIX}_HINTS} | |
786 | PATH_SUFFIXES bin | |
787 | NO_SYSTEM_ENVIRONMENT_PATH | |
788 | NO_CMAKE_SYSTEM_PATH) | |
789 | endif() | |
790 | endif() | |
791 | ||
792 | # retrieve include directory | |
793 | execute_process (COMMAND "${_${_PYTHON_PREFIX}_CONFIG}" --includes | |
794 | RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT | |
795 | OUTPUT_VARIABLE _${_PYTHON_PREFIX}_FLAGS | |
796 | ERROR_QUIET | |
797 | OUTPUT_STRIP_TRAILING_WHITESPACE) | |
798 | if (NOT _${_PYTHON_PREFIX}_RESULT) | |
799 | # retrieve include directory | |
800 | string (REGEX MATCHALL "-I[^ ]+" _${_PYTHON_PREFIX}_INCLUDE_DIRS "${_${_PYTHON_PREFIX}_FLAGS}") | |
801 | string (REPLACE "-I" "" _${_PYTHON_PREFIX}_INCLUDE_DIRS "${_${_PYTHON_PREFIX}_INCLUDE_DIRS}") | |
802 | list (REMOVE_DUPLICATES _${_PYTHON_PREFIX}_INCLUDE_DIRS) | |
803 | ||
804 | find_path (${_PYTHON_PREFIX}_INCLUDE_DIR | |
805 | NAMES Python.h | |
806 | HINTS ${_${_PYTHON_PREFIX}_INCLUDE_DIRS} | |
807 | NO_SYSTEM_ENVIRONMENT_PATH | |
808 | NO_CMAKE_SYSTEM_PATH) | |
809 | endif() | |
810 | ||
811 | if (${_PYTHON_PREFIX}_LIBRARY_RELEASE AND ${_PYTHON_PREFIX}_INCLUDE_DIR) | |
812 | break() | |
813 | endif() | |
814 | endforeach() | |
815 | ||
816 | # Rely on HINTS and standard paths if config tool failed to locate artifacts | |
817 | if (NOT (${_PYTHON_PREFIX}_LIBRARY_RELEASE OR ${_PYTHON_PREFIX}_LIBRARY_DEBUG) OR NOT ${_PYTHON_PREFIX}_INCLUDE_DIR) | |
818 | foreach (_${_PYTHON_PREFIX}_VERSION IN LISTS _${_PYTHON_PREFIX}_FIND_VERSIONS) | |
819 | string (REPLACE "." "" _${_PYTHON_PREFIX}_VERSION_NO_DOTS ${_${_PYTHON_PREFIX}_VERSION}) | |
820 | ||
821 | _python_get_frameworks (_${_PYTHON_PREFIX}_FRAMEWORK_PATHS ${_${_PYTHON_PREFIX}_VERSION}) | |
822 | ||
823 | set (_${_PYTHON_PREFIX}_REGISTRY_PATHS | |
824 | [HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\${_${_PYTHON_PREFIX}_VERSION}-${_${_PYTHON_PREFIX}_ARCH}\\InstallPath] | |
825 | [HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\${_${_PYTHON_PREFIX}_VERSION}-${_${_PYTHON_PREFIX}_ARCH2}\\InstallPath] | |
826 | [HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\${_${_PYTHON_PREFIX}_VERSION}\\InstallPath] | |
827 | [HKEY_CURRENT_USER\\SOFTWARE\\Python\\ContinuumAnalytics\\Anaconda${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}-${_${_PYTHON_PREFIX}_ARCH}\\InstallPath] | |
828 | [HKEY_CURRENT_USER\\SOFTWARE\\Python\\ContinuumAnalytics\\Anaconda${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}-${_${_PYTHON_PREFIX}_ARCH2}\\InstallPath] | |
829 | [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\${_${_PYTHON_PREFIX}_VERSION}-${_${_PYTHON_PREFIX}_ARCH}\\InstallPath] | |
830 | [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\${_${_PYTHON_PREFIX}_VERSION}-${_${_PYTHON_PREFIX}_ARCH2}\\InstallPath] | |
831 | [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\${_${_PYTHON_PREFIX}_VERSION}\\InstallPath] | |
832 | [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\ContinuumAnalytics\\Anaconda${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}-${_${_PYTHON_PREFIX}_ARCH}\\InstallPath] | |
833 | [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\ContinuumAnalytics\\Anaconda${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}-${_${_PYTHON_PREFIX}_ARCH2}\\InstallPath]) | |
834 | ||
835 | if (APPLE AND _${_PYTHON_PREFIX}_FIND_FRAMEWORK STREQUAL "FIRST") | |
836 | find_library (${_PYTHON_PREFIX}_LIBRARY_RELEASE | |
837 | NAMES python${_${_PYTHON_PREFIX}_VERSION_NO_DOTS} | |
838 | python${_${_PYTHON_PREFIX}_VERSION}mu | |
839 | python${_${_PYTHON_PREFIX}_VERSION}m | |
840 | python${_${_PYTHON_PREFIX}_VERSION}u | |
841 | python${_${_PYTHON_PREFIX}_VERSION} | |
842 | NAMES_PER_DIR | |
843 | PATHS ${_${_PYTHON_PREFIX}_FRAMEWORK_PATHS} | |
844 | PATH_SUFFIXES lib/${CMAKE_LIBRARY_ARCHITECTURE} lib libs | |
845 | lib/python${_${_PYTHON_PREFIX}_VERSION}/config-${_${_PYTHON_PREFIX}_VERSION}mu | |
846 | lib/python${_${_PYTHON_PREFIX}_VERSION}/config-${_${_PYTHON_PREFIX}_VERSION}m | |
847 | lib/python${_${_PYTHON_PREFIX}_VERSION}/config-${_${_PYTHON_PREFIX}_VERSION}u | |
848 | lib/python${_${_PYTHON_PREFIX}_VERSION}/config-${_${_PYTHON_PREFIX}_VERSION} | |
849 | lib/python${_${_PYTHON_PREFIX}_VERSION}/config | |
850 | NO_CMAKE_PATH | |
851 | NO_CMAKE_ENVIRONMENT_PATH | |
852 | NO_SYSTEM_ENVIRONMENT_PATH | |
853 | NO_CMAKE_SYSTEM_PATH) | |
854 | endif() | |
855 | ||
856 | if (WIN32 AND _${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "FIRST") | |
857 | find_library (${_PYTHON_PREFIX}_LIBRARY_RELEASE | |
858 | NAMES python${_${_PYTHON_PREFIX}_VERSION_NO_DOTS} | |
859 | python${_${_PYTHON_PREFIX}_VERSION}mu | |
860 | python${_${_PYTHON_PREFIX}_VERSION}m | |
861 | python${_${_PYTHON_PREFIX}_VERSION}u | |
862 | python${_${_PYTHON_PREFIX}_VERSION} | |
863 | NAMES_PER_DIR | |
864 | HINTS ${_${_PYTHON_PREFIX}_HINTS} | |
865 | PATHS ${_${_PYTHON_PREFIX}_REGISTRY_PATHS} | |
866 | PATH_SUFFIXES lib/${CMAKE_LIBRARY_ARCHITECTURE} lib libs | |
867 | lib/python${_${_PYTHON_PREFIX}_VERSION}/config-${_${_PYTHON_PREFIX}_VERSION}mu | |
868 | lib/python${_${_PYTHON_PREFIX}_VERSION}/config-${_${_PYTHON_PREFIX}_VERSION}m | |
869 | lib/python${_${_PYTHON_PREFIX}_VERSION}/config-${_${_PYTHON_PREFIX}_VERSION}u | |
870 | lib/python${_${_PYTHON_PREFIX}_VERSION}/config-${_${_PYTHON_PREFIX}_VERSION} | |
871 | lib/python${_${_PYTHON_PREFIX}_VERSION}/config | |
872 | NO_SYSTEM_ENVIRONMENT_PATH | |
873 | NO_CMAKE_SYSTEM_PATH) | |
874 | endif() | |
875 | ||
876 | # search in HINTS locations | |
877 | find_library (${_PYTHON_PREFIX}_LIBRARY_RELEASE | |
878 | NAMES python${_${_PYTHON_PREFIX}_VERSION_NO_DOTS} | |
879 | python${_${_PYTHON_PREFIX}_VERSION}mu | |
880 | python${_${_PYTHON_PREFIX}_VERSION}m | |
881 | python${_${_PYTHON_PREFIX}_VERSION}u | |
882 | python${_${_PYTHON_PREFIX}_VERSION} | |
883 | NAMES_PER_DIR | |
884 | HINTS ${_${_PYTHON_PREFIX}_HINTS} | |
885 | PATH_SUFFIXES lib/${CMAKE_LIBRARY_ARCHITECTURE} lib libs | |
886 | lib/python${_${_PYTHON_PREFIX}_VERSION}/config-${_${_PYTHON_PREFIX}_VERSION}mu | |
887 | lib/python${_${_PYTHON_PREFIX}_VERSION}/config-${_${_PYTHON_PREFIX}_VERSION}m | |
888 | lib/python${_${_PYTHON_PREFIX}_VERSION}/config-${_${_PYTHON_PREFIX}_VERSION}u | |
889 | lib/python${_${_PYTHON_PREFIX}_VERSION}/config-${_${_PYTHON_PREFIX}_VERSION} | |
890 | lib/python${_${_PYTHON_PREFIX}_VERSION}/config | |
891 | NO_SYSTEM_ENVIRONMENT_PATH | |
892 | NO_CMAKE_SYSTEM_PATH) | |
893 | ||
894 | if (APPLE AND _${_PYTHON_PREFIX}_FIND_FRAMEWORK STREQUAL "LAST") | |
895 | set (__${_PYTHON_PREFIX}_FRAMEWORK_PATHS ${_${_PYTHON_PREFIX}_FRAMEWORK_PATHS}) | |
896 | else() | |
897 | unset (__${_PYTHON_PREFIX}_FRAMEWORK_PATHS) | |
898 | endif() | |
899 | ||
900 | if (WIN32 AND _${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "LAST") | |
901 | set (__${_PYTHON_PREFIX}_REGISTRY_PATHS ${_${_PYTHON_PREFIX}_REGISTRY_PATHS}) | |
902 | else() | |
903 | unset (__${_PYTHON_PREFIX}_REGISTRY_PATHS) | |
904 | endif() | |
905 | ||
906 | # search in all default paths | |
907 | find_library (${_PYTHON_PREFIX}_LIBRARY_RELEASE | |
908 | NAMES python${_${_PYTHON_PREFIX}_VERSION_NO_DOTS} | |
909 | python${_${_PYTHON_PREFIX}_VERSION}mu | |
910 | python${_${_PYTHON_PREFIX}_VERSION}m | |
911 | python${_${_PYTHON_PREFIX}_VERSION}u | |
912 | python${_${_PYTHON_PREFIX}_VERSION} | |
913 | NAMES_PER_DIR | |
914 | PATHS ${__${_PYTHON_PREFIX}_FRAMEWORK_PATHS} | |
915 | ${__${_PYTHON_PREFIX}_REGISTRY_PATHS} | |
916 | PATH_SUFFIXES lib/${CMAKE_LIBRARY_ARCHITECTURE} lib libs | |
917 | lib/python${_${_PYTHON_PREFIX}_VERSION}/config-${_${_PYTHON_PREFIX}_VERSION}mu | |
918 | lib/python${_${_PYTHON_PREFIX}_VERSION}/config-${_${_PYTHON_PREFIX}_VERSION}m | |
919 | lib/python${_${_PYTHON_PREFIX}_VERSION}/config-${_${_PYTHON_PREFIX}_VERSION}u | |
920 | lib/python${_${_PYTHON_PREFIX}_VERSION}/config-${_${_PYTHON_PREFIX}_VERSION} | |
921 | lib/python${_${_PYTHON_PREFIX}_VERSION}/config) | |
922 | # retrieve runtime library | |
923 | if (${_PYTHON_PREFIX}_LIBRARY_RELEASE) | |
924 | get_filename_component (_${_PYTHON_PREFIX}_PATH "${${_PYTHON_PREFIX}_LIBRARY_RELEASE}" DIRECTORY) | |
925 | get_filename_component (_${_PYTHON_PREFIX}_PATH2 "${_${_PYTHON_PREFIX}_PATH}" DIRECTORY) | |
926 | _python_find_runtime_library (${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE | |
927 | NAMES python${_${_PYTHON_PREFIX}_VERSION_NO_DOTS} | |
928 | python${_${_PYTHON_PREFIX}_VERSION}mu | |
929 | python${_${_PYTHON_PREFIX}_VERSION}m | |
930 | python${_${_PYTHON_PREFIX}_VERSION}u | |
931 | python${_${_PYTHON_PREFIX}_VERSION} | |
932 | NAMES_PER_DIR | |
933 | HINTS "${_${_PYTHON_PREFIX}_PATH}" "${_${_PYTHON_PREFIX}_PATH2}" ${_${_PYTHON_PREFIX}_HINTS} | |
934 | PATH_SUFFIXES bin) | |
935 | endif() | |
936 | ||
937 | if (WIN32) | |
938 | # search for debug library | |
939 | if (${_PYTHON_PREFIX}_LIBRARY_RELEASE) | |
940 | # use library location as a hint | |
941 | get_filename_component (_${_PYTHON_PREFIX}_PATH "${${_PYTHON_PREFIX}_LIBRARY_RELEASE}" DIRECTORY) | |
942 | find_library (${_PYTHON_PREFIX}_LIBRARY_DEBUG | |
943 | NAMES python${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}_d | |
944 | NAMES_PER_DIR | |
945 | HINTS "${_${_PYTHON_PREFIX}_PATH}" ${_${_PYTHON_PREFIX}_HINTS} | |
946 | NO_DEFAULT_PATH) | |
947 | else() | |
948 | # search first in known locations | |
949 | if (_${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "FIRST") | |
950 | find_library (${_PYTHON_PREFIX}_LIBRARY_DEBUG | |
951 | NAMES python${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}_d | |
952 | NAMES_PER_DIR | |
953 | HINTS ${_${_PYTHON_PREFIX}_HINTS} | |
954 | PATHS ${_${_PYTHON_PREFIX}_REGISTRY_PATHS} | |
955 | PATH_SUFFIXES lib libs | |
956 | NO_SYSTEM_ENVIRONMENT_PATH | |
957 | NO_CMAKE_SYSTEM_PATH) | |
958 | endif() | |
959 | # search in all default paths | |
960 | find_library (${_PYTHON_PREFIX}_LIBRARY_DEBUG | |
961 | NAMES python${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}_d | |
962 | NAMES_PER_DIR | |
963 | HINTS ${_${_PYTHON_PREFIX}_HINTS} | |
964 | PATHS ${__${_PYTHON_PREFIX}_REGISTRY_PATHS} | |
965 | PATH_SUFFIXES lib libs) | |
966 | endif() | |
967 | if (${_PYTHON_PREFIX}_LIBRARY_DEBUG) | |
968 | get_filename_component (_${_PYTHON_PREFIX}_PATH "${${_PYTHON_PREFIX}_LIBRARY_DEBUG}" DIRECTORY) | |
969 | get_filename_component (_${_PYTHON_PREFIX}_PATH2 "${_${_PYTHON_PREFIX}_PATH}" DIRECTORY) | |
970 | _python_find_runtime_library (${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DEBUG | |
971 | NAMES python${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}_d | |
972 | NAMES_PER_DIR | |
973 | HINTS "${_${_PYTHON_PREFIX}_PATH}" "${_${_PYTHON_PREFIX}_PATH2}" ${_${_PYTHON_PREFIX}_HINTS} | |
974 | PATH_SUFFIXES bin) | |
975 | endif() | |
976 | endif() | |
977 | ||
978 | # Don't search for include dir until library location is known | |
979 | if (${_PYTHON_PREFIX}_LIBRARY_RELEASE OR ${_PYTHON_PREFIX}_LIBRARY_DEBUG) | |
980 | unset (_${_PYTHON_PREFIX}_INCLUDE_HINTS) | |
981 | ||
982 | if (${_PYTHON_PREFIX}_EXECUTABLE) | |
983 | # pick up include directory from configuration | |
984 | execute_process (COMMAND "${${_PYTHON_PREFIX}_EXECUTABLE}" -c | |
985 | "import sys; import sysconfig; sys.stdout.write(sysconfig.get_path('include'))" | |
986 | RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT | |
987 | OUTPUT_VARIABLE _${_PYTHON_PREFIX}_PATH | |
988 | ERROR_QUIET | |
989 | OUTPUT_STRIP_TRAILING_WHITESPACE) | |
990 | if (NOT _${_PYTHON_PREFIX}_RESULT) | |
991 | file (TO_CMAKE_PATH "${_${_PYTHON_PREFIX}_PATH}" _${_PYTHON_PREFIX}_PATH) | |
992 | list (APPEND _${_PYTHON_PREFIX}_INCLUDE_HINTS "${_${_PYTHON_PREFIX}_PATH}") | |
993 | endif() | |
994 | endif() | |
995 | ||
996 | foreach (_${_PYTHON_PREFIX}_LIB IN ITEMS ${_PYTHON_PREFIX}_LIBRARY_RELEASE ${_PYTHON_PREFIX}_LIBRARY_DEBUG) | |
997 | if (${_${_PYTHON_PREFIX}_LIB}) | |
998 | # Use the library's install prefix as a hint | |
999 | if (${_${_PYTHON_PREFIX}_LIB} MATCHES "^(.+/Frameworks/Python.framework/Versions/[0-9.]+)") | |
1000 | list (APPEND _${_PYTHON_PREFIX}_INCLUDE_HINTS "${CMAKE_MATCH_1}") | |
1001 | elseif (${_${_PYTHON_PREFIX}_LIB} MATCHES "^(.+)/lib(64|32)?/python[0-9.]+/config") | |
1002 | list (APPEND _${_PYTHON_PREFIX}_INCLUDE_HINTS "${CMAKE_MATCH_1}") | |
1003 | elseif (DEFINED CMAKE_LIBRARY_ARCHITECTURE AND ${_${_PYTHON_PREFIX}_LIB} MATCHES "^(.+)/lib/${CMAKE_LIBRARY_ARCHITECTURE}") | |
1004 | list (APPEND _${_PYTHON_PREFIX}_INCLUDE_HINTS "${CMAKE_MATCH_1}") | |
1005 | else() | |
1006 | # assume library is in a directory under root | |
1007 | get_filename_component (_${_PYTHON_PREFIX}_PREFIX "${${_${_PYTHON_PREFIX}_LIB}}" DIRECTORY) | |
1008 | get_filename_component (_${_PYTHON_PREFIX}_PREFIX "${_${_PYTHON_PREFIX}_PREFIX}" DIRECTORY) | |
1009 | list (APPEND _${_PYTHON_PREFIX}_INCLUDE_HINTS "${_${_PYTHON_PREFIX}_PREFIX}") | |
1010 | endif() | |
1011 | endif() | |
1012 | endforeach() | |
1013 | list (REMOVE_DUPLICATES _${_PYTHON_PREFIX}_INCLUDE_HINTS) | |
1014 | ||
1015 | if (APPLE AND _${_PYTHON_PREFIX}_FIND_FRAMEWORK STREQUAL "FIRST") | |
1016 | find_path (${_PYTHON_PREFIX}_INCLUDE_DIR | |
1017 | NAMES Python.h | |
1018 | HINTS ${_${_PYTHON_PREFIX}_HINTS} | |
1019 | PATHS ${_${_PYTHON_PREFIX}_FRAMEWORK_PATHS} | |
1020 | PATH_SUFFIXES include/python${_${_PYTHON_PREFIX}_VERSION}mu | |
1021 | include/python${_${_PYTHON_PREFIX}_VERSION}m | |
1022 | include/python${_${_PYTHON_PREFIX}_VERSION}u | |
1023 | include/python${_${_PYTHON_PREFIX}_VERSION} | |
1024 | include | |
1025 | NO_CMAKE_PATH | |
1026 | NO_CMAKE_ENVIRONMENT_PATH | |
1027 | NO_SYSTEM_ENVIRONMENT_PATH | |
1028 | NO_CMAKE_SYSTEM_PATH) | |
1029 | endif() | |
1030 | ||
1031 | if (WIN32 AND _${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "FIRST") | |
1032 | find_path (${_PYTHON_PREFIX}_INCLUDE_DIR | |
1033 | NAMES Python.h | |
1034 | HINTS ${_${_PYTHON_PREFIX}_INCLUDE_HINTS} ${_${_PYTHON_PREFIX}_HINTS} | |
1035 | PATHS ${_${_PYTHON_PREFIX}_REGISTRY_PATHS} | |
1036 | PATH_SUFFIXES include/python${_${_PYTHON_PREFIX}_VERSION}mu | |
1037 | include/python${_${_PYTHON_PREFIX}_VERSION}m | |
1038 | include/python${_${_PYTHON_PREFIX}_VERSION}u | |
1039 | include/python${_${_PYTHON_PREFIX}_VERSION} | |
1040 | include | |
1041 | NO_SYSTEM_ENVIRONMENT_PATH | |
1042 | NO_CMAKE_SYSTEM_PATH) | |
1043 | endif() | |
1044 | ||
1045 | find_path (${_PYTHON_PREFIX}_INCLUDE_DIR | |
1046 | NAMES Python.h | |
1047 | HINTS ${_${_PYTHON_PREFIX}_INCLUDE_HINTS} ${_${_PYTHON_PREFIX}_HINTS} | |
1048 | PATHS ${__${_PYTHON_PREFIX}_FRAMEWORK_PATHS} | |
1049 | ${__${_PYTHON_PREFIX}_REGISTRY_PATHS} | |
1050 | PATH_SUFFIXES include/python${_${_PYTHON_PREFIX}_VERSION}mu | |
1051 | include/python${_${_PYTHON_PREFIX}_VERSION}m | |
1052 | include/python${_${_PYTHON_PREFIX}_VERSION}u | |
1053 | include/python${_${_PYTHON_PREFIX}_VERSION} | |
1054 | include | |
1055 | NO_SYSTEM_ENVIRONMENT_PATH | |
1056 | NO_CMAKE_SYSTEM_PATH) | |
1057 | endif() | |
1058 | ||
1059 | if ((${_PYTHON_PREFIX}_LIBRARY_RELEASE OR ${_PYTHON_PREFIX}_LIBRARY_DEBUG) AND ${_PYTHON_PREFIX}_INCLUDE_DIR) | |
1060 | break() | |
1061 | endif() | |
1062 | endforeach() | |
1063 | ||
1064 | # search header file in standard locations | |
1065 | find_path (${_PYTHON_PREFIX}_INCLUDE_DIR | |
1066 | NAMES Python.h) | |
1067 | endif() | |
1068 | ||
1069 | if (${_PYTHON_PREFIX}_INCLUDE_DIR) | |
1070 | # retrieve version from header file | |
1071 | file (STRINGS "${${_PYTHON_PREFIX}_INCLUDE_DIR}/patchlevel.h" _${_PYTHON_PREFIX}_VERSION | |
1072 | REGEX "^#define[ \t]+PY_VERSION[ \t]+\"[^\"]+\"") | |
1073 | string (REGEX REPLACE "^#define[ \t]+PY_VERSION[ \t]+\"([^\"]+)\".*" "\\1" | |
1074 | _${_PYTHON_PREFIX}_VERSION "${_${_PYTHON_PREFIX}_VERSION}") | |
1075 | string (REGEX MATCHALL "[0-9]+" _${_PYTHON_PREFIX}_VERSIONS "${_${_PYTHON_PREFIX}_VERSION}") | |
1076 | list (GET _${_PYTHON_PREFIX}_VERSIONS 0 _${_PYTHON_PREFIX}_VERSION_MAJOR) | |
1077 | list (GET _${_PYTHON_PREFIX}_VERSIONS 1 _${_PYTHON_PREFIX}_VERSION_MINOR) | |
1078 | list (GET _${_PYTHON_PREFIX}_VERSIONS 2 _${_PYTHON_PREFIX}_VERSION_PATCH) | |
1079 | ||
1080 | if (NOT ${_PYTHON_PREFIX}_Interpreter_FOUND AND NOT ${_PYTHON_PREFIX}_Compiler_FOUND) | |
1081 | # set public version information | |
1082 | set (${_PYTHON_PREFIX}_VERSION ${_${_PYTHON_PREFIX}_VERSION}) | |
1083 | set (${_PYTHON_PREFIX}_VERSION_MAJOR ${_${_PYTHON_PREFIX}_VERSION_MAJOR}) | |
1084 | set (${_PYTHON_PREFIX}_VERSION_MINOR ${_${_PYTHON_PREFIX}_VERSION_MINOR}) | |
1085 | set (${_PYTHON_PREFIX}_VERSION_PATCH ${_${_PYTHON_PREFIX}_VERSION_PATCH}) | |
1086 | endif() | |
1087 | endif() | |
1088 | ||
1089 | # define public variables | |
1090 | include (SelectLibraryConfigurations) | |
1091 | select_library_configurations (${_PYTHON_PREFIX}) | |
1092 | if (${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE) | |
1093 | set (${_PYTHON_PREFIX}_RUNTIME_LIBRARY "${${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE}") | |
1094 | elseif (${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DEBUG) | |
1095 | set (${_PYTHON_PREFIX}_RUNTIME_LIBRARY "${${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DEBUG}") | |
1096 | else() | |
1097 | set (${_PYTHON_PREFIX}_RUNTIME_LIBRARY "$${_PYTHON_PREFIX}_RUNTIME_LIBRARY-NOTFOUND") | |
1098 | endif() | |
1099 | ||
1100 | _python_set_library_dirs (${_PYTHON_PREFIX}_LIBRARY_DIRS | |
1101 | ${_PYTHON_PREFIX}_LIBRARY_RELEASE ${_PYTHON_PREFIX}_LIBRARY_DEBUG) | |
1102 | if (UNIX) | |
1103 | if (${_PYTHON_PREFIX}_LIBRARY_RELEASE MATCHES "${CMAKE_SHARED_LIBRARY_SUFFIX}$" | |
1104 | OR ${_PYTHON_PREFIX}_LIBRARY_RELEASE MATCHES "${CMAKE_SHARED_LIBRARY_SUFFIX}$") | |
1105 | set (${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DIRS ${${_PYTHON_PREFIX}_LIBRARY_DIRS}) | |
1106 | endif() | |
1107 | else() | |
1108 | _python_set_library_dirs (${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DIRS | |
1109 | ${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE ${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DEBUG) | |
1110 | endif() | |
1111 | ||
1112 | set (${_PYTHON_PREFIX}_INCLUDE_DIRS "${${_PYTHON_PREFIX}_INCLUDE_DIR}") | |
1113 | ||
1114 | mark_as_advanced (${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE | |
1115 | ${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DEBUG | |
1116 | ${_PYTHON_PREFIX}_INCLUDE_DIR) | |
1117 | ||
1118 | if ((${_PYTHON_PREFIX}_LIBRARY_RELEASE OR ${_PYTHON_PREFIX}_LIBRARY_DEBUG) | |
1119 | AND ${_PYTHON_PREFIX}_INCLUDE_DIR) | |
1120 | if (${_PYTHON_PREFIX}_Interpreter_FOUND OR ${_PYTHON_PREFIX}_Compiler_FOUND) | |
1121 | # development environment must be compatible with interpreter/compiler | |
1122 | if (${_${_PYTHON_PREFIX}_VERSION_MAJOR}.${_${_PYTHON_PREFIX}_VERSION_MINOR} VERSION_EQUAL ${${_PYTHON_PREFIX}_VERSION_MAJOR}.${${_PYTHON_PREFIX}_VERSION_MINOR}) | |
1123 | set (${_PYTHON_PREFIX}_Development_FOUND TRUE) | |
1124 | endif() | |
1125 | elseif (${_PYTHON_PREFIX}_VERSION_MAJOR VERSION_EQUAL _${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR) | |
1126 | set (${_PYTHON_PREFIX}_Development_FOUND TRUE) | |
1127 | endif() | |
1128 | endif() | |
1129 | ||
1130 | # Restore the original find library ordering | |
1131 | if (DEFINED _${_PYTHON_PREFIX}_CMAKE_FIND_LIBRARY_SUFFIXES) | |
1132 | set (CMAKE_FIND_LIBRARY_SUFFIXES ${_${_PYTHON_PREFIX}_CMAKE_FIND_LIBRARY_SUFFIXES}) | |
1133 | endif() | |
1134 | endif() | |
1135 | ||
1136 | if ("NumPy" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS AND ${_PYTHON_PREFIX}_Interpreter_FOUND) | |
1137 | list (APPEND _${_PYTHON_PREFIX}_CACHED_VARS ${_PYTHON_PREFIX}_NumPy_INCLUDE_DIR) | |
1138 | if (${_PYTHON_PREFIX}_FIND_REQUIRED_NumPy) | |
1139 | list (APPEND _${_PYTHON_PREFIX}_REQUIRED_VARS ${_PYTHON_PREFIX}_NumPy_INCLUDE_DIR) | |
1140 | endif() | |
1141 | execute_process( | |
1142 | COMMAND "${${_PYTHON_PREFIX}_EXECUTABLE}" -c | |
1143 | "from __future__ import print_function\ntry: import numpy; print(numpy.get_include(), end='')\nexcept:pass\n" | |
1144 | RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT | |
1145 | OUTPUT_VARIABLE _${_PYTHON_PREFIX}_NumPy_PATH | |
1146 | ERROR_QUIET | |
1147 | OUTPUT_STRIP_TRAILING_WHITESPACE) | |
1148 | if (NOT _${_PYTHON_PREFIX}_RESULT) | |
1149 | find_path(${_PYTHON_PREFIX}_NumPy_INCLUDE_DIR | |
1150 | NAMES "numpy/arrayobject.h" "numpy/numpyconfig.h" | |
1151 | HINTS "${_${_PYTHON_PREFIX}_NumPy_PATH}" | |
1152 | NO_DEFAULT_PATH) | |
1153 | endif() | |
1154 | if(${_PYTHON_PREFIX}_NumPy_INCLUDE_DIR) | |
1155 | set(${_PYTHON_PREFIX}_NumPy_INCLUDE_DIRS "${${_PYTHON_PREFIX}_NumPy_INCLUDE_DIR}") | |
1156 | set(${_PYTHON_PREFIX}_NumPy_FOUND TRUE) | |
1157 | endif() | |
1158 | if(${_PYTHON_PREFIX}_NumPy_FOUND) | |
1159 | execute_process( | |
1160 | COMMAND "${${_PYTHON_PREFIX}_EXECUTABLE}" -c | |
1161 | "from __future__ import print_function\ntry: import numpy; print(numpy.__version__, end='')\nexcept:pass\n" | |
1162 | RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT | |
1163 | OUTPUT_VARIABLE _${_PYTHON_PREFIX}_NumPy_VERSION) | |
1164 | if (NOT _${_PYTHON_PREFIX}_RESULT) | |
1165 | set(${_PYTHON_PREFIX}_NumPy_VERSION "${_${_PYTHON_PREFIX}_NumPy_VERSION}") | |
1166 | endif() | |
1167 | endif() | |
1168 | # final step: set NumPy founded only if Development component is founded as well | |
1169 | if (NOT ${_PYTHON_PREFIX}_Development_FOUND) | |
1170 | set(${_PYTHON_PREFIX}_NumPy_FOUND FALSE) | |
1171 | endif() | |
1172 | endif() | |
1173 | ||
1174 | # final validation | |
1175 | if (${_PYTHON_PREFIX}_VERSION_MAJOR AND | |
1176 | NOT ${_PYTHON_PREFIX}_VERSION_MAJOR VERSION_EQUAL _${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR) | |
1177 | _python_display_failure ("Could NOT find ${_PYTHON_PREFIX}: Found unsuitable major version \"${${_PYTHON_PREFIX}_VERSION_MAJOR}\", but required major version is exact version \"${_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR}\"") | |
1178 | endif() | |
1179 | ||
1180 | include (FindPackageHandleStandardArgs) | |
1181 | find_package_handle_standard_args (${_PYTHON_PREFIX} | |
1182 | REQUIRED_VARS ${_${_PYTHON_PREFIX}_REQUIRED_VARS} | |
1183 | VERSION_VAR ${_PYTHON_PREFIX}_VERSION | |
1184 | HANDLE_COMPONENTS) | |
1185 | ||
1186 | # Create imported targets and helper functions | |
1187 | if(_${_PYTHON_PREFIX}_CMAKE_ROLE STREQUAL "PROJECT") | |
1188 | if ("Interpreter" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS | |
1189 | AND ${_PYTHON_PREFIX}_Interpreter_FOUND | |
1190 | AND NOT TARGET ${_PYTHON_PREFIX}::Interpreter) | |
1191 | add_executable (${_PYTHON_PREFIX}::Interpreter IMPORTED) | |
1192 | set_property (TARGET ${_PYTHON_PREFIX}::Interpreter | |
1193 | PROPERTY IMPORTED_LOCATION "${${_PYTHON_PREFIX}_EXECUTABLE}") | |
1194 | endif() | |
1195 | ||
1196 | if ("Compiler" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS | |
1197 | AND ${_PYTHON_PREFIX}_Compiler_FOUND | |
1198 | AND NOT TARGET ${_PYTHON_PREFIX}::Compiler) | |
1199 | add_executable (${_PYTHON_PREFIX}::Compiler IMPORTED) | |
1200 | set_property (TARGET ${_PYTHON_PREFIX}::Compiler | |
1201 | PROPERTY IMPORTED_LOCATION "${${_PYTHON_PREFIX}_COMPILER}") | |
1202 | endif() | |
1203 | ||
1204 | if ("Development" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS | |
1205 | AND ${_PYTHON_PREFIX}_Development_FOUND AND NOT TARGET ${_PYTHON_PREFIX}::Python) | |
1206 | ||
1207 | if (${_PYTHON_PREFIX}_LIBRARY_RELEASE MATCHES "${CMAKE_SHARED_LIBRARY_SUFFIX}$" | |
1208 | OR ${_PYTHON_PREFIX}_LIBRARY_DEBUG MATCHES "${CMAKE_SHARED_LIBRARY_SUFFIX}$" | |
1209 | OR ${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE OR ${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DEBUG) | |
1210 | set (_${_PYTHON_PREFIX}_LIBRARY_TYPE SHARED) | |
1211 | else() | |
1212 | set (_${_PYTHON_PREFIX}_LIBRARY_TYPE STATIC) | |
1213 | endif() | |
1214 | ||
1215 | add_library (${_PYTHON_PREFIX}::Python ${_${_PYTHON_PREFIX}_LIBRARY_TYPE} IMPORTED) | |
1216 | ||
1217 | set_property (TARGET ${_PYTHON_PREFIX}::Python | |
1218 | PROPERTY INTERFACE_INCLUDE_DIRECTORIES "${${_PYTHON_PREFIX}_INCLUDE_DIR}") | |
1219 | ||
1220 | if ((${_PYTHON_PREFIX}_LIBRARY_RELEASE AND ${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE) | |
1221 | OR (${_PYTHON_PREFIX}_LIBRARY_DEBUG AND ${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DEBUG)) | |
1222 | # System manage shared libraries in two parts: import and runtime | |
1223 | if (${_PYTHON_PREFIX}_LIBRARY_RELEASE AND ${_PYTHON_PREFIX}_LIBRARY_DEBUG) | |
1224 | set_property (TARGET ${_PYTHON_PREFIX}::Python PROPERTY IMPORTED_CONFIGURATIONS RELEASE DEBUG) | |
1225 | set_target_properties (${_PYTHON_PREFIX}::Python | |
1226 | PROPERTIES IMPORTED_LINK_INTERFACE_LANGUAGES_RELEASE "C" | |
1227 | IMPORTED_IMPLIB_RELEASE "${${_PYTHON_PREFIX}_LIBRARY_RELEASE}" | |
1228 | IMPORTED_LOCATION_RELEASE "${${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE}") | |
1229 | set_target_properties (${_PYTHON_PREFIX}::Python | |
1230 | PROPERTIES IMPORTED_LINK_INTERFACE_LANGUAGES_DEBUG "C" | |
1231 | IMPORTED_IMPLIB_DEBUG "${${_PYTHON_PREFIX}_LIBRARY_DEBUG}" | |
1232 | IMPORTED_LOCATION_DEBUG "${${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DEBUG}") | |
1233 | else() | |
1234 | set_target_properties (${_PYTHON_PREFIX}::Python | |
1235 | PROPERTIES IMPORTED_LINK_INTERFACE_LANGUAGES "C" | |
1236 | IMPORTED_IMPLIB "${${_PYTHON_PREFIX}_LIBRARY}" | |
1237 | IMPORTED_LOCATION "${${_PYTHON_PREFIX}_RUNTIME_LIBRARY}") | |
1238 | endif() | |
1239 | else() | |
1240 | if (${_PYTHON_PREFIX}_LIBRARY_RELEASE AND ${_PYTHON_PREFIX}_LIBRARY_DEBUG) | |
1241 | set_property (TARGET ${_PYTHON_PREFIX}::Python PROPERTY IMPORTED_CONFIGURATIONS RELEASE DEBUG) | |
1242 | set_target_properties (${_PYTHON_PREFIX}::Python | |
1243 | PROPERTIES IMPORTED_LINK_INTERFACE_LANGUAGES_RELEASE "C" | |
1244 | IMPORTED_LOCATION_RELEASE "${${_PYTHON_PREFIX}_LIBRARY_RELEASE}") | |
1245 | set_target_properties (${_PYTHON_PREFIX}::Python | |
1246 | PROPERTIES IMPORTED_LINK_INTERFACE_LANGUAGES_DEBUG "C" | |
1247 | IMPORTED_LOCATION_DEBUG "${${_PYTHON_PREFIX}_LIBRARY_DEBUG}") | |
1248 | else() | |
1249 | set_target_properties (${_PYTHON_PREFIX}::Python | |
1250 | PROPERTIES IMPORTED_LINK_INTERFACE_LANGUAGES "C" | |
1251 | IMPORTED_LOCATION "${${_PYTHON_PREFIX}_LIBRARY}") | |
1252 | endif() | |
1253 | endif() | |
1254 | ||
1255 | if (_${_PYTHON_PREFIX}_CONFIG AND _${_PYTHON_PREFIX}_LIBRARY_TYPE STREQUAL "STATIC") | |
1256 | # extend link information with dependent libraries | |
1257 | execute_process (COMMAND "${_${_PYTHON_PREFIX}_CONFIG}" --ldflags | |
1258 | RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT | |
1259 | OUTPUT_VARIABLE _${_PYTHON_PREFIX}_FLAGS | |
1260 | ERROR_QUIET | |
1261 | OUTPUT_STRIP_TRAILING_WHITESPACE) | |
1262 | if (NOT _${_PYTHON_PREFIX}_RESULT) | |
1263 | string (REGEX MATCHALL "-[Ll][^ ]+" _${_PYTHON_PREFIX}_LINK_LIBRARIES "${_${_PYTHON_PREFIX}_FLAGS}") | |
1264 | # remove elements relative to python library itself | |
1265 | list (FILTER _${_PYTHON_PREFIX}_LINK_LIBRARIES EXCLUDE REGEX "-lpython") | |
1266 | foreach (_${_PYTHON_PREFIX}_DIR IN LISTS ${_PYTHON_PREFIX}_LIBRARY_DIRS) | |
1267 | list (FILTER _${_PYTHON_PREFIX}_LINK_LIBRARIES EXCLUDE REGEX "-L${${_PYTHON_PREFIX}_DIR}") | |
1268 | endforeach() | |
1269 | set_property (TARGET ${_PYTHON_PREFIX}::Python | |
1270 | PROPERTY INTERFACE_LINK_LIBRARIES ${_${_PYTHON_PREFIX}_LINK_LIBRARIES}) | |
1271 | endif() | |
1272 | endif() | |
1273 | ||
1274 | # | |
1275 | # PYTHON_ADD_LIBRARY (<name> [STATIC|SHARED|MODULE] src1 src2 ... srcN) | |
1276 | # It is used to build modules for python. | |
1277 | # | |
1278 | function (__${_PYTHON_PREFIX}_ADD_LIBRARY prefix name) | |
1279 | cmake_parse_arguments (PARSE_ARGV 2 PYTHON_ADD_LIBRARY | |
1280 | "STATIC;SHARED;MODULE" "" "") | |
1281 | ||
1282 | unset (type) | |
1283 | if (NOT (PYTHON_ADD_LIBRARY_STATIC | |
1284 | OR PYTHON_ADD_LIBRARY_SHARED | |
1285 | OR PYTHON_ADD_LIBRARY_MODULE)) | |
1286 | set (type MODULE) | |
1287 | endif() | |
1288 | add_library (${name} ${type} ${ARGN}) | |
1289 | target_link_libraries (${name} PRIVATE ${prefix}::Python) | |
1290 | ||
1291 | # customize library name to follow module name rules | |
1292 | get_property (type TARGET ${name} PROPERTY TYPE) | |
1293 | if (type STREQUAL "MODULE_LIBRARY") | |
1294 | set_property (TARGET ${name} PROPERTY PREFIX "") | |
1295 | if(CMAKE_SYSTEM_NAME STREQUAL "Windows") | |
1296 | set_property (TARGET ${name} PROPERTY SUFFIX ".pyd") | |
1297 | endif() | |
1298 | endif() | |
1299 | endfunction() | |
1300 | endif() | |
1301 | ||
1302 | if ("NumPy" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS AND ${_PYTHON_PREFIX}_NumPy_FOUND | |
1303 | AND NOT TARGET ${_PYTHON_PREFIX}::NumPy AND TARGET ${_PYTHON_PREFIX}::Python) | |
1304 | add_library (${_PYTHON_PREFIX}::NumPy INTERFACE IMPORTED) | |
1305 | set_property (TARGET ${_PYTHON_PREFIX}::NumPy | |
1306 | PROPERTY INTERFACE_INCLUDE_DIRECTORIES "${${_PYTHON_PREFIX}_NumPy_INCLUDE_DIR}") | |
1307 | target_link_libraries (${_PYTHON_PREFIX}::NumPy INTERFACE ${_PYTHON_PREFIX}::Python) | |
1308 | endif() | |
1309 | endif() | |
1310 | ||
1311 | # final clean-up | |
1312 | ||
1313 | # Restore CMAKE_FIND_APPBUNDLE | |
1314 | if (DEFINED _${_PYTHON_PREFIX}_CMAKE_FIND_APPBUNDLE) | |
1315 | set (CMAKE_FIND_APPBUNDLE ${_${_PYTHON_PREFIX}_CMAKE_FIND_APPBUNDLE}) | |
1316 | unset (_${_PYTHON_PREFIX}_CMAKE_FIND_APPBUNDLE) | |
1317 | else() | |
1318 | unset (CMAKE_FIND_APPBUNDLE) | |
1319 | endif() | |
1320 | # Restore CMAKE_FIND_FRAMEWORK | |
1321 | if (DEFINED _${_PYTHON_PREFIX}_CMAKE_FIND_FRAMEWORK) | |
1322 | set (CMAKE_FIND_FRAMEWORK ${_${_PYTHON_PREFIX}_CMAKE_FIND_FRAMEWORK}) | |
1323 | unset (_${_PYTHON_PREFIX}_CMAKE_FIND_FRAMEWORK) | |
1324 | else() | |
1325 | unset (CMAKE_FIND_FRAMEWORK) | |
1326 | endif() | |
1327 | ||
1328 | unset (_${_PYTHON_PREFIX}_CONFIG CACHE) |