message (STATUS "Checking for revision information") set (__scs_header_file ${BINARY_DIR}/scs_version.h.txt) file (WRITE ${__scs_header_file} "/* SCS version information */\n\n") if (EXISTS "${SOURCE_DIR}/.svn") message (STATUS "Checking for Subversion revision information") find_package (Subversion QUIET REQUIRED) # the FindSubversion.cmake module is part of the standard distribution include (FindSubversion) # extract working copy information for SOURCE_DIR into MY_XXX variables Subversion_WC_INFO (${SOURCE_DIR} MY) message ("${MY_WC_INFO}") # determine if the working copy has outstanding changes execute_process (COMMAND ${Subversion_SVN_EXECUTABLE} status ${SOURCE_DIR} OUTPUT_FILE "${BINARY_DIR}/svn_status.txt" OUTPUT_STRIP_TRAILING_WHITESPACE) file (STRINGS "${BINARY_DIR}/svn_status.txt" __svn_changes REGEX "^[^?].*$" ) set (SCS_VERSION "r${MY_WC_LAST_CHANGED_REV}") if (__svn_changes) message (STATUS "Source tree based on revision ${SCS_VERSION} appears to have local changes") file (APPEND ${__scs_header_file} "#define SCS_VERSION_IS_DIRTY 1\n") set (SCS_VERSION_STR "${SCS_VERSION}-dirty") foreach (__svn_change ${__svn_changes}) message (STATUS "${__svn_change}") endforeach (__svn_change ${__svn_changes}) else () set (SCS_VERSION_STR "${SCS_VERSION}") endif () message (STATUS "${SOURCE_DIR} contains a .svn and is revision ${SCS_VERSION}") elseif (EXISTS "${SOURCE_DIR}/.git") if (EXISTS "${SOURCE_DIR}/.git/svn/.metadata") # try git-svn message (STATUS "Checking for Subversion revision information using git-svn") include (${SOURCE_DIR}/CMake/Modules/FindGitSubversion.cmake) # extract working copy information for SOURCE_DIR into MY_XXX variables GitSubversion_WC_INFO (${SOURCE_DIR} MY) message ("${MY_WC_INFO}") set (SCS_VERSION "r${MY_WC_LAST_CHANGED_REV}") # try and determine if the working copy has outstanding changes execute_process (COMMAND ${GIT_EXECUTABLE} --git-dir=${SOURCE_DIR}/.git --work-tree=${SOURCE_DIR} svn dcommit --dry-run RESULT_VARIABLE __git_svn_status OUTPUT_FILE "${BINARY_DIR}/svn_status.txt" ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE) file (STRINGS "${BINARY_DIR}/svn_status.txt" __svn_changes REGEX "^diff-tree" ) if ((NOT ${__git_svn_status} EQUAL 0) OR __svn_changes) message (STATUS "Source tree based on revision ${MY_WC_LAST_CHANGED_REV} appears to have local changes") file (APPEND ${__scs_header_file} "#define SCS_VERSION_IS_DIRTY 1\n") set (SCS_VERSION_STR "${SCS_VERSION}-dirty") else () set (SCS_VERSION_STR "${SCS_VERSION}") endif () else () # # try git # message (STATUS "Checking for gitrevision information") include (${SOURCE_DIR}/CMake/Modules/GetGitRevisionDescription.cmake) get_git_head_revision (${SOURCE_DIR} GIT_REFSPEC GIT_SHA1) git_local_changes (${SOURCE_DIR} GIT_SANITARY) string (SUBSTRING "${GIT_SHA1}" 0 6 SCS_VERSION) if ("${GIT_SANITARY}" STREQUAL "DIRTY") message (STATUS "Source tree based on revision ${GIT_REFSPEC} ${SCS_VERSION} appears to have local changes") file (APPEND ${__scs_header_file} "#define SCS_VERSION_IS_DIRTY 1\n") set (SCS_VERSION_STR "${SCS_VERSION}-dirty") execute_process (COMMAND ${GIT_EXECUTABLE} --git-dir=${SOURCE_DIR}/.git --work-tree=${SOURCE_DIR} status ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE) else () set (SCS_VERSION_STR "${SCS_VERSION}") endif () message (STATUS "refspec: ${GIT_REFSPEC} - SHA1: ${SCS_VERSION}") endif () else() message (STATUS "No SCS found") endif () file (APPEND ${__scs_header_file} "#define SCS_VERSION ${SCS_VERSION}\n") file (APPEND ${__scs_header_file} "#define SCS_VERSION_STR \"${SCS_VERSION_STR}\"\n") # copy the file to the final header only if the version changes # reduces needless rebuilds execute_process (COMMAND ${CMAKE_COMMAND} -E copy_if_different ${__scs_header_file} "${OUTPUT_DIR}/scs_version.h") file (REMOVE ${__scs_header_file})