The cmake development information generating works now with git >=v1.5.1 and issues...
authorSzilard Pall <pszilard@cbr.su.se>
Sun, 28 Mar 2010 03:56:58 +0000 (05:56 +0200)
committerSzilard Pall <pszilard@cbr.su.se>
Sun, 28 Mar 2010 04:01:18 +0000 (06:01 +0200)
CMakeLists.txt
cmake/gmxGenerateVersionInfo.cmake
src/gmxlib/CMakeLists.txt

index 3e2bbd441c5c88ec5ffc3660d70230be50f555da..3e55db1a68ca6371908e6c25f8d088018a858afb 100644 (file)
@@ -9,10 +9,6 @@ set(PROJECT_VERSION "4.0.99-dev-20100315"
 # Cmake modules/macros are in a subdirectory to keep this file cleaner
 set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake)
 
-# Generate development version info for cache
-# set(GEN_VERSION_INFO_INTERNAL "ON")
-# include(gmxGenerateVersionString)
-
 ########################################################################
 # User input options                                                   #
 ########################################################################
@@ -54,7 +50,7 @@ if(GMX_OPENMM)
         message(FATAL_ERROR "The OpenMM build is not compatible with MPI!")
     endif(GMX_MPI)
     if(GMX_THREADS)
-        message(WARNING "Threads have been disabled, not compatible with OpenMM build!")
+        message(STATUS "Threads not compatible with OpenMM build, disabled")
         set(GMX_THREADS OFF)
     endif(GMX_THREADS)
     if(GMX_SOFTWARE_INVSQRT)
@@ -65,7 +61,7 @@ if(GMX_OPENMM)
         set(GMX_ACCELERATION "none")
     endif()
     if(GMX_FAHCORE)
-        message(FATAL_ERROR "The OpenMM build does not support the FAH option!")
+        message(FATAL_ERROR "The OpenMM build does not support FAH build!")
     endif(GMX_FAHCORE)
 endif(GMX_OPENMM)
 
@@ -227,7 +223,7 @@ endif(GMX_THREADS)
 
 if(GMX_OPENMM)
     set(CUDA_BUILD_EMULATION OFF)
-    find_package(CUDA 2.3 REQUIRED)   # TODO what are we compatible with?
+    find_package(CUDA 2.3 REQUIRED)
     add_definitions(-DGMX_OPENMM)
     if(CMAKE_BUILD_TYPE STREQUAL "DEBUG")    
         set(CUDA_VERBOSE_BUILD ON)
@@ -240,6 +236,26 @@ if(APPLE)
    list(APPEND GMX_EXTRA_LIBRARIES ${ACCELERATE_FRAMEWORK})
 endif(APPLE)
 
+# only bother with finding git and using version.h if the source is a git repo
+if(EXISTS "${CMAKE_SOURCE_DIR}/.git")
+    if(USE_VERSION_H)
+        # We need at least git v1.5.1 be able to parse git's date output. If not 
+        # fund or the version is too small, we can't generate version information.
+        find_package(Git 1.5.1)
+        if(NOT Git_FOUND OR Git_VERSION VERSION_LESS "1.5.1")
+            message("No compatible git version found, won't be able to generate proper development version information.")
+        endif()
+    endif()
+else()
+    set(USE_VERSION_H OFF)
+endif()
+
+########################################################################
+# Generate development version info for cache
+########################################################################
+# set(GEN_VERSION_INFO_INTERNAL "ON")
+# include(gmxGenerateVersionString)
+
 ########################################################################
 # Our own GROMACS tests
 ########################################################################
index 328e5bce566e9ba8695a749c90e925038b95fe69..dbdd2dc4f523c131c797c9dd1a05a56c4e96630d 100644 (file)
@@ -7,10 +7,12 @@
 # GEN_VERSION_INFO_INTERNAL has to be set ON.
 #
 # The following variables have to be previously defined: 
+# Git_EXECUTABLE        - path to git binary
+# Git_VERSION           - git version (if not defined it's assumed that >=1.5.3)
 # PROJECT_VERSION       - hard-coded version string, should have the following structure: 
 #                       VERSION[-dev-SUFFIX] where the VERSION can have any form and the suffix 
 #                       is optional but should start with -dev
-# PROJECT_SOURCE_DIR    - top level source directory 
+# PROJECT_SOURCE_DIR    - top level source directory (which has to be in git)
 # VERSION_C_CMAKEIN     - path to the version.c.cmakein file 
 # VERSION_C_OUT         - path to the version.c output file
 #
@@ -38,16 +40,16 @@ if(GEN_VERSION_INFO_INTERNAL)
     set(GMX_GIT_REMOTE_HASH)
 endif()
 
-set(GIT_BIN)
-find_program(GIT_BIN "git")
-mark_as_advanced(GIT_BIN)
+# bail if the source tree is not in a git repository  
+if(NOT EXISTS "${PROJECT_SOURCE_DIR}/.git")
+    message(FATAL_ERROR " Project source directory ${PROJECT_SOURCE_DIR} not in git")
+endif()
 
