2005-01-16 15:22:33

by Michael S. Tsirkin

[permalink] [raw]
Subject: changing local version requires full rebuild

Hi!
Is it just me, or does changing the local version always require
a full kernel rebuild?

If so, I'd like to fix it, since I like copying
my kernel source with --preserve and changing the
local version, then going back to the old version in case of
a crash.
Its important to change the local version to force
make install and make modules_install to put things in a separate
directory.

Any ideas on why is that and whether its possible to fix it?

mst


2005-01-16 16:16:25

by Sam Ravnborg

[permalink] [raw]
Subject: Re: changing local version requires full rebuild

On Sun, Jan 16, 2005 at 05:22:42PM +0200, Michael S. Tsirkin wrote:
> Hi!
> Is it just me, or does changing the local version always require
> a full kernel rebuild?
>
> If so, I'd like to fix it, since I like copying
> my kernel source with --preserve and changing the
> local version, then going back to the old version in case of
> a crash.
> Its important to change the local version to force
> make install and make modules_install to put things in a separate
> directory.

Just tried it out here.
After cp -Ra only a limited part of the kernel rebuilds.
o oiu.c in ieee directory - because it dependson the shell script
o A number of drivers that include version.h
- This should be changed so local version does not affect
the reast of version.h.
o Other stuff that is always build if kernel has changed

Do you use "echo -mylocalver > localversion" to change the local version?

Sam

2005-01-16 16:28:50

by Michael S. Tsirkin

[permalink] [raw]
Subject: Re: changing local version requires full rebuild

Hello!
Quoting r. Sam Ravnborg ([email protected]) "Re: changing local version requires full rebuild":
> On Sun, Jan 16, 2005 at 05:22:42PM +0200, Michael S. Tsirkin wrote:
> > Hi!
> > Is it just me, or does changing the local version always require
> > a full kernel rebuild?
> >
> > If so, I'd like to fix it, since I like copying
> > my kernel source with --preserve and changing the
> > local version, then going back to the old version in case of
> > a crash.
> > Its important to change the local version to force
> > make install and make modules_install to put things in a separate
> > directory.
>
> Just tried it out here.
> After cp -Ra only a limited part of the kernel rebuilds.
> o oiu.c in ieee directory - because it dependson the shell script
> o A number of drivers that include version.h
> - This should be changed so local version does not affect
> the reast of version.h.
> o Other stuff that is always build if kernel has changed
>
> Do you use "echo -mylocalver > localversion" to change the local version?
>
> Sam

No, I do makemenuconfig to edit the version. Is that right?

mst

2005-01-16 17:23:58

by Michael S. Tsirkin

[permalink] [raw]
Subject: Re: changing local version requires full rebuild

Hello!
Quoting r. Sam Ravnborg ([email protected]) "Re: changing local version requires full rebuild":
> On Sun, Jan 16, 2005 at 05:22:42PM +0200, Michael S. Tsirkin wrote:
> > Hi!
> > Is it just me, or does changing the local version always require
> > a full kernel rebuild?
> >
> > If so, I'd like to fix it, since I like copying
> > my kernel source with --preserve and changing the
> > local version, then going back to the old version in case of
> > a crash.
> > Its important to change the local version to force
> > make install and make modules_install to put things in a separate
> > directory.
>
> Just tried it out here.
> After cp -Ra only a limited part of the kernel rebuilds.
> o oiu.c in ieee directory - because it dependson the shell script
> o A number of drivers that include version.h
> - This should be changed so local version does not affect
> the reast of version.h.
> o Other stuff that is always build if kernel has changed
>
> Do you use "echo -mylocalver > localversion" to change the local version?
>
> Sam

Just tried this with the same effect.

Could it be your version was already -mylocalver?

Please note that you have to actually *change* the local
version, otherwise almost nothing is recompiled.
Just a touch does nothing.

Actually, the directory kernel/ is not recompiled (so the subject is a
bit misleading) , but a huge number of files in drivers, filesystems, sound,
lib and net directory - are.

MST

2005-01-16 17:26:36

by Sam Ravnborg

[permalink] [raw]
Subject: Re: changing local version requires full rebuild

