255 lines
11 KiB
Diff
255 lines
11 KiB
Diff
|
--- /dev/null
|
||
|
+++ ./cmake/CMakeBuilder.py
|
||
|
@@ -0,0 +1,13 @@
|
||
|
+from sipbuild import SetuptoolsBuilder
|
||
|
+
|
||
|
+
|
||
|
+class CMakeBuilder(SetuptoolsBuilder):
|
||
|
+ def __init__(self, project, **kwargs):
|
||
|
+ print("Using the CMake builder")
|
||
|
+ super().__init__(project, **kwargs)
|
||
|
+
|
||
|
+ def build(self):
|
||
|
+ """ Only Generate the source files """
|
||
|
+ print("Generating the source files")
|
||
|
+ self._generate_bindings()
|
||
|
+ self._generate_scripts()
|
||
|
--- /dev/null
|
||
|
+++ ./cmake/FindSIP.cmake
|
||
|
@@ -0,0 +1,65 @@
|
||
|
+# Find SIP
|
||
|
+# ~~~~~~~~
|
||
|
+#
|
||
|
+# SIP website: http://www.riverbankcomputing.co.uk/sip/index.php
|
||
|
+#
|
||
|
+# Find the installed version of SIP. FindSIP should be called after Python
|
||
|
+# has been found.
|
||
|
+#
|
||
|
+# This file defines the following variables:
|
||
|
+#
|
||
|
+# SIP_VERSION - The version of SIP found expressed as a 6 digit hex number
|
||
|
+# suitable for comparison as a string.
|
||
|
+#
|
||
|
+# SIP_VERSION_STR - The version of SIP found as a human readable string.
|
||
|
+#
|
||
|
+# SIP_BINARY_PATH - Path and filename of the SIP command line executable.
|
||
|
+#
|
||
|
+# SIP_INCLUDE_DIR - Directory holding the SIP C++ header file.
|
||
|
+#
|
||
|
+# SIP_DEFAULT_SIP_DIR - Default directory where .sip files should be installed
|
||
|
+# into.
|
||
|
+
|
||
|
+# Copyright (c) 2007, Simon Edwards <simon@simonzone.com>
|
||
|
+# Redistribution and use is allowed according to the terms of the BSD license.
|
||
|
+# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
|
||
|
+
|
||
|
+
|
||
|
+
|
||
|
+IF(SIP_VERSION OR SIP_BUILD_EXECUTABLE)
|
||
|
+ # Already in cache, be silent
|
||
|
+ SET(SIP_FOUND TRUE)
|
||
|
+ELSE()
|
||
|
+
|
||
|
+ FIND_FILE(_find_sip_py FindSIP.py PATHS ${CMAKE_MODULE_PATH} NO_CMAKE_FIND_ROOT_PATH)
|
||
|
+
|
||
|
+ EXECUTE_PROCESS(COMMAND ${Python_EXECUTABLE} ${_find_sip_py} OUTPUT_VARIABLE sip_config)
|
||
|
+ IF(sip_config)
|
||
|
+ STRING(REGEX REPLACE "^sip_version:([^\n]+).*$" "\\1" SIP_VERSION ${sip_config})
|
||
|
+ STRING(REGEX REPLACE ".*\nsip_version_num:([^\n]+).*$" "\\1" SIP_VERSION_NUM ${sip_config})
|
||
|
+ STRING(REGEX REPLACE ".*\nsip_version_str:([^\n]+).*$" "\\1" SIP_VERSION_STR ${sip_config})
|
||
|
+ STRING(REGEX REPLACE ".*\ndefault_sip_dir:([^\n]+).*$" "\\1" SIP_DEFAULT_SIP_DIR ${sip_config})
|
||
|
+ IF(${SIP_VERSION_STR} VERSION_LESS 5)
|
||
|
+ STRING(REGEX REPLACE ".*\nsip_bin:([^\n]+).*$" "\\1" SIP_BINARY_PATH ${sip_config})
|
||
|
+ STRING(REGEX REPLACE ".*\nsip_inc_dir:([^\n]+).*$" "\\1" SIP_INCLUDE_DIR ${sip_config})
|
||
|
+ STRING(REGEX REPLACE ".*\nsip_module_dir:([^\n]+).*$" "\\1" SIP_MODULE_DIR ${sip_config})
|
||
|
+ ELSE(${SIP_VERSION_STR} VERSION_LESS 5)
|
||
|
+ FIND_PROGRAM(SIP_BUILD_EXECUTABLE sip-build)
|
||
|
+ ENDIF(${SIP_VERSION_STR} VERSION_LESS 5)
|
||
|
+ SET(SIP_FOUND TRUE)
|
||
|
+ ENDIF(sip_config)
|
||
|
+
|
||
|
+ IF(SIP_FOUND)
|
||
|
+ IF(NOT SIP_FIND_QUIETLY)
|
||
|
+ MESSAGE(STATUS "Found SIP version: ${SIP_VERSION_STR}")
|
||
|
+ ENDIF(NOT SIP_FIND_QUIETLY)
|
||
|
+ ELSE(SIP_FOUND)
|
||
|
+ IF(SIP_FIND_REQUIRED)
|
||
|
+ MESSAGE(FATAL_ERROR "Could not find SIP")
|
||
|
+ ENDIF(SIP_FIND_REQUIRED)
|
||
|
+ ENDIF(SIP_FOUND)
|
||
|
+
|
||
|
+ENDIF()
|
||
|
+
|
||
|
+include(${CMAKE_SOURCE_DIR}/cmake/SIPMacros.cmake)
|
||
|
+ADD_DEFINITIONS(-DSIP_VERSION=0x${SIP_VERSION})
|
||
|
--- /dev/null
|
||
|
+++ ./cmake/FindSIP.py
|
||
|
@@ -0,0 +1,57 @@
|
||
|
+# -*- coding: utf-8 -*-
|
||
|
+#
|
||
|
+# Copyright (c) 2007, Simon Edwards <simon@simonzone.com>
|
||
|
+# All rights reserved.
|
||
|
+#
|
||
|
+# Redistribution and use in source and binary forms, with or without
|
||
|
+# modification, are permitted provided that the following conditions are met:
|
||
|
+# * Redistributions of source code must retain the above copyright
|
||
|
+# notice, this list of conditions and the following disclaimer.
|
||
|
+# * Redistributions in binary form must reproduce the above copyright
|
||
|
+# notice, this list of conditions and the following disclaimer in the
|
||
|
+# documentation and/or other materials provided with the distribution.
|
||
|
+# * Neither the name of the Simon Edwards <simon@simonzone.com> nor the
|
||
|
+# names of its contributors may be used to endorse or promote products
|
||
|
+# derived from this software without specific prior written permission.
|
||
|
+#
|
||
|
+# THIS SOFTWARE IS PROVIDED BY Simon Edwards <simon@simonzone.com> ''AS IS'' AND ANY
|
||
|
+# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||
|
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||
|
+# DISCLAIMED. IN NO EVENT SHALL Simon Edwards <simon@simonzone.com> BE LIABLE FOR ANY
|
||
|
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||
|
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||
|
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||
|
+# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||
|
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||
|
+# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||
|
+#
|
||
|
+# FindSIP.py
|
||
|
+# Copyright (c) 2007, Simon Edwards <simon@simonzone.com>
|
||
|
+# Redistribution and use is allowed according to the terms of the BSD license.
|
||
|
+# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
|
||
|
+
|
||
|
+try:
|
||
|
+ import sipbuild
|
||
|
+
|
||
|
+ print("sip_version:%06.0x" % sipbuild.version.SIP_VERSION)
|
||
|
+ print("sip_version_num:%d" % sipbuild.version.SIP_VERSION)
|
||
|
+ print("sip_version_str:%s" % sipbuild.version.SIP_VERSION_STR)
|
||
|
+
|
||
|
+ from distutils.sysconfig import get_python_lib
|
||
|
+ python_modules_dir = get_python_lib(plat_specific=1)
|
||
|
+ print("default_sip_dir:%s" % python_modules_dir)
|
||
|
+except ImportError: # Code for SIP v4
|
||
|
+ import sipconfig
|
||
|
+
|
||
|
+ sipcfg = sipconfig.Configuration()
|
||
|
+ print("sip_version:%06.0x" % sipcfg.sip_version)
|
||
|
+ print("sip_version_num:%d" % sipcfg.sip_version)
|
||
|
+ print("sip_version_str:%s" % sipcfg.sip_version_str)
|
||
|
+ print("sip_bin:%s" % sipcfg.sip_bin)
|
||
|
+ print("default_sip_dir:%s" % sipcfg.default_sip_dir)
|
||
|
+ print("sip_inc_dir:%s" % sipcfg.sip_inc_dir)
|
||
|
+ # SIP 4.19.10+ has new sipcfg.sip_module_dir
|
||
|
+ if hasattr(sipcfg, "sip_module_dir"):
|
||
|
+ print("sip_module_dir:%s" % sipcfg.sip_module_dir)
|
||
|
+ else:
|
||
|
+ print("sip_module_dir:%s" % sipcfg.sip_mod_dir)
|
||
|
--- /dev/null
|
||
|
+++ ./cmake/SIPMacros.cmake
|
||
|
@@ -0,0 +1,107 @@
|
||
|
+
|
||
|
+
|
||
|
+# Macros for SIP
|
||
|
+# ~~~~~~~~~~~~~~
|
||
|
+
|
||
|
+set(SIP_ARGS --pep484-pyi --no-protected-is-public)
|
||
|
+
|
||
|
+function(add_sip_module MODULE_TARGET)
|
||
|
+ if(NOT SIP_BUILD_EXECUTABLE)
|
||
|
+ set(SIP_BUILD_EXECUTABLE ${CMAKE_PREFIX_PATH}/Scripts/sip-build)
|
||
|
+ endif()
|
||
|
+
|
||
|
+ message(STATUS "SIP: Generating pyproject.toml")
|
||
|
+ configure_file(${CMAKE_SOURCE_DIR}/pyproject.toml.in ${CMAKE_CURRENT_BINARY_DIR}/pyproject.toml)
|
||
|
+ configure_file(${CMAKE_SOURCE_DIR}/cmake/CMakeBuilder.py ${CMAKE_CURRENT_BINARY_DIR}/CMakeBuilder.py)
|
||
|
+ if(WIN32)
|
||
|
+ set(ext .pyd)
|
||
|
+ set(env_path_sep ";")
|
||
|
+ else()
|
||
|
+ set(ext .so)
|
||
|
+ set(env_path_sep ":")
|
||
|
+ endif()
|
||
|
+
|
||
|
+ message(STATUS "SIP: Generating source files")
|
||
|
+ execute_process(
|
||
|
+ COMMAND ${CMAKE_COMMAND} -E env "PYTHONPATH=${PYTHONPATH}${env_path_sep}$ENV{PYTHONPATH}${env_path_sep}${CMAKE_CURRENT_BINARY_DIR}" ${SIP_BUILD_EXECUTABLE} ${SIP_ARGS}
|
||
|
+ COMMAND_ECHO STDOUT
|
||
|
+ WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/
|
||
|
+ )
|
||
|
+ # This will generate the source-files during the configuration step in CMake. Needed to obtain the sources
|
||
|
+
|
||
|
+ # Touch the generated files (8 in total) to make them dirty and force them to rebuild
|
||
|
+ message(STATUS "SIP: Touching the source files")
|
||
|
+ set(_sip_output_files)
|
||
|
+ list(LENGTH SIP_FILES _no_outputfiles)
|
||
|
+ foreach(_concat_file_nr RANGE 0 ${_no_outputfiles})
|
||
|
+ if(${_concat_file_nr} LESS 8)
|
||
|
+ list(APPEND _sip_output_files "${CMAKE_CURRENT_BINARY_DIR}/${MODULE_TARGET}/${MODULE_TARGET}/sip${MODULE_TARGET}part${_concat_file_nr}.cpp")
|
||
|
+ endif()
|
||
|
+ endforeach()
|
||
|
+
|
||
|
+ # Find the generated source files
|
||
|
+ message(STATUS "SIP: Collecting the generated source files")
|
||
|
+ file(GLOB sip_c "${CMAKE_CURRENT_BINARY_DIR}/${MODULE_TARGET}/${MODULE_TARGET}/*.c")
|
||
|
+ file(GLOB sip_cpp "${CMAKE_CURRENT_BINARY_DIR}/${MODULE_TARGET}/${MODULE_TARGET}/*.cpp")
|
||
|
+ file(GLOB sip_hdr "${CMAKE_CURRENT_BINARY_DIR}/${MODULE_TARGET}/${MODULE_TARGET}/*.h")
|
||
|
+
|
||
|
+ # Add the user specified source files
|
||
|
+ message(STATUS "SIP: Collecting the user specified source files")
|
||
|
+ get_target_property(usr_src ${MODULE_TARGET} SOURCES)
|
||
|
+
|
||
|
+ # create the target library and link all the files (generated and user specified
|
||
|
+ message(STATUS "SIP: Linking the interface target against the shared library")
|
||
|
+ set(sip_sources "${sip_c}" "${sip_cpp}" "${usr_src}")
|
||
|
+
|
||
|
+ if (BUILD_SHARED_LIBS)
|
||
|
+ add_library("sip_${MODULE_TARGET}" SHARED ${sip_sources})
|
||
|
+ else()
|
||
|
+ add_library("sip_${MODULE_TARGET}" STATIC ${sip_sources})
|
||
|
+ endif()
|
||
|
+
|
||
|
+ # Make sure that the library name of the target is the same as the MODULE_TARGET with the appropriate extension
|
||
|
+ target_link_libraries("sip_${MODULE_TARGET}" PRIVATE "${MODULE_TARGET}")
|
||
|
+ set_target_properties("sip_${MODULE_TARGET}" PROPERTIES PREFIX "")
|
||
|
+ set_target_properties("sip_${MODULE_TARGET}" PROPERTIES SUFFIX ${ext})
|
||
|
+ set_target_properties("sip_${MODULE_TARGET}" PROPERTIES OUTPUT_NAME "${MODULE_TARGET}")
|
||
|
+
|
||
|
+ # Add the custom command to (re-)generate the files and mark them as dirty. This allows the user to actually work
|
||
|
+ # on the sip definition files without having to reconfigure the complete project.
|
||
|
+ if (NOT DEFINED PYTHONPATH)
|
||
|
+ set(PYTHONPATH "")
|
||
|
+ endif ()
|
||
|
+ add_custom_command(
|
||
|
+ TARGET "sip_${MODULE_TARGET}"
|
||
|
+ COMMAND ${CMAKE_COMMAND} -E env "PYTHONPATH=${PYTHONPATH}${env_path_sep}$ENV{PYTHONPATH}${env_path_sep}${CMAKE_CURRENT_BINARY_DIR}" ${SIP_BUILD_EXECUTABLE} ${SIP_ARGS}
|
||
|
+ COMMAND ${CMAKE_COMMAND} -E touch ${_sip_output_files}
|
||
|
+ WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/
|
||
|
+ MAIN_DEPENDENCY ${MODULE_SIP}
|
||
|
+ DEPENDS ${sip_sources}
|
||
|
+ VERBATIM
|
||
|
+ )
|
||
|
+
|
||
|
+ set_target_properties("sip_${MODULE_TARGET}"
|
||
|
+ PROPERTIES
|
||
|
+ RESOURCE "${CMAKE_CURRENT_BINARY_DIR}/${MODULE_TARGET}/${MODULE_TARGET}/${MODULE_TARGET}.pyi")
|
||
|
+endfunction()
|
||
|
+
|
||
|
+function(install_sip_module MODULE_TARGET)
|
||
|
+ if(DEFINED ARGV1)
|
||
|
+ set(_install_path ${ARGV1})
|
||
|
+ else()
|
||
|
+ if(DEFINED Python_SITEARCH)
|
||
|
+ set(_install_path ${Python_SITEARCH})
|
||
|
+ elseif(DEFINED Python_SITELIB)
|
||
|
+ set(_install_path ${Python_SITELIB})
|
||
|
+ else()
|
||
|
+ message(FATAL_ERROR "SIP: Specify the site-packages location")
|
||
|
+ endif()
|
||
|
+ endif()
|
||
|
+ message(STATUS "SIP: Installing Python module and PEP 484 file in ${_install_path}")
|
||
|
+ install(TARGETS "sip_${MODULE_TARGET}"
|
||
|
+ ARCHIVE DESTINATION ${_install_path}
|
||
|
+ LIBRARY DESTINATION ${_install_path}
|
||
|
+ RUNTIME DESTINATION ${_install_path}
|
||
|
+ RESOURCE DESTINATION ${_install_path}
|
||
|
+ )
|
||
|
+endfunction()
|