2023-08-16 00:20:26 +10:00
|
|
|
# SPDX-FileCopyrightText: 2011 Blender Authors
|
2023-06-14 22:49:59 +10:00
|
|
|
#
|
2022-02-11 14:23:56 +11:00
|
|
|
# SPDX-License-Identifier: BSD-3-Clause
|
|
|
|
|
|
2011-06-20 02:54:56 +00:00
|
|
|
# - Find Python libraries
|
|
|
|
|
# Find the native Python includes and library
|
2011-06-18 15:53:47 +00:00
|
|
|
#
|
2011-06-20 02:54:56 +00:00
|
|
|
# Note:, This is not _yet_ intended to be a general python module for other
|
2013-07-10 09:40:49 +00:00
|
|
|
# projects to use since its hard coded to fixed Python version
|
|
|
|
|
# as Blender only supports a single Python version at the moment.
|
|
|
|
|
#
|
|
|
|
|
# Note:
|
|
|
|
|
# this is for Blender/Unix Python only.
|
2011-06-20 02:54:56 +00:00
|
|
|
#
|
|
|
|
|
# This module defines
|
2011-06-18 15:53:47 +00:00
|
|
|
# PYTHON_VERSION
|
2022-12-05 23:10:31 +01:00
|
|
|
# PYTHON_VERSION_NO_DOTS
|
2011-06-18 15:53:47 +00:00
|
|
|
# PYTHON_INCLUDE_DIRS
|
2012-11-07 11:44:39 +00:00
|
|
|
# PYTHON_INCLUDE_CONFIG_DIRS
|
2011-06-19 06:57:56 +00:00
|
|
|
# PYTHON_LIBRARIES
|
2011-06-19 11:04:15 +00:00
|
|
|
# PYTHON_LIBPATH, Used for installation
|
2015-03-24 17:02:34 +11:00
|
|
|
# PYTHON_SITE_PACKAGES, Used for installation (as a Python module)
|
2011-06-18 15:53:47 +00:00
|
|
|
# PYTHON_LINKFLAGS
|
|
|
|
|
# PYTHON_ROOT_DIR, The base directory to search for Python.
|
|
|
|
|
# This can also be an environment variable.
|
2011-06-20 02:54:56 +00:00
|
|
|
#
|
|
|
|
|
# also defined, but not for general use are
|
|
|
|
|
# PYTHON_LIBRARY, where to find the python library.
|
2011-06-18 15:53:47 +00:00
|
|
|
|
2023-07-29 13:47:55 +10:00
|
|
|
# If `PYTHON_ROOT_DIR` was defined in the environment, use it.
|
2023-08-17 13:15:56 +10:00
|
|
|
if(DEFINED PYTHON_ROOT_DIR)
|
2023-07-29 13:47:55 +10:00
|
|
|
# Pass.
|
2023-08-17 13:15:56 +10:00
|
|
|
elseif(DEFINED ENV{PYTHON_ROOT_DIR})
|
|
|
|
|
set(PYTHON_ROOT_DIR $ENV{PYTHON_ROOT_DIR})
|
|
|
|
|
else()
|
|
|
|
|
set(PYTHON_ROOT_DIR "")
|
|
|
|
|
endif()
|
2011-06-18 15:53:47 +00:00
|
|
|
|
2024-01-04 02:50:05 +01:00
|
|
|
set(_PYTHON_VERSION_SUPPORTED 3.11)
|
2023-12-23 16:19:09 +11:00
|
|
|
|
2023-08-17 13:15:56 +10:00
|
|
|
set(PYTHON_VERSION ${_PYTHON_VERSION_SUPPORTED} CACHE STRING "Python Version (major and minor only)")
|
|
|
|
|
mark_as_advanced(PYTHON_VERSION)
|
2011-06-18 15:53:47 +00:00
|
|
|
|
2011-10-01 19:52:33 +00:00
|
|
|
|
2022-09-09 03:12:56 +02:00
|
|
|
if(APPLE)
|
|
|
|
|
if(WITH_PYTHON_MODULE)
|
|
|
|
|
set(PYTHON_LINKFLAGS "-undefined dynamic_lookup")
|
|
|
|
|
else()
|
|
|
|
|
set(PYTHON_LINKFLAGS)
|
|
|
|
|
endif()
|
|
|
|
|
else()
|
|
|
|
|
# See: http://docs.python.org/extending/embedding.html#linking-requirements
|
2023-08-17 13:15:56 +10:00
|
|
|
set(PYTHON_LINKFLAGS "-Xlinker -export-dynamic" CACHE STRING "Linker flags for python")
|
|
|
|
|
mark_as_advanced(PYTHON_LINKFLAGS)
|
2022-09-09 03:12:56 +02:00
|
|
|
endif()
|
2011-06-20 02:54:56 +00:00
|
|
|
|
2021-06-22 10:42:32 -07:00
|
|
|
# if the user passes these defines as args, we don't want to overwrite
|
2023-08-17 13:15:56 +10:00
|
|
|
set(_IS_INC_DEF OFF)
|
|
|
|
|
set(_IS_INC_CONF_DEF OFF)
|
|
|
|
|
set(_IS_LIB_DEF OFF)
|
|
|
|
|
set(_IS_LIB_PATH_DEF OFF)
|
|
|
|
|
if(DEFINED PYTHON_INCLUDE_DIR)
|
|
|
|
|
set(_IS_INC_DEF ON)
|
|
|
|
|
endif()
|
|
|
|
|
if(DEFINED PYTHON_INCLUDE_CONFIG_DIR)
|
|
|
|
|
set(_IS_INC_CONF_DEF ON)
|
|
|
|
|
endif()
|
|
|
|
|
if(DEFINED PYTHON_LIBRARY)
|
|
|
|
|
set(_IS_LIB_DEF ON)
|
|
|
|
|
endif()
|
|
|
|
|
if(DEFINED PYTHON_LIBPATH)
|
|
|
|
|
set(_IS_LIB_PATH_DEF ON)
|
|
|
|
|
endif()
|
|
|
|
|
|
|
|
|
|
string(REPLACE "." "" PYTHON_VERSION_NO_DOTS ${PYTHON_VERSION})
|
|
|
|
|
|
|
|
|
|
set(_PYTHON_ABI_FLAGS "")
|
|
|
|
|
|
|
|
|
|
set(_python_SEARCH_DIRS
|
2015-05-19 15:56:28 +10:00
|
|
|
${PYTHON_ROOT_DIR}
|
2022-12-05 23:10:31 +01:00
|
|
|
"$ENV{HOME}/py${PYTHON_VERSION_NO_DOTS}"
|
2015-05-19 15:56:28 +10:00
|
|
|
"/opt/lib/python-${PYTHON_VERSION}"
|
|
|
|
|
)
|
2011-11-02 21:35:00 +00:00
|
|
|
|
2018-09-19 17:48:11 +02:00
|
|
|
# only search for the dirs if we haven't already
|
2023-08-17 13:15:56 +10:00
|
|
|
if((NOT _IS_INC_DEF) OR (NOT _IS_INC_CONF_DEF) OR (NOT _IS_LIB_DEF) OR (NOT _IS_LIB_PATH_DEF))
|
|
|
|
|
set(_PYTHON_ABI_FLAGS_TEST
|
2021-02-12 07:50:01 +11:00
|
|
|
"u; " # release
|
|
|
|
|
"du;d" # debug
|
2011-06-20 02:54:56 +00:00
|
|
|
)
|
|
|
|
|
|
2023-08-17 13:15:56 +10:00
|
|
|
foreach(_CURRENT_ABI_FLAGS ${_PYTHON_ABI_FLAGS_TEST})
|
|
|
|
|
# if(CMAKE_BUILD_TYPE STREQUAL Debug)
|
|
|
|
|
# set(_CURRENT_ABI_FLAGS "d${_CURRENT_ABI_FLAGS}")
|
|
|
|
|
# endif()
|
|
|
|
|
string(REPLACE " " "" _CURRENT_ABI_FLAGS ${_CURRENT_ABI_FLAGS})
|
2011-10-01 19:52:33 +00:00
|
|
|
|
2023-08-17 13:15:56 +10:00
|
|
|
if(NOT DEFINED PYTHON_INCLUDE_DIR)
|
|
|
|
|
find_path(PYTHON_INCLUDE_DIR
|
2011-11-02 21:35:00 +00:00
|
|
|
NAMES
|
|
|
|
|
Python.h
|
|
|
|
|
HINTS
|
|
|
|
|
${_python_SEARCH_DIRS}
|
|
|
|
|
PATH_SUFFIXES
|
|
|
|
|
include/python${PYTHON_VERSION}${_CURRENT_ABI_FLAGS}
|
2012-11-07 16:51:09 +00:00
|
|
|
include/${CMAKE_LIBRARY_ARCHITECTURE}/python${PYTHON_VERSION}${_CURRENT_ABI_FLAGS}
|
2012-11-07 11:44:39 +00:00
|
|
|
)
|
2023-08-17 13:15:56 +10:00
|
|
|
endif()
|
2012-11-07 11:44:39 +00:00
|
|
|
|
2023-08-17 13:15:56 +10:00
|
|
|
if(NOT DEFINED PYTHON_INCLUDE_CONFIG_DIR)
|
|
|
|
|
find_path(PYTHON_INCLUDE_CONFIG_DIR
|
2012-11-07 11:44:39 +00:00
|
|
|
NAMES
|
|
|
|
|
pyconfig.h
|
|
|
|
|
HINTS
|
|
|
|
|
${_python_SEARCH_DIRS}
|
|
|
|
|
PATH_SUFFIXES
|
|
|
|
|
include/python${PYTHON_VERSION}${_CURRENT_ABI_FLAGS}
|
2012-11-07 16:51:09 +00:00
|
|
|
include/${CMAKE_LIBRARY_ARCHITECTURE}/python${PYTHON_VERSION}${_CURRENT_ABI_FLAGS}
|
2011-11-02 21:35:00 +00:00
|
|
|
)
|
2023-08-17 13:15:56 +10:00
|
|
|
if((NOT PYTHON_INCLUDE_CONFIG_DIR) AND PYTHON_INCLUDE_DIR)
|
2012-11-07 12:24:03 +00:00
|
|
|
# Fallback...
|
2023-08-17 13:15:56 +10:00
|
|
|
unset(PYTHON_INCLUDE_CONFIG_DIR CACHE)
|
|
|
|
|
set(PYTHON_INCLUDE_CONFIG_DIR ${PYTHON_INCLUDE_DIR} CACHE PATH "")
|
|
|
|
|
endif()
|
|
|
|
|
endif()
|
2011-11-02 21:35:00 +00:00
|
|
|
|
2023-08-17 13:15:56 +10:00
|
|
|
if(NOT DEFINED PYTHON_LIBRARY)
|
|
|
|
|
find_library(PYTHON_LIBRARY
|
2011-11-02 21:35:00 +00:00
|
|
|
NAMES
|
|
|
|
|
"python${PYTHON_VERSION}${_CURRENT_ABI_FLAGS}"
|
|
|
|
|
HINTS
|
|
|
|
|
${_python_SEARCH_DIRS}
|
|
|
|
|
PATH_SUFFIXES
|
|
|
|
|
lib64 lib
|
|
|
|
|
)
|
2023-08-17 13:15:56 +10:00
|
|
|
endif()
|
2011-10-01 19:52:33 +00:00
|
|
|
|
2023-08-17 13:15:56 +10:00
|
|
|
if(NOT DEFINED PYTHON_LIBPATH)
|
|
|
|
|
find_path(PYTHON_LIBPATH
|
2012-11-07 11:44:39 +00:00
|
|
|
NAMES
|
|
|
|
|
"python${PYTHON_VERSION}/abc.py" # This is a bit hackish! :/
|
|
|
|
|
HINTS
|
|
|
|
|
${_python_SEARCH_DIRS}
|
|
|
|
|
PATH_SUFFIXES
|
|
|
|
|
lib64 lib
|
|
|
|
|
)
|
2023-08-17 13:15:56 +10:00
|
|
|
if((NOT PYTHON_LIBPATH) AND PYTHON_LIBRARY)
|
2012-11-07 12:24:03 +00:00
|
|
|
# Fallback...
|
2023-08-17 13:15:56 +10:00
|
|
|
unset(PYTHON_LIBPATH CACHE)
|
|
|
|
|
get_filename_component(PYTHON_LIBPATH ${PYTHON_LIBRARY} PATH)
|
|
|
|
|
endif()
|
|
|
|
|
endif()
|
2012-11-07 11:44:39 +00:00
|
|
|
|
2023-08-17 13:15:56 +10:00
|
|
|
if(PYTHON_LIBRARY AND PYTHON_LIBPATH AND PYTHON_INCLUDE_DIR AND PYTHON_INCLUDE_CONFIG_DIR)
|
|
|
|
|
set(_PYTHON_ABI_FLAGS "${_CURRENT_ABI_FLAGS}")
|
2011-10-01 19:52:33 +00:00
|
|
|
break()
|
2023-08-17 13:15:56 +10:00
|
|
|
else()
|
2021-06-22 10:42:32 -07:00
|
|
|
# ensure we don't find values from 2 different ABI versions
|
2023-08-17 13:15:56 +10:00
|
|
|
if(NOT _IS_INC_DEF)
|
|
|
|
|
unset(PYTHON_INCLUDE_DIR CACHE)
|
|
|
|
|
endif()
|
|
|
|
|
if(NOT _IS_INC_CONF_DEF)
|
|
|
|
|
unset(PYTHON_INCLUDE_CONFIG_DIR CACHE)
|
|
|
|
|
endif()
|
|
|
|
|
if(NOT _IS_LIB_DEF)
|
|
|
|
|
unset(PYTHON_LIBRARY CACHE)
|
|
|
|
|
endif()
|
|
|
|
|
if(NOT _IS_LIB_PATH_DEF)
|
|
|
|
|
unset(PYTHON_LIBPATH CACHE)
|
|
|
|
|
endif()
|
|
|
|
|
endif()
|
|
|
|
|
endforeach()
|
|
|
|
|
|
|
|
|
|
unset(_CURRENT_ABI_FLAGS)
|
|
|
|
|
unset(_CURRENT_PATH)
|
|
|
|
|
|
|
|
|
|
unset(_PYTHON_ABI_FLAGS_TEST)
|
|
|
|
|
endif()
|
|
|
|
|
|
|
|
|
|
unset(_IS_INC_DEF)
|
|
|
|
|
unset(_IS_INC_CONF_DEF)
|
|
|
|
|
unset(_IS_LIB_DEF)
|
|
|
|
|
unset(_IS_LIB_PATH_DEF)
|
2011-11-02 21:35:00 +00:00
|
|
|
|
2018-06-10 08:12:13 +02:00
|
|
|
# handle the QUIETLY and REQUIRED arguments and SET PYTHONLIBSUNIX_FOUND to TRUE IF
|
2011-06-18 15:53:47 +00:00
|
|
|
# all listed variables are TRUE
|
2023-08-17 13:15:56 +10:00
|
|
|
include(FindPackageHandleStandardArgs)
|
2023-08-30 15:20:50 +10:00
|
|
|
|
|
|
|
|
# NOTE(@ideasman42): Instead of `DEFAULT_MSG` use a custom message because users
|
|
|
|
|
# may have newer versions Python and not be using pre-compiled libraries
|
|
|
|
|
# (on other UNIX systems or using an esoteric architecture).
|
|
|
|
|
# Some Python developers might want to use the newer features of Python too.
|
|
|
|
|
# While we could automatically detect and use newer versions but this would result in
|
|
|
|
|
# developers using a configuration which isn't officially supported without realizing it.
|
|
|
|
|
# So warn that the officially supported Python version is not found and let the developer
|
|
|
|
|
# explicitly set the newer version if they wish.
|
|
|
|
|
# From a maintenance perspective it's typically not a problem to support newer versions,
|
|
|
|
|
# doing so can help ease the process of upgrading too, nevertheless these versions don't
|
|
|
|
|
# have the same level of testing & support.
|
|
|
|
|
if(${_PYTHON_VERSION_SUPPORTED} STREQUAL ${PYTHON_VERSION})
|
|
|
|
|
# Default version.
|
|
|
|
|
set(_python_MISSING_MSG
|
|
|
|
|
"\
|
2023-05-12 16:47:15 +10:00
|
|
|
'PYTHON_VERSION=${_PYTHON_VERSION_SUPPORTED}' not found! \
|
|
|
|
|
This is the only officially supported version. \
|
|
|
|
|
If you wish to use a newer Python version you may set 'PYTHON_VERSION' \
|
|
|
|
|
however we do not guarantee full compatibility in this case."
|
2023-08-30 15:20:50 +10:00
|
|
|
)
|
|
|
|
|
else()
|
|
|
|
|
# Default version overridden, use a different message.
|
|
|
|
|
set(_python_MISSING_MSG
|
|
|
|
|
"\
|
|
|
|
|
'PYTHON_VERSION=${PYTHON_VERSION}' not found! \
|
|
|
|
|
This is *not* the officially supported version. \
|
|
|
|
|
Either configure 'PYTHON_ROOT_DIR' to point to the Python installation \
|
|
|
|
|
or use the officially supported version ('${_PYTHON_VERSION_SUPPORTED}') \
|
|
|
|
|
which may have pre-compiled binaries for your platform."
|
|
|
|
|
)
|
|
|
|
|
endif()
|
|
|
|
|
|
|
|
|
|
find_package_handle_standard_args(PythonLibsUnix
|
|
|
|
|
"${_python_MISSING_MSG}"
|
2023-05-12 16:47:15 +10:00
|
|
|
PYTHON_LIBRARY PYTHON_LIBPATH PYTHON_INCLUDE_DIR PYTHON_INCLUDE_CONFIG_DIR)
|
2023-08-30 15:20:50 +10:00
|
|
|
unset(_python_MISSING_MSG)
|
2011-06-18 15:53:47 +00:00
|
|
|
|
2023-08-17 13:15:56 +10:00
|
|
|
if(PYTHONLIBSUNIX_FOUND)
|
2011-06-20 02:54:56 +00:00
|
|
|
# Assign cache items
|
2023-08-17 13:15:56 +10:00
|
|
|
set(PYTHON_INCLUDE_DIRS ${PYTHON_INCLUDE_DIR} ${PYTHON_INCLUDE_CONFIG_DIR})
|
|
|
|
|
if(NOT WITH_PYTHON_MODULE)
|
|
|
|
|
set(PYTHON_LIBRARIES ${PYTHON_LIBRARY})
|
|
|
|
|
endif()
|
2011-06-19 11:04:15 +00:00
|
|
|
|
2023-08-17 13:15:56 +10:00
|
|
|
find_file(PYTHON_SITE_PACKAGES
|
2015-03-24 17:02:34 +11:00
|
|
|
NAMES
|
|
|
|
|
# debian specific
|
|
|
|
|
dist-packages
|
|
|
|
|
site-packages
|
|
|
|
|
HINTS
|
|
|
|
|
${PYTHON_LIBPATH}/python${PYTHON_VERSION}
|
|
|
|
|
)
|
|
|
|
|
|
2011-06-20 02:54:56 +00:00
|
|
|
# we need this for installation
|
2015-11-27 18:00:02 +11:00
|
|
|
# XXX No more valid with debian-like py3.5 packages...
|
2023-08-17 13:15:56 +10:00
|
|
|
# get_filename_component(PYTHON_LIBPATH ${PYTHON_LIBRARY} PATH)
|
2011-06-19 11:04:15 +00:00
|
|
|
|
2015-05-19 15:56:28 +10:00
|
|
|
# not required for build, just used when bundling Python.
|
2023-08-17 13:15:56 +10:00
|
|
|
find_program(
|
2015-05-19 15:56:28 +10:00
|
|
|
PYTHON_EXECUTABLE
|
|
|
|
|
NAMES
|
|
|
|
|
"python${PYTHON_VERSION}${_PYTHON_ABI_FLAGS}"
|
|
|
|
|
"python${PYTHON_VERSION}"
|
|
|
|
|
"python"
|
|
|
|
|
HINTS
|
|
|
|
|
${_python_SEARCH_DIRS}
|
|
|
|
|
PATH_SUFFIXES bin
|
|
|
|
|
)
|
2023-08-17 13:15:56 +10:00
|
|
|
endif()
|
2011-11-16 16:38:37 +00:00
|
|
|
|
2023-08-17 13:15:56 +10:00
|
|
|
unset(_PYTHON_ABI_FLAGS)
|
|
|
|
|
unset(_PYTHON_VERSION_SUPPORTED)
|
|
|
|
|
unset(_python_SEARCH_DIRS)
|
2015-05-19 15:56:28 +10:00
|
|
|
|
2023-08-17 13:15:56 +10:00
|
|
|
mark_as_advanced(
|
2011-11-16 16:38:37 +00:00
|
|
|
PYTHON_INCLUDE_DIR
|
2012-11-07 11:44:39 +00:00
|
|
|
PYTHON_INCLUDE_CONFIG_DIR
|
2011-11-16 16:38:37 +00:00
|
|
|
PYTHON_LIBRARY
|
2013-08-28 04:32:39 +00:00
|
|
|
PYTHON_LIBPATH
|
2015-03-24 17:02:34 +11:00
|
|
|
PYTHON_SITE_PACKAGES
|
2015-05-19 15:56:28 +10:00
|
|
|
PYTHON_EXECUTABLE
|
2011-11-16 16:38:37 +00:00
|
|
|
)
|