>
> > Do you use "echo -mylocalver > localversion" to change the local version?
> >
> > Sam
>
> No, I do makemenuconfig to edit the version. Is that right?

That is fine too.
When building - do you use separate output dir?

Sam

2005-01-16 17:55:32

by Michael S. Tsirkin

[permalink] [raw]
Subject: Re: changing local version requires full rebuild

Hello!
Quoting r. Sam Ravnborg ([email protected]) "Re: changing local version requires full rebuild":
> >
> > > Do you use "echo -mylocalver > localversion" to change the local version?
> > >
> > > Sam
> >
> > No, I do makemenuconfig to edit the version. Is that right?
>
> That is fine too.
> When building - do you use separate output dir?
>
> Sam

nope, just make

2005-01-16 18:10:52

by Michael S. Tsirkin

[permalink] [raw]
Subject: Re: changing local version requires full rebuild

Hello!
Quoting r. Sam Ravnborg ([email protected]) "Re: changing local version requires full rebuild":
> On Sun, Jan 16, 2005 at 05:22:42PM +0200, Michael S. Tsirkin wrote:
> > Hi!
> > Is it just me, or does changing the local version always require
> > a full kernel rebuild?
> >
> > If so, I'd like to fix it, since I like copying
> > my kernel source with --preserve and changing the
> > local version, then going back to the old version in case of
> > a crash.
> > Its important to change the local version to force
> > make install and make modules_install to put things in a separate
> > directory.
>
> Just tried it out here.
> After cp -Ra only a limited part of the kernel rebuilds.
> o oiu.c in ieee directory - because it dependson the shell script
> o A number of drivers that include version.h
> - This should be changed so local version does not affect
> the reast of version.h.


We now have:
swlab155:/usr/src/linux-2.6.10-gold # grep version.h -rI . | wc -l
2143
swlab155:/usr/src/linux-2.6.10-gold # grep UTS_RELEASE -rIi .| wc -l
47

So it appears that its much simpler to change all users of
UTS_RELEASE to use some other file, say local_version.h,
and have localversion not affect version.h

Opinions?

mst

2005-01-16 19:42:22

by Michael S. Tsirkin

[permalink] [raw]
Subject: Re: changing local version requires full rebuild

Hello!
Quoting r. Sam Ravnborg ([email protected]) "Re: changing local version requires full rebuild":
> >
> > > Do you use "echo -mylocalver > localversion" to change the local version?
> > >
> > > Sam
> >
> > No, I do makemenuconfig to edit the version. Is that right?
>
> That is fine too.
> When building - do you use separate output dir?
>
> Sam

First, by design any module includes the full
kernel release name as part of the VERMAGIC_STRING.
So at least one file will have to be rebuilt for each module,
and all modules have to be relinked, if localversion changes.


MST

2005-01-16 20:02:39

by Michael S. Tsirkin

[permalink] [raw]
Subject: [PATCH] split UTS_RELEASE to a separate header.

Hello!
Quoting r. Sam Ravnborg ([email protected]) "Re: changing local version requires full rebuild":
> On Sun, Jan 16, 2005 at 05:22:42PM +0200, Michael S. Tsirkin wrote:
> > Hi!
> > Is it just me, or does changing the local version always require
> > a full kernel rebuild?
> >
> > If so, I'd like to fix it, since I like copying
> > my kernel source with --preserve and changing the
> > local version, then going back to the old version in case of
> > a crash.
> > Its important to change the local version to force
> > make install and make modules_install to put things in a separate
> > directory.
>
> Just tried it out here.
> After cp -Ra only a limited part of the kernel rebuilds.
> o oiu.c in ieee directory - because it dependson the shell script
> o A number of drivers that include version.h
> - This should be changed so local version does not affect
> the reast of version.h.
> o Other stuff that is always build if kernel has changed
>
> Do you use "echo -mylocalver > localversion" to change the local version?
>
> Sam

Well, we have
/usr/src/linux-2.6.10-gold # grep -l UTS_RELEASE -rI . | wc -l
29
grep -l version.h -rI . | fgrep -v .cmd | fgrep -v '.mod' | fgrep -e '.c' -e '.h' | wc -l
354

