diff options
author | Michael Raskin <7c6f434c@mail.ru> | 2008-03-24 19:39:42 +0000 |
---|---|---|
committer | Michael Raskin <7c6f434c@mail.ru> | 2008-03-24 19:39:42 +0000 |
commit | 4ec702d2ab0c6c961d58026f5f4d476d439fdc06 (patch) | |
tree | e9e11cc1044cc56ea229a170c5ee8f54be60bb35 /pkgs/os-specific/linux | |
parent | 0dfa801a82b2361f4fd2a2f03c021caa518c49ec (diff) | |
download | nixpkgs-4ec702d2ab0c6c961d58026f5f4d476d439fdc06.tar nixpkgs-4ec702d2ab0c6c961d58026f5f4d476d439fdc06.tar.gz nixpkgs-4ec702d2ab0c6c961d58026f5f4d476d439fdc06.tar.bz2 nixpkgs-4ec702d2ab0c6c961d58026f5f4d476d439fdc06.tar.lz nixpkgs-4ec702d2ab0c6c961d58026f5f4d476d439fdc06.tar.xz nixpkgs-4ec702d2ab0c6c961d58026f5f4d476d439fdc06.tar.zst nixpkgs-4ec702d2ab0c6c961d58026f5f4d476d439fdc06.zip |
Added generic functionality for custom kernels.
svn path=/nixpkgs/trunk/; revision=11275
Diffstat (limited to 'pkgs/os-specific/linux')
-rw-r--r-- | pkgs/os-specific/linux/kernel/builder-custom.sh | 127 | ||||
-rw-r--r-- | pkgs/os-specific/linux/kernel/linux.nix | 89 |
2 files changed, 216 insertions, 0 deletions
diff --git a/pkgs/os-specific/linux/kernel/builder-custom.sh b/pkgs/os-specific/linux/kernel/builder-custom.sh new file mode 100644 index 00000000000..b4592e74c48 --- /dev/null +++ b/pkgs/os-specific/linux/kernel/builder-custom.sh @@ -0,0 +1,127 @@ +source $stdenv/setup + +configurePhase=configurePhase +configurePhase() { + export INSTALL_PATH=$out + export INSTALL_MOD_PATH=$out + + eval "$preConfigure" + + # Get rid of any "localversion" files installed by patches. + if test -z "$allowLocalVersion"; then + rm -f localversion* + fi + + # Set our own localversion, if specified. + if test -n "$localVersion"; then + echo "$localVersion" > localversion-nix + fi + + + # Create the config file. + cp $config .config + chmod u+w .config + + echo --extraConfig--; + echo "${extraConfig}"; + + echo "$extraConfig" | while read; do + optionName=$( echo "$REPLY" | sed -e 's/[^A-Z_]//g' ); + echo --optionName--; + echo "$REPLY"; + echo ${optionName}; + if [ -n "${optionName}" ]; then + sed -e s/.'*'${optionName}.'*'/"$REPLY/" -i .config + fi; + done; + + echo "$extraConfig" >> .config + + #substituteInPlace scripts/kconfig/lxdialog/check-lxdialog.sh \ + # --replace /usr /no-such-path + + # Necessary until NIXPKGS-38 is fixed: + echo "#! $SHELL" > scripts/kconfig/lxdialog/check-lxdialog.sh + chmod +x scripts/kconfig/lxdialog/check-lxdialog.sh + + make oldconfig \ + $makeFlags "${makeFlagsArray[@]}" + + echo --finalConfig-- + cat .config +} + + +installPhase=installPhase +installPhase() { + + ensureDir $out + + # Copy the bzImage and System.map. + cp System.map $out + if test "$arch" = um; then + ensureDir $out/bin + cp linux $out/bin + else + cp arch/$arch/boot/bzImage $out/vmlinuz + fi + + # Install the modules in $out/lib/modules with matching paths + # in modules.dep (i.e., refererring to $out/lib/modules, not + # /lib/modules). The depmod_opts= is to prevent the kernel + # from passing `-b PATH' to depmod. + export MODULE_DIR=$out/lib/modules/ + make modules_install \ + DEPMOD=$module_init_tools/sbin/depmod depmod_opts= \ + $makeFlags "${makeFlagsArray[@]}" \ + $installFlags "${installFlagsArray[@]}" + + # Strip the kernel modules. + echo "Stripping kernel modules..." + find $out -name "*.ko" -print0 | xargs -0 strip -S + + # move this to install later on + # largely copied from early FC3 kernel spec files + version=$(cd $out/lib/modules && ls -d *) + + # remove symlinks and create directories + rm -f $out/lib/modules/$version/build + rm -f $out/lib/modules/$version/source + mkdir $out/lib/modules/$version/build + + # copy config + cp .config $out/lib/modules/$version/build/.config + + if test "$arch" != um; then + # copy all Makefiles and Kconfig files + ln -s $out/lib/modules/$version/build $out/lib/modules/$version/source + cp --parents `find -type f -name "Makefile*" -o -name "Kconfig*"` $out/lib/modules/$version/build + cp Module.symvers $out/lib/modules/$version/build + + # weed out unneeded stuff + rm -rf $out/lib/modules/$version/build/Documentation + rm -rf $out/lib/modules/$version/build/scripts + rm -rf $out/lib/modules/$version/build/include + + # copy architecture dependent files + cp -a arch/$arch/scripts $out/lib/modules/$version/build || true + cp -a arch/$arch/*lds $out/lib/modules/$version/build || true + cp -a "arch/$arch/Makefile*.cpu" $out/lib/modules/$version/build/arch/$arch || true + cp -a --parents arch/$arch/kernel/asm-offsets.s $out/lib/modules/$version/build/arch/$arch/kernel || true + + # copy scripts + rm -f scripts/*.o + rm -f scripts/*/*.o + cp -a scripts $out/lib/modules/$version/build + + # copy include files + mkdir -p $out/lib/modules/$version/build/include + cd include + cp -a acpi config linux math-emu media net pcmcia rxrpc scsi sound video asm asm-generic $out/lib/modules/$version/build/include + cp -a `readlink asm` $out/lib/modules/$version/build/include + cd .. + fi +} + + +genericBuild diff --git a/pkgs/os-specific/linux/kernel/linux.nix b/pkgs/os-specific/linux/kernel/linux.nix new file mode 100644 index 00000000000..d4b4ad6c763 --- /dev/null +++ b/pkgs/os-specific/linux/kernel/linux.nix @@ -0,0 +1,89 @@ +{ stdenv, fetchurl, perl, mktemp, module_init_tools, lib + + # The base source file +, src + + # A list of patches to apply to the kernel. Each element of this list + # should be an attribute set {name, patch} where `name' is a + # symbolic name and `patch' is the actual patch. The patch may + # optionally be compressed with gzip or bzip2. +, kernelPatches ? [] + + # A list of commands to run on patched kernel before + # mke oldconfig +, preConfigure? "" + +, # Whether to build a User-Mode Linux kernel. + userModeLinux ? false + +, # Allows you to set your own kernel version for output + version ? "unknown" + + # To change how kernel thinks of itself +, localVersion ? "" + +, # Your own kernel configuration file, if you don't want to use the + # default. + kernelConfig ? null + +, # A list of additional statements to be appended to the + # configuration file. + extraConfig ? [] +}: + +assert stdenv.system == "i686-linux" || stdenv.system == "x86_64-linux"; + +let + + lib = import ../../../lib; + +in + +stdenv.mkDerivation { + name = if userModeLinux then "user-mode-linux-${version}" else "linux-${version}"; + builder = ./builder-custom.sh; + + inherit src; + preConfigure = preConfigure; + + patches = map (p: p.patch) kernelPatches; + extraConfig = + let addNewlines = map (s: "\n" + s + "\n"); + configFromPatches = + map (p: if p ? extraConfig then p.extraConfig else "") kernelPatches; + in lib.concatStrings (addNewlines (configFromPatches ++ extraConfig)); + + config = + if kernelConfig != null then kernelConfig else + if userModeLinux then ./config-2.6.23-uml else + if stdenv.system == "i686-linux" then ./config-2.6.23-i686-smp else + if stdenv.system == "x86_64-linux" then ./config-2.6.23-x86_64-smp else + abort "No kernel configuration for your platform!"; + + buildInputs = [perl mktemp]; + + arch = + if userModeLinux then "um" else + if stdenv.system == "i686-linux" then "i386" else + if stdenv.system == "x86_64-linux" then "x86_64" else + abort "Platform ${stdenv.system} is not supported."; + + makeFlags = if userModeLinux then "ARCH=um SHELL=bash" else ""; + + inherit module_init_tools; + + allowLocalVersion = false; # don't allow patches to set a suffix + inherit localVersion; # but do allow the user to set one. + + meta = { + description = + (if userModeLinux then + "User-Mode Linux" + else + "The Linux kernel") + + (if kernelPatches == [] then "" else + " (with patches: " + + lib.concatStrings (lib.intersperse ", " (map (x: x.name) kernelPatches)) + + ")"); + }; +} |