diff --git a/cmake/modules/GetSVN.cmake b/cmake/modules/GetSVN.cmake new file mode 100644 index 0000000000000000000000000000000000000000..c9609a0f3e1fd0fa72b8ba62a68df2801f188bbf --- /dev/null +++ b/cmake/modules/GetSVN.cmake @@ -0,0 +1,73 @@ +if( GENERATE_DUMMY ) + file( WRITE svnrevision.h.in "\n" ) +else() + include( FindSubversion ) + + if( SUBVERSION_FOUND ) + # Copied from FindSubversion: need to change to fix the SEND_ERROR problem + + # the subversion commands should be executed with the C locale, otherwise + # the message (which are parsed) may be translated, Alex + set( _Subversion_SAVED_LC_ALL "$ENV{LC_ALL}" ) + set( ENV{LC_ALL} C ) + + execute_process( COMMAND ${Subversion_SVN_EXECUTABLE} info ${SOURCE_DIR} + OUTPUT_VARIABLE NEXT_WC_INFO + ERROR_VARIABLE Subversion_svn_info_error + RESULT_VARIABLE Subversion_svn_info_result + OUTPUT_STRIP_TRAILING_WHITESPACE ) + + if( NOT ${Subversion_svn_info_result} EQUAL 0 ) + message( "${SOURCE_DIR} is not a subversion directory" ) + file( WRITE svnrevision.h.in "\n" ) + else() + string( REGEX REPLACE "^(.*\n)?URL: ([^\n]+).*" + "\\2" NEXT_WC_URL "${NEXT_WC_INFO}" ) + string( REGEX REPLACE "^(.*\n)?Repository Root: ([^\n]+).*" + "\\2" NEXT_WC_ROOT "${NEXT_WC_INFO}" ) + string( REGEX REPLACE "^(.*\n)?Revision: ([^\n]+).*" + "\\2" NEXT_WC_REVISION "${NEXT_WC_INFO}" ) + string( REGEX REPLACE "^(.*\n)?Last Changed Author: ([^\n]+).*" + "\\2" NEXT_WC_LAST_CHANGED_AUTHOR "${NEXT_WC_INFO}" ) + string( REGEX REPLACE "^(.*\n)?Last Changed Rev: ([^\n]+).*" + "\\2" NEXT_WC_LAST_CHANGED_REV "${NEXT_WC_INFO}" ) + string( REGEX REPLACE "^(.*\n)?Last Changed Date: ([^\n]+).*" + "\\2" NEXT_WC_LAST_CHANGED_DATE "${NEXT_WC_INFO}" ) + + string( REGEX REPLACE "^(.*)?:(.*)" + "\\2" NEXT_WC_URL_PATH "${NEXT_WC_URL}" ) + string( REGEX REPLACE "^(.*)?:(.*)" + "\\2" NEXT_WC_ROOT_PATH "${NEXT_WC_ROOT}" ) + + file( RELATIVE_PATH NEXT_WC_RELATIVE_URL "${NEXT_WC_ROOT_PATH}" "${NEXT_WC_URL_PATH}" ) + + execute_process( COMMAND ${Subversion_SVN_EXECUTABLE} status ${SOURCE_DIR} + OUTPUT_VARIABLE NEXT_WC_STATUS + ERROR_VARIABLE Subversion_svn_status_error + RESULT_VARIABLE Subversion_svn_status_result + OUTPUT_STRIP_TRAILING_WHITESPACE ) + + if( ${Subversion_svn_status_result} EQUAL 0 ) + if( NEXT_WC_STATUS ) + set( NEXT_WC_STATUS "M" ) + else() + set( NEXT_WC_STATUS "" ) + endif() + endif() + + # write a file with the SVNVERSION define + file( WRITE svnrevision.h.in "#define SVNREVISION \"${NEXT_WC_LAST_CHANGED_REV}${NEXT_WC_STATUS}\"\n" ) + file( APPEND svnrevision.h.in "#define SVNRELATIVEURL \"${NEXT_WC_RELATIVE_URL}\"\n" ) + endif() + + # restore the previous LC_ALL + set( ENV{LC_ALL} ${_Subversion_SAVED_LC_ALL} ) + else() + message( "Subversion executable not found!" ) + file( WRITE svnrevision.h.in "\n" ) + endif() +endif() + +# copy the file to the final header only if the version changes +# reduces needless rebuilds +execute_process( COMMAND ${CMAKE_COMMAND} -E copy_if_different svnrevision.h.in svnrevision.h )