This means that about 300 files are compiled each time localversion changes,
which do not actually use the local version.

So, let us split UTS_RELEASE to a separate header: release.h
The following patch over 2.6.10 does that, and fixed the in-tree files that
really need to include it.
Works for me, and helps me cut down compilation time. Comments?

Signed-off-by: Michael S. Tsirkin <[email protected]>

diff -x '.*' -ru linux-2.6.10-orig/arch/alpha/boot/bootp.c linux-2.6.10-gold/arch/alpha/boot/bootp.c
--- linux-2.6.10-orig/arch/alpha/boot/bootp.c 2004-12-24 23:35:25.000000000 +0200
+++ linux-2.6.10-gold/arch/alpha/boot/bootp.c 2005-01-16 20:45:38.000000000 +0200
@@ -9,6 +9,7 @@
*/
#include <linux/kernel.h>
#include <linux/string.h>
+#include <linux/release.h>
#include <linux/version.h>
#include <linux/mm.h>

diff -x '.*' -ru linux-2.6.10-orig/arch/alpha/boot/bootpz.c linux-2.6.10-gold/arch/alpha/boot/bootpz.c
--- linux-2.6.10-orig/arch/alpha/boot/bootpz.c 2004-12-24 23:33:50.000000000 +0200
+++ linux-2.6.10-gold/arch/alpha/boot/bootpz.c 2005-01-16 20:45:25.000000000 +0200
@@ -11,6 +11,7 @@
*/
#include <linux/kernel.h>
#include <linux/string.h>
+#include <linux/release.h>
#include <linux/version.h>
#include <linux/mm.h>

diff -x '.*' -ru linux-2.6.10-orig/arch/alpha/boot/main.c linux-2.6.10-gold/arch/alpha/boot/main.c
--- linux-2.6.10-orig/arch/alpha/boot/main.c 2004-12-24 23:35:49.000000000 +0200
+++ linux-2.6.10-gold/arch/alpha/boot/main.c 2005-01-16 20:45:47.000000000 +0200
@@ -7,6 +7,7 @@
*/
#include <linux/kernel.h>
#include <linux/string.h>
+#include <linux/release.h>
#include <linux/version.h>
#include <linux/mm.h>

diff -x '.*' -ru linux-2.6.10-orig/arch/i386/boot/setup.S linux-2.6.10-gold/arch/i386/boot/setup.S
--- linux-2.6.10-orig/arch/i386/boot/setup.S 2004-12-24 23:34:58.000000000 +0200
+++ linux-2.6.10-gold/arch/i386/boot/setup.S 2005-01-16 20:44:01.000000000 +0200
@@ -48,6 +48,7 @@

#include <linux/config.h>
#include <asm/segment.h>
+#include <linux/release.h>
#include <linux/version.h>
#include <linux/compile.h>
#include <asm/boot.h>
diff -x '.*' -ru linux-2.6.10-orig/arch/ppc/platforms/chrp_setup.c linux-2.6.10-gold/arch/ppc/platforms/chrp_setup.c
--- linux-2.6.10-orig/arch/ppc/platforms/chrp_setup.c 2004-12-24 23:35:24.000000000 +0200
+++ linux-2.6.10-gold/arch/ppc/platforms/chrp_setup.c 2005-01-16 20:45:20.000000000 +0200
@@ -27,6 +27,7 @@
#include <linux/reboot.h>
#include <linux/init.h>
#include <linux/pci.h>
+#include <linux/release.h>
#include <linux/version.h>
#include <linux/adb.h>
#include <linux/module.h>
diff -x '.*' -ru linux-2.6.10-orig/arch/ppc/syslib/btext.c linux-2.6.10-gold/arch/ppc/syslib/btext.c
--- linux-2.6.10-orig/arch/ppc/syslib/btext.c 2004-12-24 23:33:49.000000000 +0200
+++ linux-2.6.10-gold/arch/ppc/syslib/btext.c 2005-01-16 20:44:49.000000000 +0200
@@ -7,6 +7,7 @@
#include <linux/kernel.h>
#include <linux/string.h>
#include <linux/init.h>
+#include <linux/release.h>
#include <linux/version.h>

