209 lines
7.1 KiB
Bash
209 lines
7.1 KiB
Bash
check_psabi() {
|
|
awk 'BEGIN {
|
|
while (!/flags/) if (getline < "/proc/cpuinfo" != 1) exit 1
|
|
if (/lm/&&/cmov/&&/cx8/&&/fpu/&&/fxsr/&&/mmx/&&/syscall/&&/sse2/) level = 1
|
|
if (level == 1 && /cx16/&&/lahf/&&/popcnt/&&/sse4_1/&&/sse4_2/&&/ssse3/) level = 2
|
|
if (level == 2 && /avx/&&/avx2/&&/bmi1/&&/bmi2/&&/f16c/&&/fma/&&/abm/&&/movbe/&&/xsave/) level = 3
|
|
if (level == 3 && /avx512f/&&/avx512bw/&&/avx512cd/&&/avx512dq/&&/avx512vl/) level = 4
|
|
if (level > 0) { print "x64v" level }
|
|
}' 2>/dev/null||echo "x64v1"
|
|
}
|
|
|
|
is_exe_exist() { command -v "$@" &>/dev/null ; }
|
|
|
|
check_url_stat_code() {
|
|
set -o pipefail
|
|
if is_exe_exist curl
|
|
then curl -sL -o /dev/null -I -w "%{http_code}" "$@" 2>/dev/null
|
|
elif is_exe_exist wget
|
|
then wget --no-check-certificate --server-response \
|
|
--spider "$@"|& awk '/^ HTTP/{print$2}'|tail -1
|
|
else return 1
|
|
fi
|
|
}
|
|
|
|
is_url() {
|
|
[ ! -n "$1" ] && \
|
|
return 1
|
|
if [ -n "$2" ]
|
|
then [ "$(check_url_stat_code "$1")" == "$2" ]
|
|
else [ "$(check_url_stat_code "$1")" == "200" ]
|
|
fi
|
|
}
|
|
|
|
name='linux-xanmod-bin'
|
|
version='6.17.6'
|
|
release='2'
|
|
branch='main'
|
|
pkgverdl="${version%-*}"
|
|
desc='The Linux kernel, modules and headers with Xanmod patches - Prebuilt version'
|
|
desc_ru='The Linux kernel, modules and headers with Xanmod patches - Prebuilt version'
|
|
homepage='http://www.xanmod.org/'
|
|
maintainer="Евгений Храмов <xpamych@yandex.ru> (imported from AUR)"
|
|
maintainer_ru="Евгений Храмов <xpamych@yandex.ru> (импортирован из AUR)"
|
|
architectures=('amd64')
|
|
license=('GPL2')
|
|
provides=('VIRTUALBOX-GUEST-MODULES' 'WIREGUARD-MODULE' 'KSMBD-MODULE' 'NTFS3-MODULE' )
|
|
conflicts=('linux-xanmod-headers' 'linux-xanmod' )
|
|
|
|
# Базовые зависимости
|
|
deps=('coreutils' 'kmod')
|
|
build_deps=('curl' 'gawk' 'grep' 'tar' 'xz' 'jq' 'binutils')
|
|
|
|
# Зависимости для конкретных дистрибутивов
|
|
deps_arch=('coreutils' 'kmod' 'mkinitcpio' 'pahole')
|
|
deps_debian=('coreutils' 'kmod' 'initramfs-tools' 'pahole')
|
|
deps_altlinux=('coreutils' 'kmod' 'make-initrd' 'dwarves')
|
|
deps_alpine=('coreutils' 'kmod' 'mkinitfs' 'pahole')
|
|
deps_redos=('coreutils' 'kmod' 'dracut' 'dwarves')
|
|
deps_fedora=('coreutils' 'kmod' 'dracut' 'dwarves')
|
|
deps_rhel=('coreutils' 'kmod' 'dracut' 'dwarves')
|
|
deps_rosa=('coreutils' 'kmod' 'dracut' 'dwarves')
|
|
|
|
# Опциональные зависимости
|
|
opt_deps=(
|
|
'crda'
|
|
'linux-firmware'
|
|
)
|
|
|
|
scripts=(
|
|
['postinstall']='postinstall.sh'
|
|
['postremove']='postremove.sh'
|
|
)
|
|
|
|
prepare() {
|
|
cd "$srcdir"
|
|
|
|
# Determine CPU capabilities
|
|
detected_psabi="$(check_psabi)"
|
|
|
|
# Determine best available psabi and construct URLs
|
|
for v in ${detected_psabi/x64v/} 3 2 1; do
|
|
[[ "$v" -le "${detected_psabi/x64v/}" && "$_psabi" != "x64v$v" ]] || continue
|
|
_psabi="x64v$v"
|
|
_url="https://sourceforge.net/projects/xanmod/files/releases/$branch/${pkgverdl}-xanmod1/${pkgverdl}-${_psabi}-xanmod1"
|
|
if is_url "$_url"; then
|
|
detected_psabi="$_psabi"
|
|
break
|
|
fi
|
|
done
|
|
|
|
echo "==> Определена архитектура процессора: $detected_psabi"
|
|
|
|
# Get download URLs
|
|
url_info="$(curl -sL "$_url" | grep "net.sf.files" | sed 's|net.sf.files = ||g;s|;$||' | jq -r '.[].download_url' | grep -v '\-dbg_')"
|
|
url_image="$(echo "$url_info" | grep -o "https:.*/linux-image.*deb" | head -1)"
|
|
url_headers="$(echo "$url_info" | grep -o "https:.*/linux-headers.*deb" | head -1)"
|
|
file_image="${url_image##*/}"
|
|
file_headers="${url_headers##*/}"
|
|
|
|
# Download files if not already present (caching in $srcdir)
|
|
if [ ! -f "$file_image" ]; then
|
|
echo "==> Загрузка образа ядра: $file_image"
|
|
curl -L -o "$file_image" "$url_image"
|
|
else
|
|
echo "==> Использование кешированного образа ядра: $file_image"
|
|
fi
|
|
|
|
if [ ! -f "$file_headers" ]; then
|
|
echo "==> Загрузка заголовков ядра: $file_headers"
|
|
curl -L -o "$file_headers" "$url_headers"
|
|
else
|
|
echo "==> Использование кешированных заголовков ядра: $file_headers"
|
|
fi
|
|
|
|
# Extract packages using ar and tar
|
|
echo "==> Распаковка образа ядра..."
|
|
ar x "$file_image" data.tar.xz
|
|
mkdir -p .extract && tar --no-same-owner --no-same-permissions -C .extract -xf data.tar.xz
|
|
cp -af .extract/* . 2>/dev/null || true
|
|
rm -rf .extract data.tar.xz
|
|
|
|
echo "==> Распаковка заголовков ядра..."
|
|
ar x "$file_headers" data.tar.xz
|
|
mkdir -p .extract && tar --no-same-owner --no-same-permissions -C .extract -xf data.tar.xz
|
|
cp -af .extract/* . 2>/dev/null || true
|
|
rm -rf .extract data.tar.xz
|
|
|
|
# Save psabi for package() function
|
|
echo "$detected_psabi" > "$srcdir/.psabi"
|
|
}
|
|
|
|
# Бинарный пакет - сборка не требуется
|
|
|
|
package() {
|
|
cd "$srcdir"
|
|
|
|
# Read psabi from file
|
|
detected_psabi="$(cat "$srcdir/.psabi")"
|
|
kernver="${pkgverdl}-${detected_psabi}-xanmod1"
|
|
modulesdir="$pkgdir/usr/lib/modules/${kernver}"
|
|
|
|
echo "==> Установка модулей ядра для ${kernver}..."
|
|
mkdir -p "${modulesdir}"
|
|
|
|
# Copy modules directory
|
|
if [ -d "lib/modules/${kernver}" ]; then
|
|
cp -r --no-preserve=ownership "lib/modules/${kernver}"/* "${modulesdir}/" || \
|
|
cp -R "lib/modules/${kernver}"/* "${modulesdir}/"
|
|
fi
|
|
|
|
# Установка образа ядра в /boot для загрузки
|
|
echo "==> Установка образа ядра в /boot..."
|
|
mkdir -p "$pkgdir/boot"
|
|
install -Dm755 "boot/vmlinuz-${kernver}" "$pkgdir/boot/vmlinuz-${kernver}"
|
|
|
|
# systemd expects to find the kernel here to allow hibernation
|
|
# https://github.com/systemd/systemd/commit/edda44605f06a41fb86b7ab8128dcf99161d2344
|
|
install -Dm755 "boot/vmlinuz-${kernver}" "$modulesdir/vmlinuz"
|
|
|
|
# Used by mkinitcpio to name the kernel
|
|
echo "${name%-bin}" | install -Dm644 /dev/stdin "$modulesdir/pkgbase"
|
|
|
|
# Установка System.map если есть
|
|
if [ -f "boot/System.map-${kernver}" ]; then
|
|
install -Dm644 "boot/System.map-${kernver}" "$pkgdir/boot/System.map-${kernver}"
|
|
fi
|
|
|
|
# Установка конфигурации ядра если есть
|
|
if [ -f "boot/config-${kernver}" ]; then
|
|
install -Dm644 "boot/config-${kernver}" "$modulesdir/config"
|
|
fi
|
|
|
|
# Установка заголовков из usr если есть
|
|
if [ -d usr ]; then
|
|
echo "==> Установка заголовков ядра..."
|
|
mkdir -p "$pkgdir/usr"
|
|
# Copy recursively with fallback for different cp versions
|
|
cp -r --no-preserve=ownership usr/* "$pkgdir/usr/" 2>/dev/null || \
|
|
cp -R usr/* "$pkgdir/usr/" 2>/dev/null || \
|
|
(cd usr && find . -type f -exec install -Dm644 {} "$pkgdir/usr"/{} \;)
|
|
fi
|
|
}
|
|
|
|
files() {
|
|
# Find all files recursively in boot
|
|
if [ -d ./boot ]; then
|
|
find ./boot -type f -printf '%p\n'
|
|
fi
|
|
|
|
# Find all files in modules directory
|
|
if [ -d ./usr/lib/modules ]; then
|
|
find ./usr/lib/modules -type f -printf '%p\n'
|
|
find ./usr/lib/modules -type l -printf '%p\n'
|
|
fi
|
|
|
|
# Find additional files in /usr
|
|
if [ -d ./usr/include ]; then
|
|
find ./usr/include -type f -printf '%p\n'
|
|
fi
|
|
|
|
if [ -d ./usr/share ]; then
|
|
find ./usr/share -type f -printf '%p\n'
|
|
fi
|
|
|
|
if [ -d ./usr/src ]; then
|
|
find ./usr/src -type f -printf '%p\n'
|
|
find ./usr/src -type l -printf '%p\n'
|
|
fi
|
|
} |