Commit aaebf4332018980fef4e601d1b5a6e52dd9e9ae4

Authored by Ryan Anderson
Committed by Sam Ravnborg
1 parent dbec486632

[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: Ryan Anderson <ryan@michonline.com>
Signed-off-by: Sam Ravnborg <sam@ravnborg.org>

Showing 3 changed files with 92 additions and 0 deletions Side-by-side Diff

... ... @@ -548,6 +548,26 @@
548 548 # images. Default is /boot, but you can set it to other values
549 549 export INSTALL_PATH ?= /boot
550 550  
  551 +# If CONFIG_LOCALVERSION_AUTO is set, we automatically perform some tests
  552 +# and try to determine if the current source tree is a release tree, of any sort,
  553 +# or if is a pure development tree.
  554 +#
  555 +# A 'release tree' is any tree with a git TAG associated
  556 +# with it. The primary goal of this is to make it safe for a native
  557 +# git/CVS/SVN user to build a release tree (i.e, 2.6.9) and also to
  558 +# continue developing against the current Linus tree, without having the Linus
  559 +# tree overwrite the 2.6.9 tree when installed.
  560 +#
  561 +# Currently, only git is supported.
  562 +# Other SCMs can edit scripts/setlocalversion and add the appropriate
  563 +# checks as needed.
  564 +
  565 +
  566 +ifdef CONFIG_LOCALVERSION_AUTO
  567 + localversion-auto := $(shell $(PERL) $(srctree)/scripts/setlocalversion $(srctree))
  568 + LOCALVERSION := $(LOCALVERSION)$(localversion-auto)
  569 +endif
  570 +
551 571 #
552 572 # INSTALL_MOD_PATH specifies a prefix to MODLIB for module directory
553 573 # relocations required by build roots. This is not defined in the
... ... @@ -77,6 +77,22 @@
77 77 object and source tree, in that order. Your total string can
78 78 be a maximum of 64 characters.
79 79  
  80 +config LOCALVERSION_AUTO
  81 + bool "Automatically append version information to the version string"
  82 + default y
  83 + help
  84 + This will try to automatically determine if the current tree is a
  85 + release tree by looking for git tags that
  86 + belong to the current top of tree revision.
  87 +
  88 + A string of the format -gxxxxxxxx will be added to the localversion
  89 + if a git based tree is found. The string generated by this will be
  90 + appended after any matching localversion* files, and after the value
  91 + set in CONFIG_LOCALVERSION
  92 +
  93 + Note: This requires Perl, and a git repository, but not necessarily
  94 + the git or cogito tools to be installed.
  95 +
80 96 config SWAP
81 97 bool "Support for paging of anonymous memory (swap)"
82 98 depends on MMU
scripts/setlocalversion
  1 +#!/usr/bin/perl
  2 +# Copyright 2004 - Ryan Anderson <ryan@michonline.com> GPL v2
  3 +
  4 +use strict;
  5 +use warnings;
  6 +use Digest::MD5;
  7 +require 5.006;
  8 +
  9 +if (@ARGV != 1) {
  10 + print <<EOT;
  11 +Usage: setlocalversion <srctree>
  12 +EOT
  13 + exit(1);
  14 +}
  15 +
  16 +my ($srctree) = @ARGV;
  17 +chdir($srctree);
  18 +
  19 +my @LOCALVERSIONS = ();
  20 +
  21 +# We are going to use the following commands to try and determine if this
  22 +# repository is at a Version boundary (i.e, 2.6.10 vs 2.6.10 + some patches) We
  23 +# currently assume that all meaningful version boundaries are marked by a tag.
  24 +# We don't care what the tag is, just that something exists.
  25 +
  26 +# Git/Cogito store the top-of-tree "commit" in .git/HEAD
  27 +# A list of known tags sits in .git/refs/tags/
  28 +#
  29 +# The simple trick here is to just compare the two of these, and if we get a
  30 +# match, return nothing, otherwise, return a subset of the SHA-1 hash in
  31 +# .git/HEAD
  32 +
  33 +sub do_git_checks {
  34 + open(H,"<.git/HEAD") or return;
  35 + my $head = <H>;
  36 + chomp $head;
  37 + close(H);
  38 +
  39 + opendir(D,".git/refs/tags") or return;
  40 + foreach my $tagfile (grep !/^\.{1,2}$/, readdir(D)) {
  41 + open(F,"<.git/refs/tags/" . $tagfile) or return;
  42 + my $tag = <F>;
  43 + chomp $tag;
  44 + close(F);
  45 + return if ($tag eq $head);
  46 + }
  47 + closedir(D);
  48 +
  49 + push @LOCALVERSIONS, "g" . substr($head,0,8);
  50 +}
  51 +
  52 +if ( -d ".git") {
  53 + do_git_checks();
  54 +}
  55 +
  56 +printf "-%s\n", join("-",@LOCALVERSIONS) if (scalar @LOCALVERSIONS > 0);