diff options
| -rw-r--r-- | CMake/GetGitRevisionDescription.cmake | 130 | ||||
| -rw-r--r-- | CMake/GetGitRevisionDescription.cmake.in | 38 | ||||
| -rw-r--r-- | CMakeLists.txt | 5 | ||||
| -rw-r--r-- | lib/internal.h | 2 | ||||
| -rw-r--r-- | lib/library.c | 12 | ||||
| -rw-r--r-- | lib/renderers/curses/curses.c | 2 | ||||
| -rw-r--r-- | lib/renderers/wayland/wayland.c | 2 | ||||
| -rw-r--r-- | lib/version.h.in | 1 | 
8 files changed, 184 insertions, 8 deletions
diff --git a/CMake/GetGitRevisionDescription.cmake b/CMake/GetGitRevisionDescription.cmake new file mode 100644 index 0000000..c8d27f2 --- /dev/null +++ b/CMake/GetGitRevisionDescription.cmake @@ -0,0 +1,130 @@ +# - Returns a version string from Git +# +# These functions force a re-configure on each git commit so that you can +# trust the values of the variables in your build system. +# +#  get_git_head_revision(<refspecvar> <hashvar> [<additional arguments to git describe> ...]) +# +# Returns the refspec and sha hash of the current head revision +# +#  git_describe(<var> [<additional arguments to git describe> ...]) +# +# Returns the results of git describe on the source tree, and adjusting +# the output so that it tests false if an error occurs. +# +#  git_get_exact_tag(<var> [<additional arguments to git describe> ...]) +# +# Returns the results of git describe --exact-match on the source tree, +# and adjusting the output so that it tests false if there was no exact +# matching tag. +# +# Requires CMake 2.6 or newer (uses the 'function' command) +# +# Original Author: +# 2009-2010 Ryan Pavlik <rpavlik@iastate.edu> <abiryan@ryand.net> +# http://academic.cleardefinition.com +# Iowa State University HCI Graduate Program/VRAC +# +# Copyright Iowa State University 2009-2010. +# Distributed under the Boost Software License, Version 1.0. +# (See accompanying file LICENSE_1_0.txt or copy at +# http://www.boost.org/LICENSE_1_0.txt) + +if(__get_git_revision_description) +	return() +endif() +set(__get_git_revision_description YES) + +# We must run the following at "include" time, not at function call time, +# to find the path to this module rather than the path to a calling list file +get_filename_component(_gitdescmoddir ${CMAKE_CURRENT_LIST_FILE} PATH) + +function(get_git_head_revision _refspecvar _hashvar) +	set(GIT_PARENT_DIR "${CMAKE_CURRENT_SOURCE_DIR}") +	set(GIT_DIR "${GIT_PARENT_DIR}/.git") +	while(NOT EXISTS "${GIT_DIR}")	# .git dir not found, search parent directories +		set(GIT_PREVIOUS_PARENT "${GIT_PARENT_DIR}") +		get_filename_component(GIT_PARENT_DIR ${GIT_PARENT_DIR} PATH) +		if(GIT_PARENT_DIR STREQUAL GIT_PREVIOUS_PARENT) +			# We have reached the root directory, we are not in git +			set(${_refspecvar} "GITDIR-NOTFOUND" PARENT_SCOPE) +			set(${_hashvar} "GITDIR-NOTFOUND" PARENT_SCOPE) +			return() +		endif() +		set(GIT_DIR "${GIT_PARENT_DIR}/.git") +	endwhile() +	# check if this is a submodule +	if(NOT IS_DIRECTORY ${GIT_DIR}) +		file(READ ${GIT_DIR} submodule) +		string(REGEX REPLACE "gitdir: (.*)\n$" "\\1" GIT_DIR_RELATIVE ${submodule}) +		get_filename_component(SUBMODULE_DIR ${GIT_DIR} PATH) +		get_filename_component(GIT_DIR ${SUBMODULE_DIR}/${GIT_DIR_RELATIVE} ABSOLUTE) +	endif() +	set(GIT_DATA "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/git-data") +	if(NOT EXISTS "${GIT_DATA}") +		file(MAKE_DIRECTORY "${GIT_DATA}") +	endif() + +	if(NOT EXISTS "${GIT_DIR}/HEAD") +		return() +	endif() +	set(HEAD_FILE "${GIT_DATA}/HEAD") +	configure_file("${GIT_DIR}/HEAD" "${HEAD_FILE}" COPYONLY) + +	configure_file("${_gitdescmoddir}/GetGitRevisionDescription.cmake.in" +		"${GIT_DATA}/grabRef.cmake" +		@ONLY) +	include("${GIT_DATA}/grabRef.cmake") + +	set(${_refspecvar} "${HEAD_REF}" PARENT_SCOPE) +	set(${_hashvar} "${HEAD_HASH}" PARENT_SCOPE) +endfunction() + +function(git_describe _var) +	if(NOT GIT_FOUND) +		find_package(Git QUIET) +	endif() +	get_git_head_revision(refspec hash) +	if(NOT GIT_FOUND) +		set(${_var} "GIT-NOTFOUND" PARENT_SCOPE) +		return() +	endif() +	if(NOT hash) +		set(${_var} "HEAD-HASH-NOTFOUND" PARENT_SCOPE) +		return() +	endif() + +	# TODO sanitize +	#if((${ARGN}" MATCHES "&&") OR +	#	(ARGN MATCHES "||") OR +	#	(ARGN MATCHES "\\;")) +	#	message("Please report the following error to the project!") +	#	message(FATAL_ERROR "Looks like someone's doing something nefarious with git_describe! Passed arguments ${ARGN}") +	#endif() + +	#message(STATUS "Arguments to execute_process: ${ARGN}") + +	execute_process(COMMAND +		"${GIT_EXECUTABLE}" +		describe +		${hash} +		${ARGN} +		WORKING_DIRECTORY +		"${CMAKE_SOURCE_DIR}" +		RESULT_VARIABLE +		res +		OUTPUT_VARIABLE +		out +		ERROR_QUIET +		OUTPUT_STRIP_TRAILING_WHITESPACE) +	if(NOT res EQUAL 0) +		set(out "${out}-${res}-NOTFOUND") +	endif() + +	set(${_var} "${out}" PARENT_SCOPE) +endfunction() + +function(git_get_exact_tag _var) +	git_describe(out --exact-match ${ARGN}) +	set(${_var} "${out}" PARENT_SCOPE) +endfunction() diff --git a/CMake/GetGitRevisionDescription.cmake.in b/CMake/GetGitRevisionDescription.cmake.in new file mode 100644 index 0000000..888ce13 --- /dev/null +++ b/CMake/GetGitRevisionDescription.cmake.in @@ -0,0 +1,38 @@ +#  +# Internal file for GetGitRevisionDescription.cmake +# +# Requires CMake 2.6 or newer (uses the 'function' command) +# +# Original Author: +# 2009-2010 Ryan Pavlik <rpavlik@iastate.edu> <abiryan@ryand.net> +# http://academic.cleardefinition.com +# Iowa State University HCI Graduate Program/VRAC +# +# Copyright Iowa State University 2009-2010. +# Distributed under the Boost Software License, Version 1.0. +# (See accompanying file LICENSE_1_0.txt or copy at +# http://www.boost.org/LICENSE_1_0.txt) + +set(HEAD_HASH) + +file(READ "@HEAD_FILE@" HEAD_CONTENTS LIMIT 1024) + +string(STRIP "${HEAD_CONTENTS}" HEAD_CONTENTS) +if(HEAD_CONTENTS MATCHES "ref") +	# named branch +	string(REPLACE "ref: " "" HEAD_REF "${HEAD_CONTENTS}") +	if(EXISTS "@GIT_DIR@/${HEAD_REF}") +		configure_file("@GIT_DIR@/${HEAD_REF}" "@GIT_DATA@/head-ref" COPYONLY) +	elseif(EXISTS "@GIT_DIR@/logs/${HEAD_REF}") +		configure_file("@GIT_DIR@/logs/${HEAD_REF}" "@GIT_DATA@/head-ref" COPYONLY) +		set(HEAD_HASH "${HEAD_REF}") +	endif() +else() +	# detached HEAD +	configure_file("@GIT_DIR@/HEAD" "@GIT_DATA@/head-ref" COPYONLY) +endif() + +if(NOT HEAD_HASH) +	file(READ "@GIT_DATA@/head-ref" HEAD_HASH LIMIT 1024) +	string(STRIP "${HEAD_HASH}" HEAD_HASH) +endif() diff --git a/CMakeLists.txt b/CMakeLists.txt index 86f8b2e..db40db7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,11 +1,14 @@  CMAKE_MINIMUM_REQUIRED(VERSION 2.8)  PROJECT(bemenu) -INCLUDE(CTest)  SET(BEMENU_NAME "bemenu")  SET(BEMENU_DESCRIPTION "Dynamic menu library and client program inspired by dmenu")  SET(BEMENU_VERSION "1.0.0")  SET(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${bemenu_SOURCE_DIR}/CMake) +INCLUDE(CTest) +INCLUDE(GetGitRevisionDescription) +get_git_head_revision(GIT_REFSPEC GIT_SHA1) +  # C99  ADD_DEFINITIONS(-std=c99) diff --git a/lib/internal.h b/lib/internal.h index fe392a1..6613cef 100644 --- a/lib/internal.h +++ b/lib/internal.h @@ -73,7 +73,7 @@ struct render_api {      /**       * Version of the plugin. -     * Should match BM_VERSION or failure. +     * Should match BM_PLUGIN_VERSION or failure.       */      const char *version; diff --git a/lib/library.c b/lib/library.c index c7f5e60..7fca099 100644 --- a/lib/library.c +++ b/lib/library.c @@ -34,24 +34,28 @@ load(const char *file, struct bm_renderer *renderer)      const char* (*regfun)(struct render_api*);      if (!(regfun = chckDlLoadSymbol(handle, "register_renderer", &error))) -        goto fail; +        goto load_fail;      const char *name;      if (!(name = regfun(&renderer->api)))          goto fail; -    if (strcmp(renderer->api.version, BM_VERSION)) -        goto fail; +    if (strcmp(renderer->api.version, BM_PLUGIN_VERSION)) +        goto mismatch_fail;      renderer->handle = handle;      renderer->name = bm_strdup(name);      renderer->file = bm_strdup(file);      return true; +load_fail: +    fprintf(stderr, "%s\n", error); +    goto fail; +mismatch_fail: +    fprintf(stderr, "%s: version mismatch (%s != %s)\n", name, renderer->api.version, BM_PLUGIN_VERSION);  fail:      if (handle)          chckDlUnload(handle); -    fprintf(stderr, "%s\n", error);      return false;  } diff --git a/lib/renderers/curses/curses.c b/lib/renderers/curses/curses.c index 42212b6..c40e833 100644 --- a/lib/renderers/curses/curses.c +++ b/lib/renderers/curses/curses.c @@ -343,7 +343,7 @@ register_renderer(struct render_api *api)      api->poll_key = poll_key;      api->render = render;      api->prioritory = BM_PRIO_TERMINAL; -    api->version = BM_VERSION; +    api->version = BM_PLUGIN_VERSION;      return "curses";  } diff --git a/lib/renderers/wayland/wayland.c b/lib/renderers/wayland/wayland.c index 289fa5a..0d5fcde 100644 --- a/lib/renderers/wayland/wayland.c +++ b/lib/renderers/wayland/wayland.c @@ -144,7 +144,7 @@ register_renderer(struct render_api *api)      api->poll_key = poll_key;      api->render = render;      api->prioritory = BM_PRIO_GUI; -    api->version = BM_VERSION; +    api->version = BM_PLUGIN_VERSION;      return "wayland";  } diff --git a/lib/version.h.in b/lib/version.h.in index ad82a1a..a6b287c 100644 --- a/lib/version.h.in +++ b/lib/version.h.in @@ -1,4 +1,5 @@  #define INSTALL_PREFIX "@CMAKE_INSTALL_PREFIX@"  #define BM_VERSION "@BEMENU_VERSION@" +#define BM_PLUGIN_VERSION "@BEMENU_VERSION@-@GIT_SHA1@"  /* vim: set ts=8 sw=4 tw=0 :*/  | 
