Skip to content
Snippets Groups Projects

Feat: `ihta_package_python_wheel`

Open Pascal Palenda requested to merge feature/pack-py-whl into main
2 files
+ 149
4
Compare changes
  • Side-by-side
  • Inline

Files

+ 145
0
 
include_guard ()
 
 
#[=======================================================================[.rst:
 
..command:: ihta_package_python_wheel
 
 
Macro to create a Python wheel package from a target.
 
 
::
 
 
ihta_package_python_wheel(
 
TARGET_NAME <target-name>
 
[PACKAGE_NAME <package-name>]
 
[VERSION <package-version>]
 
[OUTPUT_VAR <output-variable-name>]
 
)
 
 
.. variable:: TARGET_NAME
 
 
Name of the target to package.
 
 
.. variable:: PACKAGE_NAME
 
 
Name of the package. If not given, the target name will be used.
 
 
.. variable:: VERSION
 
 
Version of the package. If not given, the version will be set to `0.0.0`.
 
 
.. variable:: OUTPUT_VAR
 
 
Name of the variable to store the output directory of the wheel package.
 
 
#]=======================================================================]
 
function (ihta_package_python_wheel)
 
set (options)
 
set (oneValueArgs TARGET_NAME PACKAGE_NAME VERSION OUTPUT_VAR)
 
set (multiValueArgs)
 
cmake_parse_arguments (PACK_WHL "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
 
 
if (NOT PACK_WHL_PACKAGE_NAME)
 
set (PACK_WHL_PACKAGE_NAME ${PACK_WHL_TARGET_NAME})
 
endif ()
 
 
if (NOT PACK_WHL_VERSION)
 
message (WARNING "No version specified for Python wheel package. Defaulting to 0.0.0")
 
set (PACK_WHL_VERSION "0.0.0")
 
endif ()
 
 
find_package (Python3 REQUIRED COMPONENTS Interpreter)
 
 
set (PACKAGE_WHL_BASE_DIR ${CMAKE_BINARY_DIR}/ihta_pack_whl)
 
set (PACKAGE_WORKING_DIR ${PACKAGE_WHL_BASE_DIR}/${PACK_WHL_PACKAGE_NAME})
 
set (PACKAGE_INIT_DIR ${PACKAGE_WORKING_DIR}/src/${PACK_WHL_PACKAGE_NAME})
 
set (DIST_DIR ${PACKAGE_WORKING_DIR}/dist)
 
 
set (
 
BUILDER_PLUGIN_CONTENT
 
[[
 
from hatchling.builders.hooks.plugin.interface import BuildHookInterface
 
 
from typing import Any
 
import sysconfig
 
 
class CustomBuildHook(BuildHookInterface):
 
def initialize(self, version: str, build_data: dict[str, Any]) -> None:
 
build_data["pure_python"] = True
 
build_data["infer_tag"] = False
 
 
platform_tag = sysconfig.get_platform()
 
platform_tag = platform_tag.replace("-", "_").replace(".", "_")
 
 
build_data["tag"] = f"py3-none-{platform_tag}"
 
]]
 
)
 
 
set (
 
PYPROJECT_CONTENT
 
"
 
[build-system]
 
requires = [\"hatchling\"]
 
build-backend = \"hatchling.build\"
 
 
[project]
 
name = \"${PACK_WHL_PACKAGE_NAME}\"
 
description = \"Package containing the ${PACK_WHL_TARGET_NAME} executable\"
 
requires-python = \">=3.9\"
 
version = \"${PACK_WHL_VERSION}\"
 
 
[tool.hatch.build.targets.wheel.hooks.custom]
 
path = \"builder_plugin.py\"
 
"
 
)
 
 
file (
 
GENERATE
 
OUTPUT ${PACKAGE_WORKING_DIR}/src/${PACK_WHL_PACKAGE_NAME}/__init__.py
 
CONTENT "from pathlib import Path
 
 
EXECUTABLE_PATH = Path(__file__).parent / \"$<TARGET_FILE_NAME:${PACK_WHL_TARGET_NAME}>\"
 
__version__ = \"${PACK_WHL_VERSION}\""
 
)
 
file (
 
GENERATE
 
OUTPUT ${PACKAGE_WORKING_DIR}/builder_plugin.py
 
CONTENT "${BUILDER_PLUGIN_CONTENT}"
 
)
 
file (
 
GENERATE
 
OUTPUT ${PACKAGE_WORKING_DIR}/pyproject.toml
 
CONTENT "${PYPROJECT_CONTENT}"
 
)
 
 
# Define packaging target
 
add_custom_target (
 
package_wheel_${PACK_WHL_TARGET_NAME}
 
# Ensure package directory exists
 
COMMAND ${CMAKE_COMMAND} -E make_directory "${PACKAGE_WORKING_DIR}"
 
# Copy executable to package directory
 
COMMAND ${CMAKE_COMMAND} -E copy "$<TARGET_FILE:${PACK_WHL_TARGET_NAME}>"
 
"${PACKAGE_INIT_DIR}/$<TARGET_FILE_NAME:${PACK_WHL_TARGET_NAME}>"
 
# copy all shared libraries to the package directory
 
COMMAND ${CMAKE_COMMAND} -E copy -t ${PACKAGE_INIT_DIR} $<TARGET_RUNTIME_DLLS:${PACK_WHL_TARGET_NAME}>
 
# Ensure wheel is installed
 
COMMAND ${Python3_EXECUTABLE} -m pip install --upgrade wheel build
 
# Build the wheel using pyproject.toml
 
COMMAND ${Python3_EXECUTABLE} -m build --wheel
 
WORKING_DIRECTORY "${PACKAGE_WORKING_DIR}"
 
COMMENT "Generating Python wheel for ${PACK_WHL_TARGET_NAME} ..."
 
COMMAND_EXPAND_LISTS
 
)
 
# make this target depend on the build target
 
add_dependencies (package_wheel_${PACK_WHL_TARGET_NAME} ${PACK_WHL_TARGET_NAME})
 
 
# put the target in an IDE folder
 
set_property (TARGET package_wheel_${PACK_WHL_TARGET_NAME} PROPERTY FOLDER "package_wheel")
 
 
if (PACK_WHL_OUTPUT_VAR)
 
set (
 
${PACK_WHL_OUTPUT_VAR}
 
${DIST_DIR}
 
PARENT_SCOPE
 
)
 
endif ()
 
 
endfunction ()
Loading