Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

kbuild / KERNELRELEASE not rebuild correctly anymore

961 views
Skip to first unread message

René Rebe

unread,
Jan 15, 2006, 5:00:15 AM1/15/06
to
Hi all,

with at least 2.6.15-mm{2,3,4} untaring the kernel and running make menuconfig
(or most other favourite config tools) do not display a version anymore since
.kernelrelease it not build as dependecy.

I only noticed this because my build scripts grab the version before the build for
later file names on installations and leave this string empty after configuration of
latest linux kernels.

Sincerely,

--
René Rebe - Rubensstr. 64 - 12157 Berlin (Europe / Germany)
http://www.exactcode.de | http://www.t2-project.org
+49 (0)30 255 897 45
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majo...@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/

Sam Ravnborg

unread,
Jan 15, 2006, 5:10:06 AM1/15/06
to
On Sun, Jan 15, 2006 at 10:51:14AM +0100, Ren? Rebe wrote:
> Hi all,
>
> with at least 2.6.15-mm{2,3,4} untaring the kernel and running make menuconfig
> (or most other favourite config tools) do not display a version anymore since
> .kernelrelease it not build as dependecy.
>
> I only noticed this because my build scripts grab the version before the build for
> later file names on installations and leave this string empty after configuration of
> latest linux kernels.

It is correct that "make kernelrelease" does not display correct info
until you have done a proper build of the kernel or at least the prepare
step.

The issue here is that we shall avoid sideeffects when running "make
kernelrelease" so it does not trigger all sorts of commands when running
as root for instance.

So the real fix is to error out when .kernelrelease does not exists.
See attached patch.

Sam

diff --git a/Makefile b/Makefile
index deedaf7..19a37a2 100644
--- a/Makefile
+++ b/Makefile
@@ -1301,7 +1301,8 @@ checkstack:
$(PERL) $(src)/scripts/checkstack.pl $(ARCH)

kernelrelease:
- @echo $(KERNELRELEASE)
+ $(if $(wildcard .kernelrelease), $(Q)echo $(KERNELRELEASE), \
+ $(error kernelrelease not valid - run 'make prepare' to update it))
kernelversion:
@echo $(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)

Grant Coady

unread,
Jan 15, 2006, 5:20:36 AM1/15/06
to
On 1/15/06, René Rebe <re...@exactcode.de> wrote:
> with at least 2.6.15-mm{2,3,4} untaring the kernel and running make menuconfig
> (or most other favourite config tools) do not display a version anymore since
> .kernelrelease it not build as dependecy.

grant@sempro:~/linux/linux-2.6.15-mm4a$ cat .kernelrelease
2.6.15-mm4a

Works for me ;)

Grant.

René Rebe

unread,
Jan 15, 2006, 5:50:31 AM1/15/06
to
Hi,

On Sunday 15 January 2006 11:05, Sam Ravnborg wrote:
> On Sun, Jan 15, 2006 at 10:51:14AM +0100, Ren? Rebe wrote:
> > Hi all,
> >
> > with at least 2.6.15-mm{2,3,4} untaring the kernel and running make
> > menuconfig (or most other favourite config tools) do not display a
> > version anymore since .kernelrelease it not build as dependecy.
> >
> > I only noticed this because my build scripts grab the version before the
> > build for later file names on installations and leave this string empty
> > after configuration of latest linux kernels.
>
> It is correct that "make kernelrelease" does not display correct info
> until you have done a proper build of the kernel or at least the prepare
> step.
>
> The issue here is that we shall avoid sideeffects when running "make
> kernelrelease" so it does not trigger all sorts of commands when running
> as root for instance.
>
> So the real fix is to error out when .kernelrelease does not exists.
> See attached patch.

You expect us to run make prepare before make menuconfig or simillar?
That sounds a bit odd ...

Yours,

--
René Rebe - Rubensstr. 64 - 12157 Berlin (Europe / Germany)
http://www.exactcode.de | http://www.t2-project.org
+49 (0)30 255 897 45

