a5bd9f6
From 9bdcd657c5b748ff8c0b4057be80add39d2addae Mon Sep 17 00:00:00 2001
a5bd9f6
From: Vladimir 'phcoder' Serbinenko <phcoder@gmail.com>
a5bd9f6
Date: Sun, 14 Apr 2013 19:24:05 +0200
a5bd9f6
Subject: [PATCH 310/364] 	Add option to compress files on install/image
a5bd9f6
 creation.
a5bd9f6
a5bd9f6
---
a5bd9f6
 ChangeLog                 |  4 ++++
a5bd9f6
 util/grub-install.in      |  8 +++----
a5bd9f6
 util/grub-install_header  | 61 ++++++++++++++++++++++++++++++++++++++++-------
a5bd9f6
 util/grub-mkimage.c       |  2 +-
a5bd9f6
 util/grub-mknetdir.in     |  2 +-
a5bd9f6
 util/grub-mkrescue.in     |  6 ++---
a5bd9f6
 util/grub-mkstandalone.in |  4 ++--
a5bd9f6
 7 files changed, 67 insertions(+), 20 deletions(-)
a5bd9f6
a5bd9f6
diff --git a/ChangeLog b/ChangeLog
a5bd9f6
index c01ae94..8cbf241 100644
a5bd9f6
--- a/ChangeLog
a5bd9f6
+++ b/ChangeLog
a5bd9f6
@@ -1,3 +1,7 @@
a5bd9f6
+2013-04-14  Szymon Janc <szymon@janc.net.pl>
a5bd9f6
+
a5bd9f6
+	Add option to compress files on install/image creation.
a5bd9f6
+
a5bd9f6
 2013-04-14  Vladimir Serbinenko  <phcoder@gmail.com>
a5bd9f6
 
a5bd9f6
 	* docs/grub-dev.texi: Rearrange menu to match the section order.
a5bd9f6
diff --git a/util/grub-install.in b/util/grub-install.in
a5bd9f6
index 016b161..32a3be3 100644
a5bd9f6
--- a/util/grub-install.in
a5bd9f6
+++ b/util/grub-install.in
a5bd9f6
@@ -684,9 +684,9 @@ case "${grub_modinfo_target_cpu}-${grub_modinfo_platform}" in
a5bd9f6
 esac
a5bd9f6
 
a5bd9f6
 if [ x"$config_opt_file" = x ]; then
a5bd9f6
-    "$grub_mkimage" -d "${source_dir}" -O "${mkimage_target}" --output="${grubdir}/${grub_modinfo_target_cpu}-$grub_modinfo_platform/core.${imgext}" --prefix="${prefix_drive}${relative_grubdir}" $modules || exit 1
a5bd9f6
+    "$grub_mkimage" -d "${source_dir}" -O "${mkimage_target}" --output="${grubdir}/${grub_modinfo_target_cpu}-$grub_modinfo_platform/core.${imgext}" --prefix="${prefix_drive}${relative_grubdir}" $grub_decompression_module $modules || exit 1
a5bd9f6
 else
a5bd9f6
-    "$grub_mkimage" -c "${config_opt_file}" -d "${source_dir}" -O "${mkimage_target}" --output="${grubdir}/${grub_modinfo_target_cpu}-$grub_modinfo_platform/core.${imgext}" --prefix="${prefix_drive}${relative_grubdir}" $modules || exit 1
a5bd9f6
+    "$grub_mkimage" -c "${config_opt_file}" -d "${source_dir}" -O "${mkimage_target}" --output="${grubdir}/${grub_modinfo_target_cpu}-$grub_modinfo_platform/core.${imgext}" --prefix="${prefix_drive}${relative_grubdir}" $grub_decompression_module $modules || exit 1
a5bd9f6
 fi
a5bd9f6
 
a5bd9f6
 # Backward-compatibility kludges
a5bd9f6
@@ -697,9 +697,9 @@ elif [ "${grub_modinfo_target_cpu}-${grub_modinfo_platform}" = "i386-ieee1275" ]
a5bd9f6
 elif [ "${grub_modinfo_target_cpu}-${grub_modinfo_platform}" = "i386-efi" ] || [ "${grub_modinfo_target_cpu}-${grub_modinfo_platform}" = "x86_64-efi" ]; then
a5bd9f6
 
a5bd9f6
     if [ x"$config_opt_file" = x ]; then
