Update package-rhel.sh (#10537)

* Update package-rhel.sh

* Update README.md

* Update package-debian.sh

* Delete package-rhel-loong.sh

* Delete package-rhel-riscv.sh

* Delete package-debian-loong.sh

* Delete package-debian-riscv.sh

* Create package-debian-x86.sh

* Create package-rhel-x86.sh

* Update build-linux.yml

* Update build-linux.yml

* Update Directory.Packages.props

* Update build-linux.yml

* Update package-debian-x86.sh

* Update package-rhel-x86.sh

* Update package-debian-x86.sh

* Update package-debian.sh

* Update build-linux.yml

* Update package-rhel.sh

* Update package-debian.sh

* Update package-debian-x86.sh

* Update DOTNET_SDK_VERSION in package-rhel-x86.sh

---------

Co-authored-by: autorepobot <repo-bot@outlook.com>
This commit is contained in:
JieXu
2026-11-08 15:01:06 +08:00
committed by GitHub
parent 91d1cbe55a
commit 6e48e507ea
9 changed files with 1255 additions and 1832 deletions
+262 -25
View File
@@ -14,6 +14,30 @@ PKGROOT="v2rayN-publish"
PROJECT_HINT="v2rayN.Desktop/v2rayN.Desktop.csproj"
RPM_TOPDIR="${HOME}/rpmbuild"
NUGET_CACHE_DIR=""
DOTNET_NUPKG_BASE="${DOTNET_NUPKG_BASE:-https://github.com/autorepobot/dotnet-nupkg-prebuild/releases/download}"
SKIASHARP_BASE="${SKIASHARP_BASE:-https://github.com/autorepobot/SkiaSharp-ppc64le/releases/download}"
SkiaSharp_VERSION="${SkiaSharp_VERSION:-3.119.4}"
HarfBuzzSharp_VERSION="${HarfBuzzSharp_VERSION:-8.3.1.5}"
DOTNET_SDK_VERSION="${DOTNET_SDK_VERSION:-10.0.114}"
DOTNET_RISCV_VERSION="${DOTNET_RISCV_VERSION:-10.0.114}"
DOTNET_RISCV_BASE="${DOTNET_RISCV_BASE:-https://github.com/autorepobot/dotnet-riscv/releases/download}"
DOTNET_RISCV_FILE="dotnet-sdk-${DOTNET_RISCV_VERSION}-linux-riscv64.tar.gz"
DOTNET_RISCV_SDK_URL="${DOTNET_RISCV_SDK_URL:-${DOTNET_RISCV_BASE}/${DOTNET_RISCV_VERSION}/${DOTNET_RISCV_FILE}}"
DOTNET_PPC64LE_VERSION="${DOTNET_PPC64LE_VERSION:-10.0.114}"
DOTNET_PPC64LE_BASE="${DOTNET_PPC64LE_BASE:-https://github.com/IBM/dotnet-s390x/releases/download}"
DOTNET_PPC64LE_FILE="dotnet-sdk-${DOTNET_PPC64LE_VERSION}-linux-ppc64le.tar.gz"
DOTNET_PPC64LE_SDK_URL="${DOTNET_PPC64LE_SDK_URL:-${DOTNET_PPC64LE_BASE}/v${DOTNET_PPC64LE_VERSION}/${DOTNET_PPC64LE_FILE}}"
DOTNET_LOONGARCH_VERSION="${DOTNET_LOONGARCH_VERSION:-10.0.114}"
DOTNET_LOONGARCH_TAG="${DOTNET_LOONGARCH_TAG:-v10.0.114-loongarch64}"
DOTNET_LOONGARCH_BASE="${DOTNET_LOONGARCH_BASE:-https://github.com/loongson/dotnet/releases/download}"
DOTNET_LOONGARCH_FILE="dotnet-sdk-${DOTNET_LOONGARCH_VERSION}-linux-loongarch64.tar.gz"
DOTNET_LOONGARCH_SDK_URL="${DOTNET_LOONGARCH_SDK_URL:-${DOTNET_LOONGARCH_BASE}/${DOTNET_LOONGARCH_TAG}/${DOTNET_LOONGARCH_FILE}}"
OS_ID=""
OS_NAME=""
OS_VERSION_ID=""
@@ -23,6 +47,9 @@ PROJECT=""
VERSION=""
BUILT_ALL=0
RPM_STRIP=""
RPM_OBJDUMP=""
declare -a BUILT_RPMS=()
die() {
@@ -30,6 +57,13 @@ die() {
exit 1
}
get_runtime_version() {
local sdk_ver="$1"
local prefix="${sdk_ver%.*}"
local patch="${sdk_ver##*.}"
echo "${prefix}.${patch#1}"
}
parse_args() {
local first_arg="${1:-}"
@@ -81,8 +115,8 @@ This script only supports: RHEL / Rocky / AlmaLinux / Fedora / CentOS."
esac
case "$HOST_ARCH" in
x86_64|aarch64) ;;
*) die "Only supports aarch64 / x86_64" ;;
x86_64|aarch64|riscv64|ppc64le|loongarch64) ;;
*) die "Only supports x86_64 / aarch64 / riscv64 / ppc64le / loongarch64" ;;
esac
current_kernel="$(uname -r)"
@@ -96,8 +130,31 @@ install_dependencies() {
local install_ok=0
if command -v dnf >/dev/null 2>&1; then
sudo dnf -y install rpm-build rpmdevtools curl unzip tar jq rsync dotnet-sdk-10.0 \
sudo dnf -y install \
rpm-build rpmdevtools curl unzip tar jq rsync ca-certificates git \
desktop-file-utils wget libicu \
&& install_ok=1
case "$HOST_ARCH" in
x86_64|aarch64)
wget -q https://dot.net/v1/dotnet-install.sh
chmod +x dotnet-install.sh
./dotnet-install.sh \
--version "$DOTNET_SDK_VERSION" \
--install-dir "$HOME/.dotnet"
export PATH="$HOME/.dotnet:$PATH"
export DOTNET_ROOT="$HOME/.dotnet"
dotnet --info >/dev/null 2>&1 && install_ok=1
;;
riscv64|ppc64le|loongarch64)
install_ok=1
;;
*)
die "Only supports x86_64 / aarch64 / riscv64 / ppc64le / loongarch64"
;;
esac
fi
if [[ "$install_ok" -ne 1 ]]; then
@@ -107,6 +164,48 @@ install_dependencies() {
fi
}
prepare_cross_rpm_tools() {
local target="$1"
local package=""
local strip_tool=""
local objdump_tool=""
case "$HOST_ARCH:$target" in
x86_64:ppc64le|aarch64:ppc64le)
package="gcc-powerpc64le-linux-gnu"
strip_tool="powerpc64le-linux-gnu-strip"
objdump_tool="powerpc64le-linux-gnu-objdump"
;;
x86_64:riscv64|aarch64:riscv64)
package="gcc-riscv64-linux-gnu"
strip_tool="riscv64-linux-gnu-strip"
objdump_tool="riscv64-linux-gnu-objdump"
;;
x86_64:loong64|aarch64:loong64)
package="gcc-loongarch64-linux-gnu"
strip_tool="loongarch64-linux-gnu-strip"
objdump_tool="loongarch64-linux-gnu-objdump"
;;
*)
RPM_STRIP=""
RPM_OBJDUMP=""
return 0
;;
esac
echo "[+] Install cross RPM tools for $target: $package"
sudo dnf -y install "$package"
command -v "$strip_tool" >/dev/null 2>&1 || die "Cross strip tool not found: $strip_tool"
command -v "$objdump_tool" >/dev/null 2>&1 || die "Cross objdump tool not found: $objdump_tool"
RPM_STRIP="$(command -v "$strip_tool")"
RPM_OBJDUMP="$(command -v "$objdump_tool")"
echo "[OK] RPM strip: $RPM_STRIP"
echo "[OK] RPM objdump: $RPM_OBJDUMP"
}
prepare_workspace() {
SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)"
cd "$SCRIPT_DIR"
@@ -239,14 +338,115 @@ resolve_version() {
echo "[*] GUI version resolved as: ${VERSION}"
}
download_nuget_packages() {
NUGET_CACHE_DIR="$(mktemp -d)"
local riscv_rt ppc64le_rt loong_rt
riscv_rt="$(get_runtime_version "$DOTNET_RISCV_VERSION")"
ppc64le_rt="$(get_runtime_version "$DOTNET_PPC64LE_VERSION")"
loong_rt="$(get_runtime_version "$DOTNET_LOONGARCH_VERSION")"
local urls=(
"${DOTNET_NUPKG_BASE}/${loong_rt}/Microsoft.AspNetCore.App.Runtime.linux-loongarch64.${loong_rt}.nupkg"
"${DOTNET_NUPKG_BASE}/${ppc64le_rt}/Microsoft.AspNetCore.App.Runtime.linux-ppc64le.${ppc64le_rt}.nupkg"
"${DOTNET_NUPKG_BASE}/${riscv_rt}/Microsoft.AspNetCore.App.Runtime.linux-riscv64.${riscv_rt}.nupkg"
"${DOTNET_NUPKG_BASE}/${loong_rt}/Microsoft.NETCore.App.Host.linux-loongarch64.${loong_rt}.nupkg"
"${DOTNET_NUPKG_BASE}/${ppc64le_rt}/Microsoft.NETCore.App.Host.linux-ppc64le.${ppc64le_rt}.nupkg"
"${DOTNET_NUPKG_BASE}/${riscv_rt}/Microsoft.NETCore.App.Host.linux-riscv64.${riscv_rt}.nupkg"
"${DOTNET_NUPKG_BASE}/${loong_rt}/Microsoft.NETCore.App.Runtime.linux-loongarch64.${loong_rt}.nupkg"
"${DOTNET_NUPKG_BASE}/${ppc64le_rt}/Microsoft.NETCore.App.Runtime.linux-ppc64le.${ppc64le_rt}.nupkg"
"${DOTNET_NUPKG_BASE}/${riscv_rt}/Microsoft.NETCore.App.Runtime.linux-riscv64.${riscv_rt}.nupkg"
"${SKIASHARP_BASE}/v${SkiaSharp_VERSION}/SkiaSharp.NativeAssets.Linux.${SkiaSharp_VERSION}.nupkg"
"${SKIASHARP_BASE}/v${SkiaSharp_VERSION}/HarfBuzzSharp.NativeAssets.Linux.${HarfBuzzSharp_VERSION}.nupkg"
)
echo "[+] Downloading prebuilt NuGet packages to: $NUGET_CACHE_DIR"
local u pkg_name
for u in "${urls[@]}"; do
pkg_name="${u##*/}"
echo " -> $pkg_name"
curl -fL "$u" -o "$NUGET_CACHE_DIR/$pkg_name" || {
echo "[!] Failed to download $u" >&2
rm -rf "$NUGET_CACHE_DIR"
NUGET_CACHE_DIR=""
return 1
}
done
echo "[OK] Prebuilt NuGet packages ready in $NUGET_CACHE_DIR"
}
prepare_dotnet_sdk() {
local short="$1"
local sdk_url=""
local sdk_file=""
local sdk_dir=""
local tmp=""
case "$HOST_ARCH:$short" in
x86_64:x64|aarch64:arm64)
return 0
;;
riscv64:riscv64)
sdk_url="$DOTNET_RISCV_SDK_URL"
sdk_file="$DOTNET_RISCV_FILE"
;;
ppc64le:ppc64le)
sdk_url="$DOTNET_PPC64LE_SDK_URL"
sdk_file="$DOTNET_PPC64LE_FILE"
;;
loongarch64:loong64)
sdk_url="$DOTNET_LOONGARCH_SDK_URL"
sdk_file="$DOTNET_LOONGARCH_FILE"
;;
*)
return 0
;;
esac
sdk_dir="$(mktemp -d)"
tmp="$(mktemp -d)"
echo "[+] Download .NET SDK for $short: $sdk_url"
curl -fL "$sdk_url" -o "$tmp/$sdk_file" || {
rm -rf "$tmp" "$sdk_dir"
return 1
}
tar -C "$sdk_dir" -xzf "$tmp/$sdk_file" || {
rm -rf "$tmp" "$sdk_dir"
return 1
}
rm -rf "$tmp"
[[ -x "$sdk_dir/dotnet" ]] || {
rm -rf "$sdk_dir"
return 1
}
export DOTNET_ROOT="$sdk_dir"
export PATH="$DOTNET_ROOT:$PATH"
hash -r
echo "[OK] .NET SDK for $short extracted to: $sdk_dir"
dotnet --info
DOTNET_SDK_DIR="$sdk_dir"
}
xray_url_for_rid() {
local rid="$1"
local ver="$2"
case "$rid" in
linux-x64) echo "https://github.com/XTLS/Xray-core/releases/download/v${ver}/Xray-linux-64.zip" ;;
linux-arm64) echo "https://github.com/XTLS/Xray-core/releases/download/v${ver}/Xray-linux-arm64-v8a.zip" ;;
*) return 1 ;;
linux-x64) echo "https://github.com/XTLS/Xray-core/releases/download/v${ver}/Xray-linux-64.zip" ;;
linux-arm64) echo "https://github.com/XTLS/Xray-core/releases/download/v${ver}/Xray-linux-arm64-v8a.zip" ;;
linux-riscv64) echo "https://github.com/XTLS/Xray-core/releases/download/v${ver}/Xray-linux-riscv64.zip" ;;
linux-ppc64le) echo "https://github.com/XTLS/Xray-core/releases/download/v${ver}/Xray-linux-ppc64le.zip" ;;
linux-loongarch64) echo "https://github.com/XTLS/Xray-core/releases/download/v${ver}/Xray-linux-loong64.zip" ;;
*) return 1 ;;
esac
}
@@ -255,9 +455,12 @@ singbox_url_for_rid() {
local ver="$2"
case "$rid" in
linux-x64) echo "https://github.com/SagerNet/sing-box/releases/download/v${ver}/sing-box-${ver}-linux-amd64.tar.gz" ;;
linux-arm64) echo "https://github.com/SagerNet/sing-box/releases/download/v${ver}/sing-box-${ver}-linux-arm64.tar.gz" ;;
*) return 1 ;;
linux-x64) echo "https://github.com/SagerNet/sing-box/releases/download/v${ver}/sing-box-${ver}-linux-amd64.tar.gz" ;;
linux-arm64) echo "https://github.com/SagerNet/sing-box/releases/download/v${ver}/sing-box-${ver}-linux-arm64.tar.gz" ;;
linux-riscv64) echo "https://github.com/SagerNet/sing-box/releases/download/v${ver}/sing-box-${ver}-linux-riscv64.tar.gz" ;;
linux-ppc64le) echo "https://github.com/SagerNet/sing-box/releases/download/v${ver}/sing-box-${ver}-linux-ppc64le.tar.gz" ;;
linux-loongarch64) echo "https://github.com/SagerNet/sing-box/releases/download/v${ver}/sing-box-${ver}-linux-loong64.tar.gz" ;;
*) return 1 ;;
esac
}
@@ -265,9 +468,12 @@ bundle_url_for_rid() {
local rid="$1"
case "$rid" in
linux-x64) echo "https://raw.githubusercontent.com/2dust/v2rayN-core-bin/refs/heads/master/v2rayN-linux-64.zip" ;;
linux-arm64) echo "https://raw.githubusercontent.com/2dust/v2rayN-core-bin/refs/heads/master/v2rayN-linux-arm64.zip" ;;
*) return 1 ;;
linux-x64) echo "https://raw.githubusercontent.com/2dust/v2rayN-core-bin/refs/heads/master/v2rayN-linux-64.zip" ;;
linux-arm64) echo "https://raw.githubusercontent.com/2dust/v2rayN-core-bin/refs/heads/master/v2rayN-linux-arm64.zip" ;;
linux-riscv64) echo "https://raw.githubusercontent.com/2dust/v2rayN-core-bin/refs/heads/master/v2rayN-linux-riscv64.zip" ;;
linux-ppc64le) echo "https://raw.githubusercontent.com/2dust/v2rayN-core-bin/refs/heads/master/v2rayN-linux-ppc64le.zip" ;;
linux-loongarch64) echo "https://raw.githubusercontent.com/2dust/v2rayN-core-bin/refs/heads/master/v2rayN-linux-loong64.zip" ;;
*) return 1 ;;
esac
}
@@ -288,7 +494,7 @@ download_xray() {
fi
[[ -n "$ver" ]] || { echo "[xray] Failed to get version"; return 1; }
url="$(xray_url_for_rid "$rid" "$ver")" || { echo "[xray] Unsupported RID: $rid"; return 1; }
url="$(xray_url_for_rid "$rid" "$ver")" || { echo "[xray] Unsupported RID for upstream Xray: $rid (skipped)"; return 0; }
echo "[+] Download xray: $url"
@@ -463,9 +669,12 @@ describe_target() {
local short="$1"
case "$short" in
x64) printf '%s\n%s\n%s\n' "linux-x64" "x86_64" "x86_64" ;;
arm64) printf '%s\n%s\n%s\n' "linux-arm64" "aarch64" "aarch64" ;;
*) echo "Unknown arch '$short' (use x64|arm64)" >&2; return 1 ;;
x64) printf '%s\n%s\n%s\n' "linux-x64" "x86_64" "x86_64" ;;
arm64) printf '%s\n%s\n%s\n' "linux-arm64" "aarch64" "aarch64" ;;
riscv64) printf '%s\n%s\n%s\n' "linux-riscv64" "riscv64" "riscv64" ;;
ppc64le) printf '%s\n%s\n%s\n' "linux-ppc64le" "ppc64le" "ppc64le" ;;
loong64) printf '%s\n%s\n%s\n' "linux-loongarch64" "loongarch64" "loongarch64" ;;
*) echo "Unknown arch '$short' (use x64|arm64|riscv64|ppc64le|loong64)" >&2; return 1 ;;
esac
}
@@ -474,8 +683,18 @@ publish_binary() {
dotnet clean "$PROJECT" -c Release
rm -rf "$(dirname "$PROJECT")/bin/Release/net10.0" || true
dotnet restore "$PROJECT"
dotnet publish "$PROJECT" -c Release -r "$rid" -p:PublishSingleFile=false -p:SelfContained=true
dotnet restore "$PROJECT" \
-r "$rid" \
--source "$NUGET_CACHE_DIR" \
--source "https://api.nuget.org/v3/index.json"
dotnet publish "$PROJECT" \
-c Release \
-r "$rid" \
--source "$NUGET_CACHE_DIR" \
--source "https://api.nuget.org/v3/index.json" \
-p:PublishSingleFile=false \
-p:SelfContained=true \
--no-restore
}
write_spec_file() {
@@ -494,7 +713,7 @@ Summary: v2rayN (Avalonia) GUI client for Linux
License: GPL-3.0-only
URL: https://github.com/2dust/v2rayN
BugURL: https://github.com/2dust/v2rayN/issues
ExclusiveArch: aarch64 x86_64
ExclusiveArch: aarch64 x86_64 riscv64 ppc64le loongarch64
Source0: __PKGROOT__.tar.gz
Requires: cairo, pango, openssl, mesa-libEGL, mesa-libGL
@@ -616,7 +835,15 @@ package_binary() {
tar -C "$workdir" -czf "$sourcedir/$PKGROOT.tar.gz" "$PKGROOT"
write_spec_file "$specfile"
rpmbuild -ba "$specfile" --target "$rpm_target"
if [[ -n "${RPM_STRIP:-}" ]]; then
rpmbuild -ba "$specfile" \
--target "$rpm_target" \
--define "__strip ${RPM_STRIP}" \
--define "__objdump ${RPM_OBJDUMP}"
else
rpmbuild -ba "$specfile" --target "$rpm_target"
fi
echo "Build done for $short. RPM at:"
for f in "${RPM_TOPDIR}/RPMS/${archdir}/v2rayN-${VERSION}-1"*.rpm; do
@@ -628,9 +855,12 @@ package_binary() {
select_targets() {
case "${ARCH_OVERRIDE:-}" in
all) printf '%s\n' x64 arm64 ;;
x64|amd64) printf '%s\n' x64 ;;
arm64|aarch64) printf '%s\n' arm64 ;;
all) printf '%s\n' x64 arm64 riscv64 ppc64le loong64 ;;
x64|amd64) printf '%s\n' x64 ;;
arm64|aarch64) printf '%s\n' arm64 ;;
riscv64) printf '%s\n' riscv64 ;;
ppc64le|ppc64el) printf '%s\n' ppc64le ;;
loong64|loongarch64) printf '%s\n' loong64 ;;
"")
case "$HOST_ARCH" in
x86_64) printf '%s\n' x64 ;;
@@ -639,7 +869,7 @@ select_targets() {
esac
;;
*)
echo "Unknown --arch '${ARCH_OVERRIDE}'. Use x64|arm64|all." >&2
echo "Unknown --arch '${ARCH_OVERRIDE}'. Use x64|arm64|riscv64|ppc64le|loong64|all." >&2
return 1
;;
esac
@@ -658,6 +888,8 @@ build_one_target() {
archdir="${meta[2]}"
echo "[*] Building for target: $short (RID=$rid, RPM --target $rpm_target)"
prepare_cross_rpm_tools "$short"
prepare_dotnet_sdk "$short" || die "Failed to prepare .NET SDK for $short."
publish_binary "$rid"
package_binary "$short" "$rid" "$rpm_target" "$archdir"
}
@@ -666,7 +898,7 @@ print_summary() {
if [[ "$BUILT_ALL" -eq 1 ]]; then
local rp=""
echo ""
echo "================ Build Summary (both architectures) ================"
echo "================ Build Summary (all architectures) ================"
if [[ "${#BUILT_RPMS[@]}" -gt 0 ]]; then
for rp in "${BUILT_RPMS[@]}"; do
echo "$rp"
@@ -688,6 +920,8 @@ main() {
prepare_workspace
resolve_version
download_nuget_packages || die "Failed to download prebuilt NuGet packages."
mapfile -t targets < <(select_targets)
[[ "${ARCH_OVERRIDE:-}" == "all" ]] && BUILT_ALL=1 || BUILT_ALL=0
@@ -695,6 +929,9 @@ main() {
build_one_target "$arch"
done
rm -rf "${NUGET_CACHE_DIR:-}" || true
rm -rf "${DOTNET_SDK_DIR:-}" || true
print_summary
}