René Rebe

unread,
Jan 15, 2006, 5:50:32 AM1/15/06
to
Hi,

On Sunday 15 January 2006 11:13, Grant Coady wrote:
> On 1/15/06, René Rebe <re...@exactcode.de> wrote:
> > with at least 2.6.15-mm{2,3,4} untaring the kernel and running make
> > menuconfig (or most other favourite config tools) do not display a
> > version anymore since .kernelrelease it not build as dependecy.
>
> grant@sempro:~/linux/linux-2.6.15-mm4a$ cat .kernelrelease
> 2.6.15-mm4a
>
> Works for me ;)

After a build? Yes. But before? E.g. at make menuconfig time or thereafter?

Yours,

--
René Rebe - Rubensstr. 64 - 12157 Berlin (Europe / Germany)
http://www.exactcode.de | http://www.t2-project.org
+49 (0)30 255 897 45

Sam Ravnborg

unread,
Jan 15, 2006, 6:30:25 AM1/15/06
to
On Sun, Jan 15, 2006 at 11:41:30AM +0100, Ren? Rebe wrote:
> >
> > So the real fix is to error out when .kernelrelease does not exists.
> > See attached patch.
>
> You expect us to run make prepare before make menuconfig or simillar?
> That sounds a bit odd ...

The kernelrelease depends on the actual configuration.
So without having completed the make *config step kbuild cannot tell the
correct kernelrelease.

Now with the patch attached to last mail kbuild will now error out in
case there is no valid kernelrelease. Thats obviously only a hack, since
we need to error out when .config has been updated and the new
kernelrelease has not been created.

Maybe the better approach would be always to create the .kernelrelease
file as part of the configuration - based on the principle of least
suprise.
See attached patch.

Sam

diff --git a/Makefile b/Makefile

index deedaf7..4ab0141 100644
--- a/Makefile
+++ b/Makefile
@@ -433,6 +433,7 @@ export KBUILD_DEFCONFIG
config %config: scripts_basic outputmakefile FORCE
$(Q)mkdir -p include/linux
$(Q)$(MAKE) $(build)=scripts/kconfig $@
+ $(Q)$(MAKE) .kernelrelease

else
# ===========================================================================
@@ -783,12 +784,13 @@ endif
localver-full = $(localver)$(localver-auto)

# Store (new) KERNELRELASE string in .kernelrelease
+quiet_cmd_kernelrelease = GEN $@
+ cmd_kernelrelease = rm -f $@; echo $(kernelrelease) > $@
+
kernelrelease = \
$(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)$(localver-full)
.kernelrelease: FORCE
- $(Q)rm -f .kernelrelease
- $(Q)echo $(kernelrelease) > .kernelrelease
- $(Q)echo " Building kernel $(kernelrelease)"
+ $(call cmd,kernelrelease)


# Things we need to do before we recursively start building the kernel
@@ -808,6 +810,7 @@ kernelrelease = \
# 1) Check that make has not been executed in the kernel src $(srctree)
# 2) Create the include2 directory, used for the second asm symlink
prepare3: .kernelrelease
+ $(Q)echo " Building kernel $(kernelrelease)"
ifneq ($(KBUILD_SRC),)
@echo ' Using $(srctree) as source for kernel'
$(Q)if [ -f $(srctree)/.config ]; then \
@@ -1301,7 +1304,8 @@ checkstack:


$(PERL) $(src)/scripts/checkstack.pl $(ARCH)

kernelrelease:
- @echo $(KERNELRELEASE)
+ $(if $(wildcard .kernelrelease), $(Q)echo $(KERNELRELEASE), \

+ $(error kernelrelease not valid - run 'make *config' to update it))
kernelversion:
@echo $(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)

René Rebe

unread,
Jan 15, 2006, 7:20:56 AM1/15/06
to
Hi,

