aboutsummaryrefslogtreecommitdiffstats
path: root/mkinitfs.in
diff options
context:
space:
mode:
authorNatanael Copa <ncopa@alpinelinux.org>2009-04-29 14:27:16 +0000
committerNatanael Copa <ncopa@alpinelinux.org>2009-04-29 14:27:16 +0000
commitb287c9457c80c3dfa0d0ee5616f2f72058df7519 (patch)
treef1f6e9d24e50b09fe369cabcd4fb2efe682de756 /mkinitfs.in
parente38a53c61d4d4abceffcae9bc5b47be8aaec3b16 (diff)
downloadmkinitfs-b287c9457c80c3dfa0d0ee5616f2f72058df7519.tar.bz2
mkinitfs-b287c9457c80c3dfa0d0ee5616f2f72058df7519.tar.xz
generate version string in scripts
Diffstat (limited to 'mkinitfs.in')
-rwxr-xr-xmkinitfs.in198
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
+