[arch-projects] [mkinitcpio] [PATCH 1/3] mkinitcpio: add -T option
Dave Reisner
d at falconindy.com
Mon Nov 18 22:02:34 EST 2013
On Mon, Nov 18, 2013 at 08:21:46PM +0100, Thomas Bächler wrote:
> The -T (--targetdirectory) option writes the root of the generated image
> directly to the specified directory.
>
> Useful for generating a shutdown-ramfs with mkinitcpio -T /run/initramfs/.
> ---
Totally on board with this -- just a few comments.
> functions | 35 ++++++++++++++++++-----------------
> mkinitcpio | 19 ++++++++++++++-----
> 2 files changed, 32 insertions(+), 22 deletions(-)
>
> diff --git a/functions b/functions
> index f0dce80..acec621 100644
> --- a/functions
> +++ b/functions
> @@ -627,45 +627,46 @@ initialize_buildroot() {
> # creates a temporary directory for the buildroot and initialize it with a
> # basic set of necessary directories and symlinks
>
> - local workdir= kernver=$1 arch=$(uname -m)
> + local workdir= kernver=$1 arch=$(uname -m) buildroot=$2
>
> if ! workdir=$(mktemp -d --tmpdir mkinitcpio.XXXXXX); then
> error 'Failed to create temporary working directory in %s' "${TMPDIR:-/tmp}"
> return 1
> fi
> + [[ -z $buildroot ]] && buildroot=$workdir/root
You could just define buildroot here as:
buildroot=${2:-$workdir/root}
>
> # base directory structure
> - install -dm755 "$workdir/root"/{new_root,proc,sys,dev,run,tmp,etc,usr/{local,lib,bin}}
> - ln -s "usr/lib" "$workdir/root/lib"
> - ln -s "../lib" "$workdir/root/usr/local/lib"
> - ln -s "bin" "$workdir/root/usr/sbin"
> - ln -s "usr/bin" "$workdir/root/bin"
> - ln -s "usr/bin" "$workdir/root/sbin"
> - ln -s "../bin" "$workdir/root/usr/local/bin"
> - ln -s "../bin" "$workdir/root/usr/local/sbin"
> + install -dm755 "$buildroot"/{new_root,proc,sys,dev,run,tmp,etc,usr/{local,lib,bin}}
> + ln -s "usr/lib" "$buildroot/lib"
> + ln -s "../lib" "$buildroot/usr/local/lib"
> + ln -s "bin" "$buildroot/usr/sbin"
> + ln -s "usr/bin" "$buildroot/bin"
> + ln -s "usr/bin" "$buildroot/sbin"
> + ln -s "../bin" "$buildroot/usr/local/bin"
> + ln -s "../bin" "$buildroot/usr/local/sbin"
>
> case $arch in
> x86_64)
> - ln -s "lib" "$workdir/root/usr/lib64"
> - ln -s "usr/lib" "$workdir/root/lib64"
> + ln -s "lib" "$buildroot/usr/lib64"
> + ln -s "usr/lib" "$buildroot/lib64"
> ;;
> esac
>
> # mkinitcpio version stamp
> - printf '%s' "$version" >"$workdir/root/VERSION"
> + printf '%s' "$version" >"$buildroot/VERSION"
>
> # kernel module dir
> - install -dm755 "$workdir/root/usr/lib/modules/$kernver/kernel"
> + install -dm755 "$buildroot/usr/lib/modules/$kernver/kernel"
>
> # mount tables
> - ln -s /proc/self/mounts "$workdir/root/etc/mtab"
> - >"$workdir/root/etc/fstab"
> + ln -s /proc/self/mounts "$buildroot/etc/mtab"
> + >"$buildroot/etc/fstab"
>
> # indicate that this is an initramfs
> - >"$workdir/root/etc/initrd-release"
> + >"$buildroot/etc/initrd-release"
>
> # add a blank ld.so.conf to keep ldconfig happy
> - >"$workdir/root/etc/ld.so.conf"
> + >"$buildroot/etc/ld.so.conf"
>
> printf '%s' "$workdir"
> }
> diff --git a/mkinitcpio b/mkinitcpio
> index 7ce6c5c..489e199 100755
> --- a/mkinitcpio
> +++ b/mkinitcpio
> @@ -19,7 +19,7 @@ _d_presets=mkinitcpio.d
>
> # options and runtime data
> _optmoduleroot= _optkver= _optgenimg=
> -_optcompress=
> +_optcompress= _opttargetdir=
> _optshowautomods=0 _optsavetree=0 _optshowmods=0
> _optquiet=1 _optcolor=1
> _optskiphooks=() _optaddhooks=() _hooks=() _optpreset=()
> @@ -53,6 +53,7 @@ usage: ${0##*/} [options]
> -r, --moduleroot <dir> Root directory for modules (default: /)
> -S, --skiphooks <hooks> Skip specified hooks, comma-separated, during build
> -s, --save Save build directory. (default: no)
> + -T, --targetdirectory <dir> Write generated image into <dir>
> -t, --builddir <dir> Use DIR as the temporary build directory
> -V, --version Display version information and exit
> -v, --verbose Verbose output (default: no)
> @@ -298,10 +299,10 @@ process_preset() (
> trap 'cleanup 130' INT
> trap 'cleanup 143' TERM
>
> -_opt_short='A:c:g:H:hk:nLMPp:r:S:st:Vvz:'
> +_opt_short='A:c:g:H:hk:nLMPp:r:S:sT:t:Vvz:'
> _opt_long=('add:' 'addhooks:' 'config:' 'generate:' 'hookhelp:' 'help'
> 'kernel:' 'listhooks' 'automods' 'moduleroot:' 'nocolor' 'allpresets'
> - 'preset:' 'skiphooks:' 'save' 'builddir:' 'version' 'verbose' 'compress:')
> + 'preset:' 'skiphooks:' 'save' 'targetdirectory:' 'builddir:' 'version' 'verbose' 'compress:')
>
> parseopts "$_opt_short" "${_opt_long[@]}" -- "$@" || exit 1
> set -- "${OPTRET[@]}"
> @@ -327,6 +328,10 @@ while :; do
> -s|--save)
> _optsavetree=1
> ;;
> + -T|--targetdirectory)
The name of the flag is a bit weird. One might consider that this is
similar to -g but with a different output format. Just a suggestion,
maybe use -d, --generatedir?
Related: we probably want to make -g and this option mutually exclusive.
> + shift
> + _opttargetdir=$1
> + ;;
> -g|--generate)
> shift
> [[ -d $1 ]] && die "Invalid image path -- must not be a directory"
> @@ -414,8 +419,12 @@ KERNELVERSION=$(resolve_kernver "$_optkver") || cleanup 1
> _d_kmoduledir=$_optmoduleroot/lib/modules/$KERNELVERSION
> [[ -d $_d_kmoduledir ]] || die "'$_d_kmoduledir' is not a valid kernel module directory"
>
> -_d_workdir=$(initialize_buildroot "$KERNELVERSION") || cleanup 1
> -BUILDROOT=$_d_workdir/root
> +_d_workdir=$(initialize_buildroot "$KERNELVERSION" $_opttargetdir) || cleanup 1
> +if [[ -z $_opttargetdir ]]; then
> + BUILDROOT=$_d_workdir/root
> +else
> + BUILDROOT=$_opttargetdir
> +fi
BUILDROOT=${_opttargetdir:-$_d_workdir/root}
>
> . "$_f_config" || die "Failed to read configuration \`%s'" "$_f_config"
>
> --
> 1.8.4.2
>
More information about the arch-projects
mailing list