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
+269 -47
View File
@@ -14,6 +14,30 @@ PKGROOT="v2rayN-publish"
PROJECT_HINT="v2rayN.Desktop/v2rayN.Desktop.csproj"
OUTPUT_DIR="${HOME}/debbuild"
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=""
@@ -21,6 +45,7 @@ HOST_ARCH=""
SCRIPT_DIR=""
PROJECT=""
VERSION=""
BUILT_ALL=0
declare -a BUILT_DEBS=()
@@ -29,6 +54,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:-}"
@@ -80,8 +112,8 @@ This script only supports: Debian."
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)"
@@ -106,26 +138,38 @@ install_dependencies() {
case "$HOST_ARCH" in
aarch64) foreign_arch="amd64" ;;
x86_64) foreign_arch="arm64" ;;
*) die "Only supports aarch64 / x86_64" ;;
riscv64|ppc64le|loongarch64)
foreign_arch=""
;;
*) die "Only supports x86_64 / aarch64 / riscv64 / ppc64le / loongarch64" ;;
esac
sudo dpkg --add-architecture "$foreign_arch" || true
sudo apt-get update
sudo apt-get -y install \
"libc6:${foreign_arch}" \
"libgcc-s1:${foreign_arch}" \
"libstdc++6:${foreign_arch}" \
"zlib1g:${foreign_arch}" \
"libfontconfig1:${foreign_arch}"
if [[ -n "$foreign_arch" ]]; then
sudo dpkg --add-architecture "$foreign_arch" || true
sudo apt-get update
sudo apt-get -y install \
"libc6:${foreign_arch}" \
"libgcc-s1:${foreign_arch}" \
"libstdc++6:${foreign_arch}" \
"zlib1g:${foreign_arch}" \
"libfontconfig1:${foreign_arch}"
fi
wget -q https://dot.net/v1/dotnet-install.sh
chmod +x dotnet-install.sh
./dotnet-install.sh --channel 10.0.1xx --install-dir "$HOME/.dotnet"
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"
export PATH="$HOME/.dotnet:$PATH"
export DOTNET_ROOT="$HOME/.dotnet"
dotnet --info >/dev/null 2>&1 && install_ok=1
dotnet --info >/dev/null 2>&1 && install_ok=1
;;
riscv64|ppc64le|loongarch64)
install_ok=1
;;
esac
fi
if [[ "$install_ok" -ne 1 ]]; then
@@ -135,6 +179,61 @@ install_dependencies() {
fi
}
prepare_deb_target_arch() {
local short="$1"
local target_arch=""
case "$HOST_ARCH:$short" in
x86_64:ppc64le|aarch64:ppc64le)
target_arch="ppc64el"
;;
x86_64:riscv64|aarch64:riscv64)
target_arch="riscv64"
;;
x86_64:loong64|aarch64:loong64)
target_arch="loong64"
;;
*)
return 0
;;
esac
echo "[+] Prepare Debian multiarch environment for $short: $target_arch"
sudo dpkg --add-architecture "$target_arch" || true
if [[ "$target_arch" == "loong64" ]]; then
echo "[+] Add Loong13 Debian Trixie source for loong64"
cat <<'EOF' | sudo tee /etc/apt/sources.list.d/loong64-loong13.list >/dev/null
deb [arch=loong64] http://loong13.debian.net/debian-loong64/ trixie main contrib non-free non-free-firmware
deb [arch=loong64] http://loong13.debian.net/debian-loong64-security/ trixie-security main contrib non-free non-free-firmware
EOF
echo "[+] Install Loong13 archive keyring"
tmp_keyring="$(mktemp -d)"
curl -fL \
"http://loong13.debian.net/debian-loong64/pool/main/d/debian-loong64-non-official-archive-keyring/debian-loong64-non-official-archive-keyring_2025.12.22_all.deb" \
-o "$tmp_keyring/loong13-keyring.deb"
sudo dpkg -i "$tmp_keyring/loong13-keyring.deb"
rm -rf "$tmp_keyring"
fi
sudo apt-get update
sudo apt-get -y install \
"libc6:${target_arch}" \
"libgcc-s1:${target_arch}" \
"libstdc++6:${target_arch}" \
"zlib1g:${target_arch}" \
"libfontconfig1:${target_arch}" \
"libfreetype6:${target_arch}"
echo "[OK] Debian target libraries prepared for $target_arch"
}
prepare_workspace() {
SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)"
cd "$SCRIPT_DIR"
@@ -267,14 +366,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
}
@@ -283,9 +483,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
}
@@ -293,9 +496,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
}
@@ -316,7 +522,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"
@@ -476,7 +682,7 @@ stage_runtime_assets() {
if [[ "$FORCE_NETCORE" -eq 0 ]]; then
if populate_assets_zip_mode "$outroot" "$rid"; then
echo "[*] Using v2rayN bundle bin assets."
echo "[*] Using v2rayN bundle archive."
else
echo "[*] Bundle failed, fallback to separate core + rules."
populate_assets_netcore_mode "$outroot" "$rid"
@@ -491,9 +697,12 @@ describe_target() {
local short="$1"
case "$short" in
x64) printf '%s\n%s\n' "linux-x64" "amd64" ;;
arm64) printf '%s\n%s\n' "linux-arm64" "arm64" ;;
*) echo "Unknown arch '$short' (use x64|arm64)" >&2; return 1 ;;
x64) printf '%s\n%s\n' "linux-x64" "amd64" ;;
arm64) printf '%s\n%s\n' "linux-arm64" "arm64" ;;
riscv64) printf '%s\n%s\n' "linux-riscv64" "riscv64" ;;
ppc64le) printf '%s\n%s\n' "linux-ppc64le" "ppc64el" ;;
loong64) printf '%s\n%s\n' "linux-loongarch64" "loong64" ;;
*) echo "Unknown arch '$short' (use x64|arm64|riscv64|ppc64le|loong64)" >&2; return 1 ;;
esac
}
@@ -502,8 +711,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_launcher_file() {
@@ -609,6 +828,8 @@ package_binary() {
write_desktop_file "$stage"
write_maintainer_scripts "$debian_dir"
prepare_deb_target_arch "$short"
extra_depends="libc6 (>= 2.39), fontconfig (>= 2.15.0), desktop-file-utils (>= 0.26), xdg-utils (>= 1.1.3), coreutils (>= 9.4), bash (>= 5.2.21), libfreetype6 (>= 2.13)"
mkdir -p "$workdir/debian"
@@ -643,7 +864,7 @@ EOF
-l"$sys_usrlibdir" \
-T"$debian_dir/substvars" \
"${ELF_FILES[@]}"
) >/dev/null 2>&1 || true
) || true
fi
shlibs_depends="$(sed -n 's/^shlibs:Depends=//p' "$debian_dir/substvars" | head -n1 || true)"
@@ -676,15 +897,6 @@ EOF
find "$stage/opt/v2rayN" -type f -exec chmod 0644 {} +
[[ -f "$stage/opt/v2rayN/v2rayN" ]] && chmod 0755 "$stage/opt/v2rayN/v2rayN" || true
# Core binaries must be executable before installation: ordinary users cannot
# chmod the root-owned files installed by dpkg.
local core
for core in xray/xray sing_box/sing-box mihomo/mihomo; do
if [[ -f "$stage/opt/v2rayN/bin/$core" ]]; then
chmod 0755 "$stage/opt/v2rayN/bin/$core"
fi
done
deb_out="$OUTPUT_DIR/v2rayn_${VERSION}_${deb_arch}.deb"
dpkg-deb --root-owner-group --build "$stage" "$deb_out"
@@ -695,9 +907,12 @@ EOF
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 ;;
@@ -706,7 +921,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
@@ -723,6 +938,7 @@ build_one_target() {
deb_arch="${meta[1]}"
echo "[*] Building for target: $short (RID=$rid, DEB arch=$deb_arch)"
prepare_dotnet_sdk "$short" || die "Failed to prepare .NET SDK for $short."
publish_binary "$rid"
package_binary "$short" "$rid" "$deb_arch"
}
@@ -753,12 +969,18 @@ 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
for arch in "${targets[@]}"; do
build_one_target "$arch"
done
rm -rf "${NUGET_CACHE_DIR:-}" || true
rm -rf "${DOTNET_SDK_DIR:-}" || true
print_summary
}