patch-kernel
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:6k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. #! /bin/sh
  2. # Script to apply kernel patches.
  3. #   usage: patch-kernel [ sourcedir [ patchdir [ stopversion ] [ -acxx ] ] ]
  4. #     The source directory defaults to /usr/src/linux, and the patch
  5. #     directory defaults to the current directory.
  6. # e.g.
  7. #   scripts/patch-kernel . ..
  8. #      Update the kernel tree in the current directory using patches in the
  9. #      directory above to the latest Linus kernel
  10. #   scripts/patch-kernel . .. -ac
  11. #      Get the latest Linux kernel and patch it with the latest ac patch
  12. #   scripts/patch-kernel . .. 2.4.9
  13. #      Gets standard kernel 2.4.9
  14. #   scripts/patch-kernel . .. 2.4.9 -ac
  15. #      Gets 2.4.9 with latest ac patches
  16. #   scripts/patch-kernel . .. 2.4.9 -ac11
  17. #      Gets 2.4.9 with ac patch ac11
  18. #   Note: It uses the patches relative to the Linus kernels, not the
  19. #   ac to ac relative patches
  20. #
  21. # It determines the current kernel version from the top-level Makefile.
  22. # It then looks for patches for the next sublevel in the patch directory.
  23. # This is applied using "patch -p1 -s" from within the kernel directory.
  24. # A check is then made for "*.rej" files to see if the patch was
  25. # successful.  If it is, then all of the "*.orig" files are removed.
  26. #
  27. #       Nick Holloway <Nick.Holloway@alfie.demon.co.uk>, 2nd January 1995.
  28. #
  29. # Added support for handling multiple types of compression. What includes
  30. # gzip, bzip, bzip2, zip, compress, and plaintext. 
  31. #
  32. #       Adam Sulmicki <adam@cfar.umd.edu>, 1st January 1997.
  33. #
  34. # Added ability to stop at a given version number
  35. # Put the full version number (i.e. 2.3.31) as the last parameter
  36. #       Dave Gilbert <linux@treblig.org>, 11th December 1999.
  37. # Fixed previous patch so that if we are already at the correct version
  38. # not to patch up.
  39. #
  40. # Added -ac option, use -ac or -ac9 (say) to stop at a particular version
  41. #       Dave Gilbert <linux@treblig.org>, 29th September 2001.
  42. # Set directories from arguments, or use defaults.
  43. sourcedir=${1-/usr/src/linux}
  44. patchdir=${2-.}
  45. stopvers=${3-imnotaversion}
  46. # See if we have any -ac options
  47. for PARM in $*
  48. do
  49.   case $PARM in
  50.   -ac*)
  51.   gotac=$PARM;
  52. esac;
  53. done
  54. # ---------------------------------------------------------------------------
  55. # Find a file, first parameter is basename of file
  56. # it tries many compression mechanisms and sets variables to say how to get it
  57. function findFile {
  58.   filebase=$1;
  59.   if [ -r ${filebase}.gz ]; then
  60. ext=".gz"
  61. name="gzip"
  62. uncomp="gunzip -dc"
  63.   elif [ -r ${filebase}.bz  ]; then
  64. ext=".bz"
  65.     name="bzip"
  66. uncomp="bunzip -dc"
  67.   elif [ -r ${filebase}.bz2 ]; then
  68. ext=".bz2"
  69. name="bzip2"
  70. uncomp="bunzip2 -dc"
  71.   elif [ -r ${filebase}.zip ]; then
  72. ext=".zip"
  73. name="zip"
  74. uncomp="unzip -d"
  75.   elif [ -r ${filebase}.Z ]; then
  76. ext=".Z"
  77. name="uncompress"
  78. uncomp="uncompress -c"
  79.   elif [ -r ${filebase} ]; then
  80. ext=""
  81. name="plaintext"
  82. uncomp="cat"
  83.   else
  84.   return 1;
  85. fi
  86.   return 0;
  87. }
  88. # ---------------------------------------------------------------------------
  89. # Apply a patch and check it goes in cleanly
  90. # First param is patch name (e.g. patch-2.4.9-ac5) - without path or extension
  91. function applyPatch {
  92.   echo -n "Applying $1 (${name})... "
  93.   if $uncomp ${patchdir}/$1${ext} | patch -p1 -s -N -E -d $sourcedir
  94.   then
  95.     echo "done."
  96.   else
  97.     echo "failed.  Clean up yourself."
  98.     return 1;
  99.   fi
  100.   if [ "`find $sourcedir/ '(' -name '*.rej' -o -name '.*.rej' ')' -print`" ]
  101.   then
  102.     echo "Aborting.  Reject files found."
  103.     return 1;
  104.   fi
  105.   # Remove backup files
  106.   find $sourcedir/ '(' -name '*.orig' -o -name '.*.orig' ')' -exec rm -f {} ;
  107.  
  108.   return 0;
  109. }
  110. # set current VERSION, PATCHLEVEL, SUBLEVEL, EXTERVERSION
  111. eval `sed -n -e 's/^([A-Z]*) = ([0-9]*)$/1=2/p' -e 's/^([A-Z]*) = (-[-a-z0-9]*)$/1=2/p' $sourcedir/Makefile`
  112. if [ -z "$VERSION" -o -z "$PATCHLEVEL" -o -z "$SUBLEVEL" ]
  113. then
  114.     echo "unable to determine current kernel version" >&2
  115.     exit 1
  116. fi
  117. echo "Current kernel version is $VERSION.$PATCHLEVEL.$SUBLEVEL${EXTRAVERSION}"
  118. if [ x$EXTRAVERSION != "x" ]
  119. then
  120.   echo "I'm sorry but patch-kernel can't work with a kernel source tree that is not a base version"
  121. exit 1;
  122. fi
  123. while :
  124. do
  125.     CURRENTFULLVERSION="$VERSION.$PATCHLEVEL.$SUBLEVEL"
  126.     if [ $stopvers = $CURRENTFULLVERSION ]
  127.     then
  128.         echo "Stoping at $CURRENTFULLVERSION base as requested."
  129.         break
  130.     fi
  131.     SUBLEVEL=`expr $SUBLEVEL + 1`
  132.     FULLVERSION="$VERSION.$PATCHLEVEL.$SUBLEVEL"
  133.     patch=patch-$FULLVERSION
  134. # See if the file exists and find extension
  135. findFile $patchdir/${patch} || break
  136.     # Apply the patch and check all is OK
  137.     applyPatch $patch || break
  138. done
  139. if [ x$gotac != x ]; then
  140.   # Out great user wants the -ac patches
  141. # They could have done -ac (get latest) or -acxx where xx=version they want
  142. if [ $gotac == "-ac" ]
  143. then
  144.   # They want the latest version
  145. HIGHESTPATCH=0
  146. for PATCHNAMES in $patchdir/patch-${CURRENTFULLVERSION}-ac*.*
  147. do
  148. ACVALUE=`echo $PATCHNAMES | sed -e 's/^.*patch-[0-9.]*-ac([0-9]*).*/1/'`
  149. # Check it is actually a recognised patch type
  150. findFile $patchdir/patch-${CURRENTFULLVERSION}-ac${ACVALUE} || break
  151.   if [ $ACVALUE -gt $HIGHESTPATCH ]
  152. then
  153.   HIGHESTPATCH=$ACVALUE
  154.   fi
  155. done
  156. if [ $HIGHESTPATCH -ne 0 ]
  157. then
  158. findFile $patchdir/patch-${CURRENTFULLVERSION}-ac${HIGHESTPATCH} || break
  159. applyPatch patch-${CURRENTFULLVERSION}-ac${HIGHESTPATCH}
  160. else
  161.   echo "No ac patches found"
  162. fi
  163. else
  164.   # They want an exact version
  165. findFile $patchdir/patch-${CURRENTFULLVERSION}${gotac} || {
  166.   echo "Sorry, I couldn't find the $gotac patch for $CURRENTFULLVERSION.  Hohum."
  167. exit 1
  168. }
  169. applyPatch patch-${CURRENTFULLVERSION}${gotac}
  170. fi
  171. fi