a5bd9f6
-	"$grub_mkimage" -d "${source_dir}" -O "${mkimage_target}" --output="${grubdir}/${grub_modinfo_target_cpu}-$grub_modinfo_platform/grub.efi" --prefix="" $modules || exit 1
a5bd9f6
+	"$grub_mkimage" -d "${source_dir}" -O "${mkimage_target}" --output="${grubdir}/${grub_modinfo_target_cpu}-$grub_modinfo_platform/grub.efi" --prefix="" $grub_decompression_module $modules || exit 1
a5bd9f6
     else
a5bd9f6
-	"$grub_mkimage" -c "${config_opt_file}" -d "${source_dir}" -O "${mkimage_target}" --output="${grubdir}/${grub_modinfo_target_cpu}-$grub_modinfo_platform/grub.efi" --prefix="" $modules || exit 1
a5bd9f6
+	"$grub_mkimage" -c "${config_opt_file}" -d "${source_dir}" -O "${mkimage_target}" --output="${grubdir}/${grub_modinfo_target_cpu}-$grub_modinfo_platform/grub.efi" --prefix="" $grub_decompression_module $modules || exit 1
a5bd9f6
     fi
a5bd9f6
 fi
a5bd9f6
 
a5bd9f6
diff --git a/util/grub-install_header b/util/grub-install_header
a5bd9f6
index 69aac46..805fc4f 100644
a5bd9f6
--- a/util/grub-install_header
a5bd9f6
+++ b/util/grub-install_header
a5bd9f6
@@ -19,6 +19,14 @@ set -e
a5bd9f6
 pkglib_DATA="moddep.lst command.lst fs.lst partmap.lst parttool.lst \
a5bd9f6
 handler.lst video.lst crypto.lst terminal.lst"
a5bd9f6
 