-# if the source tree is a git repository extract the necessary information for  
-# building the development version string 
-if(NOT "${GIT_BIN}" MATCHES ".*-NOTFOUND" 
-   AND IS_DIRECTORY "${PROJECT_SOURCE_DIR}/.git")
+# if git executable xists and it's compatible version
+# build the development version string 
+if(EXISTS ${Git_EXECUTABLE} AND NOT Git_VERSION VERSION_LESS "1.5.1")
     # refresh git index 
-    execute_process(COMMAND ${GIT_BIN} update-index -q --refresh
+    execute_process(COMMAND ${Git_EXECUTABLE} update-index -q --refresh
         WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
         TIMEOUT 5
         OUTPUT_QUIET
@@ -56,9 +58,8 @@ if(NOT "${GIT_BIN}" MATCHES ".*-NOTFOUND"
     ) 
 
    # get the full hash of the current HEAD 
-    execute_process(COMMAND ${GIT_BIN} rev-parse HEAD
+    execute_process(COMMAND ${Git_EXECUTABLE} rev-parse HEAD
         WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
-        TIMEOUT 5
         OUTPUT_VARIABLE GMX_GIT_HEAD_HASH
         ERROR_VARIABLE EXEC_ERR
         OUTPUT_STRIP_TRAILING_WHITESPACE
@@ -67,9 +68,8 @@ if(NOT "${GIT_BIN}" MATCHES ".*-NOTFOUND"
     string(SUBSTRING ${GMX_GIT_HEAD_HASH} 0 5 HEAD_HASH_SHORT) 
 
     # if there are local uncommitted changes, the build gets labeled "dirty"
-    execute_process(COMMAND ${GIT_BIN} diff-index --name-only HEAD
+    execute_process(COMMAND ${Git_EXECUTABLE} diff-index --name-only HEAD
         WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
-        TIMEOUT 5
         OUTPUT_VARIABLE SRC_LOCAL_CHANGES
         ERROR_VARIABLE EXEC_ERR
         OUTPUT_STRIP_TRAILING_WHITESPACE
@@ -79,26 +79,50 @@ if(NOT "${GIT_BIN}" MATCHES ".*-NOTFOUND"
         set(GMX_GIT_HEAD_HASH "${GMX_GIT_HEAD_HASH} (dirty)")
     endif()
 
-    # get the date of the HEAD commit
-    execute_process(COMMAND ${GIT_BIN} rev-list -n1 "--pretty=format:%ci" HEAD
-        WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
-        TIMEOUT 5
-        OUTPUT_VARIABLE HEAD_DATE
-        ERROR_VARIABLE EXEC_ERR
-        OUTPUT_STRIP_TRAILING_WHITESPACE
-    )
-    string(REGEX REPLACE "\n| " ";" HEAD_DATE ${HEAD_DATE})
-    list(GET HEAD_DATE 2 HEAD_DATE)
-    string(REGEX REPLACE "-" "" HEAD_DATE ${HEAD_DATE})
+    # if git is older then 1.5.3 we need to extract the RFC2822 style date 
+    # and massage it, otherwise the ISO 8601 format is more trusworthy
+    if (NOT Git_VERSION STREQUAL "" AND Git_VERSION VERSION_LESS "1.5.3")
+        execute_process(COMMAND ${Git_EXECUTABLE} rev-list -n1 "--pretty=format:%cD" HEAD
+            WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
+            OUTPUT_VARIABLE HEAD_DATE
+            ERROR_VARIABLE EXEC_ERR
+            OUTPUT_STRIP_TRAILING_WHITESPACE
+        )
+        string(REGEX REPLACE ".*, ([0-9]+) ([A-Z][a-z]+) ([0-9]+).*" "\\3\\2\\1" 
+            HEAD_DATE ${HEAD_DATE})
+        string(TOUPPER ${HEAD_DATE} HEAD_DATE)
+        string(REGEX REPLACE "JAN" "01" HEAD_DATE ${HEAD_DATE})
+        string(REGEX REPLACE "FEB" "02" HEAD_DATE ${HEAD_DATE})
+        string(REGEX REPLACE "MAR" "03" HEAD_DATE ${HEAD_DATE})
+        string(REGEX REPLACE "APR" "04" HEAD_DATE ${HEAD_DATE})
+        string(REGEX REPLACE "MAY" "05" HEAD_DATE ${HEAD_DATE})
+        string(REGEX REPLACE "JUN" "06" HEAD_DATE ${HEAD_DATE})
+        string(REGEX REPLACE "JUL" "07" HEAD_DATE ${HEAD_DATE})
+        string(REGEX REPLACE "AUG" "08" HEAD_DATE ${HEAD_DATE})
+        string(REGEX REPLACE "SEP" "09" HEAD_DATE ${HEAD_DATE})
+        string(REGEX REPLACE "OCT" "10" HEAD_DATE ${HEAD_DATE})
+        string(REGEX REPLACE "NOV" "11" HEAD_DATE ${HEAD_DATE})
+        string(REGEX REPLACE "DEC" "12" HEAD_DATE ${HEAD_DATE})
+    else()
+        # get the date of the HEAD commit
+        execute_process(COMMAND ${Git_EXECUTABLE} rev-list -n1 "--pretty=format:%ci" HEAD
+            WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
+            OUTPUT_VARIABLE HEAD_DATE
+            ERROR_VARIABLE EXEC_ERR
+            OUTPUT_STRIP_TRAILING_WHITESPACE
+        )
+        string(REGEX REPLACE "\n| " ";" HEAD_DATE ${HEAD_DATE})
+        list(GET HEAD_DATE 2 HEAD_DATE)
+        string(REGEX REPLACE "-" "" HEAD_DATE ${HEAD_DATE})
+    endif()
 
     # compile the version string suffix
     set(VERSION_STR_SUFFIX "${HEAD_DATE}-${HEAD_HASH_SHORT}${DIRTY_STR}") 
     
     # find the name of the remote which is located on the official gromacs git server
-    execute_process(COMMAND ${GIT_BIN} config --get-regexp 
+    execute_process(COMMAND ${Git_EXECUTABLE} config --get-regexp 
                     "remote\\..*\\.url" "git\\.gromacs\\.org[:|/]gromacs"
         WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
-        TIMEOUT 5
         OUTPUT_VARIABLE GMX_REMOTE
         ERROR_VARIABLE EXEC_ERR
         OUTPUT_STRIP_TRAILING_WHITESPACE
@@ -113,9 +137,8 @@ if(NOT "${GIT_BIN}" MATCHES ".*-NOTFOUND"
         # find the first ancestor in the list provided by rev-list (not 
         # necessarily the last though) which is in GMX_REMOTE, extract the 
         # hash and the number of commits HEAD is ahead with 
-        execute_process(COMMAND ${GIT_BIN} rev-list --max-count=100 HEAD
+        execute_process(COMMAND ${Git_EXECUTABLE} rev-list --max-count=100 HEAD
             WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
-            TIMEOUT 5
             OUTPUT_VARIABLE ANCESTOR_LIST
         )
         string(REGEX REPLACE "\n" ";" ANCESTOR_LIST ${ANCESTOR_LIST})
@@ -123,9 +146,8 @@ if(NOT "${GIT_BIN}" MATCHES ".*-NOTFOUND"
         set(AHEAD 0)
         set(GMX_GIT_REMOTE_HASH "")
         foreach(OBJ ${ANCESTOR_LIST})
-            execute_process(COMMAND ${GIT_BIN} name-rev --refs=refs/remotes/${GMX_REMOTE}/* ${OBJ}
+            execute_process(COMMAND ${Git_EXECUTABLE} name-rev --refs=refs/remotes/${GMX_REMOTE}/* ${OBJ}
                 WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
-                TIMEOUT 5
                 OUTPUT_VARIABLE HASH_AND_REVNAME
                 OUTPUT_STRIP_TRAILING_WHITESPACE
             )
@@ -158,11 +180,10 @@ if(NOT "${GIT_BIN}" MATCHES ".*-NOTFOUND"
 else()
     # the version has to be defined - if not we're not using version.h/.c and set 
     # the GIT related information to "unknown"
-    message(WARNING " Not a git repository and/or git not found, using hard-coded version.")
+    message(WARNING " Source tree seems to be a repository, but no compatible git is available, using hard-coded version string")
     set(GMX_PROJECT_VERSION_STR "${PROJECT_VERSION}")
     set(GMX_GIT_HEAD_HASH "unknown")
     set(GMX_GIT_REMOTE_HASH "unknown")
-    set(USE_VERSION_H OFF)
 endif()
 
 # if we're generating cache variables set these
index d49c1ca0bba015b0dc870520364337cd7bb09291..62d543b7a6173767b0b61e6296c34d30028a556e 100644 (file)
@@ -4,8 +4,10 @@ include_directories(${CMAKE_CURRENT_SOURCE_DIR})
 # add target that generates version.c every time a make is run
 # only do this if we generate the version
 if(USE_VERSION_H)
-add_custom_target(gmx_version ALL
+    add_custom_target(gmx_version ALL
             COMMAND ${CMAKE_COMMAND} 
+                -D Git_EXECUTABLE="${Git_EXECUTABLE}"
+                -D Git_VERSION="${Git_VERSION}"
                 -D PROJECT_VERSION="${PROJECT_VERSION}"
                 -D PROJECT_SOURCE_DIR="${PROJECT_SOURCE_DIR}"
                 -D VERSION_C_CMAKEIN="${CMAKE_SOURCE_DIR}/src/gmxlib/version.c.cmakein"