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

Commit 09155120 authored by Michal Marek's avatar Michal Marek
Browse files

kbuild: Clean up and speed up the localversion logic



Now that we run scripts/setlocalversion during every build, it makes
sense to move all the localversion logic there. This cleans up the
toplevel Makefile and also makes sure that the script is called only
once in 'make prepare' (previously, it would be called every time due to
a variable expansion in an ifneq statement). No user-visible change is
intended, unless one runs the setlocalversion script directly.

Reported-by: default avatarDmitry Torokhov <dmitry.torokhov@gmail.com>
Cc: David Rientjes <rientjes@google.com>
Cc: Greg Thelen <gthelen@google.com>
Cc: Nico Schottelius <nico-linuxsetlocalversion@schottelius.org>
Signed-off-by: default avatarMichal Marek <mmarek@suse.cz>
parent fb994ecc
Loading
Loading
Loading
Loading
+3 −71
Original line number Original line Diff line number Diff line
@@ -883,80 +883,12 @@ PHONY += $(vmlinux-dirs)
$(vmlinux-dirs): prepare scripts
$(vmlinux-dirs): prepare scripts
	$(Q)$(MAKE) $(build)=$@
	$(Q)$(MAKE) $(build)=$@


# Build the kernel release string
#
# The KERNELRELEASE value built here is stored in the file
# include/config/kernel.release, and is used when executing several
# make targets, such as "make install" or "make modules_install."
#
# The eventual kernel release string consists of the following fields,
# shown in a hierarchical format to show how smaller parts are concatenated
# to form the larger and final value, with values coming from places like
# the Makefile, kernel config options, make command line options and/or
# SCM tag information.
#
#	$(KERNELVERSION)
#	  $(VERSION)			eg, 2
#	  $(PATCHLEVEL)			eg, 6
#	  $(SUBLEVEL)			eg, 18
#	  $(EXTRAVERSION)		eg, -rc6
#	$(localver-full)
#	  $(localver)
#	    localversion*		(files without backups, containing '~')
#	    $(CONFIG_LOCALVERSION)	(from kernel config setting)
#	  $(LOCALVERSION)		(from make command line, if provided)
#	  $(localver-extra)
#	    $(scm-identifier)		(unique SCM tag, if one exists)
#	      ./scripts/setlocalversion	(only with CONFIG_LOCALVERSION_AUTO)
#	      .scmversion		(only with CONFIG_LOCALVERSION_AUTO)
#	    +				(only without CONFIG_LOCALVERSION_AUTO
#					 and without LOCALVERSION= and
#					 repository is at non-tagged commit)
#
# For kernels without CONFIG_LOCALVERSION_AUTO compiled from an SCM that has
# been revised beyond a tagged commit, `+' is appended to the version string
# when not overridden by using "make LOCALVERSION=".  This indicates that the
# kernel is not a vanilla release version and has been modified.

pattern = ".*/localversion[^~]*"
string  = $(shell cat /dev/null \
	   `find $(objtree) $(srctree) -maxdepth 1 -regex $(pattern) | sort -u`)

localver = $(subst $(space),, $(string) \
			      $(patsubst "%",%,$(CONFIG_LOCALVERSION)))

# scripts/setlocalversion is called to create a unique identifier if the source
# is managed by a known SCM and the repository has been revised since the last
# tagged (release) commit.  The format of the identifier is determined by the
# SCM's implementation.
#
# .scmversion is used when generating rpm packages so we do not loose
# the version information from the SCM when we do the build of the kernel
# from the copied source
ifeq ($(wildcard .scmversion),)
        scm-identifier = $(shell $(CONFIG_SHELL) \
                         $(srctree)/scripts/setlocalversion $(srctree))
else
        scm-identifier = $(shell cat .scmversion 2> /dev/null)
endif

ifdef CONFIG_LOCALVERSION_AUTO
	localver-extra = $(scm-identifier)
else
	ifneq ($(scm-identifier),)
		ifeq ($(LOCALVERSION),)
			localver-extra = +
		endif
	endif
endif

localver-full = $(localver)$(LOCALVERSION)$(localver-extra)

# Store (new) KERNELRELASE string in include/config/kernel.release
# Store (new) KERNELRELASE string in include/config/kernel.release
kernelrelease = $(KERNELVERSION)$(localver-full)
localversion = $(shell $(CONFIG_SHELL) \
	       $(srctree)/scripts/setlocalversion $(srctree))
include/config/kernel.release: include/config/auto.conf FORCE
include/config/kernel.release: include/config/auto.conf FORCE
	$(Q)rm -f $@
	$(Q)rm -f $@
	$(Q)echo $(kernelrelease) > $@
	$(Q)echo $(KERNELVERSION)$(localversion) > $@




