From: Rob Landley <rob@landley.net>
To: Horst von Brand <vonbrand@inf.utfsm.cl>, linux-kernel@vger.kernel.org
Subject: Re: [PATCH] Miniconfig revisited (2/3)
Date: Sun, 9 Jul 2006 12:45:43 -0400 [thread overview]
Message-ID: <200607091245.43880.rob@landley.net> (raw)
In-Reply-To: <200607081621.k68GL5Oc015536@laptop11.inf.utfsm.cl>
[-- Attachment #1: Type: text/plain, Size: 1540 bytes --]
On Saturday 08 July 2006 12:21 pm, Horst von Brand wrote:
> > +LENGTH=$(cat .config | wc -l)
>
> Why the cat(1)? "wc -l < .config" is the same
I believe it was originally a longer pipeline, and I can't wc the file
directly or it'll spit out the filename, but < is indeed one less process
spawned per loop.
> > +# Loop through all lines in the file
> > +I=1
> > +while true
> > +do
> > + if [ $I -gt $LENGTH ]
> > + then
> > + break
> > + fi
>
> Could do it with:
>
> for I in $(seq 1 $LENGTH); do
> ...
> done
Makes a 1/10th of a second difference to the final runtime, but if you prefer
that...
> or just plain read the lines
>
> > +
> > + echo -n -e "\r"$I/$LENGTH lines $(cat "$OUTPUT" | wc -c) bytes
>
> Again, unnecessary cat(1).
Yup, a valid cleanup.
The thing is, the script's going to be dog slow no matter what I do, and most
of the slowness isn't in the script, it's the config infrastructure
re-parsing the config file 1500 times or so for defconfig. (The script's
about 3% of the runtime overhead, and the two largest chunks of that are
printing out the progress indicator and the sed invocation right above the
make.) So I didn't put that much effort into optimizing it.
Someday I'd like to go in and make kconfig spit out a miniconfig directly, but
kconfig's not really set up to do that, and touching Roman Zippel's code
would give him the opportunity to say no again.
Anyway, here's a version with your fixes. Thanks for the review,
Rob
--
Never bet against the cheap plastic solution.
[-- Attachment #2: shrinkconfig2.patch --]
[-- Type: text/x-diff, Size: 2038 bytes --]
--- linux-2.6.17.1/scripts/shrinkconfig 2006-07-09 12:40:38.000000000 -0400
+++ linux-2.6.17.new/scripts/shrinkconfig 2006-07-09 12:12:32.000000000 -0400
@@ -0,0 +1,79 @@
+#!/bin/bash
+
+# shrinkconfig copyright 2006 by Rob Landley <rob@landley.net>
+# Licensed under the GNU General Public License version 2.
+
+if [ $# -ne 1 ]
+then
+ echo "Turns current .config into a miniconfig file."
+ echo "Usage: shrinkconfig mini.config"
+ exit 1
+fi
+
+if [ ! -f .config ]
+then
+ echo "Need a .config file to shrink."
+ exit 1
+fi
+LENGTH=$(wc -l < .config)
+
+OUTPUT="$1"
+cp .config "$OUTPUT"
+if [ $? -ne 0 ]
+then
+ echo "Couldn't create $OUTPUT"
+ exit 1
+fi
+
+# If we get interrupted, clean up the mess
+
+KERNELOUTPUT=""
+
+function cleanup
+{
+ echo
+ echo "Interrupted."
+ [ ! -z "$KERNELOUTPUT" ] && rm -rf "$KERNELOUTPUT"
+ rm "$OUTPUT"
+ exit 1
+}
+
+trap cleanup HUP INT QUIT TERM
+
+# Since the "O=" argument to make doesn't work recursively, we need to jump
+# through a few hoops to avoid overwriting the .config that we're shrinking.
+
+# If we're building out of tree, we'll have absolute paths to source and build
+# directories in the Makefile.
+
+KERNELSRC=$(sed -n -e 's/KERNELSRC[^/]*:=[^/]*//p' Makefile)
+[ -z "$KERNELSRC" ] && KERNELSRC=$(pwd)
+KERNELOUTPUT=`pwd`/.config.minitemp
+
+mkdir -p "$KERNELOUTPUT" || exit 1
+
+echo "Shrinking .config to $OUTPUT..."
+
+for I in $(seq 1 $LENGTH)
+do
+ echo -n -e "\r"$I/$LENGTH lines $(wc -c < "$OUTPUT") bytes
+
+ sed -n "${I}!p" "$OUTPUT" > "$KERNELOUTPUT"/.config.test
+ # Do a config with this file
+ make -C "$KERNELSRC" O="$KERNELOUTPUT" allnoconfig KCONFIG_ALLCONFIG="$KERNELOUTPUT"/.config.test > /dev/null
+
+ # Compare. The date changes, so expect a small difference each time.
+ D=$(diff "$KERNELOUTPUT"/.config .config | wc -l)
+ if [ $D -eq 4 ]
+ then
+ mv "$KERNELOUTPUT"/.config.test "$OUTPUT"
+ LENGTH=$[$LENGTH-1]
+ else
+ I=$[$I + 1]
+ fi
+done
+
+rm -rf "$KERNELOUTPUT"
+
+# One extra echo to preserve status line.
+echo
next parent reply other threads:[~2006-07-09 16:45 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <200607081621.k68GL5Oc015536@laptop11.inf.utfsm.cl>
2006-07-09 16:45 ` Rob Landley [this message]
2006-07-10 3:17 ` [PATCH] Miniconfig revisited (2/3) Horst von Brand
2006-07-06 21:53 [PATCH] Miniconfig revisited (0/3) Rob Landley
2006-07-07 1:44 ` [PATCH] Miniconfig revisited (2/3) Rob Landley
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=200607091245.43880.rob@landley.net \
--to=rob@landley.net \
--cc=linux-kernel@vger.kernel.org \
--cc=vonbrand@inf.utfsm.cl \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.