On 08/20/2010 12:42 PM, Michael Wild wrote:
> 
> On 19. Aug, 2010, at 23:36 , Michael Hertling wrote:
> 
>> On 08/19/2010 09:42 PM, Michael Wild wrote:
>>>
>>> In that case I recommend creating a CMake script (e.g. 
>>> create_application_version.cmake) which creates the ApplicationVersion.xml 
>>> file. It queries the current revision (have a look at FindSVN.cmake on how 
>>> to do this), determines the date and time (this is a problem, refer to this 
>>> thread for more info: 
>>> http://www.mail-archive.com/cmake@cmake.org/msg30662.html) and then either 
>>> does a configure_file() or a file(WRITE) to create ApplicationVersion.xml. 
>>> Ideally the create_application_version.cmake is also a configured file 
>>> (with the path to the build and source tree and the path to the svn 
>>> executable etc.).
>>>
>>> This script is then invoked by a custom command:
>>>
>>> # dummy_file is never created...
>>> add_custom_command(OUTPUT ${CMAKE_BINARY_DIR}/ApplicationVersion.xml 
>>> ${CMAKE_BINARY_DIR}/dummy_file
>>>  COMMAND ${CMAKE_EXECUTABLE} -P 
>>> ${CMAKE_BINARY_DIR}/create_application_version.cmake
>>>  COMMENT "Creating ApplicationVersion.xml"
>>>  VERBATIM
>>>  )
>>>
>>> # this intentionally depends on dummy_file, which is never created
>>> add_custom_target(create_appplication_version ALL
>>>  DEPENDS ${CMAKE_BINARY_DIR}/ApplicationVersion.xml 
>>> ${CMAKE_BINARY_DIR}/dummy_file)
>>>
>>> add_executable(super_duper main.cpp 
>>> ${CMAKE_BINARY_DIR}/ApplicationVersion.xml)
>>> add_dependencies(super_duper create_appplication_version)
>>>
>>>
>>> The trick I'm trying to pull off, is that super_duper depends on 
>>> create_appplication_version, which is always out of date and depends on the 
>>> non-existing file dummy_file, thus always updating ApplicationVersion.xml. 
>>> Not that I haven't tested this.
>>
>> Possibly, this may be simplified: The COMMAND can be transferred from
>> the custom command to the custom target, so the former goes away and
>> one doesn't need a dummy file for triggering. Furthermore, the custom
>> target doesn't need to be declared ALL, and the ApplicationVersion.xml
>> doesn't need to appear in ADD_EXECUTABLE(), but as it's no header and,
>> thus, not subject to CMake's dependency scanning, one has to imply an
>> explicit dependency through the OBJECT_DEPENDS source file property on
>> main.cpp to ensure the executable's rebuild when ApplicationVersion.xml
>> changes.
> 
> Ahh, I forgot about the OBJECT_DEPENDS. And you also need to set the 
> GENERATED property to TRUE on the ApplicationVersion.xml file if you leave 
> away the custom command, otherwise CMake will complain at configure time. But 
> all-in-all probably simpler, and you don't need the despicable dummy_file.

Yes, the GENERATED property should be set, but if there's a template
named ApplicationVersion.xml.in CMake won't complain about a missing
ApplicationVersion.xml not marked as GENERATED since it checks for a
".in" extension automatically.

>> The create_application_version.cmake should use CONFIGURE_FILE() to
>> generate the ApplicationVersion.xml since this function doesn't write
>> a new output file if it wouldn't differ from the previous one, so the
>> ApplicationVersion.xml doesn't trigger rebuilds if it doesn't actually
>> change. At <http://www.cmake.org/pipermail/cmake/2010-July/037958.html>
>> and <http://www.cmake.org/pipermail/cmake/2010-July/038015.html>, you'll
>> find a similar discussion.
> 
> If he's going to encode the time that probably won't matter, since the file 
> will most likely always differ...

Yes, and I assume it's not the OP's desire to trigger a rebuild because
of a hand's leap. ;) Hence, what should be done is to generate one file
with the version and another file with the timestamp, preferably by the
same custom target, but to impose a dependency on the version file only.
So, the version and the timestamp are regenerated each time a concerned
target is checked for being up to date, but solely a new version will
trigger a rebuild.

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

Reply via email to