# Things we need to do before we recursively start building the kernel
# Things we need to do before we recursively start building the kernel
+1 −1
Original line number Original line Diff line number Diff line
@@ -44,7 +44,7 @@ rpm-pkg rpm: $(objtree)/kernel.spec FORCE
	fi
	fi
	$(MAKE) clean
	$(MAKE) clean
	$(PREV) ln -sf $(srctree) $(KERNELPATH)
	$(PREV) ln -sf $(srctree) $(KERNELPATH)
	$(CONFIG_SHELL) $(srctree)/scripts/setlocalversion > $(objtree)/.scmversion
	$(CONFIG_SHELL) $(srctree)/scripts/setlocalversion --scm-only > $(objtree)/.scmversion
	$(PREV) tar -cz $(RCS_TAR_IGNORE) -f $(KERNELPATH).tar.gz $(KERNELPATH)/.
	$(PREV) tar -cz $(RCS_TAR_IGNORE) -f $(KERNELPATH).tar.gz $(KERNELPATH)/.
	$(PREV) rm $(KERNELPATH)
	$(PREV) rm $(KERNELPATH)
	rm -f $(objtree)/.scmversion
	rm -f $(objtree)/.scmversion
+132 −47
Original line number Original line Diff line number Diff line
@@ -10,21 +10,52 @@
#
#


usage() {
usage() {
	echo "Usage: $0 [srctree]" >&2
	echo "Usage: $0 [--scm-only] [srctree]" >&2
	exit 1
	exit 1
}
}


cd "${1:-.}" || usage
scm_only=false
srctree=.
if test "$1" = "--scm-only"; then
	scm_only=true
	shift
fi
if test $# -gt 0; then
	srctree=$1
	shift
fi
if test $# -gt 0 -o ! -d "$srctree"; then
	usage
fi

scm_version()
{
	local short=false

	cd "$srctree"
	if test -e .scmversion; then
		cat "$_"
		return
	fi
	if test "$1" = "--short"; then
		short=true
	fi


	# Check for git and a git repo.
	# Check for git and a git repo.
	if head=`git rev-parse --verify --short HEAD 2>/dev/null`; then
	if head=`git rev-parse --verify --short HEAD 2>/dev/null`; then


	# If we are at a tagged commit (like "v2.6.30-rc6"), we ignore it,
		# If we are at a tagged commit (like "v2.6.30-rc6"), we ignore
	# because this version is defined in the top level Makefile.
		# it, because this version is defined in the top level Makefile.
		if [ -z "`git describe --exact-match 2>/dev/null`" ]; then
		if [ -z "`git describe --exact-match 2>/dev/null`" ]; then


		# If we are past a tagged commit (like "v2.6.30-rc5-302-g72357d5"),
			# If only the short version is requested, don't bother
		# we pretty print it.
			# running further git commands
			if $short; then
				echo "+"
				return
			fi
			# If we are past a tagged commit (like
			# "v2.6.30-rc5-302-g72357d5"), we pretty print it.
			if atag="`git describe 2>/dev/null`"; then
			if atag="`git describe 2>/dev/null`"; then
				echo "$atag" | awk -F- '{printf("-%05d-%s", $(NF-1),$(NF))}'
				echo "$atag" | awk -F- '{printf("-%05d-%s", $(NF-1),$(NF))}'


@@ -49,7 +80,7 @@ if head=`git rev-parse --verify --short HEAD 2>/dev/null`; then
		fi
		fi


		# All done with git
		# All done with git
	exit
		return
	fi
	fi


	# Check for mercurial and a mercurial repo.
	# Check for mercurial and a mercurial repo.
@@ -69,7 +100,7 @@ if hgid=`hg id 2>/dev/null`; then
		esac
		esac


		# All done with mercurial
		# All done with mercurial
	exit
		return
	fi
	fi


	# Check for svn and a svn repo.
	# Check for svn and a svn repo.
@@ -78,5 +109,59 @@ if rev=`svn info 2>/dev/null | grep '^Last Changed Rev'`; then
		printf -- '-svn%s' "$rev"
		printf -- '-svn%s' "$rev"


		# All done with svn
		# All done with svn
		return
	fi
}

collect_files()
{
	local file res

	for file; do
		case "$file" in
		*\~*)
			continue
			;;
		esac
		if test -e "$file"; then
			res="$res$(cat "$file")"
		fi
	done
	echo "$res"
}

if $scm_only; then
	scm_version
	exit
	exit
fi
fi

if test -e include/config/auto.conf; then
	source "$_"
else
	echo "Error: kernelrelease not valid - run 'make prepare' to update it"
	exit 1
fi

# localversion* files in the build and source directory
res="$(collect_files localversion*)"
if test ! "$srctree" -ef .; then
	res="$res$(collect_files "$srctree"/localversion*)"
fi

# CONFIG_LOCALVERSION and LOCALVERSION (if set)
res="${res}${CONFIG_LOCALVERSION}${LOCALVERSION}"

# scm version string if not at a tagged commit
if test "$CONFIG_LOCALVERSION_AUTO" = "y"; then
	# full scm version string
	res="$res$(scm_version)"
else
	# apped a plus sign if the repository is not in a clean tagged
	# state and  LOCALVERSION= is not specified
	if test "${LOCALVERSION+set}" != "set"; then
		scm=$(scm_version --short)
		res="$res${scm:++}"
	fi
fi

echo "$res"