#include <asm/sections.h>
diff -x '.*' -ru linux-2.6.10-orig/arch/ppc64/kernel/process.c linux-2.6.10-gold/arch/ppc64/kernel/process.c
--- linux-2.6.10-orig/arch/ppc64/kernel/process.c 2004-12-24 23:35:00.000000000 +0200
+++ linux-2.6.10-gold/arch/ppc64/kernel/process.c 2005-01-16 20:46:01.000000000 +0200
@@ -35,6 +35,7 @@
#include <linux/ptrace.h>
#include <linux/kallsyms.h>
#include <linux/interrupt.h>
+#include <linux/release.h>
#include <linux/version.h>

#include <asm/pgtable.h>
diff -x '.*' -ru linux-2.6.10-orig/arch/ppc64/kernel/pSeries_setup.c linux-2.6.10-gold/arch/ppc64/kernel/pSeries_setup.c
--- linux-2.6.10-orig/arch/ppc64/kernel/pSeries_setup.c 2004-12-24 23:34:00.000000000 +0200
+++ linux-2.6.10-gold/arch/ppc64/kernel/pSeries_setup.c 2005-01-16 20:45:52.000000000 +0200
@@ -36,6 +36,7 @@
#include <linux/ioport.h>
#include <linux/console.h>
#include <linux/pci.h>
+#include <linux/release.h>
#include <linux/version.h>
#include <linux/adb.h>
#include <linux/module.h>
diff -x '.*' -ru linux-2.6.10-orig/arch/ppc64/kernel/setup.c linux-2.6.10-gold/arch/ppc64/kernel/setup.c
--- linux-2.6.10-orig/arch/ppc64/kernel/setup.c 2004-12-24 23:34:44.000000000 +0200
+++ linux-2.6.10-gold/arch/ppc64/kernel/setup.c 2005-01-16 20:45:57.000000000 +0200
@@ -24,6 +24,7 @@
#include <linux/seq_file.h>
#include <linux/ioport.h>
#include <linux/console.h>
+#include <linux/release.h>
#include <linux/version.h>
#include <linux/tty.h>
#include <linux/root_dev.h>
diff -x '.*' -ru linux-2.6.10-orig/arch/x86_64/boot/setup.S linux-2.6.10-gold/arch/x86_64/boot/setup.S
--- linux-2.6.10-orig/arch/x86_64/boot/setup.S 2004-12-24 23:35:39.000000000 +0200
+++ linux-2.6.10-gold/arch/x86_64/boot/setup.S 2005-01-16 20:46:11.000000000 +0200
@@ -47,6 +47,7 @@

#include <linux/config.h>
#include <asm/segment.h>
+#include <linux/release.h>
#include <linux/version.h>
#include <linux/compile.h>
#include <asm/boot.h>
diff -x '.*' -ru linux-2.6.10-orig/arch/x86_64/kernel/process.c linux-2.6.10-gold/arch/x86_64/kernel/process.c
--- linux-2.6.10-orig/arch/x86_64/kernel/process.c 2004-12-24 23:34:58.000000000 +0200
+++ linux-2.6.10-gold/arch/x86_64/kernel/process.c 2005-01-16 20:46:06.000000000 +0200
@@ -32,6 +32,7 @@
#include <linux/delay.h>
#include <linux/irq.h>
#include <linux/ptrace.h>
+#include <linux/release.h>
#include <linux/version.h>

#include <asm/uaccess.h>
diff -x '.*' -ru linux-2.6.10-orig/drivers/block/floppy.c linux-2.6.10-gold/drivers/block/floppy.c
--- linux-2.6.10-orig/drivers/block/floppy.c 2004-12-24 23:34:01.000000000 +0200
+++ linux-2.6.10-gold/drivers/block/floppy.c 2005-01-16 20:47:16.000000000 +0200
@@ -155,6 +155,7 @@
#include <linux/kernel.h>
#include <linux/timer.h>
#include <linux/workqueue.h>
+#include <linux/release.h>
#include <linux/version.h>
#define FDPATCHES
#include <linux/fdreg.h>
diff -x '.*' -ru linux-2.6.10-orig/drivers/cdrom/aztcd.c linux-2.6.10-gold/drivers/cdrom/aztcd.c
--- linux-2.6.10-orig/drivers/cdrom/aztcd.c 2004-12-24 23:35:28.000000000 +0200
+++ linux-2.6.10-gold/drivers/cdrom/aztcd.c 2005-01-16 20:47:25.000000000 +0200
@@ -165,6 +165,7 @@
Torben Mathiasen <[email protected]>
*/

