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.9' 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="Евгений Храмов (imported from AUR)" maintainer_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 }