-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathFindPythonDev.cmake
139 lines (124 loc) · 5.65 KB
/
FindPythonDev.cmake
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
# - Try to find Python include dirs and libraries
#
# Usage of this module as follows:
#
# find_package(PythonDev)
#
# Variables used by this module, they can change the default behaviour and need
# to be set before calling find_package:
#
# PYTHON_EXECUTABLE If this is set to a path to a Python interpreter
# then this module attempts to infer the path to
# python-config from it
# PYTHON_CONFIG Set this variable to the location of python-config
# if the module has problems finding the proper
# installation path.
#
# Variables defined by this module:
#
# PYTHONDEV_FOUND System has Python dev headers/libraries
# PYTHON_INCLUDE_DIR The Python include directories.
# PYTHON_LIBRARIES The Python libraries and linker flags.
include(FindPackageHandleStandardArgs)
if ( CMAKE_CROSSCOMPILING )
find_package(PythonLibs)
if (PYTHON_INCLUDE_PATH AND NOT PYTHON_INCLUDE_DIR)
set(PYTHON_INCLUDE_DIR "${PYTHON_INCLUDE_PATH}")
endif ()
find_package_handle_standard_args(PythonDev DEFAULT_MSG
PYTHON_INCLUDE_DIR
PYTHON_LIBRARIES
)
return()
endif ()
if (PYTHON_EXECUTABLE)
# Get the real path so that we can reliably find the correct python-config
# (e.g. some systems may have a "python" symlink, but not a "python-config"
# symlink).
get_filename_component(PYTHON_EXECUTABLE "${PYTHON_EXECUTABLE}" REALPATH)
get_filename_component(PYTHON_EXECUTABLE_DIR "${PYTHON_EXECUTABLE}" DIRECTORY)
get_filename_component(PYTHON_EXECUTABLE_NAME "${PYTHON_EXECUTABLE}" NAME)
if ( EXISTS ${PYTHON_EXECUTABLE}-config )
set(PYTHON_CONFIG ${PYTHON_EXECUTABLE}-config CACHE PATH "" FORCE)
# Avoid assumption that python-config is associated with python3 if
# python3 co-exists in a directory that also contains python2 stuff
elseif ( EXISTS ${PYTHON_EXECUTABLE_DIR}/python-config AND
NOT EXISTS ${PYTHON_EXECUTABLE_DIR}/python2 AND
NOT EXISTS ${PYTHON_EXECUTABLE_DIR}/python2.7 AND
NOT EXISTS ${PYTHON_EXECUTABLE_DIR}/python2-config AND
NOT EXISTS ${PYTHON_EXECUTABLE_DIR}/python2.7-config )
set(PYTHON_CONFIG ${PYTHON_EXECUTABLE_DIR}/python-config CACHE PATH "" FORCE)
endif ()
else ()
find_program(PYTHON_CONFIG NAMES
python3-config
python3.9-config
python3.8-config
python3.7-config
python3.6-config
python3.5-config
python-config
)
endif ()
# The OpenBSD python packages have python-config's that don't reliably
# report linking flags that will work.
if (PYTHON_CONFIG AND NOT ${CMAKE_SYSTEM_NAME} STREQUAL "OpenBSD")
# Try `--ldflags --embed` first and fallback to `--ldflags` if it fails.
# Python 3.8+ introduced the `--embed` flag in relation to this:
# https://docs.python.org/3.8/whatsnew/3.8.html#debug-build-uses-the-same-abi-as-release-build
# Note that even if this FindPythonDev script could technically apply to
# either embedded or extension use cases, the `--embed` flag only adds
# a `-lpython` and it's generally safe to link libpython in both cases.
# The only downside to doing that against an extension when it's not
# strictly necessary is losing the ability to mix-and-match debug/release
# modes between Python and extensions and that's not a feature to typically
# care about.
execute_process(COMMAND "${PYTHON_CONFIG}" --ldflags --embed
RESULT_VARIABLE _python_config_result
OUTPUT_VARIABLE PYTHON_LIBRARIES
OUTPUT_STRIP_TRAILING_WHITESPACE
ERROR_QUIET)
if ( NOT ${_python_config_result} EQUAL 0 )
execute_process(COMMAND "${PYTHON_CONFIG}" --ldflags
RESULT_VARIABLE _python_config_result
OUTPUT_VARIABLE PYTHON_LIBRARIES
OUTPUT_STRIP_TRAILING_WHITESPACE
ERROR_QUIET)
endif ()
string(STRIP "${PYTHON_LIBRARIES}" PYTHON_LIBRARIES)
execute_process(COMMAND "${PYTHON_CONFIG}" --includes
OUTPUT_VARIABLE PYTHON_INCLUDE_DIR
OUTPUT_STRIP_TRAILING_WHITESPACE
ERROR_QUIET)
string(REGEX REPLACE "^[-I]" "" PYTHON_INCLUDE_DIR "${PYTHON_INCLUDE_DIR}")
string(REGEX REPLACE "[ ]-I" " " PYTHON_INCLUDE_DIR "${PYTHON_INCLUDE_DIR}")
separate_arguments(PYTHON_INCLUDE_DIR)
find_package_handle_standard_args(PythonDev DEFAULT_MSG
PYTHON_CONFIG
PYTHON_INCLUDE_DIR
PYTHON_LIBRARIES
)
else ()
if ( ${CMAKE_VERSION} VERSION_LESS "3.12.0" )
find_package(PythonLibs)
if ( PYTHON_INCLUDE_PATH AND NOT PYTHON_INCLUDE_DIR )
set(PYTHON_INCLUDE_DIR "${PYTHON_INCLUDE_PATH}")
endif ()
else ()
# Expect this branch to be used mostly in macOS where the system
# default Python 3 installation is not easily/consistently detected
# by CMake. CMake 3.12+ is required, but it's expected that macOS
# users are getting a recent version from homebrew/etc anyway.
find_package(Python3 COMPONENTS Development)
if ( Python3_INCLUDE_DIRS AND NOT PYTHON_INCLUDE_DIR )
set(PYTHON_INCLUDE_DIR "${Python3_INCLUDE_DIRS}")
endif ()
if ( Python3_LIBRARIES AND NOT PYTHON_LIBRARIES )
set(PYTHON_LIBRARIES "${Python3_LIBRARIES}")
endif ()
endif ()
find_package_handle_standard_args(PythonDev DEFAULT_MSG
PYTHON_INCLUDE_DIR
PYTHON_LIBRARIES
)
endif ()