hopefully version stuff is now run properly on every make...
authorTero Marttila <terom@fixme.fi>
Fri, 16 Jan 2009 00:42:02 +0200
changeset 397 13fa0546ef87
parent 396 e1a24791d192
child 398 306825786fba
hopefully version stuff is now run properly on every make...
CMakeLists.txt
cmake/BuildVersion.cmake
cmake/FindTimestamp.cmake
cmake/FindVersion.cmake
cmake/VersionScript.cmake
src/Application.cc
src/Application.hh
src/CMakeLists.txt
src/Config.hh
src/config.h.in
src/version.c.in
--- 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@";
+