Re: [CMake] Revision header

2012-01-23 Thread Johannes Zarl
On Saturday, 21. January 2012, 22:51:01, 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 :)

I guess the most efficient way is to fix your upversion script so that it only 
overwrites revision.h if it actually changed. This way you can execute it 
every time without having it mess up the dependency tracking...


  Johannes
--

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


Re: [CMake] Revision header

2012-01-23 Thread Michael Hertling
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


[CMake] Revision header

2012-01-21 Thread Oliver Smith
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

--

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