Initial Commit
This commit is contained in:
@@ -0,0 +1,62 @@
|
|||||||
|
# SPDX-FileCopyrightText: 2026 Christian Tosta
|
||||||
|
# SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
# @file .github/workflows/build.yml
|
||||||
|
# @brief Simplified master workflow using CMake workflows
|
||||||
|
|
||||||
|
name: Pyenv Build & Release
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
tags:
|
||||||
|
- "v*"
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
release-ci:
|
||||||
|
runs-on: ubuntu-24.04
|
||||||
|
outputs:
|
||||||
|
VERSION: ${{ steps.step_getlatest_tag.outputs.VERSION }}
|
||||||
|
steps:
|
||||||
|
- name: Checkout local
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
repository: ${{ github.repository }}
|
||||||
|
sparse-checkout: |
|
||||||
|
.github/workflows
|
||||||
|
|
||||||
|
- name: Install build dependencies
|
||||||
|
run: sudo apt-get install git -y -qq
|
||||||
|
|
||||||
|
- name: Get latest pyenv release tag
|
||||||
|
id: step_getlatest_tag
|
||||||
|
run: |
|
||||||
|
latest_tag=$(git -c 'versionsort.suffix=-' ls-remote --exit-code --refs --sort='version:refname' --tags https://github.com/pyenv/pyenv '*.*' \
|
||||||
|
| tail --lines=1 | cut --delimiter='/' --fields=3)
|
||||||
|
|
||||||
|
test ! -z "$latest_tag" && echo "LATEST_TAG=$latest_tag" >> "$GITHUB_ENV" || exit 1
|
||||||
|
echo "VERSION=$(echo $latest_tag | sed 's/v//')" >> "$GITHUB_OUTPUT"
|
||||||
|
|
||||||
|
- name: Save version
|
||||||
|
run: echo ${{ steps.step_getlatest_tag.outputs.VERSION }} > VERSION
|
||||||
|
|
||||||
|
- name: Upload version
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: VERSION
|
||||||
|
path: VERSION
|
||||||
|
retention-days: 1
|
||||||
|
|
||||||
|
debian:
|
||||||
|
needs: release-ci
|
||||||
|
uses: ./.github/workflows/targets/debian.yml
|
||||||
|
with:
|
||||||
|
containers: "['debian:trixie','debian:bookworm']"
|
||||||
|
|
||||||
|
fedora:
|
||||||
|
needs: release-ci
|
||||||
|
uses: ./.github/workflows/targets/fedora.yml
|
||||||
|
with:
|
||||||
|
containers: "['fedora:44','fedora:45','fedora:latest']"
|
||||||
|
|
||||||
|
publish:
|
||||||
|
needs: [debian, fedora]
|
||||||
|
uses: ./.github/workflows/release.yml
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
# SPDX-FileCopyrightText: 2026 Christian Tosta
|
||||||
|
# SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
name: Publish release
|
||||||
|
|
||||||
|
on: workflow_call
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
publish:
|
||||||
|
runs-on: ubuntu-24.04
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Get version
|
||||||
|
uses: actions/download-artifact@v4
|
||||||
|
with:
|
||||||
|
name: VERSION
|
||||||
|
|
||||||
|
- name: Set version
|
||||||
|
run: echo "VERSION=$(cat VERSION | xargs)" >> "$GITHUB_ENV"
|
||||||
|
|
||||||
|
- name: Download artifacts
|
||||||
|
uses: actions/download-artifact@v4
|
||||||
|
with:
|
||||||
|
pattern: pyenv-*
|
||||||
|
merge-multiple: true
|
||||||
|
|
||||||
|
- name: Release
|
||||||
|
uses: softprops/action-gh-release@v2
|
||||||
|
if: startsWith(github.ref, 'refs/tags/')
|
||||||
|
with:
|
||||||
|
files: |
|
||||||
|
*.deb
|
||||||
|
*.rpm
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
# SPDX-FileCopyrightText: 2026 Christian Tosta
|
||||||
|
# SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
# @file .github/workflows/targets/debian.yml
|
||||||
|
# @brief Simplified Debian build target using workflow preset
|
||||||
|
|
||||||
|
name: Debian Build Target
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_call:
|
||||||
|
inputs:
|
||||||
|
containers:
|
||||||
|
required: true
|
||||||
|
type: string
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build-deb:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
container: ${{ fromJson(inputs.containers) }}
|
||||||
|
container:
|
||||||
|
image: ${{ matrix.container }}
|
||||||
|
steps:
|
||||||
|
- name: Checkout Repository
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Install Dependencies
|
||||||
|
run: apt-get update && apt-get install -y cmake build-essential git dpkg-dev fakeroot
|
||||||
|
|
||||||
|
- name: Run CMake Workflow
|
||||||
|
run: cmake --workflow --preset deb-workflow
|
||||||
|
|
||||||
|
- name: Upload Artifacts
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: pyenv-deb-${{ matrix.container }}
|
||||||
|
path: build/deb/*.deb
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
# SPDX-FileCopyrightText: 2026 Christian Tosta
|
||||||
|
# SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
# @file .github/workflows/targets/fedora.yml
|
||||||
|
# @brief Fedora build target with internal container matrix
|
||||||
|
|
||||||
|
name: Fedora Build Target
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_call:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build-rpm:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
container: [fedora:42, fedora:43, fedora:latest]
|
||||||
|
container:
|
||||||
|
image: ${{ matrix.container }}
|
||||||
|
steps:
|
||||||
|
- name: Checkout Repository
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Install Dependencies
|
||||||
|
run: dnf install -y cmake gcc-c++ make git rpm-build
|
||||||
|
|
||||||
|
- name: Run CMake Workflow
|
||||||
|
run: cmake --workflow --preset rpm-workflow
|
||||||
|
|
||||||
|
- name: Upload Artifacts
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: pyenv-rpm-${{ matrix.container }}
|
||||||
|
path: build/rpm/*.rpm
|
||||||
+37
@@ -0,0 +1,37 @@
|
|||||||
|
.agignore
|
||||||
|
/bats
|
||||||
|
/bats-*/
|
||||||
|
bin/
|
||||||
|
build/
|
||||||
|
/cache
|
||||||
|
CHANGELOG.md
|
||||||
|
COMMANDS.md
|
||||||
|
completions/
|
||||||
|
CONDUCT.md
|
||||||
|
CONTRIBUTING.md
|
||||||
|
/default-packages
|
||||||
|
.dockerignore
|
||||||
|
.editorconfig
|
||||||
|
.idea
|
||||||
|
install_local_python.gif
|
||||||
|
libexec/
|
||||||
|
/libexec/*.dylib
|
||||||
|
LICENSE.pyenv.md
|
||||||
|
MAINTENANCE.md
|
||||||
|
Makefile
|
||||||
|
man/
|
||||||
|
plugins/
|
||||||
|
pyenv/
|
||||||
|
pyenv.d/
|
||||||
|
README.pyenv.md
|
||||||
|
/shims
|
||||||
|
/sources
|
||||||
|
src/
|
||||||
|
/src/Makefile
|
||||||
|
/src/*.o
|
||||||
|
terminal_output.png
|
||||||
|
test/
|
||||||
|
*.un~
|
||||||
|
/version
|
||||||
|
/versions
|
||||||
|
.vimrc
|
||||||
@@ -0,0 +1,47 @@
|
|||||||
|
# SPDX-FileCopyrightText: 2026 Christian Tosta
|
||||||
|
# SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
#
|
||||||
|
# @file CMakeLists.txt
|
||||||
|
# @brief Main CMake configuration for multi-distribution pyenv packaging.
|
||||||
|
|
||||||
|
cmake_minimum_required(VERSION 3.24)
|
||||||
|
project(pyenv-packaging NONE)
|
||||||
|
|
||||||
|
file(READ "${CMAKE_CURRENT_SOURCE_DIR}/metadata.json" METADATA_JSON)
|
||||||
|
string(JSON PYENV_VERSION GET ${METADATA_JSON} "version")
|
||||||
|
string(JSON PYENV_URL GET ${METADATA_JSON} "source_url")
|
||||||
|
string(REPLACE "\${self.version}" "${PYENV_VERSION}" PYENV_URL "${PYENV_URL}")
|
||||||
|
|
||||||
|
include(ExternalProject)
|
||||||
|
|
||||||
|
ExternalProject_Add(pyenv_upstream
|
||||||
|
URL ${PYENV_URL}
|
||||||
|
DOWNLOAD_EXTRACT_TIMESTAMP TRUE
|
||||||
|
CONFIGURE_COMMAND ""
|
||||||
|
BUILD_COMMAND ""
|
||||||
|
INSTALL_COMMAND ""
|
||||||
|
PATCH_COMMAND sh -c "find <SOURCE_DIR> \\( -name .git\\* \\) -exec rm -rf {} +"
|
||||||
|
)
|
||||||
|
|
||||||
|
set(PYENV_SRC_UPSTREAM "${CMAKE_CURRENT_BINARY_DIR}/pyenv_upstream-prefix/src/pyenv_upstream")
|
||||||
|
set(PYENV_SRC "${CMAKE_CURRENT_SOURCE_DIR}/pyenv")
|
||||||
|
|
||||||
|
add_custom_target(merge_upstream ALL
|
||||||
|
COMMAND ${CMAKE_COMMAND} -E copy_directory "${PYENV_SRC_UPSTREAM}" "${PYENV_SRC}"
|
||||||
|
DEPENDS pyenv_upstream
|
||||||
|
)
|
||||||
|
|
||||||
|
include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/CPackRules.cmake)
|
||||||
|
|
||||||
|
install(DIRECTORY ${PYENV_SRC}/bin ${PYENV_SRC}/libexec ${PYENV_SRC}/plugins ${PYENV_SRC}/pyenv.d
|
||||||
|
DESTINATION ${PACKAGE_PREFIX}/share/pyenv)
|
||||||
|
|
||||||
|
install(DIRECTORY ${PYENV_SRC}/man DESTINATION ${PACKAGE_PREFIX}/share)
|
||||||
|
|
||||||
|
install(CODE "file(MAKE_DIRECTORY \"\$ENV{DESTDIR}${PACKAGE_PREFIX}/share/pyenv/versions\")")
|
||||||
|
install(CODE "file(MAKE_DIRECTORY \"\$ENV{DESTDIR}${PACKAGE_PREFIX}/share/pyenv/shims\")")
|
||||||
|
install(CODE "file(MAKE_DIRECTORY \"\$ENV{DESTDIR}${PACKAGE_PREFIX}/share/pyenv/hooks\")")
|
||||||
|
|
||||||
|
install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/pyenv.sh"
|
||||||
|
DESTINATION /etc/profile.d
|
||||||
|
PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ)
|
||||||
@@ -0,0 +1,88 @@
|
|||||||
|
{
|
||||||
|
"version": 6,
|
||||||
|
"cmakeMinimumRequired": {
|
||||||
|
"major": 3,
|
||||||
|
"minor": 24
|
||||||
|
},
|
||||||
|
"configurePresets": [
|
||||||
|
{
|
||||||
|
"name": "deb-config",
|
||||||
|
"displayName": "Debian / Ubuntu Build",
|
||||||
|
"binaryDir": "${sourceDir}/build/deb",
|
||||||
|
"cacheVariables": {
|
||||||
|
"BUILD_DEB": "ON",
|
||||||
|
"BUILD_RPM": "OFF",
|
||||||
|
"CMAKE_INSTALL_PREFIX": "/usr"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "rpm-config",
|
||||||
|
"displayName": "Fedora / RPM Build",
|
||||||
|
"binaryDir": "${sourceDir}/build/rpm",
|
||||||
|
"cacheVariables": {
|
||||||
|
"BUILD_DEB": "OFF",
|
||||||
|
"BUILD_RPM": "ON",
|
||||||
|
"CMAKE_INSTALL_PREFIX": "/usr"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "act-config",
|
||||||
|
"displayName": "Local Containerized Build (act)",
|
||||||
|
"binaryDir": "${sourceDir}/build/act",
|
||||||
|
"cacheVariables": {
|
||||||
|
"USE_ACT_CONTAINER": "ON",
|
||||||
|
"BUILD_DEB": "ON"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"buildPresets": [
|
||||||
|
{
|
||||||
|
"name": "deb-build",
|
||||||
|
"configurePreset": "deb-config"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "rpm-build",
|
||||||
|
"configurePreset": "rpm-config"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "rpm-rebuild",
|
||||||
|
"configurePreset": "rpm-config",
|
||||||
|
"targets": [ "rpm-rebuild" ]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "act-build",
|
||||||
|
"configurePreset": "act-config",
|
||||||
|
"targets": ["act-build"]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"packagePresets": [
|
||||||
|
{
|
||||||
|
"name": "deb-package",
|
||||||
|
"configurePreset": "deb-config"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "srpm-package",
|
||||||
|
"configurePreset": "rpm-config",
|
||||||
|
"configFile": "CPackSourceConfig.cmake",
|
||||||
|
"generators": ["RPM"]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"workflowPresets": [
|
||||||
|
{
|
||||||
|
"name": "deb-workflow",
|
||||||
|
"steps": [
|
||||||
|
{ "type": "configure", "name": "deb-config" },
|
||||||
|
{ "type": "build", "name": "deb-build" },
|
||||||
|
{ "type": "package", "name": "deb-package" }
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "rpm-workflow",
|
||||||
|
"steps": [
|
||||||
|
{ "type": "configure", "name": "rpm-config" },
|
||||||
|
{ "type": "build", "name": "rpm-build" },
|
||||||
|
{ "type": "package", "name": "srpm-package" }
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
# SPDX-FileCopyrightText: 2026 Christian Tosta
|
||||||
|
# SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
# @file cmake/ActBuilder.cmake
|
||||||
|
# @brief Helper module to orchestrate local builds via act containerization
|
||||||
|
|
||||||
|
option(USE_ACT_CONTAINER "Enable local containerized build via act" OFF)
|
||||||
|
|
||||||
|
find_program(ACT_EXECUTABLE act)
|
||||||
|
|
||||||
|
if(ACT_EXECUTABLE)
|
||||||
|
message(STATUS "Found act utility: ${ACT_EXECUTABLE}")
|
||||||
|
|
||||||
|
add_custom_target(act-build
|
||||||
|
COMMAND ${ACT_EXECUTABLE} push --container-architecture linux/amd64
|
||||||
|
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
|
||||||
|
COMMENT "Running local CI pipeline using act..."
|
||||||
|
)
|
||||||
|
else()
|
||||||
|
message(WARNING "The 'act' utility was not found. Local containerized builds via act-build target will be unavailable.")
|
||||||
|
endif()
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
# This file will be configured to contain variables for CPack. These variables
|
||||||
|
# should be set in the CMake list file of the project before CPack module is
|
||||||
|
# included. Example variables are:
|
||||||
|
# CPACK_GENERATOR - Generator used to create package
|
||||||
|
# CPACK_INSTALL_CMAKE_PROJECTS - For each project (path, name, component)
|
||||||
|
# CPACK_CMAKE_GENERATOR - CMake Generator used for the projects
|
||||||
|
# CPACK_INSTALL_COMMANDS - Extra commands to install components
|
||||||
|
# CPACK_INSTALL_DIRECTORIES - Extra directories to install
|
||||||
|
# CPACK_PACKAGE_DESCRIPTION_FILE - Description file for the package
|
||||||
|
# CPACK_PACKAGE_DESCRIPTION_SUMMARY - Summary of the package
|
||||||
|
# CPACK_PACKAGE_EXECUTABLES - List of pairs of executables and labels
|
||||||
|
# CPACK_PACKAGE_FILE_NAME - Name of the package generated
|
||||||
|
# CPACK_PACKAGE_ICON - Icon used for the package
|
||||||
|
# CPACK_PACKAGE_INSTALL_DIRECTORY - Name of directory for the installer
|
||||||
|
# CPACK_PACKAGE_NAME - Package project name
|
||||||
|
# CPACK_PACKAGE_VENDOR - Package project vendor
|
||||||
|
# CPACK_PACKAGE_VERSION - Package project version
|
||||||
|
# CPACK_PACKAGE_VERSION_MAJOR - Package project version (major)
|
||||||
|
# CPACK_PACKAGE_VERSION_MINOR - Package project version (minor)
|
||||||
|
# CPACK_PACKAGE_VERSION_PATCH - Package project version (patch)
|
||||||
|
|
||||||
|
# There are certain generator specific ones
|
||||||
|
|
||||||
|
# NSIS Generator:
|
||||||
|
# CPACK_PACKAGE_INSTALL_REGISTRY_KEY - Name of the registry key for the installer
|
||||||
|
# CPACK_NSIS_EXTRA_UNINSTALL_COMMANDS - Extra commands used during uninstall
|
||||||
|
# CPACK_NSIS_EXTRA_INSTALL_COMMANDS - Extra commands used during install
|
||||||
|
|
||||||
|
@_CPACK_OTHER_VARIABLES_@
|
||||||
@@ -0,0 +1,79 @@
|
|||||||
|
# SPDX-FileCopyrightText: 2026 Christian Tosta
|
||||||
|
# SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
# @file targets/debian/cmake/CPackRules.cmake
|
||||||
|
# @brief Centralized CPack packaging rules for DEB and RPM
|
||||||
|
|
||||||
|
option(BUILD_DEB "Build DEB package" OFF)
|
||||||
|
option(BUILD_RPM "Build RPM package" OFF)
|
||||||
|
|
||||||
|
set(CPACK_SOURCE_IGNORE_FILES
|
||||||
|
"/.gitea$"
|
||||||
|
"/.gitignore$"
|
||||||
|
"/.git/"
|
||||||
|
"/[.]agignore$"
|
||||||
|
"/[.]dockerignore$"
|
||||||
|
"/[.]editorconfig$"
|
||||||
|
"/[.]gitea/"
|
||||||
|
"/[.]github/"
|
||||||
|
"/[.]vimrc$"
|
||||||
|
"/build/"
|
||||||
|
"/Makefile$"
|
||||||
|
"pkg\\.spec\\.in$"
|
||||||
|
"~$|\\.swp$"
|
||||||
|
)
|
||||||
|
set(CPACK_IGNORE_FILES "${CPACK_SOURCE_IGNORE_FILES}")
|
||||||
|
|
||||||
|
if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/cmake/ActBuilder.cmake")
|
||||||
|
include(cmake/ActBuilder.cmake)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
file(READ "${CMAKE_CURRENT_SOURCE_DIR}/metadata.json" METADATA_JSON)
|
||||||
|
|
||||||
|
string(JSON CPACK_PACKAGE_NAME GET ${METADATA_JSON} "name")
|
||||||
|
string(JSON CPACK_PACKAGE_VERSION GET ${METADATA_JSON} "version")
|
||||||
|
string(JSON CPACK_PACKAGE_RELEASE GET ${METADATA_JSON} "release")
|
||||||
|
string(JSON CPACK_PACKAGE_VENDOR GET ${METADATA_JSON} "maintainer")
|
||||||
|
set(CPACK_VERBATIM_VARIABLES YES)
|
||||||
|
|
||||||
|
if(CPACK_PACKAGING_INSTALL_PREFIX AND NOT CPACK_PACKAGING_INSTALL_PREFIX STREQUAL "/")
|
||||||
|
set(PACKAGE_PREFIX "${CPACK_PACKAGING_INSTALL_PREFIX}")
|
||||||
|
elseif(CMAKE_INSTALL_PREFIX AND NOT CMAKE_INSTALL_PREFIX STREQUAL "/")
|
||||||
|
set(PACKAGE_PREFIX "${CMAKE_INSTALL_PREFIX}")
|
||||||
|
else()
|
||||||
|
set(PACKAGE_PREFIX "/usr/local")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set(CPACK_PACKAGING_INSTALL_PREFIX "${PACKAGE_PREFIX}")
|
||||||
|
set(CPACK_SET_DESTDIR ON)
|
||||||
|
set(CPACK_PACKAGE_RELOCATABLE "OFF")
|
||||||
|
|
||||||
|
if(BUILD_RPM)
|
||||||
|
set(CPACK_RPM_FILE_NAME "RPM-DEFAULT")
|
||||||
|
set(CPACK_SOURCE_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}")
|
||||||
|
set(CPACK_RPM_USER_BINARY_SPECFILE "${CMAKE_BINARY_DIR}/${CPACK_PACKAGE_NAME}.spec")
|
||||||
|
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/pkg.spec.in"
|
||||||
|
"${CPACK_RPM_USER_BINARY_SPECFILE}"
|
||||||
|
@ONLY
|
||||||
|
IMMEDIATE
|
||||||
|
)
|
||||||
|
elseif(BUILD_DEB)
|
||||||
|
set(CPACK_GENERATOR "DEB")
|
||||||
|
|
||||||
|
string(JSON CPACK_DEBIAN_PACKAGE_MAINTAINER GET ${METADATA_JSON} "maintainer")
|
||||||
|
string(JSON CPACK_DEBIAN_PACKAGE_ARCHITECTURE GET ${METADATA_JSON} "architecture")
|
||||||
|
|
||||||
|
# Build and runtime dependencies
|
||||||
|
string(JSON DEPENDS_LEN LENGTH ${METADATA_JSON} "deb-depends")
|
||||||
|
set(CPACK_DEBIAN_PACKAGE_DEPENDS "")
|
||||||
|
math(EXPR DEPENDS_MAX "${DEPENDS_LEN} - 1")
|
||||||
|
foreach(i RANGE 0 ${DEPENDS_MAX})
|
||||||
|
string(JSON DEP GET ${METADATA_JSON} "deb-depends" ${i})
|
||||||
|
list(APPEND CPACK_DEBIAN_PACKAGE_DEPENDS ${DEP})
|
||||||
|
endforeach()
|
||||||
|
list(JOIN CPACK_DEBIAN_PACKAGE_DEPENDS ", " CPACK_DEBIAN_PACKAGE_DEPENDS)
|
||||||
|
set(CPACK_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}_${CPACK_PACKAGE_VERSION}_${CPACK_DEBIAN_PACKAGE_ARCHITECTURE}")
|
||||||
|
set(CPACK_DEBIAN_PACKAGE_SHLIBDEPS ON)
|
||||||
|
set(CPACK_COMPONENTS_ALL_GROUPS_IN_ONE_PACKAGE ON)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
include(CPack)
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
{
|
||||||
|
"name": "pyenv",
|
||||||
|
"version": "2.8.3",
|
||||||
|
"release": "1",
|
||||||
|
"maintainer": "Christian Tosta <no-reply@ekaaty.com>",
|
||||||
|
"architecture": "all",
|
||||||
|
"source_url": "https://github.com/pyenv/pyenv/archive/refs/tags/v${self.version}.tar.gz",
|
||||||
|
"deb-depends": [
|
||||||
|
"bash",
|
||||||
|
"git",
|
||||||
|
"build-essential",
|
||||||
|
"libssl-dev",
|
||||||
|
"zlib1g-dev",
|
||||||
|
"libbz2-dev",
|
||||||
|
"libreadline-dev",
|
||||||
|
"libsqlite3-dev",
|
||||||
|
"libffi-dev",
|
||||||
|
"liblzma-dev"
|
||||||
|
]
|
||||||
|
}
|
||||||
+77
@@ -0,0 +1,77 @@
|
|||||||
|
# SPDX-FileCopyrightText: 2026 Christian Tosta
|
||||||
|
# SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
%global plugins ccache virtualenv pip-migrate
|
||||||
|
%global _prefix @PACKAGE_PREFIX@
|
||||||
|
|
||||||
|
Name: @CPACK_PACKAGE_NAME@
|
||||||
|
Version: @CPACK_PACKAGE_VERSION@
|
||||||
|
Release: @CPACK_PACKAGE_RELEASE@%{?dist}
|
||||||
|
Summary: Simple Python version management
|
||||||
|
|
||||||
|
License: MIT
|
||||||
|
URL: https://github.com/pyenv/pyenv
|
||||||
|
Source0: %{url}/archive/refs/tags/v%{version}.tar.gz#/%{name}-%{version}.tar.gz
|
||||||
|
|
||||||
|
BuildArch: noarch
|
||||||
|
BuildRequires: git
|
||||||
|
|
||||||
|
Requires: bash
|
||||||
|
Requires: git
|
||||||
|
Requires: gcc
|
||||||
|
Requires: make
|
||||||
|
Requires: openssl-devel
|
||||||
|
Requires: bzip2-devel
|
||||||
|
Requires: readline-devel
|
||||||
|
Requires: sqlite-devel
|
||||||
|
Requires: libffi-devel
|
||||||
|
Requires: xz-devel
|
||||||
|
Requires: tk-devel
|
||||||
|
Requires: gdbm-devel
|
||||||
|
Requires: ncurses-devel
|
||||||
|
Requires: zlib-devel
|
||||||
|
Requires: libuuid-devel
|
||||||
|
|
||||||
|
%description
|
||||||
|
pyenv lets you easily switch between multiple versions of Python. It's simple,
|
||||||
|
unobtrusive, and follows the UNIX tradition of single-purpose tools that do one
|
||||||
|
thing well.
|
||||||
|
|
||||||
|
%prep
|
||||||
|
%setup -q -n %{name}-%{version}
|
||||||
|
|
||||||
|
%build
|
||||||
|
set +x
|
||||||
|
for plugin in %{plugins}; do
|
||||||
|
echo -n "Cloning plugin [${plugin}]... "
|
||||||
|
git clone -q https://github.com/pyenv/pyenv-${plugin} plugins/${plugin}
|
||||||
|
echo "done."
|
||||||
|
done
|
||||||
|
set -x
|
||||||
|
|
||||||
|
%install
|
||||||
|
rm -rf %{buildroot}
|
||||||
|
|
||||||
|
mkdir -p %{buildroot}%{_datadir}/%{name}/{versions,shims,hooks}
|
||||||
|
mkdir -p %{buildroot}%{_sysconfdir}/profile.d
|
||||||
|
|
||||||
|
pushd pyenv
|
||||||
|
cp -r bin libexec plugins pyenv.d %{buildroot}%{_datadir}/%{name}/
|
||||||
|
cp -r man %{buildroot}%{_datadir}
|
||||||
|
popd
|
||||||
|
|
||||||
|
install -p -m 0644 pyenv.sh %{buildroot}%{_sysconfdir}/profile.d/pyenv.sh
|
||||||
|
|
||||||
|
%files
|
||||||
|
%defattr(-,root,root,-)
|
||||||
|
%license pyenv/LICENSE
|
||||||
|
%doc pyenv/README.md pyenv/CHANGELOG.md
|
||||||
|
|
||||||
|
%{_sysconfdir}/profile.d/pyenv.sh
|
||||||
|
%{_mandir}/man1/*.1*
|
||||||
|
%{_datadir}/%{name}/
|
||||||
|
|
||||||
|
%changelog
|
||||||
|
* Thu Jun 18 2026 Ekaaty Build Service <noreply@ekaaty.com> - @CPACK_PACKAGE_VERSION@-@CPACK_PACKAGE_RELEASE@
|
||||||
|
- Initial RPM package release for enterprise multi-user environments.
|
||||||
|
- Added pyenv.sh into /etc/profile.d/ for automated initialization.
|
||||||
@@ -0,0 +1,40 @@
|
|||||||
|
# ==============================================================================
|
||||||
|
# /etc/profile.d/pyenv.sh
|
||||||
|
# Global Pyenv Configuration for Multi-User Enterprise Environment
|
||||||
|
# ==============================================================================
|
||||||
|
|
||||||
|
# Add the globally compiled Pyenv core binaries to the system PATH
|
||||||
|
export PATH="/opt/pyenv/bin:$PATH"
|
||||||
|
|
||||||
|
# Isolate the Pyenv execution root to the current user's HOME directory
|
||||||
|
# This ensures that 'pyenv rehash' and shim generation have native write permissions
|
||||||
|
export PYENV_ROOT="$HOME/.pyenv"
|
||||||
|
|
||||||
|
# Bootstrap required directory structure inside the user's HOME if missing
|
||||||
|
if [ ! -d "$PYENV_ROOT/versions" ]; then
|
||||||
|
mkdir -p "$PYENV_ROOT/versions" "$PYENV_ROOT/shims"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Define the hook path required by Pyenv architecture plugins
|
||||||
|
export PYENV_HOOK_PATH="/opt/pyenv/hooks"
|
||||||
|
|
||||||
|
# SELF-HEALING: Detect and forcefully purge broken/orphaned symbolic links
|
||||||
|
# This prevents shell errors if an administrator uninstalls a global Python version
|
||||||
|
find "$PYENV_ROOT/versions/" -xtype l -delete 2>/dev/null
|
||||||
|
|
||||||
|
# SYNCHRONIZATION: Map globally available Python installations into the user's scope
|
||||||
|
# Individual symlinks are used so the user's Pyenv can correctly resolve each version
|
||||||
|
find /opt/pyenv/versions/ -type d -name '[23]*' | \
|
||||||
|
while read path; do
|
||||||
|
version=$(basename $path);
|
||||||
|
mkdir -p "$PYENV_ROOT/versions/$version/envs" 2>/dev/null
|
||||||
|
if [ -d "$PYENV_ROOT/versions/$version" ]; then
|
||||||
|
ln -snf /opt/pyenv/versions/$version/* \
|
||||||
|
"$PYENV_ROOT/versions/$version/" 2>/dev/null;
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
# INITIALIZATION: Spawn the Pyenv environment and virtualenv managers
|
||||||
|
# into the shell session
|
||||||
|
eval "$(pyenv init -)"
|
||||||
|
eval "$(pyenv virtualenv-init -)"
|
||||||
Reference in New Issue
Block a user