Commit aaebf433 authored by Ryan Anderson's avatar Ryan Anderson Committed by Sam Ravnborg

[PATCH] kbuild: automatically append a short string to the version based upon the git commit

If CONFIG_AUTO_LOCALVERSION is set, the user is using a git-based tree, and the
current HEAD is not referred to by any tags in .git/refs/tags/, append -g and
the first 8 characters of the commit to the version string.  This makes it
easier to use git-bisect, and/or to do a daily build, without trampling on your
older, working builds, or accidentally setting up conflicting sets of modules.
Signed-off-by: default avatarRyan Anderson <ryan@michonline.com>
Signed-off-by: default avatarSam Ravnborg <sam@ravnborg.org>
parent dbec4866
...@@ -548,6 +548,26 @@ export KBUILD_IMAGE ?= vmlinux ...@@ -548,6 +548,26 @@ export KBUILD_IMAGE ?= vmlinux
# images. Default is /boot, but you can set it to other values # images. Default is /boot, but you can set it to other values
export INSTALL_PATH ?= /boot export INSTALL_PATH ?= /boot
# If CONFIG_LOCALVERSION_AUTO is set, we automatically perform some tests
# and try to determine if the current source tree is a release tree, of any sort,
# or if is a pure development tree.
#
# A 'release tree' is any tree with a git TAG associated
# with it. The primary goal of this is to make it safe for a native
# git/CVS/SVN user to build a release tree (i.e, 2.6.9) and also to
# continue developing against the current Linus tree, without having the Linus
# tree overwrite the 2.6.9 tree when installed.
#
# Currently, only git is supported.
# Other SCMs can edit scripts/setlocalversion and add the appropriate
# checks as needed.
ifdef CONFIG_LOCALVERSION_AUTO
localversion-auto := $(shell $(PERL) $(srctree)/scripts/setlocalversion $(srctree))
LOCALVERSION := $(LOCALVERSION)$(localversion-auto)
endif
# #
# INSTALL_MOD_PATH specifies a prefix to MODLIB for module directory # INSTALL_MOD_PATH specifies a prefix to MODLIB for module directory
# relocations required by build roots. This is not defined in the # relocations required by build roots. This is not defined in the
......
...@@ -77,6 +77,22 @@ config LOCALVERSION ...@@ -77,6 +77,22 @@ config LOCALVERSION
object and source tree, in that order. Your total string can object and source tree, in that order. Your total string can
be a maximum of 64 characters. be a maximum of 64 characters.
config LOCALVERSION_AUTO
bool "Automatically append version information to the version string"
default y
help
This will try to automatically determine if the current tree is a
release tree by looking for git tags that
belong to the current top of tree revision.
A string of the format -gxxxxxxxx will be added to the localversion
if a git based tree is found. The string generated by this will be
appended after any matching localversion* files, and after the value
set in CONFIG_LOCALVERSION
Note: This requires Perl, and a git repository, but not necessarily
the git or cogito tools to be installed.
config SWAP config SWAP
bool "Support for paging of anonymous memory (swap)" bool "Support for paging of anonymous memory (swap)"
depends on MMU depends on MMU
......
#!/usr/bin/perl
# Copyright 2004 - Ryan Anderson <ryan@michonline.com> GPL v2
use strict;
use warnings;
use Digest::MD5;
require 5.006;
if (@ARGV != 1) {
print <<EOT;
Usage: setlocalversion <srctree>
EOT
exit(1);
}
my ($srctree) = @ARGV;
chdir($srctree);
my @LOCALVERSIONS = ();
# We are going to use the following commands to try and determine if this
# repository is at a Version boundary (i.e, 2.6.10 vs 2.6.10 + some patches) We
# currently assume that all meaningful version boundaries are marked by a tag.
# We don't care what the tag is, just that something exists.
# Git/Cogito store the top-of-tree "commit" in .git/HEAD
# A list of known tags sits in .git/refs/tags/
#
# The simple trick here is to just compare the two of these, and if we get a
# match, return nothing, otherwise, return a subset of the SHA-1 hash in
# .git/HEAD
sub do_git_checks {
open(H,"<.git/HEAD") or return;
my $head = <H>;
chomp $head;
close(H);
opendir(D,".git/refs/tags") or return;
foreach my $tagfile (grep !/^\.{1,2}$/, readdir(D)) {
open(F,"<.git/refs/tags/" . $tagfile) or return;
my $tag = <F>;
chomp $tag;
close(F);
return if ($tag eq $head);
}
closedir(D);
push @LOCALVERSIONS, "g" . substr($head,0,8);
}
if ( -d ".git") {
do_git_checks();
}
printf "-%s\n", join("-",@LOCALVERSIONS) if (scalar @LOCALVERSIONS > 0);
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment