Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[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>

authored by

Ryan Anderson and committed by
Sam Ravnborg
aaebf433 dbec4866

+92
+20
Makefile
··· 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
+16
init/Kconfig
··· 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
+56
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);