diff options
author | Natanael Copa <ncopa@alpinelinux.org> | 2009-04-29 14:27:16 +0000 |
---|---|---|
committer | Natanael Copa <ncopa@alpinelinux.org> | 2009-04-29 14:27:16 +0000 |
commit | b287c9457c80c3dfa0d0ee5616f2f72058df7519 (patch) | |
tree | f1f6e9d24e50b09fe369cabcd4fb2efe682de756 /mkinitfs.in | |
parent | e38a53c61d4d4abceffcae9bc5b47be8aaec3b16 (diff) | |
download | mkinitfs-b287c9457c80c3dfa0d0ee5616f2f72058df7519.tar.bz2 mkinitfs-b287c9457c80c3dfa0d0ee5616f2f72058df7519.tar.xz |
generate version string in scripts
Diffstat (limited to 'mkinitfs.in')
-rwxr-xr-x | mkinitfs.in | 198 |
1 files changed, 198 insertions, 0 deletions
diff --git a/mkinitfs.in b/mkinitfs.in new file mode 100755 index 0000000..85ce5b0 --- /dev/null +++ b/mkinitfs.in @@ -0,0 +1,198 @@ +#!/bin/sh + +VERSION=@VERSION@ + +_cp() { + local i + if [ -n "$list_sources" ]; then + for i in "$@"; do + echo $i + done + return + fi + + for i in "$@"; do + local dest="$tmpdir"/${i%/*} + mkdir -p "$dest" + cp -flLpR "$i" "$dest" 2>/dev/null || cp -pR "$i" "$dest" + done +} + +feature_files() { + local dir="$1" + local glob file + for f in $features; do + if [ ! -f "$dir/$f" ]; then + continue + fi + for glob in $(cat "$dir/$f"); do + for file in $glob; do + echo $glob + done + done + done +} + +initfs_base() { + local i= dirs= glob= file= + echo "==> initramfs: copying base files" >&2 + for i in dev proc sys sbin bin .modloop lib/modules media/cdrom \ + media/floppy media/usb newroot; do + dirs="$dirs $tmpdir/$i" + done + [ -z "$list_sources" ] && mkdir -p $dirs + + for file in $(feature_files "$filelists_dir"); do + _cp $file + done + + # copy init + if [ -z "$list_sources" ]; then + cd $startdir + install -m755 "$init" "$tmpdir"/init + else + echo "$init" + fi +} + +find_kmod_deps() { + awk ' +function recursedeps(k, j) { + if (k in visited) + return; + visited[k] = 1; + split(deps[k], dep, " "); + for (j in dep) + recursedeps(dep[j]); + print(k); +} + +BEGIN { + if (modulesdep == "") + modulesdep="modules.dep"; + FS = ": "; + while ( (getline < modulesdep) > 0) { + deps[$1] = $2; + } +} + +{ + mod["/"$0] = 1; +} + +END { + for (i in mod) + recursedeps(i); +}' -v modulesdep="$basedir/lib/modules/$kernel/modules.dep" +} + +initfs_kmods() { + local glob= file= files= dirs= + [ -z "$list_soruces" ] && rm -rf "$tmpdir"/lib/modules + cd "$kerneldir" || return 1 + echo "==> initramfs: copying kernel $kernel modules" >&2 + files=$( + for file in $(feature_files $modulelists_dir); do + if ! [ -e ${file} ]; then + echo "$file: No such file or directory" >&2 + continue + fi + echo $file + done | find_kmod_deps) + for file in $files; do + _cp "$basedir"/lib/modules/$kernel/$file + done +} + +initfs_cpio() { + [ -n "$list_sources" ] && return + echo "==> initramfs: creating $outfile" >&2 + (cd "$tmpdir" && find . | cpio -o -H newc | gzip) > $outfile +} + +usage() { + cat <<EOF +usage: mkinitfs [-hkLl] [-b basedir] [-c configfile] [-f features] + [-i initfile ] [-o outfile] [-t tempdir] [kernelversion]" +options: + -b prefix files and kernel modules with basedir + -c use configfile instead of $config + -f use specified features + -h print this help + -i use initfile as init instead of $init + -k keep tempdir + -l only list files that would have been used + -L list available features + -o set another outfile + -t use tempdir when creating initramfs image + +EOF + exit 1 +} + +# main + +startdir=$PWD +config=/etc/mkinitfs/mkinitfs.conf +init=/usr/share/mkinitfs/initramfs-init + +while getopts "b:c:hi:kLlo:t:" opt; do + case "$opt" in + b) basedir="$OPTARG";; + c) config="$OPTARG";; + f) myfeatures="$OPTARG";; + h) usage;; + i) init=$OPTARG;; + k) keeptmp=1;; + L) list_features=1;; + l) list_sources=1;; + o) outfile="$OPTARG";; + t) tmpdir="$OPTARG";; + *) usage;; + esac +done +shift $(( $OPTIND - 1 )) + +. "$config" +filelists_dir=${filelists_dir:-"/etc/mkinitfs/files.d"} +modulelists_dir=${modules_dir:-"/etc/mkinitfs/modules.d"} +[ -n "$myfeatures" ] && features="$myfeatures" + +if [ -n "$list_features" ]; then + for i in $filelists_dir $modulelists_dir; do + ( [ -d "$i" ] && cd $i && ls ) + done | sort | uniq + exit 0 +fi + +[ -n "$1" ] && kernel="$1" +[ -z "$kernel" ] && kernel=$(uname -r) +kerneldir="$basedir/lib/modules/$kernel" +if [ -z "$outfile" ]; then + outfile="$basedir"/boot/${kernel##*-}.gz +fi + +if [ ! -d "$kerneldir" ]; then + echo "$kerneldir does not exist or is not a directory" + exit 1 +fi + +if [ -z "$tmpdir" ]; then + tmpdir=$(mktemp -d /tmp/mkinitfs.XXXXXX) +else + mkdir -p "$tmpdir" +fi + +if [ -z "$keeptmp" ]; then + [ -d "$tmpdir" ] && rm -rf "$tmpdir"/* +fi + +initfs_base +initfs_kmods +initfs_cpio + +# cleanup +if [ -z "$keeptmp" ]; then + [ -d "$tmpdir" ] && rm -rf "$tmpdir" +fi + |