On 01/21/2012 10:51 PM, Oliver Smith wrote: > I have a script that generates a revision.h file, I've spent the morning > trying to figure out how to make it so that ... any time CMake rebuilds > any of the other targets, it starts by running the make-new-revision script. > > The idea is, I use the script manually to upversion, but anytime I type > "make" and /anything/ has to be done (even just a relink), it will do > the upversion first. > > I've only managed to make it either source dependent or always build, > which forces the versionNo file to recompile and forces all executables > to relink, so if you type: > > make ; make ... it will have to relink the executables the second time > because of an pointless upversion :) > > - Oliver
There might be a solution for your concern, but it's probably somewhat fragile; look at the following exemplary project for a demonstration: # CMakeLists.txt: CMAKE_MINIMUM_REQUIRED(VERSION 2.8 FATAL_ERROR) PROJECT(P C) SET(CMAKE_VERBOSE_MAKEFILE ON) SET(VERSIONHEADERIN ${CMAKE_SOURCE_DIR}/version.h.in) SET(VERSIONHEADER ${CMAKE_BINARY_DIR}/version.h) SET(VERSIONFILE ${CMAKE_BINARY_DIR}/version.txt) IF(NOT EXISTS ${VERSIONFILE}) FILE(WRITE ${VERSIONFILE} "0\n") ENDIF() INCLUDE_DIRECTORIES(${CMAKE_BINARY_DIR}) ADD_EXECUTABLE(main main.c) ADD_CUSTOM_TARGET(version ${CMAKE_COMMAND} -DVERSIONHEADERIN=${VERSIONHEADERIN} -DVERSIONHEADER=${VERSIONHEADER} -DVERSIONFILE=${VERSIONFILE} -P ${CMAKE_SOURCE_DIR}/version.cmake) ADD_DEPENDENCIES(main version) ADD_CUSTOM_TARGET(upversion ${CMAKE_COMMAND} -DVERSIONFILE=${VERSIONFILE} -P ${CMAKE_SOURCE_DIR}/upversion.cmake) # version.cmake: FILE(STRINGS ${VERSIONFILE} VERSION) EXECUTE_PROCESS( COMMAND make -n VERBOSE= COMMAND grep "Linking" RESULT_VARIABLE GREPPED ) IF(GREPPED EQUAL 0) # Something will be done, thus: MATH(EXPR VERSION "${VERSION}+1") FILE(WRITE ${VERSIONFILE} "${VERSION}\n") ENDIF() CONFIGURE_FILE(${VERSIONHEADERIN} ${VERSIONHEADER} @ONLY) # upversion.cmake: FILE(STRINGS ${VERSIONFILE} VERSION) MATH(EXPR VERSION "${VERSION}+1") FILE(WRITE ${VERSIONFILE} "${VERSION}\n") /* version.h.in: */ #define VERSION @VERSION@ /* main.c: */ #include "version.h" #include <stdio.h> int main(void) { printf("VERSION: %d\n",VERSION); } The basic idea is to run "make -n" (version.cmake), scan the output for strings indicating an upcoming rebuild ("Linking"), increment a version number accordingly (version.txt) and generate a version header in the end (version.h.in). Anything else is done via the usual dependency tracking. Additionally, the upversion.cmake script allows for incrementing the version number manually. Perhaps, you can adapt the approach to your needs. However, the critical moment is how to detect if any actions which require the version number to be incremented are going to happen. The example uses "make -n" and "grep" for this purpose, but that's fragile, of course, as I remarked at the outset. Regards, Michael -- Powered by www.kitware.com Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html Please keep messages on-topic and check the CMake FAQ at: http://www.cmake.org/Wiki/CMake_FAQ Follow this link to subscribe/unsubscribe: http://www.cmake.org/mailman/listinfo/cmake