a5bd9f6
+grub_compress_file () {
a5bd9f6
+    if [ "$compressor" != "" ] ; then
a5bd9f6
+        "$compressor" $compressor_opts "$1" > "$2"
a5bd9f6
+    else
a5bd9f6
+        cp -f "$1" "$2"
a5bd9f6
+    fi
a5bd9f6
+}
a5bd9f6
+
a5bd9f6
 grub_install_files () {
a5bd9f6
     grub_install_files_source_directory="$1"
a5bd9f6
     grub_install_files_target_directory="$2"
a5bd9f6
@@ -42,7 +50,7 @@ grub_install_files () {
a5bd9f6
 
a5bd9f6
     if [ x"$install_modules" = xall ]; then
a5bd9f6
 	for file in "${grub_install_files_source_directory}/"*.mod; do
a5bd9f6
-	    cp -f "$file" "${grub_install_files_target_directory}"/"${grub_install_files_platform}"
a5bd9f6
+	    grub_compress_file "$file" "${grub_install_files_target_directory}"/"${grub_install_files_platform}/$(basename "$file")"
a5bd9f6
 	done
a5bd9f6
     else
a5bd9f6
 	modules1=
a5bd9f6
@@ -56,13 +64,13 @@ grub_install_files () {
a5bd9f6
 	    modules2="$modules3"
a5bd9f6
 	done
a5bd9f6
 	for file in $(echo "$modules1" | sed 's, ,\n,g' |sort -u); do
a5bd9f6
-	    cp -f "${grub_install_files_source_directory}/$file.mod" "${grub_install_files_target_directory}"/"${grub_install_files_platform}"
a5bd9f6
+	    grub_compress_file "${grub_install_files_source_directory}/$file.mod" "${grub_install_files_target_directory}"/"${grub_install_files_platform}/$file.mod"
a5bd9f6
 	done
a5bd9f6
     fi
a5bd9f6
     
a5bd9f6
     for file in ${pkglib_DATA} efiemu32.o efiemu64.o; do
a5bd9f6
 	if test -f "${grub_install_files_source_directory}/${file}"; then
a5bd9f6
-            cp -f "${grub_install_files_source_directory}/${file}" "${grub_install_files_target_directory}"/"${grub_install_files_platform}"
a5bd9f6
+            grub_compress_file "${grub_install_files_source_directory}/${file}" "${grub_install_files_target_directory}"/"${grub_install_files_platform}/${file}"
a5bd9f6
 	fi
a5bd9f6
     done
a5bd9f6
     
a5bd9f6
@@ -78,34 +86,36 @@ grub_install_files () {
a5bd9f6
     if [ x"$install_locales" = xall ]; then
a5bd9f6
 	for file in "${grub_install_files_source_directory}"/po/*.mo; do
a5bd9f6
 	    if test -f "$file"; then
a5bd9f6
-		cp -f "$file" "${grub_install_files_target_directory}"/locale/
a5bd9f6
+		grub_compress_file "$file" "${grub_install_files_target_directory}"/locale/"$(basename "$file")"
a5bd9f6
 	    fi
a5bd9f6
 	done
a5bd9f6
 	for dir in "${localedir}"/*; do
a5bd9f6
 	    if test -f "$dir/LC_MESSAGES/@PACKAGE@.mo" && ! test -f "${grub_install_files_target_directory}"/locale/"${dir##*/}.mo"; then
a5bd9f6
-		cp -f "$dir/LC_MESSAGES/@PACKAGE@.mo" "${grub_install_files_target_directory}"/locale/"${dir##*/}.mo"
a5bd9f6
+		grub_compress_file "$dir/LC_MESSAGES/@PACKAGE@.mo" "${grub_install_files_target_directory}"/locale/"${dir##*/}.mo"
a5bd9f6
 	    fi
a5bd9f6
 	done
a5bd9f6
     else
a5bd9f6
 	for locale in $install_locales; do
a5bd9f6
 	    if test -f "${grub_install_files_source_directory}"/po/$locale.mo; then
a5bd9f6
-		cp -f " "${grub_install_files_source_directory}"/po/$locale.mo" "${grub_install_files_target_directory}"/locale/$locale.mo
a5bd9f6
+		grub_compress_file "${grub_install_files_source_directory}"/po/locale.mo "${grub_install_files_target_directory}"/locale/$locale.mo
a5bd9f6
 	    elif test -f "${localedir}/$locale/LC_MESSAGES/@PACKAGE@.mo"; then
a5bd9f6
-		cp -f "${localedir}/$locale/LC_MESSAGES/@PACKAGE@.mo" "${grub_install_files_target_directory}"/locale/$locale.mo
a5bd9f6
+		grub_compress_file "${localedir}/$locale/LC_MESSAGES/@PACKAGE@.mo" "${grub_install_files_target_directory}"/locale/$locale.mo
a5bd9f6
 	    fi
a5bd9f6
 	done
a5bd9f6
     fi
a5bd9f6
     for theme in ${install_themes} ; do
a5bd9f6
 	if test -f "${pkgdatadir}"/themes/"${theme}"/theme.txt; then
a5bd9f6
 	    mkdir -p "${grub_install_files_target_directory}"/themes/"${theme}"
a5bd9f6
-	    cp "${pkgdatadir}"/themes/"${theme}"/* "${grub_install_files_target_directory}"/themes/"${theme}"
a5bd9f6
+	    for file in "${pkgdatadir}"/themes/"${theme}"/*; do
a5bd9f6
+		grub_compress_file "$file" "${grub_install_files_target_directory}"/themes/"${theme}"/"$(basename "$file")"
a5bd9f6
+	    done
a5bd9f6
 	fi
a5bd9f6
     done
a5bd9f6
 
a5bd9f6
     for font in ${install_fonts} ; do
a5bd9f6
 	if test -f "${pkgdatadir}"/"$font".pf2; then
a5bd9f6
 	    mkdir -p "${grub_install_files_target_directory}"/fonts
a5bd9f6
-	    cp "${pkgdatadir}"/"$font".pf2 "${grub_install_files_target_directory}"/fonts
a5bd9f6
+	    grub_compress_file "${pkgdatadir}"/"$font".pf2 "${grub_install_files_target_directory}"/fonts/"$font".pf2
a5bd9f6
 	fi
a5bd9f6
     done
a5bd9f6
 }
a5bd9f6
@@ -115,12 +125,17 @@ grub_print_install_files_help () {
a5bd9f6
     print_option_help "--themes=THEMES" "$(gettext_printf "install THEMES [default=%s]" "starfield")"
a5bd9f6
     print_option_help "--fonts=FONTS" "$(gettext_printf "install FONTS [default=%s]" "unicode")"
a5bd9f6
     print_option_help "--locales=LOCALES" "$(gettext_printf "install only LOCALES [default=all]")"
a5bd9f6
+    print_option_help "--compress[=no,xz,gz,lzo]" "$(gettext "compress GRUB files [optional]")"
a5bd9f6
 }
a5bd9f6
 
a5bd9f6
 install_modules=all
a5bd9f6
 install_themes=starfield
a5bd9f6
 install_fonts=unicode
a5bd9f6
 install_locales=all
a5bd9f6
+compress=no
a5bd9f6
+grub_decompression_module=""
a5bd9f6
+compressor=""
a5bd9f6
+compressor_opts=""
a5bd9f6
 
a5bd9f6
 argument () {
a5bd9f6
   opt=$1
a5bd9f6
@@ -133,6 +148,29 @@ argument () {
a5bd9f6
   echo $1
a5bd9f6
 }
a5bd9f6
 
a5bd9f6
+grub_parse_compress () {
a5bd9f6
+    compress="$1"
a5bd9f6
+    case x"$compress" in
a5bd9f6
+	xno) ;;
a5bd9f6
+	xgz)
a5bd9f6
+	    compressor=`which gzip || true`
a5bd9f6
+	    grub_decompression_module="gzio"
a5bd9f6
+	    compressor_opts="--best --stdout";;
a5bd9f6
+	xxz)
a5bd9f6
+	    compressor=`which xz || true`
a5bd9f6
+	    grub_decompression_module="xzio gcry_crc"
a5bd9f6
+	    compressor_opts="--lzma2=dict=128KiB --check=none --stdout";;
a5bd9f6
+	xlzo)
a5bd9f6
+	    compressor=`which lzop || true`
a5bd9f6
+	    grub_decompression_module="lzopio adler32 gcry_crc"
a5bd9f6
+	    compressor_opts="-9 -c";;
a5bd9f6
+	*)
a5bd9f6
+	    gettext_printf "Unrecognized compression \`%s'\n" "$compress" 1>&2
a5bd9f6
+	    usage
a5bd9f6
+	    exit 1
a5bd9f6
+    esac
a5bd9f6
+}
a5bd9f6
+
a5bd9f6
 grub_process_install_options () {
a5bd9f6
     option=$1
a5bd9f6
     shift
a5bd9f6
@@ -156,6 +194,11 @@ grub_process_install_options () {
a5bd9f6
 	    install_locales=`argument $option "$@"`; grub_process_install_options_consumed=2; return ;;
a5bd9f6
 	--locales=*)
a5bd9f6
             install_locales=`echo "$option" | sed 's/--locales=//'`; grub_process_install_options_consumed=1; return ;;
a5bd9f6
+	--compress)
a5bd9f6
+	    grub_parse_compress `argument $option "$@"`; grub_process_install_options_consumed=2; return ;;
a5bd9f6
+        --compress=*)
a5bd9f6
+            grub_parse_compress `echo "${option}" | sed 's/--compress=//'`; grub_process_install_options_consumed=1; return ;;
a5bd9f6
     esac
a5bd9f6
 }
a5bd9f6
 
a5bd9f6
+export grub_decompression_module
a5bd9f6
diff --git a/util/grub-mkimage.c b/util/grub-mkimage.c
a5bd9f6
index 96279a4..0acc61e 100644
a5bd9f6
--- a/util/grub-mkimage.c
a5bd9f6
+++ b/util/grub-mkimage.c
a5bd9f6
@@ -1740,7 +1740,7 @@ static struct argp_option options[] = {
a5bd9f6
   {"note",   'n', 0, 0, N_("add NOTE segment for CHRP IEEE1275"), 0},
a5bd9f6
   {"output",  'o', N_("FILE"), 0, N_("output a generated image to FILE [default=stdout]"), 0},
a5bd9f6
   {"format",  'O', N_("FORMAT"), 0, 0, 0},
a5bd9f6
-  {"compression",  'C', "(xz|none|auto)", 0, N_("choose the compression to use"), 0},
a5bd9f6
+  {"compression",  'C', "(xz|none|auto)", 0, N_("choose the compression to use for core image"), 0},
a5bd9f6
   {"verbose",     'v', 0,      0, N_("print verbose messages."), 0},
a5bd9f6
   { 0, 0, 0, 0, 0, 0 }
a5bd9f6
 };
a5bd9f6
diff --git a/util/grub-mknetdir.in b/util/grub-mknetdir.in
a5bd9f6
index 6df761a..d32de46 100644
a5bd9f6
--- a/util/grub-mknetdir.in
a5bd9f6
+++ b/util/grub-mknetdir.in
a5bd9f6
@@ -191,7 +191,7 @@ process_input_dir ()
a5bd9f6
 source ${subdir}/grub.cfg
a5bd9f6
 EOF
a5bd9f6
 
a5bd9f6
-    "$grub_mkimage" ${config_opt} -d "${input_dir}" -O ${mkimage_target} "--output=${grubdir}/core.$ext" "--prefix=$prefix" $modules $netmodules tftp || exit 1
a5bd9f6
+    "$grub_mkimage" ${config_opt} -d "${input_dir}" -O ${mkimage_target} "--output=${grubdir}/core.$ext" "--prefix=$prefix" $modules $grub_decompression_module $netmodules tftp || exit 1
a5bd9f6
     # TRANSLATORS: First %s is replaced by platform name. Second one by filename.
a5bd9f6
     gettext_printf "Netboot directory for %s created. Configure your DHCP server to point to %s\n" "${platform}" "${subdir}/${platform}/core.$ext"
a5bd9f6
 }
a5bd9f6
diff --git a/util/grub-mkrescue.in b/util/grub-mkrescue.in
a5bd9f6
index b97d674..7270d7f 100644
a5bd9f6
--- a/util/grub-mkrescue.in
a5bd9f6
+++ b/util/grub-mkrescue.in
a5bd9f6
@@ -248,7 +248,7 @@ EOF
a5bd9f6
     done ; ) > "${load_cfg}"
a5bd9f6
 
a5bd9f6
     "$grub_mkimage" -O ${platform} -d "${source_directory}" -c "${load_cfg}" -o "$3" \
a5bd9f6
-        search iso9660 $4
a5bd9f6
+        $grub_decompression_module search iso9660 $4
a5bd9f6
     rm -rf "${load_cfg}"
a5bd9f6
 }
a5bd9f6
 
a5bd9f6
@@ -263,7 +263,7 @@ make_image_fwdisk ()
a5bd9f6
     gettext_printf "Enabling %s support ...\n" "$2"
a5bd9f6
 
a5bd9f6
     "$grub_mkimage" -O ${platform} -d "${source_directory}" -p '()/boot/grub' -o "$3" \
a5bd9f6
-        iso9660 $4
a5bd9f6
+        $grub_decompression_module iso9660 $4
a5bd9f6
 }
a5bd9f6
 
a5bd9f6
 if [ "${override_dir}" = "" ] ; then
a5bd9f6
@@ -362,7 +362,7 @@ if test -e "${pc_dir}" ; then
a5bd9f6
     done ;) > "${load_cfg}"
a5bd9f6
 
a5bd9f6
     "$grub_mkimage" -O i386-pc -d "${pc_dir}/" -o "${core_img}" -c "$load_cfg" --prefix=/boot/grub \
a5bd9f6
-        iso9660 biosdisk
a5bd9f6
+        $grub_decompression_module iso9660 biosdisk
a5bd9f6
     cat "${pc_dir}/cdboot.img" "${core_img}" > "${iso9660_dir}/boot/grub/i386-pc/eltorito.img"
a5bd9f6
 
a5bd9f6
     grub_mkisofs_arguments="${grub_mkisofs_arguments} -b boot/grub/i386-pc/eltorito.img -no-emul-boot -boot-load-size 4 -boot-info-table"
a5bd9f6
diff --git a/util/grub-mkstandalone.in b/util/grub-mkstandalone.in
a5bd9f6
index a5434c4..927075b 100644
a5bd9f6
--- a/util/grub-mkstandalone.in
a5bd9f6
+++ b/util/grub-mkstandalone.in
a5bd9f6
@@ -60,7 +60,7 @@ usage () {
a5bd9f6
     print_option_help "-O, --format=$(gettext "FORMAT")" "$(gettext "generate an image in FORMAT")"; echo
a5bd9f6
     print_option_help "" "$(gettext "available formats:") $formats"
a5bd9f6
     echo
a5bd9f6
-    print_option_help "-C, --compression=(xz|none|auto)" "$(gettext "choose the compression to use")"
a5bd9f6
+    print_option_help "-C, --compression=(xz|none|auto)" "$(gettext "choose the compression to use for core image")"
a5bd9f6
     print_option_help "--modules=$(gettext "MODULES")" "$(gettext "pre-load specified modules MODULES")"
a5bd9f6
     grub_print_install_files_help
a5bd9f6
     print_option_help  "--grub-mkimage=$(gettext "FILE")" "$(gettext "use FILE as grub-mkimage")"
a5bd9f6
@@ -170,7 +170,7 @@ memdisk_img=`mktemp "${TMPDIR:-/tmp}/tmp.XXXXXXXXXX"` || exit 1
a5bd9f6
 
a5bd9f6
 (cd "${memdisk_dir}"; tar -cf - * $source) > "${memdisk_img}"
a5bd9f6
 rm -rf "${memdisk_dir}"
a5bd9f6
-"$grub_mkimage" -O "${format}" -C "$compression" -d "${source_directory}" -m "${memdisk_img}" -o "$output_image" --prefix='(memdisk)/boot/grub' memdisk tar $modules
a5bd9f6
+"$grub_mkimage" -O "${format}" -C "$compression" -d "${source_directory}" -m "${memdisk_img}" -o "$output_image" --prefix='(memdisk)/boot/grub' memdisk tar $grub_decompression_module $modules
a5bd9f6
 rm -rf "${memdisk_img}"
a5bd9f6
 
a5bd9f6
 exit 0
a5bd9f6
-- 
a5bd9f6
1.8.1.4
a5bd9f6