* [PATCH] Makefile: localversion fix (was: [2.6.16-rc6] CONFIG_LOCALVERSION_AUTO)
2006-03-15 4:47 [2.6.16-rc6] CONFIG_LOCALVERSION_AUTO Mathis Ahrens
@ 2006-03-16 20:20 ` Mathis Ahrens
2006-03-16 20:34 ` [2.6.16-rc6] CONFIG_LOCALVERSION_AUTO Sam Ravnborg
1 sibling, 0 replies; 4+ messages in thread
From: Mathis Ahrens @ 2006-03-16 20:20 UTC (permalink / raw)
To: linux-kernel; +Cc: Sam Ravnborg
Mathis Ahrens wrote:
> 1.
> Semantics of LOCALVERSION are confusing and probably buggy.
> The Makefile states:
>
> # Take the contents of any files called localversion* and the config
> # variable CONFIG_LOCALVERSION and append them to KERNELRELEASE.
> # LOCALVERSION from the command line override all of this
>
> whereas my simplified view of current code is:
>
> version = major + minor + patch + extra
> release = version + localver-full
> localver-full = localver + localver-auto
> localver = <concat all localversions*> + $CONFIG_LOCALVERSION
> localver-auto = $LOCALVERSION + <some -gxxxxxx>
>
> LOCALVERSION does not seem to /override/ anything if specified on the
> command line, but rather (with CONFIG_LOCALVERSION_AUTO=y) gets
> /inserted/.
>
> Also, with CONFIG_LOCALVERSION_AUTO=n, specifying LOCALVERSION
> on the command line currently does nothing at all. This is a regression
> from 2.6.15, I suppose.
>
Hmm, no comments on this?
I am not sure if different behaviour is desired, but here goes my proposal:
From: Mathis Ahrens <Mathis.Ahrens@gmx.de>
Fix Makefile to honor LOCALVERSION if specified on the command line.
Make it then replace any other localversions from files, CONFIG_LOCALVERSION
or CONFIG_LOCALVERSION_AUTO.
Signed-off-by: Mathis Ahrens <Mathis.Ahrens@gmx.de>
--- linux/Makefile.orig 2006-03-15 01:49:26.000000000 +0100
+++ linux/Makefile 2006-03-16 18:10:38.000000000 +0100
@@ -760,22 +760,27 @@ $(vmlinux-dirs): prepare scripts
# The KERNELRELEASE is stored in a file named .kernelrelease
# to be used when executing for example make install or make
modules_install
#
-# Take the contents of any files called localversion* and the config
-# variable CONFIG_LOCALVERSION and append them to KERNELRELEASE.
-# LOCALVERSION from the command line override all of this
+# If LOCALVERSION from the command line is not empty, that is
+# appended to the KERNELRELEASE.
+#
+# Else we append in that order
+# - the contents of any files called localversion*
+# - the config variable CONFIG_LOCALVERSION
+# - if CONFIG_LOCALVERSION_AUTO is set, another scm-specific string
nullstring :=
space := $(nullstring) # end of line
-___localver = $(objtree)/localversion* $(srctree)/localversion*
-__localver = $(sort $(wildcard $(___localver)))
+__localver-filelist = $(objtree)/localversion* $(srctree)/localversion*
+_localver-filelist = $(sort $(wildcard $(__localver-filelist)))
# skip backup files (containing '~')
-_localver = $(foreach f, $(__localver), $(if $(findstring ~, $(f)),,$(f)))
+localver-filelist = $(foreach f, $(_localver-filelist), \
+ $(if $(findstring ~, $(f)),,$(f)))
+
+localver-files = $(subst $(space),, $(shell cat /dev/null
$(localver-filelist)))
+localver-conf = $(subst $(space),, $(patsubst
"%",%,$(CONFIG_LOCALVERSION)))
+
-localver = $(subst $(space),, \
- $(shell cat /dev/null $(_localver)) \
- $(patsubst "%",%,$(CONFIG_LOCALVERSION)))
-
# If CONFIG_LOCALVERSION_AUTO is set scripts/setlocalversion is called
# and if the SCM is know a tag from the SCM is appended.
# The appended tag is determinded by the SCM used.
@@ -784,12 +789,15 @@ localver = $(subst $(space),, \
# Other SCMs can edit scripts/setlocalversion and add the appropriate
# checks as needed.
ifdef CONFIG_LOCALVERSION_AUTO
- _localver-auto = $(shell $(CONFIG_SHELL) \
+ localver-auto = $(shell $(CONFIG_SHELL) \
$(srctree)/scripts/setlocalversion $(srctree))
- localver-auto = $(LOCALVERSION)$(_localver-auto)
endif
-localver-full = $(localver)$(localver-auto)
+ifeq ($(LOCALVERSION),)
+ localver-full = $(localver-files)$(localver-conf)$(localver-auto)
+else
+ localver-full = $(subst $(space),, $(LOCALVERSION))
+endif
# Store (new) KERNELRELASE string in .kernelrelease
kernelrelease = $(KERNELVERSION)$(localver-full)
^ permalink raw reply [flat|nested] 4+ messages in thread* Re: [2.6.16-rc6] CONFIG_LOCALVERSION_AUTO
2006-03-15 4:47 [2.6.16-rc6] CONFIG_LOCALVERSION_AUTO Mathis Ahrens
2006-03-16 20:20 ` [PATCH] Makefile: localversion fix (was: [2.6.16-rc6] CONFIG_LOCALVERSION_AUTO) Mathis Ahrens
@ 2006-03-16 20:34 ` Sam Ravnborg
2006-03-16 23:49 ` Mathis Ahrens
1 sibling, 1 reply; 4+ messages in thread
From: Sam Ravnborg @ 2006-03-16 20:34 UTC (permalink / raw)
To: Mathis Ahrens; +Cc: linux-kernel
On Wed, Mar 15, 2006 at 05:47:51AM +0100, Mathis Ahrens wrote:
>
> Hi all,
>
> i just discovered this cute little feature, but had three
> minor issues while experimenting with it on 2.6.16-rc6:
>
> 1.
> Semantics of LOCALVERSION are confusing and probably buggy.
> The Makefile states:
>
> # Take the contents of any files called localversion* and the config
> # variable CONFIG_LOCALVERSION and append them to KERNELRELEASE.
> # LOCALVERSION from the command line override all of this
>
> whereas my simplified view of current code is:
>
> version = major + minor + patch + extra
> release = version + localver-full
> localver-full = localver + localver-auto
> localver = <concat all localversions*> + $CONFIG_LOCALVERSION
> localver-auto = $LOCALVERSION + <some -gxxxxxx>
>
> LOCALVERSION does not seem to /override/ anything if specified on the
> command line, but rather (with CONFIG_LOCALVERSION_AUTO=y) gets
> /inserted/.
>
> Also, with CONFIG_LOCALVERSION_AUTO=n, specifying LOCALVERSION
> on the command line currently does nothing at all. This is a regression
> from 2.6.15, I suppose.
This is a bug.
I will fix that for 2.6.17.
> 2.
> "make kernelrelease" does not imply "make .kernelrelease", it only
> does cat the file .kernelrelease (or shows an error if it's not there).
>
> This leads to the following IMHO slightly irritating behaviour
> $ echo "LV1" > localversion
> $ make kernelrelease
> 2.6.16-rc6LV1
> $ echo "LV2" > localversion
> $ make kernelrelease
> 2.6.16-rc6LV1
>
> Is there a reason for this?
make kernelrelase shall work in both a read-only environment and shall
avoid modifying files when run as another user.
So the simple measure was to error out only if .kernelrelease was
missing.
The trick here seems to print $(KERNELVERSION)$(localver-full)
but only if .kernelrelease is present.
On the other hand if .kernelrelase and $(KERNELVERSION)$(localver-full)
differ then what to print.
The kernelrelease of the kernel or how it is configured?
echo -sam > locelversion does NOT change the kernel.
The kernelrealse of the kernel is only changed after running 'make'.
And this is what we want to see - the kernelrelase of the kernel, not
what happes to be stored in a file after the kernel was compiled.
>
> 3.
> The help of CONFIG_LOCALVERSION_AUTO reads:
>
> Note: This requires Perl, and a git repository, but not necessarily
> the git or cogito tools to be installed.
>
> Looking at scripts/setlocalversion, this does not seem to be correct
> anymore.
Thanks. Will be fixed.
Sam
^ permalink raw reply [flat|nested] 4+ messages in thread