+#include <linux/release.h>
#include <linux/version.h>
#include <linux/blkdev.h>
#include "aztcd.h"
diff -x '.*' -ru linux-2.6.10-orig/drivers/cdrom/mcdx.c linux-2.6.10-gold/drivers/cdrom/mcdx.c
--- linux-2.6.10-orig/drivers/cdrom/mcdx.c 2004-12-24 23:34:44.000000000 +0200
+++ linux-2.6.10-gold/drivers/cdrom/mcdx.c 2005-01-16 20:47:20.000000000 +0200
@@ -56,6 +56,7 @@
= "$Id: mcdx.c,v 1.21 1997/01/26 07:12:59 davem Exp $";
#endif

+#include <linux/release.h>
#include <linux/version.h>
#include <linux/module.h>

diff -x '.*' -ru linux-2.6.10-orig/drivers/char/ftape/compressor/zftape-compress.c linux-2.6.10-gold/drivers/char/ftape/compressor/zftape-compress.c
--- linux-2.6.10-orig/drivers/char/ftape/compressor/zftape-compress.c 2004-12-24 23:35:25.000000000 +0200
+++ linux-2.6.10-gold/drivers/char/ftape/compressor/zftape-compress.c 2005-01-16 20:46:42.000000000 +0200
@@ -31,6 +31,7 @@
char zftc_rev[] = "$Revision: 1.1.6.1 $";
char zftc_dat[] = "$Date: 1997/11/16 15:15:56 $";

+#include <linux/release.h>
#include <linux/version.h>
#include <linux/errno.h>
#include <linux/mm.h>
diff -x '.*' -ru linux-2.6.10-orig/drivers/char/ftape/lowlevel/ftape-init.c linux-2.6.10-gold/drivers/char/ftape/lowlevel/ftape-init.c
--- linux-2.6.10-orig/drivers/char/ftape/lowlevel/ftape-init.c 2004-12-24 23:35:25.000000000 +0200
+++ linux-2.6.10-gold/drivers/char/ftape/lowlevel/ftape-init.c 2005-01-16 20:46:32.000000000 +0200
@@ -23,6 +23,7 @@

#include <linux/config.h>
#include <linux/module.h>
+#include <linux/release.h>
#include <linux/version.h>
#include <linux/errno.h>
#include <linux/fs.h>
diff -x '.*' -ru linux-2.6.10-orig/drivers/char/ftape/zftape/zftape-init.c linux-2.6.10-gold/drivers/char/ftape/zftape/zftape-init.c
--- linux-2.6.10-orig/drivers/char/ftape/zftape/zftape-init.c 2004-12-24 23:34:31.000000000 +0200
+++ linux-2.6.10-gold/drivers/char/ftape/zftape/zftape-init.c 2005-01-16 20:46:38.000000000 +0200
@@ -23,6 +23,7 @@
#include <linux/config.h>
#include <linux/module.h>
#include <linux/errno.h>
+#include <linux/release.h>
#include <linux/version.h>
#include <linux/fs.h>
#include <linux/kernel.h>
diff -x '.*' -ru linux-2.6.10-orig/drivers/parisc/led.c linux-2.6.10-gold/drivers/parisc/led.c
--- linux-2.6.10-orig/drivers/parisc/led.c 2004-12-24 23:34:30.000000000 +0200
+++ linux-2.6.10-gold/drivers/parisc/led.c 2005-01-16 20:47:29.000000000 +0200
@@ -26,6 +26,7 @@
#include <linux/init.h>
#include <linux/types.h>
#include <linux/ioport.h>
+#include <linux/release.h>
#include <linux/version.h>
#include <linux/delay.h>
#include <linux/netdevice.h>
diff -x '.*' -ru linux-2.6.10-orig/drivers/scsi/aic7xxx_old.c linux-2.6.10-gold/drivers/scsi/aic7xxx_old.c
--- linux-2.6.10-orig/drivers/scsi/aic7xxx_old.c 2004-12-24 23:35:50.000000000 +0200
+++ linux-2.6.10-gold/drivers/scsi/aic7xxx_old.c 2005-01-16 20:47:11.000000000 +0200
@@ -224,6 +224,7 @@
#include <asm/io.h>
#include <asm/irq.h>
#include <asm/byteorder.h>
+#include <linux/release.h>
#include <linux/version.h>
#include <linux/string.h>
#include <linux/errno.h>
diff -x '.*' -ru linux-2.6.10-orig/drivers/usb/core/hcd.c linux-2.6.10-gold/drivers/usb/core/hcd.c
--- linux-2.6.10-orig/drivers/usb/core/hcd.c 2004-12-24 23:34:58.000000000 +0200
+++ linux-2.6.10-gold/drivers/usb/core/hcd.c 2005-01-16 20:47:07.000000000 +0200
@@ -29,6 +29,7 @@
#endif

