--- /dev/null
+find_package(Python3 ${WITH_PYTHON3} EXACT
+ QUIET
+ REQUIRED
+ COMPONENTS Interpreter)
+
+function(create_python_package pkgname)
+ set(options BUILD_ISOLATION)
+ set(oneValueArgs WHEELDIR)
+ cmake_parse_arguments(PARSE_ARGV 0 pypkg
+ "${options}" "${oneValueArgs}" "")
+ if(NOT "${pypkg_WHEELDIR}")
+ set(pypkg_WHEELDIR "${CMAKE_CURRENT_BINARY_DIR}/wheels/${pkgname}")
+ endif()
+
+ python_package_build_pip_wheel(
+ "${pkgname}" "${pypkg_WHEELDIR}" "${pypkg_BUILD_ISOLATION}"
+ )
+ python_package_install_pip_wheel("${pkgname}" "${pypkg_WHEELDIR}")
+endfunction(create_python_package)
+
+
+function(
+ python_package_build_pip_wheel
+ pkgname
+ wheeldir
+ build_isolation
+)
+ list(APPEND build_args
+ --wheel-dir "${wheeldir}"
+ --no-deps
+ --use-pep517
+ --disable-pip-version-check
+ --no-clean
+ --progress-bar=off
+ --verbose
+ )
+ if(NOT "${build_isolation}")
+ list(APPEND build_args --no-build-isolation)
+ endif()
+ list(APPEND build_args "${CMAKE_CURRENT_SOURCE_DIR}")
+
+ add_custom_command(
+ OUTPUT ${wheeldir}
+ DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/pyproject.toml
+ COMMAND ${Python3_EXECUTABLE} -m pip wheel ${build_args}
+ )
+ if(NOT TARGET build-wheel-${pkgname})
+ add_custom_target(build-wheel-${pkgname} ALL
+ DEPENDS ${wheeldir})
+ endif()
+endfunction(python_package_build_pip_wheel)
+
+function(
+ python_package_install_pip_wheel
+ pkgname
+ wheeldir
+)
+ list(APPEND install_args
+ "--prefix=${CMAKE_INSTALL_PREFIX}"
+ --no-deps
+ --disable-pip-version-check
+ --progress-bar=off
+ --root-user-action=ignore
+ --verbose
+ --ignore-installed
+ --no-warn-script-location
+ --no-index
+ --no-cache-dir
+ --find-links "${wheeldir}"
+ "${pkgname}"
+ )
+
+ install(CODE "
+ set(args \"${install_args}\")
+ if(DEFINED ENV{DESTDIR})
+ list(INSERT args 1 --root=\$ENV{DESTDIR})
+ endif()
+ message(DEBUG PythonPackage.install_cmd=
+ \"${Python3_EXECUTABLE} -m pip install\" \"\${args}\")
+ execute_process(
+ COMMAND ${Python3_EXECUTABLE} -m pip install \${args}
+ WORKING_DIRECTORY \"${CMAKE_CURRENT_BINARY_DIR}\"
+ COMMAND_ERROR_IS_FATAL ANY)")
+endfunction(python_package_install_pip_wheel)