On Sunday 15 January 2006 12:19, Sam Ravnborg wrote:
> On Sun, Jan 15, 2006 at 11:41:30AM +0100, Ren? Rebe wrote:
> > > So the real fix is to error out when .kernelrelease does not exists.
> > > See attached patch.
> >
> > You expect us to run make prepare before make menuconfig or simillar?
> > That sounds a bit odd ...
>
> The kernelrelease depends on the actual configuration.
> So without having completed the make *config step kbuild cannot tell the
> correct kernelrelease.
>
> Now with the patch attached to last mail kbuild will now error out in
> case there is no valid kernelrelease. Thats obviously only a hack, since
> we need to error out when .config has been updated and the new
> kernelrelease has not been created.
>
> Maybe the better approach would be always to create the .kernelrelease
> file as part of the configuration - based on the principle of least
> suprise.

Aside this "solution" still annoys me, you need at least patch the config
stuff to not display an empty version string ;-)

I'm curious, aside rsbac, what in the .config is altering the KERNELRELEASE?

Yours,

--
René Rebe - Rubensstr. 64 - 12157 Berlin (Europe / Germany)
http://www.exactcode.de | http://www.t2-project.org
+49 (0)30 255 897 45

Sam Ravnborg

unread,
Jan 15, 2006, 7:40:19 AM1/15/06
to
>
> I'm curious, aside rsbac, what in the .config is altering the KERNELRELEASE?
CONFIG_LOCALVERSION
CONFIG_LOCALVERSION_AUTO

Sam

René Rebe

unread,
Jan 15, 2006, 9:30:19 AM1/15/06
to
Hi,

On Sunday 15 January 2006 13:31, Sam Ravnborg wrote:
> > I'm curious, aside rsbac, what in the .config is altering the
> > KERNELRELEASE?
>
> CONFIG_LOCALVERSION
> CONFIG_LOCALVERSION_AUTO

Ah, ok - I feared something less obviously more complex. Do we need this
options at all? People can still just edit the EXTRAVERSION line in the
Makefile - at least I always did so ...

Also you have not answered if you expect to patch away the version output in
the *config frontends ...

Yours,

--
René Rebe - Rubensstr. 64 - 12157 Berlin (Europe / Germany)
http://www.exactcode.de | http://www.t2-project.org
+49 (0)30 255 897 45

Kyle Moffett

unread,
Jan 15, 2006, 6:30:17 PM1/15/06
to
On Jan 15, 2006, at 09:26, René Rebe wrote:
> Hi,
>
> On Sunday 15 January 2006 13:31, Sam Ravnborg wrote:
>>> I'm curious, aside rsbac, what in the .config is altering the
>>> KERNELRELEASE?
>>
>> CONFIG_LOCALVERSION
>> CONFIG_LOCALVERSION_AUTO
>
> Ah, ok - I feared something less obviously more complex. Do we need
> this options at all? People can still just edit the EXTRAVERSION
> line in the Makefile - at least I always did so ...

It makes it easy for people who build a lot of different kernel
versions and patchsets with similar configs. When compiling a kernel
for "aphrodite", I use my "config.aphrodite4" which has
CONFIG_LOCALVERSION="-aphrodite4". I may patch the kernel first with
-mm or another patchset for testing which modify EXTRAVERSION, and
with the localversion change I get the following kernels, depending
only on patchset and my config:

/boot/vmlinuz-2.6.15-aphrodite4
/boot/vmlinuz-2.6.15-mm4-aphrodite4
[...etc...]

Cheers,
Kyle Moffett

--
Somone asked me why I work on this free (http://www.fsf.org/
philosophy/) software stuff and not get a real job. Charles Schulz
had the best answer:

"Why do musicians compose symphonies and poets write poems? They do
it because life wouldn't have any meaning for them if they didn't.
That's why I draw cartoons. It's my life."
-- Charles Schulz

Sam Ravnborg

