From 4b87e3c54e851db7b0febf56778be05012f8899c Mon Sep 17 00:00:00 2001 From: pouillot Date: Tue, 10 Jan 2012 18:18:32 +0000 Subject: [PATCH] Re #526 / #335 Add a new OPTION_AUTOVERSION boolean CMake cache variable (default: On), to enable/disable the aotumatic SVN version detection feature + slightly improve the version naming scheme git-svn-id: https://svn.code.sf.net/p/speed-dreams/code/trunk@4391 30fe4595-0a0c-4342-8851-515496e4dcbd Former-commit-id: 4fad5ebc63703f8b697675af84a900ad2f07afc3 Former-commit-id: 9b1893b4e9da448c930bce4043f9fb2460a76ff1 --- CMakeLists.txt | 154 ++++++++++++++++++++++++--------------------- cmake/macros.cmake | 2 + 2 files changed, 86 insertions(+), 70 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 1f8be2947..a27aabcd0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -17,96 +17,110 @@ CHECK_LIBRARIES() CHECK_PLIB_LIBRARIES() CHECK_PACKAGES() -#Calculate version -#Set version which doesn't follow from HeadURL -SET(HEAD_URL "$HeadURL$") +# Determine version SET(NEXT_LESSER_VERSION 0) # The next lesser version SET(NEXT_MAJOR_MINOR_VERSION "2.0") # Next major.minor version -#Define regular expressions -SET(REGEX_TAG "^\\$HeadURL:.*speed-dreams/tags/([^/\\$ ]*).*\\$$") -SET(REGEX_BUG_BRANCH "^\\$HeadURL:.*speed-dreams/branches/([0-9]+\\.[0-9]+)(\\.[xX])?/.*\\$$") -SET(REGEX_TRUNK "^\\$HeadURL:.*speed-dreams/trunk/.*\\$$") -SET(REGEX_BRANCH "^\\$HeadURL:.*speed-dreams/branches/([^/\\$ ]*).*\\$$") - -#Check regular expressions -STRING(REGEX MATCH "${REGEX_TAG}" VERSION_IS_TAG "${HEAD_URL}") -STRING(REGEX MATCH "${REGEX_BUG_BRANCH}" VERSION_IS_BUG_BRANCH "${HEAD_URL}") -STRING(REGEX MATCH "${REGEX_TRUNK}" VERSION_IS_TRUNK "${HEAD_URL}") -STRING(REGEX MATCH "${REGEX_BRANCH}" VERSION_IS_BRANCH "${HEAD_URL}") - -#Look in which case we are and set the version according to that -SET(NEED_SVN_REV FALSE) -IF(VERSION_IS_TAG) - STRING(REGEX REPLACE "${REGEX_TAG}" "\\1" VERSION "${HEAD_URL}") - SET(NEED_SVN_REV TRUE) -ELSEIF(VERSION_IS_BUG_BRANCH) - STRING(REGEX REPLACE "${REGEX_BUG_BRANCH}" "\\1" TMP_VERSION "${HEAD_URL}") - SET(VERSION "${TMP_VERSION}.${NEXT_LESSER_VERSION}-dev") - SET(NEED_SVN_REV TRUE) -ELSEIF(VERSION_IS_TRUNK) +IF(NOT OPTION_AUTOVERSION) + SET(VERSION "${NEXT_MAJOR_MINOR_VERSION}-dev") - SET(NEED_SVN_REV TRUE) -ELSEIF(VERSION_IS_BRANCH) - STRING(REGEX REPLACE "${REGEX_BRANCH}" "\\1" VERSION "${HEAD_URL}") - SET(VERSION "${VERSION}-dev") - SET(NEED_SVN_REV TRUE) -ELSE(VERSION_IS_TAG) - MESSAGE("Warning: Could not determine version name from HeadURL ${HEAD_URL}") - SET(VERSION "0.0-unkown") -ENDIF(VERSION_IS_TAG) - -#Try to get current revision -IF(NEED_SVN_REV) - SET(SVN_FIND_REV_FAILED FALSE) - FIND_PROGRAM(SVNVERSION_EXEC svnversion PATHS /usr/local/bin /usr/bin) - MARK_AS_ADVANCED(SVNVERSION_EXEC) - IF(NOT SVNVERSION_EXEC) - SET(SVN_FIND_REV_FAILED TRUE) - ENDIF(NOT SVNVERSION_EXEC) - IF(NOT SVN_FIND_REV_FAILED) - MESSAGE(STATUS "Looking for current subversion revision (may be long) ...") - EXECUTE_PROCESS(COMMAND ${SVNVERSION_EXEC} ${CMAKE_CURRENT_SOURCE_DIR} --no-newline - RESULT_VARIABLE SVNVERSION_RESULT - OUTPUT_VARIABLE SVN_REV_LONG) - IF(NOT ${SVNVERSION_RESULT} EQUAL 0) - SET(SVN_FIND_REV_FAILED TRUE) - ENDIF(NOT ${SVNVERSION_RESULT} EQUAL 0) - ENDIF(NOT SVN_FIND_REV_FAILED) - IF(NOT SVN_FIND_REV_FAILED) - IF("${SVN_REV_LONG}" MATCHES ":") - STRING(REGEX REPLACE "^[^:]*:(.*)$" "\\1" SVN_REV "${SVN_REV_LONG}") - ELSE("${SVN_REV_LONG}" MATCHES ":") - SET(SVN_REV "${SVN_REV_LONG}") - ENDIF("${SVN_REV_LONG}" MATCHES ":") - IF(NOT SVN_REV) - SET(SVN_FIND_REV_FAILED TRUE) - ENDIF(NOT SVN_REV) - ENDIF(NOT SVN_FIND_REV_FAILED) SET(VERSION_LONG "${VERSION}") - IF(NOT SVN_FIND_REV_FAILED) - STRING(TOLOWER ${SVN_REV} SVN_REV) - SET(VERSION_LONG "${VERSION_LONG}-r${SVN_REV}") - ENDIF(NOT SVN_FIND_REV_FAILED) - MESSAGE(STATUS "Found '${VERSION_LONG}'") -ELSE(NEED_SVN_REV) - SET(VERSION_LONG "${VERSION}") -ENDIF(NEED_SVN_REV) + + MESSAGE(STATUS "Version '${VERSION_LONG}' (not auto-detected from SVN source tree)") +ELSE(NOT OPTION_AUTOVERSION) + + # Use SVN HeadURL property on this CMakeLists.txt file in order to automatically get the current version + SET(HEAD_URL "$HeadURL$") + + # Define regular expressions + SET(REGEX_TAG "^\\$HeadURL:.*speed-dreams/tags/([^/\\$ ]*).*\\$$") + SET(REGEX_BUG_BRANCH "^\\$HeadURL:.*speed-dreams/branches/([0-9]+\\.[0-9]+)(\\.[xX])?/.*\\$$") + SET(REGEX_TRUNK "^\\$HeadURL:.*speed-dreams/trunk/.*\\$$") + SET(REGEX_BRANCH "^\\$HeadURL:.*speed-dreams/branches/([^/\\$ ]*).*\\$$") + + # Check regular expressions + STRING(REGEX MATCH "${REGEX_TAG}" VERSION_IS_TAG "${HEAD_URL}") + STRING(REGEX MATCH "${REGEX_BUG_BRANCH}" VERSION_IS_BUG_BRANCH "${HEAD_URL}") + STRING(REGEX MATCH "${REGEX_TRUNK}" VERSION_IS_TRUNK "${HEAD_URL}") + STRING(REGEX MATCH "${REGEX_BRANCH}" VERSION_IS_BRANCH "${HEAD_URL}") + + # See if we need to look at the current SVN revision + SET(NEED_SVN_REV TRUE) + IF(VERSION_IS_TAG) + STRING(REGEX REPLACE "${REGEX_TAG}" "\\1" VERSION "${HEAD_URL}") + ELSEIF(VERSION_IS_BUG_BRANCH) + STRING(REGEX REPLACE "${REGEX_BUG_BRANCH}" "\\1" TMP_VERSION "${HEAD_URL}") + SET(VERSION "${TMP_VERSION}.${NEXT_LESSER_VERSION}-dev") + ELSEIF(VERSION_IS_TRUNK) + SET(VERSION "${NEXT_MAJOR_MINOR_VERSION}-trunk") + ELSEIF(VERSION_IS_BRANCH) + STRING(REGEX REPLACE "${REGEX_BRANCH}" "\\1" VERSION "${HEAD_URL}") + ELSE(VERSION_IS_TAG) + MESSAGE("Warning: Could not determine version name from HeadURL ${HEAD_URL}") + SET(VERSION "${NEXT_MAJOR_MINOR_VERSION}-dev") + SET(NEED_SVN_REV FALSE) + ENDIF(VERSION_IS_TAG) + + # Try to get current SVN revision + IF(NEED_SVN_REV) + SET(SVN_FIND_REV_FAILED FALSE) + FIND_PROGRAM(SVNVERSION_EXEC svnversion PATHS /usr/local/bin /usr/bin) + MARK_AS_ADVANCED(SVNVERSION_EXEC) + IF(NOT SVNVERSION_EXEC) + SET(SVN_FIND_REV_FAILED TRUE) + ENDIF(NOT SVNVERSION_EXEC) + IF(NOT SVN_FIND_REV_FAILED) + MESSAGE(STATUS "Looking for current subversion revision (may be long) ...") + EXECUTE_PROCESS(COMMAND ${SVNVERSION_EXEC} ${CMAKE_CURRENT_SOURCE_DIR} --no-newline + RESULT_VARIABLE SVNVERSION_RESULT + OUTPUT_VARIABLE SVN_REV_LONG) + IF(NOT ${SVNVERSION_RESULT} EQUAL 0) + SET(SVN_FIND_REV_FAILED TRUE) + ENDIF(NOT ${SVNVERSION_RESULT} EQUAL 0) + ENDIF(NOT SVN_FIND_REV_FAILED) + IF(NOT SVN_FIND_REV_FAILED) + IF("${SVN_REV_LONG}" MATCHES ":") + STRING(REGEX REPLACE "^[^:]*:(.*)$" "\\1" SVN_REV "${SVN_REV_LONG}") + ELSE("${SVN_REV_LONG}" MATCHES ":") + SET(SVN_REV "${SVN_REV_LONG}") + ENDIF("${SVN_REV_LONG}" MATCHES ":") + IF(NOT SVN_REV) + SET(SVN_FIND_REV_FAILED TRUE) + ENDIF(NOT SVN_REV) + ENDIF(NOT SVN_FIND_REV_FAILED) + SET(VERSION_LONG "${VERSION}") + IF(NOT SVN_FIND_REV_FAILED) + STRING(TOLOWER ${SVN_REV} SVN_REV) + SET(VERSION_LONG "${VERSION_LONG}-r${SVN_REV}") + ENDIF(NOT SVN_FIND_REV_FAILED) + ELSE(NEED_SVN_REV) + SET(VERSION_LONG "${VERSION}") + ENDIF(NEED_SVN_REV) + + MESSAGE(STATUS "Version '${VERSION_LONG}'") + +ENDIF(NOT OPTION_AUTOVERSION) + +# Generate config.h CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/cmake/config.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config.h) +# Generate DOxygen configuration file CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/cmake/doxygen_config.cmake ${CMAKE_CURRENT_BINARY_DIR}/doxygen_config @ONLY) +# Install top tree data files SD_INSTALL_FILES(DATA "/" FILES credits.xml CHANGES.txt COPYING.txt INSTALL.txt README.txt TODO.txt) +# Sub-dirs to build ... ADD_SUBDIRECTORY(src) ADD_SUBDIRECTORY(data) ADD_SUBDIRECTORY(cmake) +# Usefull for using SD as a robot development framework without building SD INSTALL_SD_CMAKE() # Generate a 'make clobber'-like clobber.sh/.bat script in case of an in-source build. diff --git a/cmake/macros.cmake b/cmake/macros.cmake index 0cd42283d..1cb7c25b6 100644 --- a/cmake/macros.cmake +++ b/cmake/macros.cmake @@ -1017,6 +1017,8 @@ MACRO(ADD_SD_COMPILE_OPTIONS) SET(OPTION_UNLOAD_SSGGRAPH true CACHE BOOL "If false, never unload ssggraph module (useful on some Linuxes to avoid XOrg crashes)") ENDIF(UNIX) + SET(OPTION_AUTOVERSION true CACHE BOOL "Enable automatic computation of the version from SVN source tree") + # Compiler definitions. ADD_DEFINITIONS(-D_SVID_SOURCE -D_BSD_SOURCE -DSHM)