#!/bin/bash ########################################################################## # Script : kernel.SlackBuild # Purpose: Natively build and package the Linux Kernel for Slackware ARM # Author : Stuart Winter # Date...: 20-Sep-2005 ########################################################################## # Changelog ############ # 20-Sep-2005 # * First version for Linux 2.6.13.1 on the StrongARM RiscPC # 31-Dec-2005 # * Linux 2.6.14.5 ########################################################################## # Record toolchain & other info for the build log: slackbuildinfo # Paths to skeleton port's source & real Slackware source tree: export CWD=$PWD # Temporary build locations: export TMPBUILD=$TMP/build-$PKGNAM export PKG=$TMP/package-$PKGNAM mkpkgdirs # Delete & re-create temporary directories then cd into $TMPBUILD # Extract the kernel source: echo -n "Extracting Kernel source... " tar xf $CWD/sources/linux-*.tar.xz || exit 1 echo "done" # Make the source tree dir name match $VERSION (useful for rc releases) mv -fv linux-* linux-$VERSION cd linux-* || exit 1 slackhousekeeping # Install the appropriate Kernel config file: install -vpm644 $CWD/configs/config-$SLKARCH .config # Bring the config file uptodate: # When updating between major releases, it's easier and faster # to run this on an x86:- # make ARCH=arm oldconfig # -- HOWEVER -- # If we're using a patched kernel which provides new features/support, we need to # apply those patches PRIOR to running make menuconfig, otherwise the config choices # are lost! # ------------- # #make oldconfig #read -p "You can run 'make menuconfig' in another session now, then press ENTER" # but don't run it here because it doesn't go well with logging :) # make menuconfig #read -p "Now run make menuconfig in another shell & fix up the config" # Remove any hyphen from the EXTRAVERSION name. # Having a dash in there breaks the package file naming convention, # and even if we rename the package, the /lib/modules/2.x* directory # still has the hyphen in it, which confuses the hell out of the Slackware installer # build script. sed -i '/EXTRAVERSION *=/s/-//g' Makefile #sed -i 's/\(EXTRAVERSION *= *\)-/\1/' Makefile #sed -i 's/^EXTRAVERSION.*=\(.*\)$/EXTRAVERSION = '"$VERSION"'/' Makefile # Ensure that the Kernel version reported in the Makefile matches # the version in the package name that we plan to use. # Since Linux 3.1 was released, the version of the kernel archive was named '3.1' # but the kernel itself was versioned at 3.1.0 to prevent breaking init scripts # that expected 3 digits. # Slackware's Kernel packages need to match the actual version that the Kernel # reports itself as, otherwise there will be trouble ahead! (see below about the Slackware # installer build script): # # If we're doing builds of RC kernels, we can ignore this check and assume we performed the # necessary due dilligence. Non-RC releases have no 'EXTRAVERSION' value set. # if [ "$( echo "$(sed -ne's/^VERSION *= *//p' Makefile).$(sed -ne's/^PATCHLEVEL *= *//p' Makefile).$(sed -ne's/^SUBLEVEL *= *//p' Makefile)" )" != $VERSION ]; then echo "**** Package name vs Kernel version mismatch ****" exit 1 fi # Unpack the non-free binary blobs that accompany the open source drivers. # For the moment this is limited to the RealTek NIC that is present on the Nvidia Tegra # "TrimSlice" system. echo "Adding the non-free driver binary blobs to the Kernel source..." tar xvvf $CWD/sources/firmware/rtl_nic.tar.xz -C firmware/ # ARM feature enhancements: # Various patches: #for i in $CWD/sources/patches/various/*.xz ; do # auto_apply_patch $i || exit 1 #done # OpenRD: #for i in $CWD/sources/patches/openrd/*.xz ; do # auto_apply_patch $i || exit 1 #done # Fixes: # MTD support won't build: #auto_apply_patch $CWD/sources/patches/mtd-ftbfs.patch.xz || exit 1 # Tegra & Trimslice: for i in $CWD/sources/patches/tegra/*.xz ; do auto_apply_patch $i || exit 1 done # Versatile platform: for i in $CWD/sources/patches/versatile/*.xz ; do auto_apply_patch $i || exit 1 done # Build Kernel make clean make $NUMJOBS CONFIG_DEBUG_SECTION_MISMATCH=y zImage || make CONFIG_DEBUG_SECTION_MISMATCH=y zImage || exit 1 # Build the U-Boot image for 'Das U-Boot' - required for ARM devices # that use the U-Boot Linux Loader: make uImage || exit 1 # Build modules: make $NUMJOBS CONFIG_DEBUG_SECTION_MISMATCH=y modules || make CONFIG_DEBUG_SECTION_MISMATCH=y modules || exit 1 # Archive the compiled kernel source - this is used to create the kernel-source package. if [ "$SLKARCH" = "kirkwood" ]; then echo "Archiving compiled source for kernel-source package..." # This takes far too long on ARM. I'll let the Distro polishing script pack this one: # ( cd .. && tar -Ixz -pcf $CWD/compiled-sources/$SLKARCH-kernel-$VERSION-compiled.tar.xz linux-$VERSION ) ( cd .. && tar -pcf $CWD/compiled-sources/$SLKARCH-kernel-$VERSION-compiled.tar linux-$VERSION ) fi # Archive the Kernel headers in order to build the d/kernel-headers package. echo "Archiving the Kernel includes for d/kernel-headers..." mkdir -vpm755 $TMPBUILD/kernel-headers # This installs 'sanitised' headers. Previously I'd copied these manually but # since ARM moved the headers to a new location in the kernel source, the headers # became broken -- using this method results in stuff compiling, so I'll use it :-) make INSTALL_HDR_PATH=$TMPBUILD/kernel-headers headers_install ( cd $TMPBUILD/kernel-headers # Wipe these '.install' and '..install.cmd' files find . -iname '.*' -type f -print0 | xargs -0 rm -f tar -Ixz -pcf $CWD/../d/kernel-headers/sources/kernel-headers-$VERSION.tar.xz . ) # Install modules into the package: make modules_install INSTALL_MOD_PATH=$PKG # And now spam the filesystem. I don't like this, but unless I patch mkinitrd # to find modules in a location other than /, I need to do it: # For all other work with modules, we should use the versions just compiled and # packaged - the /lib/modules/xx may contain additional modules from previous builds, # but it'll be good for mkinitrd since we know in advance which modules we'll # include in the initrd, so these will always exist and be the latest builds. # Eek! -- this allows us to easily ensure that we don't specify any # older now-compiled-in-kernel drivers as modules, which may have been # left from an older build - makes testing easier without having to # modify the mkinitrd line below. # I need to patch mkinitrd ;-) rm -rf /lib/modules/$VERSION-$SLKARCH make modules_install # Install & archive the firmware so it can be built from a separate script in # a/kernel-firmware. These firmware files are architecture independent so # we only need one package. echo "Installing and archiving kernel-firmware for the a/kernel-firmware package ..." mkdir -vpm755 $TMPBUILD/firmwareinstall make firmware_install INSTALL_FW_PATH=$TMPBUILD/firmwareinstall/lib/firmware cp -fav firmware/WHENCE $TMPBUILD/firmwareinstall/lib/firmware ( cd $TMPBUILD/firmwareinstall && tar -Ixz -pcf $CWD/../a/kernel-firmware/sources/kernel-firmware-$VERSION.tar.xz . ) # Install the modules into the a/kernel-modules source directory for use afterwards. # (these are compressed by the kernel-modules.SlackBuild script) echo "Archiving Kernel modules for the a/kernel-modules package..." # Wipe the firmware from the package since it's included in the a/kernel-firmware package # and delt with above: echo "Wiping /lib/firmware from the current package contents so that" echo "it won't be included in the a/kernel-modules package ..." rm -rf $PKG/lib/firmware ( cd $PKG && tar -Ixz -pcf $CWD/../a/kernel-modules/sources/$SLKARCH-kernel-modules-$VERSION.tar.xz lib/ ) # When building in /patches/source: #( cd $PKG && tar -Ixz -pcf $CWD/../kernel-modules/sources/$SLKARCH-kernel-modules-$VERSION.tar.xz lib/ ) # Compress kernel modules to reduce the size of the initrd. # Busybox >=1.14 supports compressed kernel modules. echo "Compressing Kernel modules for $SLKARCH ..." find /lib/modules/$VERSION-$SLKARCH -type f -name "*.ko" -exec gzip -9f {} \; for i in $(find /lib/modules/$VERSION-$SLKARCH -type l -name "*.ko") ; do ln -vfs $( readlink $i ).gz $i.gz ; rm -fv $i ; done # Usually we'd do this inside the resulting package but we need the modules # to be up to date on the live system so that mkinitrd can grab what it needs: ( cd / echo "Updating module dependencies for $VERSION-$SLKARCH" find lib/modules -name $VERSION-$SLKARCH -type d -mindepth 1 -maxdepth 1 -printf "%f\n" | xargs -i depmod {} -b. ) # Install the kernel image and system map: mkdir -vpm755 $PKG/{install,boot} #gzip -f9cv System.map > $PKG/boot/System.map-$SLKARCH-$VERSION.gz # These are named after their respective architectures so that you # can have more than 1 Kernel package installed on the system # at any one time, and configure your boot loader to boot, say # "/uImage-kirkwood", and not then have to maintain Kernel version # numbers. # We'll wipe the ones we don't need for this architecture a bit # further down. install -vpm644 System.map $PKG/boot/System.map-$SLKARCH-$VERSION install -vpm644 arch/arm/boot/zImage $PKG/boot/zImage-$SLKARCH-$VERSION install -vpm644 arch/arm/boot/uImage $PKG/boot/uImage-$SLKARCH-$VERSION # Make symlinks: ( cd $PKG/boot ln -vfs System.map-$SLKARCH-$VERSION System.map-$SLKARCH ln -vfs zImage-$SLKARCH-$VERSION zImage-$SLKARCH ln -vfs uImage-$SLKARCH-$VERSION uImage-$SLKARCH ) # The Kernel config file used (following the Slackware standard): install -pvm644 .config $PKG/boot/config-$SLKARCH-$VERSION # The package description: install -pvm644 $CWD/slack-descs/$SLKARCH-slack-desc $PKG/install/slack-desc # Copy the Kernel into our tree's 'kernels' directory: # If you want to keep these, move the old one out of the way first # otherwise it gets clobbered. mkdir -vpm755 $PKGSTORE/../kernels/$SLKARCH install -vm644 arch/arm/boot/zImage $PKGSTORE/../kernels/$SLKARCH/zImage-$SLKARCH # Some Archs (eg ARM Versatile emulated by QEMU) won't need a U-Boot image, # but if somebody *does* have a real ARM Versatile board (I don't know if it # uses U-Boot), then we ought to supply a U-Boot image anyway: install -vm644 arch/arm/boot/uImage $PKGSTORE/../kernels/$SLKARCH/uImage-$SLKARCH # This is really for the installer build script: gzip -f9cv System.map > $PKGSTORE/../kernels/$SLKARCH/System.map.gz # And because Slackware includes the kernel config, let's do it too! install -vpm644 .config $PKGSTORE/../kernels/$SLKARCH/config # Make an initrd for the architecture - using a clean # extraction (otherwise mkinitrd uses /boot/initrd-tree which on # the Slackware ARM dev boxes, could contain anything! ;-) # # Note: Using mkinitrd will create the '/rootfs' file inside the initrd # filesystem in line with what the devbox running this script has # as its root filesystem. However, you can (and probably should!) # (I tend to use ext3 though, so you'll be ok if you use that too! ;-) ) # specify the root filesystem type at boot time by appending # # rootfs=ext4 or which ever filesystem you're using. # # For QEMU, this is explained in the 'disk_launch' helper script # provided. This 'rootfs=' is just a Kernel command line value # which is parsed by the initrd's '/init' script. # # This is work in progress and will probably need to be expanded for # other architectures - as each arch will need a separate initrd anyway, # otherwise they'll contain modules for all supported architectures # as the installer does. # Tip: when looking for what depends on what in the Kernel: # find /usr/src/linux-$VERSION/ -name Kconfig -exec grep -l ZLIB_ {} \; rm -rf $TMPBUILD/initrd-tree mkdir -vpm755 $TMPBUILD/initrd-tree # Unpack the generic Slackware initial ram disk tree: tar xf /usr/share/mkinitrd/initrd-tree.tar.gz -C $TMPBUILD/initrd-tree # # # Filesystems & supporting libraries to include - these are the standard # offered by the Slackware Installer: # If we wanted ocfs2 (I originally thought Slackware supported it!) # then we also need: # ocfs2:configfs # # Note: If you were referred to this build script by some of the supporting # Slackware ARM documentation, please note that this list of filesystem # modules most likely far exceeds what is suggested by the # /usr/share/mkinitrd/mkinitrd_command_generator.sh script. # This is because the Slackware ARM initrd must be able to boot a newly # installed OS which could have been configured in a number of ways # (basically this means "what filesystems you used" ;-) ). # Also, I try to keep this list in sync with the modules required by the # Slackware installer. All that is needed by your own initrd will be # enough to access the installes OS, and then load the rest of the Kernel # modules from there. # So, "DON'T PANIC!!" # 'mkinitrd' figures out the module dependencies and includes those too, so # we don't need to specify all associated modules (although I do try to keep a # running list where possible). # # Generic requirements: # Filesystems: INITRDFS="vfat:jbd:jbd2:nls:exportfs:binfmt_misc:md:dm-mod:mbcache:ext2:ext3:ext4:reiserfs:jfs:xfs:fscache" # Generic SCSI drivers & low-level drivers for discs/media: INITRDSCSI="sg:scsi_mod:sd_mod:cdrom:sr_mod:scsi_tgt:mmc_block" # Network filesystems: INITRDNETFS="nfs:lockd:nfs_common" # USB hubs & support mods, including interface devices (USB keyboards etc) # followed by some specific device drivers. INITRDUSB="ehci-hcd:uhci_hcd:usbhid:ohci_hcd:hid:usbcore:usb-storage:ums-cypress:ums-usbat:ums-freecom:ums-isd200:ums-sddr09:ums-sddr55:ums-alauda:ums-jumpshot:ums-onetouch" # For SDHC cards: INITRDCARDS="mvsdio" # Additional stuff such as Netconsole (useful for debugging on machines without a serial cable) # INITRDADDITIONS=":netconsole" case "$SLKARCH" in ####################################################################################### # ARM Ltd. Versatile platform (supported on Slackware ARM through emulation by "QEMU") ####################################################################################### versatile) # Network interface cards: INITRDNETDEV="smc91x" # SCSI cards: INITRDSCSI="$INITRDSCSI:sym53c8xx" mkinitrd \ -R \ -L \ -u \ -w 3 \ -k $VERSION-$SLKARCH \ -s $TMPBUILD/initrd-tree \ -m $INITRDSCSI:$INITRDUSB:$INITRDFS:$INITRDNETDEV:$INITRDNETFS:$INITRDCARDS${INITRDADDITIONS} \ -o /initrd-$SLKARCH.gz mv -fv /initrd-$SLKARCH.gz $PKGSTORE/../kernels/$SLKARCH/ # Put a copy of the initial RAM disk into the $PKG's /boot # This allows devices whose boot loader can read the partition where /boot resides # can have a generic initrd to boot into after installation. install -vpm644 $PKGSTORE/../kernels/$SLKARCH/initrd-$SLKARCH.gz $PKG/boot/initrd-$SLKARCH-$VERSION.gz ( cd $PKG/boot ln -vfs initrd-$SLKARCH-$VERSION.gz initrd-$SLKARCH.gz ) # Let's wipe the uInitrd and uimage files from this architecture. # We only support installing the Versatile from within QEMU. # Comment these lines if we want to keep the uImage, but I think it'll only # cause confusion to keep both copies. ( cd $PKG/boot rm -fv uImage* uinitrd* ) rm -fv $PKGSTORE/../kernels/$SLKARCH/uImage* ;; ######################################################################### # Marvell Kirkwood series (Including the 'SheevaPlug' & OpenRD systems) ######################################################################### kirkwood) # Network interface cards: INITRDNETDEV="mv643xx_eth" # SATA support for the Kirkwood family: # Generic libata & Marvell's SATA driver. INITRDSATA="libata:sata_mv" # XGI video chipset used on OpenRD and probably other kirkwood devices: # We'd also need "fbcon" if we choose not to compile it into the kernel. INITRDVIDEO="xgifb" # Wait 6 seconds for the USB discs to spin up. The SheevaPlug's # USB recognition can be a bit hit and miss, so it's best to # wait for longer than usual. mkinitrd \ -R \ -L \ -u \ -w 6 \ -k $VERSION-$SLKARCH \ -s $TMPBUILD/initrd-tree \ -m $INITRDVIDEO:$INITRDSCSI:$INITRDSATA:$INITRDUSB:$INITRDFS:$INITRDNETDEV:$INITRDNETFS:$INITRDCARDS${INITRDADDITIONS} \ -o /uinitrd-kirkwood.gz # Creating it in / avoids an ugly bit of output at boot that contains # the path where it was built. It just looks nicer this way :-) mv -fv /uinitrd-kirkwood.gz $TMPBUILD/ # -o $TMPBUILD/uinitrd-kirkwood.gz # Create a uInitrd for U-boot: cd $TMPBUILD mkimage \ -A arm \ -O linux \ -T ramdisk \ -C gzip \ -n "Slackware ARM for $SLKARCH platform" \ -d $TMPBUILD/uinitrd-kirkwood.gz \ $PKGSTORE/../kernels/$SLKARCH/uinitrd-$SLKARCH # Put a copy of the initial RAM disk into the $PKG's /boot # This allows devices whose boot loader can read the partition where /boot resides # can have a generic initrd to boot into after installation. # This 'uinitrd' is for devices using the 'Das U-Boot' Linux loader. install -vpm644 $PKGSTORE/../kernels/$SLKARCH/uinitrd-$SLKARCH $PKG/boot/uinitrd-$SLKARCH-$VERSION ( cd $PKG/boot ln -vfs uinitrd-$SLKARCH-$VERSION uinitrd-$SLKARCH ) # Wipe what we don't need for this architecture. # In this case we only retain the 'uImage' and 'uInitrd' ( cd $PKG/boot rm -fv zImage* initrd* ) rm -fv $PKGSTORE/../kernels/$SLKARCH/zImage* # This was the wrong direction for this, but I'll leave it in incase for some # odd reason I do need to provide JFFS2 images in the future. # # # Create a JFFS2 image for Kirkwood - to be written to the SheevaPlug's NAND # # so we can boot the initrd & kernel from flash, therefore not have to put up # # with U-Boot's poor USB support -- I hope! :-) # # At the moment we're not going to offer these initrds as stand alone files -- they # # will be included only in the Kernel package. This is because I figure that if you # # can't boot from NAND *and* USB, then your only hope is still the network, in which case # # you use the standard U-Boot-ified initrd. # # This JFFS2 image would only be written from the installed/running OS or during OS installation. # cd $TMPBUILD # mkdir -vpm755 jffs2-fs # cd jffs2-fs # zcat $TMPBUILD/uinitrd-kirkwood.gz | cpio -div # mkfs.jffs2 -l -e 0x20000 --pad -r . -o $PKG/boot/initrd-$SLKARCH-$VERSION.jffs2 # # Make a convenient versionless symlink -- useful for scripting: # ( cd $PKG/boot # ln -vfs initrd-$SLKARCH-$VERSION.jffs2 initrd-$SLKARCH.jffs2 ) # ;; ####################################################################### # NVidia Tegra systems ####################################################################### tegra) # Network interface cards: INITRDNETDEV="r8169" # this one needs a binary blob, which we'll build into the Kernel vmlinuz. # SATA support for the Kirkwood family: # Generic libata & Marvell's SATA driver. INITRDSATA="libata" # The Trimslice's SATA is on an internal USB host # MMC # INITRDMMC="sdhci-tegra" # For the Toshiba AC100 # We'd also need "fbcon" if we choose not to compile it into the kernel. # The Trimslice uses the Tegra module which we need to compile into the Kernel. # INITRDVIDEO="xgifb" # Subsystems for System on Chip stuff: # (Some of these may not be required - I can most likely whittle them down later) INITRDSOC="i2c-tegra:rtc-em3027:spi-tegra" # Wait 6 seconds for the USB discs to spin up. mkinitrd \ -R \ -L \ -u \ -w 6 \ -k $VERSION-$SLKARCH \ -s $TMPBUILD/initrd-tree \ -m $INITRDSOC:$INITRDSCSI:$INITRDSATA:$INITRDUSB:$INITRDFS:$INITRDNETDEV:$INITRDNETFS:$INITRDCARDS${INITRDADDITIONS} \ -o /uinitrd-tegra.gz # Creating it in / avoids an ugly bit of output at boot that contains # the path where it was built. It just looks nicer this way :-) mv -fv /uinitrd-tegra.gz $TMPBUILD/ # -o $TMPBUILD/uinitrd-tegra.gz # Create a uInitrd for U-boot: cd $TMPBUILD mkimage \ -A arm \ -O linux \ -T ramdisk \ -C gzip \ -n "Slackware ARM Initial RAM disk for the $SLKARCH platform" \ -d $TMPBUILD/uinitrd-tegra.gz \ $PKGSTORE/../kernels/$SLKARCH/uinitrd-$SLKARCH # Put a copy of the initial RAM disk into the $PKG's /boot # This allows devices whose boot loader can read the partition where /boot resides # can have a generic initrd to boot into after installation. # This 'uinitrd' is for devices using the 'Das U-Boot' Linux loader. install -vpm644 $PKGSTORE/../kernels/$SLKARCH/uinitrd-$SLKARCH $PKG/boot/uinitrd-$SLKARCH-$VERSION ( cd $PKG/boot ln -vfs uinitrd-$SLKARCH-$VERSION uinitrd-$SLKARCH ) # Wipe what we don't need for this architecture. # In this case we only retain the 'uImage' and 'uInitrd' ( cd $PKG/boot rm -fv zImage* initrd* ) rm -fv $PKGSTORE/../kernels/$SLKARCH/zImage* ;; esac # It's nice to have this final touch (pun intended): ( cd $PKGSTORE/../kernels/$SLKARCH/ touch -r ?Image-$SLKARCH * $PKG/boot/* ) # Build the base Kernel package (without libraries): cd $PKG chown -R root:root . chmod -R og-w . # Move the libs out of the way -- they go in a/kernel-modules package # mv lib /tmp/$$lib rm -rf lib # don't need these anymore since they are archived in the a/kernel-modules source directory # Replace version number with a _ so it doesn't get confused with # the package name. # This is incase we're using any '-rc' releases. export VERSION="$( echo $VERSION | sed 's?-??g' )" makepkg -l y -c n $PKGSTORE/$PKGSERIES/$PKGNAM-$VERSION-$ARCH-$BUILD.tgz # Now put the libs back (we need them for the a/kernel-modules package): # mv /tmp/$$lib lib cat << EOF Next steps: ----------- [1] If we're upgrading the Kernel headers, run the build script in d/kernel-headers and modify l/glibc's build script to use the newer headers package and rebuild glibc. ** Normally I will not do this step ** [2] # cd ~/tmp/build-kernel_xxx # cd linux*/arch/arm/boot # cp -fv zImage /mnt/somepath boot the OS with the new zImage [4] Kernel source package: - Rebuild the k/ kernel-source package. ./kernel-sourcepackage.SlackBuild [5] Update Kernel modules: cd ../../a/kernel-modules Update Kernel version in 'arm/build' ./arm/build EOF