Commit aaebf4332018980fef4e601d1b5a6e52dd9e9ae4
Committed by
Sam Ravnborg
1 parent
dbec486632
Exists in
master
and in
39 other branches
[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
Makefile
... | ... | @@ -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 |
init/Kconfig
... | ... | @@ -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); |