#include <linux/module.h>
+#include <linux/release.h>
#include <linux/version.h>
#include <linux/kernel.h>
#include <linux/slab.h>
diff -x '.*' -ru linux-2.6.10-orig/drivers/usb/gadget/ether.c linux-2.6.10-gold/drivers/usb/gadget/ether.c
--- linux-2.6.10-orig/drivers/usb/gadget/ether.c 2004-12-24 23:35:39.000000000 +0200
+++ linux-2.6.10-gold/drivers/usb/gadget/ether.c 2005-01-16 20:46:57.000000000 +0200
@@ -37,6 +37,7 @@
#include <linux/list.h>
#include <linux/interrupt.h>
#include <linux/uts.h>
+#include <linux/release.h>
#include <linux/version.h>
#include <linux/device.h>
#include <linux/moduleparam.h>
diff -x '.*' -ru linux-2.6.10-orig/drivers/usb/gadget/file_storage.c linux-2.6.10-gold/drivers/usb/gadget/file_storage.c
--- linux-2.6.10-orig/drivers/usb/gadget/file_storage.c 2004-12-24 23:36:01.000000000 +0200
+++ linux-2.6.10-gold/drivers/usb/gadget/file_storage.c 2005-01-16 20:47:02.000000000 +0200
@@ -237,6 +237,7 @@
#include <linux/string.h>
#include <linux/suspend.h>
#include <linux/uts.h>
+#include <linux/release.h>
#include <linux/version.h>
#include <linux/wait.h>

diff -x '.*' -ru linux-2.6.10-orig/drivers/usb/gadget/serial.c linux-2.6.10-gold/drivers/usb/gadget/serial.c
--- linux-2.6.10-orig/drivers/usb/gadget/serial.c 2004-12-24 23:35:24.000000000 +0200
+++ linux-2.6.10-gold/drivers/usb/gadget/serial.c 2005-01-16 20:46:53.000000000 +0200
@@ -31,6 +31,7 @@
#include <linux/list.h>
#include <linux/interrupt.h>
#include <linux/uts.h>
+#include <linux/release.h>
#include <linux/version.h>
#include <linux/wait.h>
#include <linux/proc_fs.h>
diff -x '.*' -ru linux-2.6.10-orig/drivers/usb/gadget/zero.c linux-2.6.10-gold/drivers/usb/gadget/zero.c
--- linux-2.6.10-orig/drivers/usb/gadget/zero.c 2004-12-24 23:34:32.000000000 +0200
+++ linux-2.6.10-gold/drivers/usb/gadget/zero.c 2005-01-16 20:46:49.000000000 +0200
@@ -76,6 +76,7 @@
#include <linux/list.h>
#include <linux/interrupt.h>
#include <linux/uts.h>
+#include <linux/release.h>
#include <linux/version.h>
#include <linux/device.h>
#include <linux/moduleparam.h>
diff -x '.*' -ru linux-2.6.10-orig/fs/cifs/connect.c linux-2.6.10-gold/fs/cifs/connect.c
--- linux-2.6.10-orig/fs/cifs/connect.c 2004-12-24 23:35:28.000000000 +0200
+++ linux-2.6.10-gold/fs/cifs/connect.c 2005-01-16 20:46:16.295338328 +0200
@@ -23,6 +23,7 @@
#include <linux/string.h>
#include <linux/list.h>
#include <linux/wait.h>
+#include <linux/release.h>
#include <linux/version.h>
#include <linux/ipv6.h>
#include <linux/pagemap.h>
diff -x '.*' -ru linux-2.6.10-orig/include/linux/vermagic.h linux-2.6.10-gold/include/linux/vermagic.h
--- linux-2.6.10-orig/include/linux/vermagic.h 2004-12-24 23:35:50.000000000 +0200
+++ linux-2.6.10-gold/include/linux/vermagic.h 2005-01-16 20:46:22.750357016 +0200
@@ -1,3 +1,4 @@
+#include <linux/release.h>
#include <linux/version.h>
#include <linux/module.h>

