Added a patch line for busybox for bug #198892. This is 3.4.9_pre10 for testing.
[genkernel.git] / genkernel
1 #!/bin/bash
2
3 PATH="/bin:/usr/bin:/sbin:/usr/sbin"
4 GK_V='3.4.9_pre10'
5
6 # Set the default for TMPDIR.  May be modified by genkernel.conf or the
7 # --tempdir command line option.
8 TMPDIR='/var/tmp/genkernel'
9
10 TODEBUGCACHE=1 # Until an error occurs or LOGFILE is fully qualified.
11
12 small_die() {
13   echo $1
14   exit 1
15 }
16
17 parse_opt() {
18         case "$1" in
19                 *\=*)
20                         echo "$1" | cut -f2- -d=
21                 ;;
22         esac
23 }
24
25 # We don't know where our config is, so we check for it, and default to using
26 # /etc/genkernel.conf if nobody has specified one.
27 case "$*" in
28         --config=*)
29                 CMD_GK_CONFIG=`parse_opt "$*"`
30         ;;
31 esac
32
33 source ${CMD_GK_CONFIG:-/etc/genkernel.conf} || small_die "Could not read /etc/genkernel.conf"
34
35 source ${GK_SHARE}/gen_funcs.sh || small_die "Could not read ${GK_SHARE}/gen_funcs.sh"
36 source ${GK_SHARE}/gen_cmdline.sh || gen_die "Could not read ${GK_SHARE}/gen_cmdline.sh"
37 source ${GK_SHARE}/gen_arch.sh || gen_die "Could not read ${GK_SHARE}/gen_arch.sh"
38 source ${GK_SHARE}/gen_determineargs.sh || gen_die "Could not read ${GK_SHARE}/gen_determineargs.sh"
39 source ${GK_SHARE}/gen_compile.sh || gen_die "Could not read ${GK_SHARE}/gen_compile.sh"
40 source ${GK_SHARE}/gen_configkernel.sh || gen_die "Could not read ${GK_SHARE}/gen_configkernel.sh"
41 source ${GK_SHARE}/gen_initrd.sh || gen_die "Could not read ${GK_SHARE}/gen_initrd.sh"
42 source ${GK_SHARE}/gen_initramfs.sh || gen_die "Could not read ${GK_SHARE}/gen_initramfs.sh"
43 source ${GK_SHARE}/gen_moddeps.sh || gen_die "Could not read ${GK_SHARE}/gen_moddeps.sh"
44 source ${GK_SHARE}/gen_package.sh || gen_die "Could not read ${GK_SHARE}/gen_package.sh"
45 source ${GK_SHARE}/gen_bootloader.sh || gen_die "Could not read ${GK_SHARE}/gen_bootloader.sh"
46
47 TEMP=${TMPDIR}/$RANDOM.$RANDOM.$RANDOM.$$
48
49 trap_cleanup(){
50         # Call exit code of 1 for failure
51         cleanup
52         exit 1
53 }
54
55 cleanup(){
56     if [ -n "$TEMP" -a -d "$TEMP" ]; then
57         rm -rf "$TEMP"
58     fi
59
60     if isTrue ${POSTCLEAR}
61     then
62             echo
63             print_info 1 'RUNNING FINAL CACHE/TMP CLEANUP'
64             print_info 1 "CACHE_DIR: ${CACHE_DIR}"
65             CLEAR_CACHE_DIR='yes'
66             setup_cache_dir
67             echo
68             print_info 1 "TMPDIR: ${TMPDIR}"
69             clear_tmpdir
70             fi
71 }
72
73 trap trap_cleanup SIGHUP SIGQUIT SIGINT SIGTERM SIGKILL
74 BUILD_KERNEL=0
75 BUILD_INITRD=0
76 BUILD_MODULES=0
77
78 # Parse all command line options...
79 Options=$* # Save for later
80 while [ $# -gt 0 ]
81 do
82         Option=$1; shift
83         parse_cmdline $Option
84 done
85
86 # Check if no action is specified...
87 if [ "${BUILD_KERNEL}" -eq '0' -a "${BUILD_INITRD}" -eq '0' ]
88 then
89         usage
90         exit 1
91 fi
92
93 clear_log
94 NORMAL=${GOOD} print_info 1 "Gentoo Linux Genkernel; Version ${GK_V}${NORMAL}"
95 print_info 1 "Running with options: ${Options}"
96 echo
97
98 # Set ${ARCH}
99 get_official_arch
100
101 # Read arch-specific config
102 source ${ARCH_CONFIG} || gen_die "Could not read ${ARCH_CONFIG}"
103 source ${GK_SHARE}/${ARCH}/modules_load || gen_die "Could not read ${GK_SHARE}/${ARCH}/modules_load"
104
105 # Merge modules_load from config
106 for group_modules in ${!AMODULES_*}; do
107         group="$(echo $group_modules | cut -d_ -f2)"
108         eval cmodules="\$$group_modules"
109         eval MODULES_${group}=\"\${MODULES_${group}} ${cmodules}\"
110         print_info 1 "<config> Merged AMODULES_${group}:'${cmodules}' into MODULES_${group}"
111 done
112
113
114 # Based on genkernel.conf, arch-specific configs, and commandline options,
115 # get the real arguments for usage...
116
117 determine_real_args
118
119 [ ! -f "${TEMP}" ] && mkdir -p "${TEMP}"
120
121 setup_cache_dir
122
123
124 dump_debugcache
125
126 NORMAL=${BOLD} print_info 1 "Linux Kernel ${BOLD}${KV}${NORMAL} for ${BOLD}${ARCH}${NORMAL}..."
127
128 if [ "${BUILD_INITRD}" -ne '0' ]
129 then
130         if ! has_loop
131         then
132                 modprobe loop 2>/dev/null
133                 sleep 3
134                 if ! has_loop
135                 then
136                         print_error 1 'The build-host kernel does not appear to have loop device support.'
137                         print_error 1 'Please load loop support before running genkernel!'
138                         gen_die 'Load loop support!'
139                 else
140                         print_info 1 'loop: "loop" module loaded successfully...'
141                 fi
142         fi
143 fi
144
145 # Check BOOTDIR is mounted
146 if isTrue ${CMD_NOINSTALL}
147 then
148         isTrue ${MOUNTBOOT} && print_info 2 'Skipping automatic mount of boot'
149 else
150         [[ -d ${BOOTDIR} ]] || gen_die "${BOOTDIR} is not a directory"
151         
152         if ! egrep -q "[[:space:]]${BOOTDIR}[[:space:]]" /proc/mounts
153         then
154                 if egrep -q "^[^#].+[[:space:]]${BOOTDIR}[[:space:]]" /etc/fstab
155                 then
156                         if isTrue ${MOUNTBOOT}
157                         then
158                                 if ! mount ${BOOTDIR}
159                                 then
160                                         print_warning 1 "${BOLD}WARNING${NORMAL}: Failed to mount ${BOOTDIR}!"
161                                         echo
162                                 else
163                                         print_info 1 "mount: ${BOOTDIR} mounted successfully!"
164                                 fi
165                         else
166                                 print_warning 1 "${BOLD}WARNING${NORMAL}: No mounted ${BOOTDIR} partition detected!"
167                                 print_warning 1 "         Run ``mount ${BOOTDIR}`` to mount it!"
168                                 echo
169                         fi
170                 fi
171         elif isBootRO
172         then
173                 if isTrue ${MOUNTBOOT}
174                 then
175                         if ! mount -o remount,rw ${BOOTDIR}
176                         then
177                                 print_warning 1 "${BOLD}WARNING${NORMAL}: Failed to remount ${BOOTDIR} RW!"
178                                 echo
179                         else
180                                 print_info 1 "mount: ${BOOTDIR} remounted read/write successfully!"
181                                 BOOTRW=1
182                         fi
183                 fi
184         fi
185 fi
186
187 ## Check whether another Genkernel is running
188 #GENPIDS="`ps -C genkernel --no-headers -o pid | wc -l`"
189 #if [ "${GENPIDS}" -gt '3' ]
190 #then
191 #       [ "${GENPIDS}" -gt '4' ] && EX='s'
192 #       print_warning 1 "${BOLD}WARNING${NORMAL}: Another Genkernel instance is running under"
193 #       print_warning 1 "         process ID${EX} " 0
194 #       GENPIDS=`ps -C genkernel --no-headers -o pid`
195 #       echo -n "${GENPIDS}" | sed -e "s/$$//; s/ /, /g"
196 #       echo 'halting...'
197 #       echo
198 #       print_warning 1 'Running multiple genkernels on the same source tree will cause data loss!'
199 #       print_info 1 "Press ^C to halt; ^D to continue [ ${BOLD}if${NORMAL} you know what you're doing! ]"
200 #       echo
201 #       CTEMP="${TEMP}"
202 #       TEMP=${TMPDIR-/tmp}
203 #       TEMP=${TEMP}/genkernel.$RANDOM.$RANDOM.$RANDOM.$$
204 #       print_info 1 'thread: Running multiple genkernels may cause problems!'
205 #       print_info 1 "thread: Temporary files reallocated to ${TEMP}..."
206 #       echo
207 #fi
208
209 KERNCACHE_IS_VALID=0
210 if [ "${KERNCACHE}" != "" ] 
211 then
212     gen_kerncache_is_valid
213 fi
214
215 if [ ${BUILD_KERNEL} -eq '1' -a "${KERNCACHE_IS_VALID}" == "0" ]
216 then
217         # Configure kernel
218         config_kernel
219         
220         # Make deps
221         compile_dep
222
223         # Make prepare [2.6]
224         if [ "${ARCH_HAVENOPREPARE}" = '' ]
225         then
226                 [ "${VER}" -gt '2' ] || [ "${VER}" -eq '2' -a "${PAT}" -ge '6' ] && compile_generic prepare kernel
227         fi
228         
229         # KV may have changed due to the configuration
230         get_KV
231
232         # Compile kernel; If using --genzimage, or building a mips kernel, skip
233         # compile until after initrd/initramfs is done
234         [ "${ENABLE_PEGASOS_HACKS}" != 'yes' -a ${BUILD_INITRAMFS} -eq '0' ] && compile_kernel
235
236         # Compile modules
237         if [ ${BUILD_MODULES} -eq '1' -a ${BUILD_STATIC} -eq '0' ]
238         then
239                 compile_modules
240         fi
241
242         if [ ${SAVE_CONFIG} -eq '1' ]
243         then
244                 print_info 1 "Copying config for successful build to /etc/kernels/kernel-config-${ARCH}-${KV}"
245                 [ ! -e '/etc/kernels' ] && mkdir -p /etc/kernels
246                 cp "${KERNEL_DIR}/.config" "/etc/kernels/kernel-config-${ARCH}-${KV}"
247         fi
248         if [ "${KERNCACHE}" != "" ]
249         then
250                 if [ "${ENABLE_PEGASOS_HACKS}" != 'yes' -a ${BUILD_INITRAMFS} -eq 0 ]
251                 then
252                         gen_kerncache
253                 fi
254         fi
255 fi
256
257 if ! isTrue "${CMD_NOINSTALL}"
258 then
259         if [ "${KERNCACHE}" != "" -a "${KERNCACHE_IS_VALID}" != "0" ] 
260         then
261                 gen_kerncache_extract_kernel
262         fi
263 fi
264
265 if [ "${KERNCACHE}" != "" -a "${KERNCACHE_IS_VALID}" != "0" ] 
266 then
267         [ ${BUILD_STATIC} -eq '0' ] && gen_kerncache_extract_modules
268         gen_kerncache_extract_config
269 fi
270
271 # Run callback
272 if [ "${CMD_CALLBACK}" != "" ]
273 then
274         print_info 1 "" 1 0
275         print_info 1 "Preparing to run callback: \"${CMD_CALLBACK}\"" 0
276
277         CALLBACK_ESCAPE=0
278         CALLBACK_COUNT=0
279
280         trap "CALLBACK_ESCAPE=1" TERM KILL INT QUIT ABRT
281         while [[ ${CALLBACK_ESCAPE} -eq '0' && ${CALLBACK_COUNT} -lt 5 ]]
282         do
283                 sleep 1; echo -n '.';
284                 let CALLBACK_COUNT=${CALLBACK_COUNT}+1
285         done
286
287         if [ "${CALLBACK_ESCAPE}" -eq '0' ]
288         then
289                 echo
290                 echo
291                 eval ${CMD_CALLBACK} | tee -a ${LOGFILE}
292                 CMD_STATUS="${PIPESTATUS[0]}"
293                 echo
294                 print_info 1 "<<< Callback exit status: ${CMD_STATUS}"
295                 [ "${CMD_STATUS}" -ne 0 ] && gen_die '--callback failed!'
296         else
297                 echo
298                 print_info 1 ">>> Callback cancelled..."
299         fi
300         trap - TERM KILL INT QUIT ABRT
301         print_info 1 "" 1 0
302 fi
303
304 if [ "${BUILD_INITRD}" -eq '1' ]
305 then
306         [ "${DISKLABEL}" -eq '1' ] && compile_e2fsprogs
307
308         if [ "${KERN_24}" -eq '1' ] 
309         then
310                 compile_devfsd
311         fi
312
313         if [ "${KERN_24}" != '1' ]
314         then
315             if [ "${BUSYBOX}" -eq '1' ]
316             then
317                 # Compile Busybox
318                 compile_busybox
319             fi
320             
321             # Compile initramfs
322             create_initramfs
323         else
324             # Create initrd
325             compile_busybox
326             create_initrd
327         fi
328 else
329         print_info 1 'initrd: Not building since only the kernel was requested...'
330 fi
331
332 # Pegasos fix
333 if [ "${ENABLE_PEGASOS_HACKS}" = 'yes' -o ${BUILD_INITRAMFS} -eq 1 ]
334 then
335         # Compile kernel, intergrating the initrd into it for Pegasos & mips
336         compile_kernel
337
338         # We skipped the kernel build and kerncache generation
339         # So do it here
340         [ "${KERNCACHE}" != "" ] && gen_kerncache
341 fi
342
343 [ "${MINKERNPACKAGE}" != '' ] && gen_minkernpackage
344 [ "${MODULESPACKAGE}" != '' ] && gen_modulespackage
345
346 # Clean up...
347 [ -n "${CTEMP}" ] && rm -rf "${TEMP}"
348
349 if [ "${BUILD_KERNEL}" -eq '1' ]
350 then
351         set_bootloader
352         print_info 1 ''
353         print_info 1 "Kernel compiled successfully!"
354         print_info 1 ''
355         print_info 1 'Required Kernel Parameters:'
356         if [ "${BUILD_INITRD}" -eq '0' ]
357         then
358                 print_info 1 '    root=/dev/$ROOT'
359                 print_info 1 '    [ And "vga=0x317 splash=verbose" if you use a framebuffer ]'
360                 print_info 1 ''
361                 print_info 1 '    Where $ROOT is the device node for your root partition as the'
362                 print_info 1 '    one specified in /etc/fstab'
363         elif [ "${KERN_24}" != '1' ]
364         then
365                 print_info 1 '    real_root=/dev/$ROOT'
366                 print_info 1 ''
367                 print_info 1 '    Where $ROOT is the device node for your root partition as the'
368                 print_info 1 '    one specified in /etc/fstab'
369                 print_info 1 ''
370                 print_info 1 "If you require Genkernel's hardware detection features; you MUST"
371                 print_info 1 'tell your bootloader to use the provided INITRAMFS file. Otherwise;'
372                 print_info 1 'substitute the root argument for the real_root argument if you are'
373                 print_info 1 'not planning to use the initrd...'
374         else    
375                 print_info 1 '    root=/dev/ram0 real_root=/dev/$ROOT init=/linuxrc'
376                 [ "${INITRD_SIZE}" -ge 4096 ] && print_info 1 "    ramdisk_size=${INITRD_SIZE}"
377                 print_info 1 ''
378                 print_info 1 '    Where $ROOT is the device node for your root partition as the'
379                 print_info 1 '    one specified in /etc/fstab'
380                 print_info 1 ''
381                 print_info 1 "If you require Genkernel's hardware detection features; you MUST"
382                 print_info 1 'tell your bootloader to use the provided INITRD file. Otherwise;'
383                 print_info 1 'substitute the root argument for the real_root argument if you are'
384                 print_info 1 'not planning to use the initrd...'
385         fi
386 fi
387
388 if [ "${BUILD_INITRD}" -eq '1' ]
389 then
390         echo
391         print_info 1 'WARNING... WARNING... WARNING...'
392         print_info 1 'Additional kernel cmdline arguments that *may* be required to boot properly...'
393         [ "${SPLASH}" -eq '1' ] && print_info 1 "add \"vga=791 splash=silent,theme:${SPLASH_THEME} console=tty1 quiet\" if you use a splash framebuffer ]"
394         [ "${LVM}" -eq '1' ] && print_info 1 'add "dolvm" for lvm support'
395         [ "${EVMS}" -eq '1' ] && print_info 1 'add "doevms" for evms support'
396         [ "${DMRAID}" -eq '1' ] && print_info 1 'add "dodmraid" for dmraid support'
397         [ "${DMRAID}" -eq '1' ] && print_info 1 '       or "dodmraid=<additional options>"'
398         [ "${UNIONFS}" -eq '1' ] && print_info 1 'add "unionfs" for unionfs support'
399         [ "${UNIONFS}" -eq '1' ] && print_info 1 '      or "unionfs=<block_device>"'
400 fi
401
402 [ "${BOOTRW}" != '' ] && mount -o remount,ro ${BOOTDIR}
403
404 echo
405 print_info 1 'Do NOT report kernel bugs as genkernel bugs unless your bug'
406 print_info 1 'is about the default genkernel configuration...'
407 print_info 1 ''
408 print_info 1 'Make sure you have the latest genkernel before reporting bugs.'
409
410 #Final Cleanup
411 cleanup