unread,
Jan 16, 2006, 6:20:06 AM1/16/06
to
I have just added following patch to my tree.
It addresses all your inputs.

Sam

[PATCH] kbuild: create .kernelrelease at *config step

To enable 'make kernelrelease' earlier now create .kernelrelease when
one of the *config targets are used.
Also introduce KERNELVERSION - only user is kconfig.
KERNELVERSION was needed to display kernel version in menuconfig -
KERNELRELEASE is not valid until configuration has completed.
kconfig files modified to use KERNELVERSION.
Bug reported by: Rene Rebe <re...@exactcode.de>

Signed-off-by: Sam Ravnborg <s...@ravnborg.org>

---

Makefile | 19 ++++++++++---------
scripts/kconfig/confdata.c | 2 +-
scripts/kconfig/gconf.c | 2 +-
scripts/kconfig/mconf.c | 2 +-
scripts/kconfig/symbol.c | 4 ++--
5 files changed, 15 insertions(+), 14 deletions(-)

2244cbd8a9185c197ec5ba5de175aec288697223
diff --git a/Makefile b/Makefile
index b3dd9db..22e322f 100644
--- a/Makefile
+++ b/Makefile
@@ -338,8 +338,9 @@ AFLAGS := -D__ASSEMBLY__

# Read KERNELRELEASE from .kernelrelease (if it exists)
KERNELRELEASE = $(shell cat .kernelrelease 2> /dev/null)
+KERNELVERSION = $(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)

-export VERSION PATCHLEVEL SUBLEVEL KERNELRELEASE \
+export VERSION PATCHLEVEL SUBLEVEL KERNELRELEASE KERNELVERSION \
ARCH CONFIG_SHELL HOSTCC HOSTCFLAGS CROSS_COMPILE AS LD CC \
CPP AR NM STRIP OBJCOPY OBJDUMP MAKE AWK GENKSYMS PERL UTS_MACHINE \
HOSTCXX HOSTCXXFLAGS LDFLAGS_MODULE CHECK CHECKFLAGS
@@ -434,6 +435,7 @@ export KBUILD_DEFCONFIG


config %config: scripts_basic outputmakefile FORCE
$(Q)mkdir -p include/linux
$(Q)$(MAKE) $(build)=scripts/kconfig $@
+ $(Q)$(MAKE) .kernelrelease

else
# ===========================================================================

@@ -784,12 +786,10 @@ endif


localver-full = $(localver)$(localver-auto)

# Store (new) KERNELRELASE string in .kernelrelease

-kernelrelease = \
- $(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)$(localver-full)
+kernelrelease = $(KERNELVERSION)$(localver-full)


.kernelrelease: FORCE
- $(Q)rm -f .kernelrelease
- $(Q)echo $(kernelrelease) > .kernelrelease
- $(Q)echo " Building kernel $(kernelrelease)"

+ $(Q)rm -f $@
+ $(Q)echo $(kernelrelease) > $@




# Things we need to do before we recursively start building the kernel

@@ -899,7 +899,7 @@ define filechk_version.h
)
endef

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

# ---------------------------------------------------------------------------
@@ -1302,9 +1302,10 @@ checkstack:


$(PERL) $(src)/scripts/checkstack.pl $(ARCH)

kernelrelease:
- @echo $(KERNELRELEASE)
+ $(if $(wildcard .kernelrelease), $(Q)echo $(KERNELRELEASE), \
+ $(error kernelrelease not valid - run 'make *config' to update it))
kernelversion:

- @echo $(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)
+ @echo $(KERNELVERSION)

