From e3b2d33a1128040a5accf3d2e6398aa94d8ca3c9 Mon Sep 17 00:00:00 2001 From: zach Date: Wed, 8 Jul 2026 18:32:21 +0200 Subject: [PATCH] fix: fallback to python wheel if Nuitka is not available --- CMakeLists.txt | 97 ++++++++++++++++-------- Plugins/cmake/zshell-cli-python.cmake.in | 19 +++++ 2 files changed, 86 insertions(+), 30 deletions(-) create mode 100644 Plugins/cmake/zshell-cli-python.cmake.in diff --git a/CMakeLists.txt b/CMakeLists.txt index 1d3932b..4e17b61 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -72,43 +72,80 @@ if("shell" IN_LIST ENABLE_MODULES) set(ZSHELL_CLI_DIST "${ZSHELL_CLI_BUILD_DIR}/zshell.dist") set(ZSHELL_CLI_SRC "${CMAKE_SOURCE_DIR}/cli/src/zshell") - find_program(NUITKA_EXECUTABLE nuitka REQUIRED) + find_program(NUITKA_EXECUTABLE nuitka) - file(GLOB_RECURSE ZSHELL_CLI_SOURCES CONFIGURE_DEPENDS - "${ZSHELL_CLI_SRC}/*.py" - ) - file(GLOB_RECURSE ZSHELL_CLI_ASSETS CONFIGURE_DEPENDS - "${ZSHELL_CLI_SRC}/assets/*" - ) + if(NUITKA_EXECUTABLE) + file(GLOB_RECURSE ZSHELL_CLI_SOURCES CONFIGURE_DEPENDS + "${ZSHELL_CLI_SRC}/*.py" + ) + file(GLOB_RECURSE ZSHELL_CLI_ASSETS CONFIGURE_DEPENDS + "${ZSHELL_CLI_SRC}/assets/*" + ) - add_custom_command( - OUTPUT "${ZSHELL_CLI_DIST}/zshell-cli" - COMMAND ${CMAKE_COMMAND} -E make_directory "${ZSHELL_CLI_BUILD_DIR}" - COMMAND ${CMAKE_COMMAND} -E rm -rf "${ZSHELL_CLI_DIST}" + add_custom_command( + OUTPUT "${ZSHELL_CLI_DIST}/zshell-cli" + COMMAND ${CMAKE_COMMAND} -E make_directory "${ZSHELL_CLI_BUILD_DIR}" + COMMAND ${CMAKE_COMMAND} -E rm -rf "${ZSHELL_CLI_DIST}" - COMMAND - ${NUITKA_EXECUTABLE} - --standalone - --include-data-dir=${CMAKE_SOURCE_DIR}/cli/src/zshell/assets=zshell/assets - --output-dir=${ZSHELL_CLI_BUILD_DIR} - --output-filename=zshell-cli - ${CMAKE_SOURCE_DIR}/cli/src/zshell/ + COMMAND + ${NUITKA_EXECUTABLE} + --standalone + --include-data-dir=${CMAKE_SOURCE_DIR}/cli/src/zshell/assets=zshell/assets + --output-dir=${ZSHELL_CLI_BUILD_DIR} + --output-filename=zshell-cli + ${CMAKE_SOURCE_DIR}/cli/src/zshell/ - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/cli - DEPENDS ${ZSHELL_CLI_SOURCES} ${ZSHELL_CLI_ASSETS} - ) + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/cli + DEPENDS ${ZSHELL_CLI_SOURCES} ${ZSHELL_CLI_ASSETS} + ) - add_custom_target(zshell-cli ALL DEPENDS "${ZSHELL_CLI_DIST}/zshell-cli") + add_custom_target(zshell-cli ALL DEPENDS "${ZSHELL_CLI_DIST}/zshell-cli") - install(PROGRAMS "${ZSHELL_CLI_DIST}/zshell-cli" DESTINATION "${INSTALL_LIBDIR}/zshell-cli") - install(DIRECTORY "${ZSHELL_CLI_DIST}/" DESTINATION "${INSTALL_LIBDIR}/zshell-cli" PATTERN "zshell-cli" EXCLUDE) + install(PROGRAMS "${ZSHELL_CLI_DIST}/zshell-cli" DESTINATION "${INSTALL_LIBDIR}/zshell-cli") + install(DIRECTORY "${ZSHELL_CLI_DIST}/" DESTINATION "${INSTALL_LIBDIR}/zshell-cli" PATTERN "zshell-cli" EXCLUDE) - configure_file( - "${CMAKE_SOURCE_DIR}/Plugins/cmake/zshell-cli.cmake.in" - "${CMAKE_BINARY_DIR}/Plugins/cmake/zshell-cli.cmake" - @ONLY - ) - install(SCRIPT "${CMAKE_BINARY_DIR}/Plugins/cmake/zshell-cli.cmake") + configure_file( + "${CMAKE_SOURCE_DIR}/Plugins/cmake/zshell-cli.cmake.in" + "${CMAKE_BINARY_DIR}/Plugins/cmake/zshell-cli.cmake" + @ONLY + ) + install(SCRIPT "${CMAKE_BINARY_DIR}/Plugins/cmake/zshell-cli.cmake") + else() + message(STATUS "Nuitka not found, building zshell-cli as a Python wheel instead") + + find_package(Python3 COMPONENTS Interpreter REQUIRED) + + set(ZSHELL_CLI_DIR "${CMAKE_SOURCE_DIR}") + set(ZSHELL_CLI_DIST_DIR "${ZSHELL_CLI_DIR}/dist") + set(ZSHELL_CLI_WHEEL_STAMP "${CMAKE_BINARY_DIR}/zshell-cli/wheel.stamp") + + file(GLOB_RECURSE ZSHELL_CLI_SOURCES CONFIGURE_DEPENDS + "${ZSHELL_CLI_DIR}/src/zshell/*.py" + ) + file(GLOB_RECURSE ZSHELL_CLI_ASSETS CONFIGURE_DEPENDS + "${ZSHELL_CLI_DIR}/src/zshell/assets/*" + ) + + add_custom_command( + OUTPUT "${ZSHELL_CLI_WHEEL_STAMP}" + COMMAND ${CMAKE_COMMAND} -E make_directory "${CMAKE_BINARY_DIR}/zshell-cli" + COMMAND ${CMAKE_COMMAND} -E rm -rf "${ZSHELL_CLI_DIST_DIR}" + COMMAND ${Python3_EXECUTABLE} -m build --wheel --no-isolation + COMMAND ${CMAKE_COMMAND} -E touch "${ZSHELL_CLI_WHEEL_STAMP}" + WORKING_DIRECTORY "${ZSHELL_CLI_DIR}" + DEPENDS ${ZSHELL_CLI_SOURCES} ${ZSHELL_CLI_ASSETS} + COMMENT "Building zshell-cli python wheel" + ) + + add_custom_target(zshell-cli ALL DEPENDS "${ZSHELL_CLI_WHEEL_STAMP}") + + configure_file( + "${CMAKE_SOURCE_DIR}/Plugins/cmake/zshell-cli-python.cmake.in" + "${CMAKE_BINARY_DIR}/Plugins/cmake/zshell-cli-python.cmake" + @ONLY + ) + install(SCRIPT "${CMAKE_BINARY_DIR}/Plugins/cmake/zshell-cli-python.cmake") + endif() endif() if("plugin" IN_LIST ENABLE_MODULES) diff --git a/Plugins/cmake/zshell-cli-python.cmake.in b/Plugins/cmake/zshell-cli-python.cmake.in new file mode 100644 index 0000000..a69100f --- /dev/null +++ b/Plugins/cmake/zshell-cli-python.cmake.in @@ -0,0 +1,19 @@ +file(GLOB ZSHELL_CLI_WHEEL "@ZSHELL_CLI_DIST_DIR@/*.whl") +if(NOT ZSHELL_CLI_WHEEL) + message(FATAL_ERROR "No zshell-cli wheel found in @ZSHELL_CLI_DIST_DIR@") +endif() + +set(_zshell_installer_args "--prefix=@CMAKE_INSTALL_PREFIX@") +if(DEFINED ENV{DESTDIR} AND NOT "$ENV{DESTDIR}" STREQUAL "") + list(APPEND _zshell_installer_args "--destdir=$ENV{DESTDIR}") +endif() + +execute_process( + COMMAND "@Python3_EXECUTABLE@" -m installer + ${_zshell_installer_args} + ${ZSHELL_CLI_WHEEL} + RESULT_VARIABLE ZSHELL_CLI_INSTALL_RESULT +) +if(NOT ZSHELL_CLI_INSTALL_RESULT EQUAL 0) + message(FATAL_ERROR "zshell-cli wheel install failed") +endif()