Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

[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
Loading
Loading
Loading
Loading
+20 −0
Original line number Original line Diff line number Diff line
@@ -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
+16 −0
Original line number Original line Diff line number Diff line
@@ -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
+56 −0
Original line number Original line Diff line number Diff line
#!/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);