|
|
@ -24,6 +24,8 @@ else() |
|
|
|
message (FATAL_ERROR "FindPython: INTERNAL ERROR") |
|
|
|
endif() |
|
|
|
|
|
|
|
get_property(_${_PYTHON_PREFIX}_CMAKE_ROLE GLOBAL PROPERTY CMAKE_ROLE) |
|
|
|
|
|
|
|
|
|
|
|
# |
|
|
|
# helper commands |
|
|
@ -1133,118 +1135,120 @@ find_package_handle_standard_args (${_PYTHON_PREFIX} |
|
|
|
HANDLE_COMPONENTS) |
|
|
|
|
|
|
|
# Create imported targets and helper functions |
|
|
|
if ("Interpreter" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS |
|
|
|
AND ${_PYTHON_PREFIX}_Interpreter_FOUND |
|
|
|
AND NOT TARGET ${_PYTHON_PREFIX}::Interpreter) |
|
|
|
add_executable (${_PYTHON_PREFIX}::Interpreter IMPORTED) |
|
|
|
set_property (TARGET ${_PYTHON_PREFIX}::Interpreter |
|
|
|
PROPERTY IMPORTED_LOCATION "${${_PYTHON_PREFIX}_EXECUTABLE}") |
|
|
|
endif() |
|
|
|
|
|
|
|
if ("Compiler" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS |
|
|
|
AND ${_PYTHON_PREFIX}_Compiler_FOUND |
|
|
|
AND NOT TARGET ${_PYTHON_PREFIX}::Compiler) |
|
|
|
add_executable (${_PYTHON_PREFIX}::Compiler IMPORTED) |
|
|
|
set_property (TARGET ${_PYTHON_PREFIX}::Compiler |
|
|
|
PROPERTY IMPORTED_LOCATION "${${_PYTHON_PREFIX}_COMPILER}") |
|
|
|
endif() |
|
|
|
|
|
|
|
if ("Development" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS |
|
|
|
AND ${_PYTHON_PREFIX}_Development_FOUND AND NOT TARGET ${_PYTHON_PREFIX}::Python) |
|
|
|
if(_${_PYTHON_PREFIX}_CMAKE_ROLE STREQUAL "PROJECT") |
|
|
|
if ("Interpreter" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS |
|
|
|
AND ${_PYTHON_PREFIX}_Interpreter_FOUND |
|
|
|
AND NOT TARGET ${_PYTHON_PREFIX}::Interpreter) |
|
|
|
add_executable (${_PYTHON_PREFIX}::Interpreter IMPORTED) |
|
|
|
set_property (TARGET ${_PYTHON_PREFIX}::Interpreter |
|
|
|
PROPERTY IMPORTED_LOCATION "${${_PYTHON_PREFIX}_EXECUTABLE}") |
|
|
|
endif() |
|
|
|
|
|
|
|
if (${_PYTHON_PREFIX}_LIBRARY_RELEASE MATCHES "${CMAKE_SHARED_LIBRARY_SUFFIX}$" |
|
|
|
OR ${_PYTHON_PREFIX}_LIBRARY_DEBUG MATCHES "${CMAKE_SHARED_LIBRARY_SUFFIX}$" |
|
|
|
OR ${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE OR ${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DEBUG) |
|
|
|
set (_${_PYTHON_PREFIX}_LIBRARY_TYPE SHARED) |
|
|
|
else() |
|
|
|
set (_${_PYTHON_PREFIX}_LIBRARY_TYPE STATIC) |
|
|
|
if ("Compiler" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS |
|
|
|
AND ${_PYTHON_PREFIX}_Compiler_FOUND |
|
|
|
AND NOT TARGET ${_PYTHON_PREFIX}::Compiler) |
|
|
|
add_executable (${_PYTHON_PREFIX}::Compiler IMPORTED) |
|
|
|
set_property (TARGET ${_PYTHON_PREFIX}::Compiler |
|
|
|
PROPERTY IMPORTED_LOCATION "${${_PYTHON_PREFIX}_COMPILER}") |
|
|
|
endif() |
|
|
|
|
|
|
|
add_library (${_PYTHON_PREFIX}::Python ${_${_PYTHON_PREFIX}_LIBRARY_TYPE} IMPORTED) |
|
|
|
|
|
|
|
set_property (TARGET ${_PYTHON_PREFIX}::Python |
|
|
|
PROPERTY INTERFACE_INCLUDE_DIRECTORIES "${${_PYTHON_PREFIX}_INCLUDE_DIR}") |
|
|
|
|
|
|
|
if ((${_PYTHON_PREFIX}_LIBRARY_RELEASE AND ${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE) |
|
|
|
OR (${_PYTHON_PREFIX}_LIBRARY_DEBUG AND ${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DEBUG)) |
|
|
|
# System manage shared libraries in two parts: import and runtime |
|
|
|
if (${_PYTHON_PREFIX}_LIBRARY_RELEASE AND ${_PYTHON_PREFIX}_LIBRARY_DEBUG) |
|
|
|
set_property (TARGET ${_PYTHON_PREFIX}::Python PROPERTY IMPORTED_CONFIGURATIONS RELEASE DEBUG) |
|
|
|
set_target_properties (${_PYTHON_PREFIX}::Python |
|
|
|
PROPERTIES IMPORTED_LINK_INTERFACE_LANGUAGES_RELEASE "C" |
|
|
|
IMPORTED_IMPLIB_RELEASE "${${_PYTHON_PREFIX}_LIBRARY_RELEASE}" |
|
|
|
IMPORTED_LOCATION_RELEASE "${${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE}") |
|
|
|
set_target_properties (${_PYTHON_PREFIX}::Python |
|
|
|
PROPERTIES IMPORTED_LINK_INTERFACE_LANGUAGES_DEBUG "C" |
|
|
|
IMPORTED_IMPLIB_DEBUG "${${_PYTHON_PREFIX}_LIBRARY_DEBUG}" |
|
|
|
IMPORTED_LOCATION_DEBUG "${${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DEBUG}") |
|
|
|
if ("Development" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS |
|
|
|
AND ${_PYTHON_PREFIX}_Development_FOUND AND NOT TARGET ${_PYTHON_PREFIX}::Python) |
|
|
|
|
|
|
|
if (${_PYTHON_PREFIX}_LIBRARY_RELEASE MATCHES "${CMAKE_SHARED_LIBRARY_SUFFIX}$" |
|
|
|
OR ${_PYTHON_PREFIX}_LIBRARY_DEBUG MATCHES "${CMAKE_SHARED_LIBRARY_SUFFIX}$" |
|
|
|
OR ${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE OR ${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DEBUG) |
|
|
|
set (_${_PYTHON_PREFIX}_LIBRARY_TYPE SHARED) |
|
|
|
else() |
|
|
|
set_target_properties (${_PYTHON_PREFIX}::Python |
|
|
|
PROPERTIES IMPORTED_LINK_INTERFACE_LANGUAGES "C" |
|
|
|
IMPORTED_IMPLIB "${${_PYTHON_PREFIX}_LIBRARY}" |
|
|
|
IMPORTED_LOCATION "${${_PYTHON_PREFIX}_RUNTIME_LIBRARY}") |
|
|
|
set (_${_PYTHON_PREFIX}_LIBRARY_TYPE STATIC) |
|
|
|
endif() |
|
|
|
else() |
|
|
|
if (${_PYTHON_PREFIX}_LIBRARY_RELEASE AND ${_PYTHON_PREFIX}_LIBRARY_DEBUG) |
|
|
|
set_property (TARGET ${_PYTHON_PREFIX}::Python PROPERTY IMPORTED_CONFIGURATIONS RELEASE DEBUG) |
|
|
|
set_target_properties (${_PYTHON_PREFIX}::Python |
|
|
|
PROPERTIES IMPORTED_LINK_INTERFACE_LANGUAGES_RELEASE "C" |
|
|
|
IMPORTED_LOCATION_RELEASE "${${_PYTHON_PREFIX}_LIBRARY_RELEASE}") |
|
|
|
set_target_properties (${_PYTHON_PREFIX}::Python |
|
|
|
PROPERTIES IMPORTED_LINK_INTERFACE_LANGUAGES_DEBUG "C" |
|
|
|
IMPORTED_LOCATION_DEBUG "${${_PYTHON_PREFIX}_LIBRARY_DEBUG}") |
|
|
|
|
|
|
|
add_library (${_PYTHON_PREFIX}::Python ${_${_PYTHON_PREFIX}_LIBRARY_TYPE} IMPORTED) |
|
|
|
|
|
|
|
set_property (TARGET ${_PYTHON_PREFIX}::Python |
|
|
|
PROPERTY INTERFACE_INCLUDE_DIRECTORIES "${${_PYTHON_PREFIX}_INCLUDE_DIR}") |
|
|
|
|
|
|
|
if ((${_PYTHON_PREFIX}_LIBRARY_RELEASE AND ${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE) |
|
|
|
OR (${_PYTHON_PREFIX}_LIBRARY_DEBUG AND ${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DEBUG)) |
|
|
|
# System manage shared libraries in two parts: import and runtime |
|
|
|
if (${_PYTHON_PREFIX}_LIBRARY_RELEASE AND ${_PYTHON_PREFIX}_LIBRARY_DEBUG) |
|
|
|
set_property (TARGET ${_PYTHON_PREFIX}::Python PROPERTY IMPORTED_CONFIGURATIONS RELEASE DEBUG) |
|
|
|
set_target_properties (${_PYTHON_PREFIX}::Python |
|
|
|
PROPERTIES IMPORTED_LINK_INTERFACE_LANGUAGES_RELEASE "C" |
|
|
|
IMPORTED_IMPLIB_RELEASE "${${_PYTHON_PREFIX}_LIBRARY_RELEASE}" |
|
|
|
IMPORTED_LOCATION_RELEASE "${${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE}") |
|
|
|
set_target_properties (${_PYTHON_PREFIX}::Python |
|
|
|
PROPERTIES IMPORTED_LINK_INTERFACE_LANGUAGES_DEBUG "C" |
|
|
|
IMPORTED_IMPLIB_DEBUG "${${_PYTHON_PREFIX}_LIBRARY_DEBUG}" |
|
|
|
IMPORTED_LOCATION_DEBUG "${${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DEBUG}") |
|
|
|
else() |
|
|
|
set_target_properties (${_PYTHON_PREFIX}::Python |
|
|
|
PROPERTIES IMPORTED_LINK_INTERFACE_LANGUAGES "C" |
|
|
|
IMPORTED_IMPLIB "${${_PYTHON_PREFIX}_LIBRARY}" |
|
|
|
IMPORTED_LOCATION "${${_PYTHON_PREFIX}_RUNTIME_LIBRARY}") |
|
|
|
endif() |
|
|
|
else() |
|
|
|
set_target_properties (${_PYTHON_PREFIX}::Python |
|
|
|
PROPERTIES IMPORTED_LINK_INTERFACE_LANGUAGES "C" |
|
|
|
IMPORTED_LOCATION "${${_PYTHON_PREFIX}_LIBRARY}") |
|
|
|
if (${_PYTHON_PREFIX}_LIBRARY_RELEASE AND ${_PYTHON_PREFIX}_LIBRARY_DEBUG) |
|
|
|
set_property (TARGET ${_PYTHON_PREFIX}::Python PROPERTY IMPORTED_CONFIGURATIONS RELEASE DEBUG) |
|
|
|
set_target_properties (${_PYTHON_PREFIX}::Python |
|
|
|
PROPERTIES IMPORTED_LINK_INTERFACE_LANGUAGES_RELEASE "C" |
|
|
|
IMPORTED_LOCATION_RELEASE "${${_PYTHON_PREFIX}_LIBRARY_RELEASE}") |
|
|
|
set_target_properties (${_PYTHON_PREFIX}::Python |
|
|
|
PROPERTIES IMPORTED_LINK_INTERFACE_LANGUAGES_DEBUG "C" |
|
|
|
IMPORTED_LOCATION_DEBUG "${${_PYTHON_PREFIX}_LIBRARY_DEBUG}") |
|
|
|
else() |
|
|
|
set_target_properties (${_PYTHON_PREFIX}::Python |
|
|
|
PROPERTIES IMPORTED_LINK_INTERFACE_LANGUAGES "C" |
|
|
|
IMPORTED_LOCATION "${${_PYTHON_PREFIX}_LIBRARY}") |
|
|
|
endif() |
|
|
|
endif() |
|
|
|
endif() |
|
|
|
|
|
|
|
if (_${_PYTHON_PREFIX}_CONFIG AND _${_PYTHON_PREFIX}_LIBRARY_TYPE STREQUAL "STATIC") |
|
|
|
# extend link information with dependent libraries |
|
|
|
execute_process (COMMAND "${_${_PYTHON_PREFIX}_CONFIG}" --ldflags |
|
|
|
RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT |
|
|
|
OUTPUT_VARIABLE _${_PYTHON_PREFIX}_FLAGS |
|
|
|
ERROR_QUIET |
|
|
|
OUTPUT_STRIP_TRAILING_WHITESPACE) |
|
|
|
if (NOT _${_PYTHON_PREFIX}_RESULT) |
|
|
|
string (REGEX MATCHALL "-[Ll][^ ]+" _${_PYTHON_PREFIX}_LINK_LIBRARIES "${_${_PYTHON_PREFIX}_FLAGS}") |
|
|
|
# remove elements relative to python library itself |
|
|
|
list (FILTER _${_PYTHON_PREFIX}_LINK_LIBRARIES EXCLUDE REGEX "-lpython") |
|
|
|
foreach (_${_PYTHON_PREFIX}_DIR IN LISTS ${_PYTHON_PREFIX}_LIBRARY_DIRS) |
|
|
|
list (FILTER _${_PYTHON_PREFIX}_LINK_LIBRARIES EXCLUDE REGEX "-L${${_PYTHON_PREFIX}_DIR}") |
|
|
|
endforeach() |
|
|
|
set_property (TARGET ${_PYTHON_PREFIX}::Python |
|
|
|
PROPERTY INTERFACE_LINK_LIBRARIES ${_${_PYTHON_PREFIX}_LINK_LIBRARIES}) |
|
|
|
if (_${_PYTHON_PREFIX}_CONFIG AND _${_PYTHON_PREFIX}_LIBRARY_TYPE STREQUAL "STATIC") |
|
|
|
# extend link information with dependent libraries |
|
|
|
execute_process (COMMAND "${_${_PYTHON_PREFIX}_CONFIG}" --ldflags |
|
|
|
RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT |
|
|
|
OUTPUT_VARIABLE _${_PYTHON_PREFIX}_FLAGS |
|
|
|
ERROR_QUIET |
|
|
|
OUTPUT_STRIP_TRAILING_WHITESPACE) |
|
|
|
if (NOT _${_PYTHON_PREFIX}_RESULT) |
|
|
|
string (REGEX MATCHALL "-[Ll][^ ]+" _${_PYTHON_PREFIX}_LINK_LIBRARIES "${_${_PYTHON_PREFIX}_FLAGS}") |
|
|
|
# remove elements relative to python library itself |
|
|
|
list (FILTER _${_PYTHON_PREFIX}_LINK_LIBRARIES EXCLUDE REGEX "-lpython") |
|
|
|
foreach (_${_PYTHON_PREFIX}_DIR IN LISTS ${_PYTHON_PREFIX}_LIBRARY_DIRS) |
|
|
|
list (FILTER _${_PYTHON_PREFIX}_LINK_LIBRARIES EXCLUDE REGEX "-L${${_PYTHON_PREFIX}_DIR}") |
|
|
|
endforeach() |
|
|
|
set_property (TARGET ${_PYTHON_PREFIX}::Python |
|
|
|
PROPERTY INTERFACE_LINK_LIBRARIES ${_${_PYTHON_PREFIX}_LINK_LIBRARIES}) |
|
|
|
endif() |
|
|
|
endif() |
|
|
|
endif() |
|
|
|
|
|
|
|
# |
|
|
|
# PYTHON_ADD_LIBRARY (<name> [STATIC|SHARED|MODULE] src1 src2 ... srcN) |
|
|
|
# It is used to build modules for python. |
|
|
|
# |
|
|
|
function (__${_PYTHON_PREFIX}_ADD_LIBRARY prefix name) |
|
|
|
cmake_parse_arguments (PARSE_ARGV 2 PYTHON_ADD_LIBRARY |
|
|
|
"STATIC;SHARED;MODULE" "" "") |
|
|
|
|
|
|
|
unset (type) |
|
|
|
if (NOT (PYTHON_ADD_LIBRARY_STATIC |
|
|
|
OR PYTHON_ADD_LIBRARY_SHARED |
|
|
|
OR PYTHON_ADD_LIBRARY_MODULE)) |
|
|
|
set (type MODULE) |
|
|
|
endif() |
|
|
|
add_library (${name} ${type} ${ARGN}) |
|
|
|
target_link_libraries (${name} PRIVATE ${prefix}::Python) |
|
|
|
|
|
|
|
# customize library name to follow module name rules |
|
|
|
get_property (type TARGET ${name} PROPERTY TYPE) |
|
|
|
if (type STREQUAL "MODULE_LIBRARY") |
|
|
|
set_property (TARGET ${name} PROPERTY PREFIX "") |
|
|
|
if(CMAKE_SYSTEM_NAME STREQUAL "Windows") |
|
|
|
set_property (TARGET ${name} PROPERTY SUFFIX ".pyd") |
|
|
|
# |
|
|
|
# PYTHON_ADD_LIBRARY (<name> [STATIC|SHARED|MODULE] src1 src2 ... srcN) |
|
|
|
# It is used to build modules for python. |
|
|
|
# |
|
|
|
function (__${_PYTHON_PREFIX}_ADD_LIBRARY prefix name) |
|
|
|
cmake_parse_arguments (PARSE_ARGV 2 PYTHON_ADD_LIBRARY |
|
|
|
"STATIC;SHARED;MODULE" "" "") |
|
|
|
|
|
|
|
unset (type) |
|
|
|
if (NOT (PYTHON_ADD_LIBRARY_STATIC |
|
|
|
OR PYTHON_ADD_LIBRARY_SHARED |
|
|
|
OR PYTHON_ADD_LIBRARY_MODULE)) |
|
|
|
set (type MODULE) |
|
|
|
endif() |
|
|
|
endif() |
|
|
|
endfunction() |
|
|
|
add_library (${name} ${type} ${ARGN}) |
|
|
|
target_link_libraries (${name} PRIVATE ${prefix}::Python) |
|
|
|
|
|
|
|
# customize library name to follow module name rules |
|
|
|
get_property (type TARGET ${name} PROPERTY TYPE) |
|
|
|
if (type STREQUAL "MODULE_LIBRARY") |
|
|
|
set_property (TARGET ${name} PROPERTY PREFIX "") |
|
|
|
if(CMAKE_SYSTEM_NAME STREQUAL "Windows") |
|
|
|
set_property (TARGET ${name} PROPERTY SUFFIX ".pyd") |
|
|
|
endif() |
|
|
|
endif() |
|
|
|
endfunction() |
|
|
|
endif() |
|
|
|
endif() |
|
|
|
|
|
|
|
# final clean-up |
|
|
|