[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