# FIXME Should go into a make.lib or something
# ===========================================================================
diff --git a/scripts/kconfig/confdata.c b/scripts/kconfig/confdata.c
index ccd4513..b0cbbe2 100644
--- a/scripts/kconfig/confdata.c
+++ b/scripts/kconfig/confdata.c
@@ -375,7 +375,7 @@ int conf_write(const char *name)
if (!out_h)
return 1;
}
- sym = sym_lookup("KERNELRELEASE", 0);
+ sym = sym_lookup("KERNELVERSION", 0);
sym_calc_value(sym);
time(&now);
env = getenv("KCONFIG_NOTIMESTAMP");
diff --git a/scripts/kconfig/gconf.c b/scripts/kconfig/gconf.c
index 9f5aabd..665bd53 100644
--- a/scripts/kconfig/gconf.c
+++ b/scripts/kconfig/gconf.c
@@ -276,7 +276,7 @@ void init_main_window(const gchar * glad
NULL);

sprintf(title, _("Linux Kernel v%s Configuration"),
- getenv("KERNELRELEASE"));
+ getenv("KERNELVERSION"));
gtk_window_set_title(GTK_WINDOW(main_wnd), title);

gtk_widget_show(main_wnd);
diff --git a/scripts/kconfig/mconf.c b/scripts/kconfig/mconf.c
index d63d7fb..7f97319 100644
--- a/scripts/kconfig/mconf.c
+++ b/scripts/kconfig/mconf.c
@@ -1051,7 +1051,7 @@ int main(int ac, char **av)
conf_parse(av[1]);
conf_read(NULL);

- sym = sym_lookup("KERNELRELEASE", 0);
+ sym = sym_lookup("KERNELVERSION", 0);
sym_calc_value(sym);
sprintf(menu_backtitle, _("Linux Kernel v%s Configuration"),
sym_get_string_value(sym));
diff --git a/scripts/kconfig/symbol.c b/scripts/kconfig/symbol.c
index 69c2549..3d7877a 100644
--- a/scripts/kconfig/symbol.c
+++ b/scripts/kconfig/symbol.c
@@ -61,10 +61,10 @@ void sym_init(void)
if (p)
sym_add_default(sym, p);

- sym = sym_lookup("KERNELRELEASE", 0);
+ sym = sym_lookup("KERNELVERSION", 0);
sym->type = S_STRING;
sym->flags |= SYMBOL_AUTO;
- p = getenv("KERNELRELEASE");
+ p = getenv("KERNELVERSION");
if (p)
sym_add_default(sym, p);

--
1.0.GIT

Frédéric L. W. Meunier

unread,
Jan 19, 2006, 1:40:17 PM1/19/06
to
Is this expected ?

$ cd /usr/local/src/kernel/linux-2.6.16
$ make O=/home/fredlwm/objdir/ oldconfig
...
make -C /usr/local/src/kernel/linux-2.6.16 O=/home/fredlwm/objdir .kernelrelease
Makefile:480: .config: No such file or directory

.config is in /home/fredlwm/objdir

.kernelrelease gets created in
/usr/local/src/kernel/linux-2.6.16 . I thought nothing would be
written to the sources directory. What if I were on a read-only
filesystem ?

I didn't try to build it. Are these harmless ?

--
How to contact me - http://www.pervalidus.net/contact.html

Sam Ravnborg

unread,
Jan 19, 2006, 2:00:08 PM1/19/06
to
On Thu, Jan 19, 2006 at 04:31:03PM -0200, Fr?d?ric L. W. Meunier wrote:
> Is this expected ?
>
> $ cd /usr/local/src/kernel/linux-2.6.16
> $ make O=/home/fredlwm/objdir/ oldconfig
> ...
> make -C /usr/local/src/kernel/linux-2.6.16 O=/home/fredlwm/objdir
> .kernelrelease
> Makefile:480: .config: No such file or directory
>
> .config is in /home/fredlwm/objdir
>
> .kernelrelease gets created in
> /usr/local/src/kernel/linux-2.6.16 . I thought nothing would be
> written to the sources directory. What if I were on a read-only
> filesystem ?
>
> I didn't try to build it. Are these harmless ?

This is a bug, I will post a simple patch shortly to fix it.

Sam

0 new messages