diff -x '.*' -ru linux-2.6.10-orig/include/linux/version.h linux-2.6.10-gold/include/linux/version.h
--- linux-2.6.10-orig/include/linux/version.h 2005-01-05 14:49:23.000000000 +0200
+++ linux-2.6.10-gold/include/linux/version.h 2005-01-16 20:48:20.000000000 +0200
@@ -1,3 +1,2 @@
-#define UTS_RELEASE "2.6.10-orig"
#define LINUX_VERSION_CODE 132618
#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))
diff -x '.*' -ru linux-2.6.10-orig/init/version.c linux-2.6.10-gold/init/version.c
--- linux-2.6.10-orig/init/version.c 2004-12-24 23:34:45.000000000 +0200
+++ linux-2.6.10-gold/init/version.c 2005-01-16 20:47:34.000000000 +0200
@@ -10,6 +10,7 @@
#include <linux/module.h>
#include <linux/uts.h>
#include <linux/utsname.h>
+#include <linux/release.h>
#include <linux/version.h>

#define version(a) Version_ ## a
diff -x '.*' -ru linux-2.6.10-orig/Makefile linux-2.6.10-gold/Makefile
--- linux-2.6.10-orig/Makefile 2004-12-24 23:35:01.000000000 +0200
+++ linux-2.6.10-gold/Makefile 2005-01-16 20:36:30.000000000 +0200
@@ -763,7 +763,8 @@
# prepare1 creates a makefile if using a separate output directory
prepare1: prepare2 outputmakefile

-prepare0: prepare1 include/linux/version.h include/asm include/config/MARKER
+prepare0: prepare1 include/linux/version.h include/linux/release.h \
+ include/asm include/config/MARKER
ifneq ($(KBUILD_MODULES),)
$(Q)rm -rf $(MODVERDIR)
$(Q)mkdir -p $(MODVERDIR)
@@ -820,18 +821,23 @@
uts_len := 64

