hopefully version stuff is now run properly on every make...
--- a/CMakeLists.txt Thu Jan 15 21:33:54 2009 +0200
+++ b/CMakeLists.txt Fri Jan 16 00:42:02 2009 +0200
@@ -24,11 +24,8 @@
set(CMAKE_BUILD_TYPE Release CACHE STRING "Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel." FORCE)
endif(NOT CMAKE_BUILD_TYPE)
-# include cmake stuff
-include ("cmake/FindVersion.cmake")
-
-# Determine PROJECT_VERSION
-FindProjectVersion ("${CMAKE_SOURCE_DIR}")
+# Compile-time version script
+include ("cmake/BuildVersion.cmake")
# skip source code definitions if just building docs
if (NOT KG_DOC_ONLY)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/cmake/BuildVersion.cmake Fri Jan 16 00:42:02 2009 +0200
@@ -0,0 +1,13 @@
+#
+# Run a cmake script to update version info on every build
+#
+ADD_CUSTOM_COMMAND (
+ OUTPUT "src/version.c"
+ COMMAND ${CMAKE_COMMAND} -DOUTPUT_PATH="${CMAKE_BINARY_DIR}/src/version.c" -P ${CMAKE_SOURCE_DIR}/cmake/VersionScript.cmake
+ WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
+)
+
+ADD_CUSTOM_TARGET (version_info ALL DEPENDS "src/version.c")
+
+MESSAGE (STATUS "Added custom command for src/version.c output")
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/cmake/FindTimestamp.cmake Fri Jan 16 00:42:02 2009 +0200
@@ -0,0 +1,14 @@
+#
+# Function to get current timestamp.
+#
+# Sets PROJECT_BUILD_TIMESTAMP var
+#
+function (FindBuildTimestamp)
+ EXECUTE_PROCESS (
+ COMMAND date --rfc-2822
+ OUTPUT_VARIABLE timestamp_now
+ OUTPUT_STRIP_TRAILING_WHITESPACE
+ )
+
+ SET (PROJECT_BUILD_TIMESTAMP "${timestamp_now}" PARENT_SCOPE)
+endfunction (FindBuildTimestamp)
--- a/cmake/FindVersion.cmake Thu Jan 15 21:33:54 2009 +0200
+++ b/cmake/FindVersion.cmake Fri Jan 16 00:42:02 2009 +0200
@@ -4,45 +4,48 @@
# this will set PROJECT_VERSION to a string
#
FUNCTION (FindProjectVersion project_path)
- # XXX: only support mercurial for now
-
- MESSAGE (STATUS "project_path=${project_path}")
-
- # first, determine tag
- EXECUTE_PROCESS (
- COMMAND hg identify --tag
- WORKING_DIRECTORY "${project_path}"
- RESULT_VARIABLE hg_error_code
- OUTPUT_VARIABLE hg_tag
- OUTPUT_STRIP_TRAILING_WHITESPACE
- )
-
- if (hg_error_code)
- MESSAGE (FATAL_ERROR "`hg identify --tag` failed")
- endif (hg_error_code)
-
- # if tag is other than tip, use that
- if ("${hg_tag}" STREQUAL "tip")
- # use the revision hash
+ # Mercurial
+ if (EXISTS ${project_path}/.hg)
+ # first, determine tag
EXECUTE_PROCESS (
- COMMAND hg identify --id
+ COMMAND hg identify --tag
WORKING_DIRECTORY "${project_path}"
RESULT_VARIABLE hg_error_code
- OUTPUT_VARIABLE hg_id
+ OUTPUT_VARIABLE hg_tag
OUTPUT_STRIP_TRAILING_WHITESPACE
)
-
+
if (hg_error_code)
- MESSAGE (FATAL_ERROR "`hg identify --id` failed")
+ MESSAGE (FATAL_ERROR "`hg identify --tag` failed")
endif (hg_error_code)
- SET (PROJECT_VERSION "${hg_id}" PARENT_SCOPE)
- MESSAGE (STATUS "Version: mercurial tip id: ${hg_id}")
+ # if tag is other than tip, use that
+ if ("${hg_tag}" STREQUAL "tip")
+ # use the revision hash
+ EXECUTE_PROCESS (
+ COMMAND hg identify --id
+ WORKING_DIRECTORY "${project_path}"
+ RESULT_VARIABLE hg_error_code
+ OUTPUT_VARIABLE hg_id
+ OUTPUT_STRIP_TRAILING_WHITESPACE
+ )
- else ("${hg_tag}" STREQUAL "tip")
- SET (PROJECT_VERSION "${hg_tag}" PARENT_SCOPE)
- MESSAGE (STATUS "Version: mercurial tag: ${hg_tag}")
+ if (hg_error_code)
+ MESSAGE (FATAL_ERROR "`hg identify --id` failed")
+ endif (hg_error_code)
- endif ("${hg_tag}" STREQUAL "tip")
+ SET (PROJECT_VERSION "${hg_id}" PARENT_SCOPE)
+ MESSAGE (STATUS "Version: mercurial tip id: ${hg_id}")
+ else ("${hg_tag}" STREQUAL "tip")
+ SET (PROJECT_VERSION "${hg_tag}" PARENT_SCOPE)
+ MESSAGE (STATUS "Version: mercurial tag: ${hg_tag}")
+
+ endif ("${hg_tag}" STREQUAL "tip")
+
+ else (EXISTS ${project_path}/.hg)
+ SET (PROJECT_VERSION "0.0" PARENT_SCOPE)
+ MESSAGE (STATUS "No version information available, assuming version ${PROJECT_VERSION}")
+
+ endif (EXISTS ${project_path}/.hg)
ENDFUNCTION (FindProjectVersion)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/cmake/VersionScript.cmake Fri Jan 16 00:42:02 2009 +0200
@@ -0,0 +1,21 @@
+# location of output version.c
+SET (PROJECT_VERSION_FILE ${OUTPUT_PATH})
+
+# include cmake stuff
+include ("cmake/FindVersion.cmake")
+include ("cmake/FindTimestamp.cmake")
+
+# determine PROJECT_VERSION
+FindProjectVersion ("${CMAKE_SOURCE_DIR}")
+
+# build date
+FindBuildTimestamp ()
+
+
+# create version.c
+CONFIGURE_FILE (
+ "src/version.c.in" ${PROJECT_VERSION_FILE} @ONLY
+)
+
+MESSAGE (STATUS "wrote version.c -> ${PROJECT_VERSION_FILE}")
+
--- a/src/Application.cc Thu Jan 15 21:33:54 2009 +0200
+++ b/src/Application.cc Fri Jan 16 00:42:02 2009 +0200
@@ -15,6 +15,7 @@
ARG_RESOLUTION = 'R',
ARG_LIST_MODES = 0xff01,
+ ARG_VERSION = 0xff02,
};
@@ -47,6 +48,9 @@
args.add_option(ARG_LIST_MODES, "list-modes", "",
"output a list of available display modes and exit");
+ args.add_option(ARG_VERSION, "version", "",
+ "output application version and exit");
+
// set defaults
arg_graphics = false;
arg_port = NETWORK_PORT_STR;
@@ -110,6 +114,10 @@
dump_display_modes();
return false;
+ case ARG_VERSION:
+ dump_version();
+ return false;
+
case CL_CommandLine::REST_ARG:
throw ArgumentError(args.get_argument());
@@ -150,6 +158,10 @@
for (std::vector<CL_DisplayMode>::const_iterator it = modes.begin(); it != modes.end(); it++)
std::cout << "\t" << it->get_resolution().width << "x" << it->get_resolution().height << std::endl;
}
+
+void Main::dump_version (void) {
+ std::cout << PROJECT_LONG_NAME << " version " << PROJECT_VERSION << " built " << PROJECT_BUILD_TIMESTAMP << std::endl;
+}
/**
* IT BEGAN IN AFRIKA
--- a/src/Application.hh Thu Jan 15 21:33:54 2009 +0200
+++ b/src/Application.hh Fri Jan 16 00:42:02 2009 +0200
@@ -66,6 +66,11 @@
* Print out a list of display modes
*/
void dump_display_modes (void);
+
+ /**
+ * Print out our project version
+ */
+ void dump_version (void);
public:
/**
--- a/src/CMakeLists.txt Thu Jan 15 21:33:54 2009 +0200
+++ b/src/CMakeLists.txt Fri Jan 16 00:42:02 2009 +0200
@@ -1,7 +1,8 @@
FILE(GLOB SOURCE_FILES "*.cc" "Network/*.cc")
FILE(GLOB HEADER_FILES "*.hh" "Network/*.hh")
-set(SOURCES ${SOURCE_FILES} ${HEADER_FILES})
+set_source_files_properties("version.c" PROPERTIES GENERATED true)
+set(SOURCES ${SOURCE_FILES} ${HEADER_FILES} "version.c")
# Generate config.h
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/config.h.in" "${CMAKE_CURRENT_BINARY_DIR}/config.h" @ONLY)
--- a/src/Config.hh Thu Jan 15 21:33:54 2009 +0200
+++ b/src/Config.hh Fri Jan 16 00:42:02 2009 +0200
@@ -113,7 +113,7 @@
const CL_Color COLOR_ROCK(132, 136, 135);
// graphics params
-const std::string GRAPHICS_WINDOW_TITLE = (PROJECT_LONG_NAME " : Version " PROJECT_VERSION);
+const std::string GRAPHICS_WINDOW_TITLE = PROJECT_LONG_NAME; /* (PROJECT_LONG_NAME " : Version " PROJECT_VERSION); */
const uint32_t GRAPHICS_RESOLUTION_WIDTH = 800;
const uint32_t GRAPHICS_RESOLUTION_HEIGHT = 600;
const uint16_t GRAPHICS_UPDATE_INTERVAL_MS = 20;
--- a/src/config.h.in Thu Jan 15 21:33:54 2009 +0200
+++ b/src/config.h.in Fri Jan 16 00:42:02 2009 +0200
@@ -7,7 +7,11 @@
#define PROJECT_DATA_DIR "@PROJECT_DATA_DIR@"
#define PROJECT_SHORT_NAME "@PROJECT_SHORT_NAME@"
#define PROJECT_LONG_NAME "@PROJECT_LONG_NAME@"
-#define PROJECT_VERSION "@PROJECT_VERSION@"
+
+/*
+ * Defined in version.c:
+ */
+extern const char *PROJECT_VERSION, *PROJECT_BUILD_TIMESTAMP;
#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/version.c.in Fri Jan 16 00:42:02 2009 +0200
@@ -0,0 +1,4 @@
+/* This file is re-generated on each build */
+const char *PROJECT_VERSION = "@PROJECT_VERSION@";
+const char *PROJECT_BUILD_TIMESTAMP = "@PROJECT_BUILD_TIMESTAMP@";
+