* also update zfs to 8e8acabdcaeb831c777f71361722f4235b698a8d * build zfs directly in-tree
399 lines
14 KiB
Bash
399 lines
14 KiB
Bash
# Maintainer: Joan Figueras <ffigue at gmail dot com>
|
|
# Contributor: Torge Matthies <openglfreak at googlemail dot com>
|
|
# Contributor: Jan Alexander Steffens (heftig) <jan.steffens@gmail.com>
|
|
# Contributor: Adam Mirre (wanderer) <wanderer at dotya dot ml> - added options to build ZFS in-tree
|
|
|
|
##
|
|
## The following variables can be customized at build time. Use env or export to change at your wish
|
|
##
|
|
## Example: env _microarchitecture=98 use_numa=n use_tracers=n makepkg -sc
|
|
##
|
|
## Look inside 'choose-gcc-optimization.sh' to choose your microarchitecture
|
|
## Valid numbers between: 0 to 99
|
|
## Default is: 0 => generic
|
|
## Good option if your package is for one machine: 98 (Intel native) or 99 (AMD native)
|
|
if [ -z ${_microarchitecture+x} ]; then
|
|
_microarchitecture=0
|
|
fi
|
|
|
|
## Disable NUMA since most users do not have multiple processors. Breaks CUDA/NvEnc.
|
|
## Archlinux and Xanmod enable it by default.
|
|
## Set variable "use_numa" to: n to disable (possibly increase performance)
|
|
## y to enable (stock default)
|
|
if [ -z ${use_numa+x} ]; then
|
|
use_numa=y
|
|
fi
|
|
|
|
## Since upstream disabled CONFIG_STACK_TRACER (limits debugging and analyzing of the kernel)
|
|
## you can enable them setting this option. Caution, because they have an impact in performance.
|
|
## Stock Archlinux has this enabled.
|
|
## Set variable "use_tracers" to: n to disable (possibly increase performance, XanMod default)
|
|
## y to enable (Archlinux default)
|
|
if [ -z ${use_tracers+x} ]; then
|
|
use_tracers=n
|
|
fi
|
|
|
|
# Unique compiler supported upstream is GCC
|
|
## Choose between GCC and CLANG config (default is GCC)
|
|
## Use the environment variable "_compiler=clang"
|
|
if [ "${_compiler}" = "clang" ]; then
|
|
_compiler_flags="CC=clang HOSTCC=clang LLVM=1 LLVM_IAS=1"
|
|
fi
|
|
|
|
# Build the zfs module in to the kernel
|
|
if [ -z ${_build_zfs+x} ]; then
|
|
_build_zfs=n
|
|
fi
|
|
|
|
# Choose between the 4 main configs for stable branch. Default x86-64-v1 which use CONFIG_GENERIC_CPU2:
|
|
# Possible values: config_x86-64-v1 (default) / config_x86-64-v2 / config_x86-64-v3 / config_x86-64-v4
|
|
# This will be overwritten by selecting any option in microarchitecture script
|
|
# Source files: https://github.com/xanmod/linux/tree/5.17/CONFIGS/xanmod/gcc
|
|
if [ -z ${_config+x} ]; then
|
|
_config=config_x86-64-v1
|
|
fi
|
|
|
|
# Compress modules with ZSTD (to save disk space)
|
|
if [ -z ${_compress_modules+x} ]; then
|
|
_compress_modules=n
|
|
fi
|
|
|
|
# Compile ONLY used modules to VASTLY reduce the number of modules built
|
|
# and the build time.
|
|
#
|
|
# To keep track of which modules are needed for your specific system/hardware,
|
|
# give module_db script a try: https://aur.archlinux.org/packages/modprobed-db
|
|
# This PKGBUILD read the database kept if it exists
|
|
#
|
|
# More at this wiki page ---> https://wiki.archlinux.org/index.php/Modprobed-db
|
|
if [ -z ${_localmodcfg} ]; then
|
|
_localmodcfg=n
|
|
fi
|
|
|
|
# Tweak kernel options prior to a build via nconfig
|
|
if [ -z ${_makenconfig} ]; then
|
|
_makenconfig=n
|
|
fi
|
|
|
|
### IMPORTANT: Do no edit below this line unless you know what you're doing
|
|
|
|
pkgbase=linux-xanmod-zfs-wanderer
|
|
_major=6.3
|
|
pkgver=${_major}.9
|
|
_branch=6.x
|
|
xanmod=1
|
|
pkgrel=${xanmod}
|
|
pkgdesc='Linux Xanmod - Current Stable (CURRENT) with recent OpenZFS version built in-tree'
|
|
# url="http://www.xanmod.org/"
|
|
url="https://git.dotya.ml/wanderer/linux-xanmod-zfs.git"
|
|
arch=(x86_64)
|
|
license=(GPL2)
|
|
makedepends=(
|
|
bc cpio kmod libelf perl tar xz
|
|
)
|
|
if [ "${_compiler}" = "clang" ]; then
|
|
makedepends+=(clang llvm lld python)
|
|
fi
|
|
options=('!strip')
|
|
_srcname="linux-${pkgver}-xanmod${xanmod}"
|
|
|
|
source=("https://cdn.kernel.org/pub/linux/kernel/v${_branch}/linux-${_major}.tar."{xz,sign}
|
|
"https://github.com/xanmod/linux/releases/download/${pkgver}-xanmod${xanmod}/patch-${pkgver}-xanmod${xanmod}.xz"
|
|
choose-gcc-optimization.sh)
|
|
#"patch-${pkgver}-xanmod${xanmod}.xz::https://sourceforge.net/projects/xanmod/files/releases/stable/${pkgver}-xanmod${xanmod}/patch-${pkgver}-xanmod${xanmod}.xz/download"
|
|
validpgpkeys=(
|
|
'ABAF11C65A2970B130ABE3C479BE3E4300411886' # Linux Torvalds
|
|
'647F28654894E3BD457199BE38DBBDC86092693E' # Greg Kroah-Hartman
|
|
)
|
|
# ^ gpg --locate-keys torvalds@kernel.org gregkh@kernel.org
|
|
|
|
# Archlinux patches
|
|
_commit="ec9e9a4219fe221dec93fa16fddbe44a34933d8d"
|
|
_patches=()
|
|
for _patch in ${_patches[@]}; do
|
|
#source+=("${_patch}::https://git.archlinux.org/svntogit/packages.git/plain/trunk/${_patch}?h=packages/linux&id=${_commit}")
|
|
source+=("${_patch}::https://raw.githubusercontent.com/archlinux/svntogit-packages/${_commit}/trunk/${_patch}")
|
|
done
|
|
|
|
sha256sums=('ba3491f5ed6bd270a370c440434e3d69085fcdd528922fa01e73d7657db73b1e'
|
|
'SKIP'
|
|
'f6010d895c549ba8fc7e4728208c04de988486de0c30a1cdf50e04855d37675d'
|
|
'5c84bfe7c1971354cff3f6b3f52bf33e7bbeec22f85d5e7bfde383b54c679d30')
|
|
|
|
## ZFS makedepends, source and checksums
|
|
if [ "$_build_zfs" = "y" ]; then
|
|
# zfsver="2.1.9"
|
|
# source_url="https://github.com/openzfs/zfs/releases/download/zfs-${zfsver}/zfs-${zfsver}.tar.gz"
|
|
# source+=("$source_url"
|
|
# "${source_url}.asc"
|
|
# )
|
|
# sha256sums+=('6b172cdf2eb54e17fcd68f900fab33c1430c5c59848fa46fab83614922fe50f6'
|
|
# 'SKIP'
|
|
# )
|
|
# validpgpkeys+=(
|
|
# '4F3BA9AB6D1F8D683DC2DFB56AD860EED4598027' # Tony Hutter
|
|
# '29D5610EAE2941E355A2FE8AB97467AAC77B9667' # Ned Bass
|
|
# )
|
|
|
|
# ZFS branch zfs-2.1.10-staging
|
|
makedepends+=(git)
|
|
source_url="https://github.com/openzfs/zfs.git#commit=8e8acabdcaeb831c777f71361722f4235b698a8d"
|
|
source+=("git+$source_url")
|
|
sha256sums+=('SKIP')
|
|
fi
|
|
|
|
export KBUILD_BUILD_HOST=${KBUILD_BUILD_HOST:-archlinux}
|
|
export KBUILD_BUILD_USER=${KBUILD_BUILD_USER:-makepkg}
|
|
export KBUILD_BUILD_TIMESTAMP=${KBUILD_BUILD_TIMESTAMP:-$(date -Ru${SOURCE_DATE_EPOCH:+d @$SOURCE_DATE_EPOCH})}
|
|
|
|
prepare() {
|
|
cd linux-${_major}
|
|
|
|
# Apply Xanmod patch
|
|
patch -Np1 -i ../patch-${pkgver}-xanmod${xanmod} || true
|
|
|
|
msg2 "Setting version..."
|
|
# scripts/setlocalversion --save-scmversion
|
|
echo "-$pkgrel" > localversion.10-pkgrel
|
|
echo "${pkgbase#linux-xanmod}" > localversion.20-pkgname
|
|
|
|
# Archlinux patches
|
|
local src
|
|
for src in "${source[@]}"; do
|
|
src="${src%%::*}"
|
|
src="${src##*/}"
|
|
[[ $src = *.patch ]] || continue
|
|
msg2 "Applying patch $src..."
|
|
patch -Np1 < "../$src"
|
|
done
|
|
|
|
# Applying configuration
|
|
cp -vf CONFIGS/xanmod/gcc/${_config} .config
|
|
# enable LTO_CLANG_THIN
|
|
if [ "${_compiler}" = "clang" ]; then
|
|
scripts/config --disable LTO_CLANG_FULL
|
|
scripts/config --enable LTO_CLANG_THIN
|
|
fi
|
|
|
|
# CONFIG_STACK_VALIDATION gives better stack traces. Also is enabled in all official kernel packages by Archlinux team
|
|
scripts/config --enable CONFIG_STACK_VALIDATION
|
|
|
|
# Enable IKCONFIG following Arch's philosophy
|
|
scripts/config --enable CONFIG_IKCONFIG \
|
|
--enable CONFIG_IKCONFIG_PROC
|
|
|
|
# User set. See at the top of this file
|
|
if [ "$use_tracers" = "y" ]; then
|
|
msg2 "Enabling CONFIG_FTRACE only if we are not compiling with clang..."
|
|
if [ "${_compiler}" = "gcc" ]; then
|
|
scripts/config --enable CONFIG_FTRACE \
|
|
--enable CONFIG_FUNCTION_TRACER \
|
|
--enable CONFIG_STACK_TRACER
|
|
fi
|
|
fi
|
|
|
|
if [ "$use_numa" = "n" ]; then
|
|
msg2 "Disabling NUMA..."
|
|
scripts/config --disable CONFIG_NUMA
|
|
fi
|
|
|
|
# Compress modules by default (following Arch's kernel)
|
|
if [ "$_compress_modules" = "y" ]; then
|
|
scripts/config --enable CONFIG_MODULE_COMPRESS_ZSTD
|
|
fi
|
|
|
|
# Let's user choose microarchitecture optimization in GCC
|
|
# Use default microarchitecture only if we have not choosen another microarchitecture
|
|
if [ "$_microarchitecture" -ne "0" ]; then
|
|
../choose-gcc-optimization.sh $_microarchitecture
|
|
fi
|
|
|
|
# This is intended for the people that want to build this package with their own config
|
|
# Put the file "myconfig" at the package folder (this will take preference) or "${XDG_CONFIG_HOME}/linux-xanmod/myconfig"
|
|
# If we detect partial file with scripts/config commands, we execute as a script
|
|
# If not, it's a full config, will be replaced
|
|
for _myconfig in "${SRCDEST}/myconfig" "${HOME}/.config/linux-xanmod/myconfig" "${XDG_CONFIG_HOME}/linux-xanmod/myconfig" ; do
|
|
if [ -f "${_myconfig}" ] && [ "$(wc -l <"${_myconfig}")" -gt "0" ]; then
|
|
if grep -q 'scripts/config' "${_myconfig}"; then
|
|
# myconfig is a partial file. Executing as a script
|
|
msg2 "Applying myconfig..."
|
|
bash -x "${_myconfig}"
|
|
else
|
|
# myconfig is a full config file. Replacing default .config
|
|
msg2 "Using user CUSTOM config..."
|
|
cp -f "${_myconfig}" .config
|
|
fi
|
|
echo
|
|
break
|
|
fi
|
|
done
|
|
|
|
### Optionally load needed modules for the make localmodconfig
|
|
# See https://aur.archlinux.org/packages/modprobed-db
|
|
if [ "$_localmodcfg" = "y" ]; then
|
|
if [ -f $HOME/.config/modprobed.db ]; then
|
|
msg2 "Running Steven Rostedt's make localmodconfig now"
|
|
make ${_compiler_flags} LSMOD=$HOME/.config/modprobed.db localmodconfig
|
|
else
|
|
msg2 "No modprobed.db data found"
|
|
exit 1
|
|
fi
|
|
fi
|
|
|
|
make ${_compiler_flags} olddefconfig
|
|
|
|
make -s kernelrelease > version
|
|
msg2 "Prepared %s version %s" "$pkgbase" "$(<version)"
|
|
|
|
if [ "$_makenconfig" = "y" ]; then
|
|
make ${_compiler_flags} nconfig
|
|
fi
|
|
|
|
# save configuration for later reuse
|
|
cat .config > "${SRCDEST}/config.last"
|
|
}
|
|
|
|
build() {
|
|
cd linux-${_major}
|
|
make ${_compiler_flags} -j10 modules_prepare
|
|
|
|
if [ "$_build_zfs" = "y" ]; then
|
|
cd ${srcdir}/"zfs"
|
|
|
|
./autogen.sh
|
|
sed -i "s|\$(uname -r)|$(<${srcdir}/linux-${_major}/version)|g" configure
|
|
./configure KERNEL_LLVM=1 --prefix=/usr --sysconfdir=/etc --sbindir=/usr/bin --libdir=/usr/lib \
|
|
--datadir=/usr/share --includedir=/usr/include --with-udevdir=/lib/udev \
|
|
--libexecdir=/usr/lib/zfs --with-config=kernel \
|
|
--with-linux=${srcdir}/linux-${_major} \
|
|
--with-linux-obj=${srcdir}/linux-${_major} \
|
|
--enable-linux-builtin=yes \
|
|
&& ./copy-builtin ${srcdir}/linux-${_major}
|
|
cd ${srcdir}/linux-${_major}
|
|
sed -i 's/CONFIG_LEGACY_DIRECT_IO=y/CONFIG_LEGACY_DIRECT_IO=y\nCONFIG_ZFS=y/' .config
|
|
fi
|
|
|
|
make ${_compiler_flags} -j10 all
|
|
}
|
|
|
|
_package() {
|
|
pkgdesc="The Linux kernel and modules with Xanmod patches"
|
|
depends=(coreutils kmod initramfs)
|
|
optdepends=('crda: to set the correct wireless channels of your country'
|
|
'linux-firmware: firmware images needed for some devices')
|
|
provides=(VIRTUALBOX-GUEST-MODULES
|
|
WIREGUARD-MODULE
|
|
KSMBD-MODULE
|
|
NTFS3-MODULE)
|
|
|
|
cd linux-${_major}
|
|
local kernver="$(<version)"
|
|
local modulesdir="$pkgdir/usr/lib/modules/$kernver"
|
|
|
|
msg2 "Installing boot image..."
|
|
# systemd expects to find the kernel here to allow hibernation
|
|
# https://github.com/systemd/systemd/commit/edda44605f06a41fb86b7ab8128dcf99161d2344
|
|
install -Dm644 "$(make -s image_name)" "$modulesdir/vmlinuz"
|
|
|
|
# Used by mkinitcpio to name the kernel
|
|
echo "$pkgbase" | install -Dm644 /dev/stdin "$modulesdir/pkgbase"
|
|
|
|
msg2 "Installing modules..."
|
|
make INSTALL_MOD_PATH="$pkgdir/usr" INSTALL_MOD_STRIP=1 modules_install
|
|
|
|
# remove build and source links
|
|
rm "$modulesdir"/{source,build}
|
|
}
|
|
|
|
_package-headers() {
|
|
pkgdesc="Headers and scripts for building modules for the $pkgdesc kernel"
|
|
depends=(pahole)
|
|
|
|
cd linux-${_major}
|
|
local builddir="$pkgdir/usr/lib/modules/$(<version)/build"
|
|
|
|
msg2 "Installing build files..."
|
|
install -Dt "$builddir" -m644 .config Makefile Module.symvers System.map \
|
|
localversion.* version vmlinux
|
|
install -Dt "$builddir/kernel" -m644 kernel/Makefile
|
|
install -Dt "$builddir/arch/x86" -m644 arch/x86/Makefile
|
|
cp -t "$builddir" -a scripts
|
|
|
|
# required when STACK_VALIDATION is enabled
|
|
install -Dt "$builddir/tools/objtool" tools/objtool/objtool
|
|
|
|
# required when DEBUG_INFO_BTF_MODULES is enabled
|
|
if [ -f "tools/bpf/resolve_btfids/resolve_btfids" ]; then install -Dt "$builddir/tools/bpf/resolve_btfids" tools/bpf/resolve_btfids/resolve_btfids ; fi
|
|
|
|
msg2 "Installing headers..."
|
|
cp -t "$builddir" -a include
|
|
cp -t "$builddir/arch/x86" -a arch/x86/include
|
|
install -Dt "$builddir/arch/x86/kernel" -m644 arch/x86/kernel/asm-offsets.s
|
|
|
|
install -Dt "$builddir/drivers/md" -m644 drivers/md/*.h
|
|
install -Dt "$builddir/net/mac80211" -m644 net/mac80211/*.h
|
|
|
|
# https://bugs.archlinux.org/task/13146
|
|
install -Dt "$builddir/drivers/media/i2c" -m644 drivers/media/i2c/msp3400-driver.h
|
|
|
|
# https://bugs.archlinux.org/task/20402
|
|
install -Dt "$builddir/drivers/media/usb/dvb-usb" -m644 drivers/media/usb/dvb-usb/*.h
|
|
install -Dt "$builddir/drivers/media/dvb-frontends" -m644 drivers/media/dvb-frontends/*.h
|
|
install -Dt "$builddir/drivers/media/tuners" -m644 drivers/media/tuners/*.h
|
|
|
|
# https://bugs.archlinux.org/task/71392
|
|
install -Dt "$builddir/drivers/iio/common/hid-sensors" -m644 drivers/iio/common/hid-sensors/*.h
|
|
|
|
echo "Installing KConfig files..."
|
|
find . -name 'Kconfig*' -exec install -Dm644 {} "$builddir/{}" \;
|
|
|
|
msg2 "Removing unneeded architectures..."
|
|
local arch
|
|
for arch in "$builddir"/arch/*/; do
|
|
[[ $arch = */x86/ ]] && continue
|
|
echo "Removing $(basename "$arch")"
|
|
rm -r "$arch"
|
|
done
|
|
|
|
msg2 "Removing documentation..."
|
|
rm -r "$builddir/Documentation"
|
|
|
|
msg2 "Removing broken symlinks..."
|
|
find -L "$builddir" -type l -printf 'Removing %P\n' -delete
|
|
|
|
msg2 "Removing loose objects..."
|
|
find "$builddir" -type f -name '*.o' -printf 'Removing %P\n' -delete
|
|
|
|
msg2 "Stripping build tools..."
|
|
local file
|
|
while read -rd '' file; do
|
|
case "$(file -bi "$file")" in
|
|
application/x-sharedlib\;*) # Libraries (.so)
|
|
strip -v $STRIP_SHARED "$file" ;;
|
|
application/x-archive\;*) # Libraries (.a)
|
|
strip -v $STRIP_STATIC "$file" ;;
|
|
application/x-executable\;*) # Binaries
|
|
strip -v $STRIP_BINARIES "$file" ;;
|
|
application/x-pie-executable\;*) # Relocatable binaries
|
|
strip -v $STRIP_SHARED "$file" ;;
|
|
esac
|
|
done < <(find "$builddir" -type f -perm -u+x ! -name vmlinux -print0)
|
|
|
|
msg2 "Stripping vmlinux..."
|
|
strip -v $STRIP_STATIC "$builddir/vmlinux"
|
|
|
|
msg2 "Adding symlink..."
|
|
mkdir -p "$pkgdir/usr/src"
|
|
ln -sr "$builddir" "$pkgdir/usr/src/$pkgbase"
|
|
}
|
|
|
|
pkgname=("${pkgbase}" "${pkgbase}-headers")
|
|
for _p in "${pkgname[@]}"; do
|
|
eval "package_$_p() {
|
|
$(declare -f "_package${_p#$pkgbase}")
|
|
_package${_p#$pkgbase}
|
|
}"
|
|
done
|
|
|
|
# vim:set ts=8 sts=2 sw=2 et:
|