bbconfig: add COMPRESS_BBCONFIG option
authorDenys Vlasenko <vda.linux@googlemail.com>
Sun, 29 Aug 2010 12:36:11 +0000 (14:36 +0200)
committerDenys Vlasenko <vda.linux@googlemail.com>
Sun, 29 Aug 2010 12:36:11 +0000 (14:36 +0200)
function                                             old     new   delta
bbconfig_config_bz2                                    -    4905   +4905
bbconfig_main                                         13      70     +57
bbconfig_config                                    21811       -  -21811
------------------------------------------------------------------------------
(add/remove: 1/1 grow/shrink: 1/0 up/down: 4962/-21811)    Total: -16849 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Makefile
archival/libunarchive/Kbuild.src
miscutils/Config.src
miscutils/bbconfig.c
scripts/mkconfigs

index d13abc8..b7afaa9 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -842,7 +842,7 @@ export CPPFLAGS_busybox.lds += -P -C -U$(ARCH)
 
 #      Split autoconf.h into include/linux/config/*
 quiet_cmd_gen_bbconfigopts = GEN     include/bbconfigopts.h
-      cmd_gen_bbconfigopts = $(srctree)/scripts/mkconfigs > include/bbconfigopts.h
+      cmd_gen_bbconfigopts = $(srctree)/scripts/mkconfigs include/bbconfigopts.h include/bbconfigopts_bz2.h
 quiet_cmd_split_autoconf   = SPLIT   include/autoconf.h -> include/config/*
       cmd_split_autoconf   = scripts/basic/split-include include/autoconf.h include/config
 #bbox# piggybacked generation of few .h files
index c7ba447..e92b4aa 100644 (file)
@@ -54,6 +54,7 @@ lib-$(CONFIG_FEATURE_SEAMLESS_BZ2)      += open_transformer.o decompress_bunzip2
 lib-$(CONFIG_FEATURE_SEAMLESS_LZMA)     += open_transformer.o decompress_unlzma.o get_header_tar_lzma.o
 lib-$(CONFIG_FEATURE_SEAMLESS_XZ)       += open_transformer.o decompress_unxz.o
 lib-$(CONFIG_FEATURE_COMPRESS_USAGE)    += decompress_bunzip2.o
+lib-$(CONFIG_FEATURE_COMPRESS_BBCONFIG) += decompress_bunzip2.o
 lib-$(CONFIG_FEATURE_TAR_TO_COMMAND)    += data_extract_to_command.o
 
 ifneq ($(lib-y),)
index cadaabb..151f61b 100644 (file)
@@ -22,6 +22,20 @@ config BBCONFIG
          The bbconfig applet will print the config file with which
          busybox was built.
 
+config FEATURE_COMPRESS_BBCONFIG
+       bool "Compress bbconfig data"
+       default y
+       depends on BBCONFIG
+       help
+         Store bbconfig data in compressed form, uncompress them on-the-fly
+         before output.
+
+         If you have a really tiny busybox with few applets enabled (and
+         bunzip2 isn't one of them), the overhead of the decompressor might
+         be noticeable. Also, if you run executables directly from ROM
+         and have very little memory, this might not be a win. Otherwise,
+         you probably want this.
+
 config BEEP
        bool "beep"
        default y
index 0d649b4..2860771 100644 (file)
@@ -3,10 +3,32 @@
  */
 #include "libbb.h"
 #include "bbconfigopts.h"
+#if ENABLE_FEATURE_COMPRESS_BBCONFIG
+# include "unarchive.h"
+# include "bbconfigopts_bz2.h"
+#endif
 
 int bbconfig_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
 int bbconfig_main(int argc UNUSED_PARAM, char **argv UNUSED_PARAM)
 {
+#if ENABLE_FEATURE_COMPRESS_BBCONFIG
+       bunzip_data *bd;
+       int i = start_bunzip(&bd,
+                       /* src_fd: */ -1,
+                       /* inbuf:  */ (void *)bbconfig_config_bz2,
+                       /* len:    */ sizeof(bbconfig_config_bz2));
+       /* read_bunzip can longjmp to start_bunzip, and ultimately
+        * end up here with i != 0 on read data errors! Not trivial */
+       if (!i) {
+               /* Cannot use xmalloc: will leak bd in NOFORK case! */
+               char *outbuf = malloc_or_warn(sizeof(bbconfig_config));
+               if (outbuf) {
+                       read_bunzip(bd, outbuf, sizeof(bbconfig_config));
+                       full_write1_str(outbuf);
+               }
+       }
+#else
        full_write1_str(bbconfig_config);
+#endif
        return 0;
 }
index 65dd441..38d7ac0 100755 (executable)
 #      - Retain lines that begin with "# CONFIG_"
 #      - lines that use double-quotes must \\-escape-quote them
 
-config="$1"
-if [ $# -lt 1 ]
-then
-       config=.config
-fi
+config=.config
 
+{
 echo "\
 #ifndef _BBCONFIGOPTS_H
 #define _BBCONFIGOPTS_H
@@ -43,9 +40,36 @@ echo "\
  * This file is generated automatically by scripts/mkconfigs.
  * Do not edit.
  */
-static const char bbconfig_config[] ="
+static const char bbconfig_config[] ALIGN1 ="
 
-sed 's/\"/\\\"/g' $config | grep "^#\? \?CONFIG_" | awk '{print "\"" $0 "\\n\"";}'
+grep '^#\? \?CONFIG_' "$config" \
+| sed -e 's/\"/\\\"/g' -e 's/^/"/' -e 's/$/\\n"/'
 
 echo ";"
-echo "#endif /* _BBCONFIGOPTS_H */"
+echo "#endif"
+} >"$1"
+
+{
+echo "\
+#ifndef _BBCONFIGOPTS_BZ2_H
+#define _BBCONFIGOPTS_BZ2_H
+/*
+ * busybox configuration settings.
+ *
+ * Licensed under GPLv2 or later, see file LICENSE in this source tree.
+ *
+ * This file is generated automatically by scripts/mkconfigs.
+ * Do not edit.
+ */
+static const char bbconfig_config_bz2[] ALIGN1 = {"
+
+grep '^#\? \?CONFIG_' "$config" \
+| bzip2 -1 | tee z.bz2 | dd bs=2 skip=1 2>/dev/null | od -v -t x1 \
+| sed -e 's/^[^ ]*//' \
+        -e 's/ //g' \
+        -e '/^$/d' \
+        -e 's/\(..\)/0x\1,/g'
+
+echo "};"
+echo "#endif"
+} >"$2"