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