define filechk_version.h
+ ( echo \#define LINUX_VERSION_CODE `expr $(VERSION) \\* 65536 + $(PATCHLEVEL) \\* 256 + $(SUBLEVEL)`; \
+ echo '#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))'; \
+ )
+endef
+
+define filechk_release.h
if [ `echo -n "$(KERNELRELEASE)" | wc -c ` -gt $(uts_len) ]; then \
echo '"$(KERNELRELEASE)" exceeds $(uts_len) characters' >&2; \
exit 1; \
fi; \
- (echo \#define UTS_RELEASE \"$(KERNELRELEASE)\"; \
- echo \#define LINUX_VERSION_CODE `expr $(VERSION) \\* 65536 + $(PATCHLEVEL) \\* 256 + $(SUBLEVEL)`; \
- echo '#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))'; \
- )
+ ( echo \#define UTS_RELEASE \"$(KERNELRELEASE)\" )
endef

include/linux/version.h: $(srctree)/Makefile FORCE
$(call filechk,version.h)
+include/linux/release.h: $(srctree)/Makefile FORCE
+ $(call filechk,release.h)

# ---------------------------------------------------------------------------

@@ -946,6 +952,7 @@
MRPROPER_DIRS += include/config include2
MRPROPER_FILES += .config .config.old include/asm .version \
include/linux/autoconf.h include/linux/version.h \
+ include/linux/release.h \
Module.symvers tags TAGS cscope*

# clean - Delete most, but leave enough to build external modules
diff -x '.*' -ru linux-2.6.10-orig/scripts/checkversion.pl linux-2.6.10-gold/scripts/checkversion.pl
--- linux-2.6.10-orig/scripts/checkversion.pl 2004-12-24 23:34:33.000000000 +0200
+++ linux-2.6.10-gold/scripts/checkversion.pl 2005-01-16 20:42:40.000000000 +0200
@@ -1,7 +1,7 @@
#! /usr/bin/perl
#
-# checkversion find uses of LINUX_VERSION_CODE, KERNEL_VERSION, or
-# UTS_RELEASE without including <linux/version.h>, or cases of
+# checkversion find uses of LINUX_VERSION_CODE or KERNEL_VERSION
+# without including <linux/version.h>, or cases of
# including <linux/version.h> that don't need it.
# Copyright (C) 2003, Randy Dunlap <[email protected]>

@@ -40,9 +40,8 @@
$iLinuxVersion = $. if m/^\s*#\s*include\s*<linux\/version\.h>/o;
}

- # Look for uses: LINUX_VERSION_CODE, KERNEL_VERSION, UTS_RELEASE
- if (($_ =~ /LINUX_VERSION_CODE/) || ($_ =~ /\WKERNEL_VERSION/) ||
- ($_ =~ /UTS_RELEASE/)) {
+ # Look for uses: LINUX_VERSION_CODE, KERNEL_VERSION
+ if ( ($_ =~ /LINUX_VERSION_CODE/) || ($_ =~ /\WKERNEL_VERSION/) ) {
$fUseVersion = 1;
last LINE if $iLinuxVersion;
}

2005-01-16 22:58:42

by Brian Gerst

[permalink] [raw]
Subject: Re: [PATCH] split UTS_RELEASE to a separate header.

Michael S. Tsirkin wrote:
> Hello!
> Quoting r. Sam Ravnborg ([email protected]) "Re: changing local version requires full rebuild":
>
>>On Sun, Jan 16, 2005 at 05:22:42PM +0200, Michael S. Tsirkin wrote:
>>
>>>Hi!
>>>Is it just me, or does changing the local version always require
>>>a full kernel rebuild?
>>>
>>>If so, I'd like to fix it, since I like copying
>>>my kernel source with --preserve and changing the
>>>local version, then going back to the old version in case of
>>>a crash.
>>>Its important to change the local version to force
>>>make install and make modules_install to put things in a separate
>>>directory.
>>
>>Just tried it out here.
>>After cp -Ra only a limited part of the kernel rebuilds.
>>o oiu.c in ieee directory - because it dependson the shell script
>>o A number of drivers that include version.h
>> - This should be changed so local version does not affect
>> the reast of version.h.
>>o Other stuff that is always build if kernel has changed
>>
>>Do you use "echo -mylocalver > localversion" to change the local version?
>>
>> Sam
>
>
> Well, we have
> /usr/src/linux-2.6.10-gold # grep -l UTS_RELEASE -rI . | wc -l
> 29
> grep -l version.h -rI . | fgrep -v .cmd | fgrep -v '.mod' | fgrep -e '.c' -e '.h' | wc -l
> 354
>
> This means that about 300 files are compiled each time localversion changes,
> which do not actually use the local version.
>
> So, let us split UTS_RELEASE to a separate header: release.h
> The following patch over 2.6.10 does that, and fixed the in-tree files that
> really need to include it.
> Works for me, and helps me cut down compilation time. Comments?
>

Most of the stuff using UTS_RELEASE can use system_utsname.release
instead (except boot code). Most cases in drivers/ can simply be removed.

--
Brian Gerst