[CMake] How to regenerate source file during make?
Michael Wild
themiwi at gmail.com
Fri Jan 15 10:45:31 EST 2010
On 15. Jan, 2010, at 16:38 , David Cole wrote:
> On Fri, Jan 15, 2010 at 10:35 AM, Michael Wild <themiwi at gmail.com> wrote:
>
>>
>> On 15. Jan, 2010, at 16:25 , Marcel Loose wrote:
>>
>>> On Fri, 2010-01-15 at 10:07 -0500, David Cole wrote:
>>>> On Fri, Jan 15, 2010 at 9:44 AM, Marcel Loose <loose at astron.nl> wrote:
>>>> Hi Jack,
>>>>
>>>> The difference with your and my case is that you have an input
>>>> file
>>>> (the .xsd file) and output files (the .h and .cpp files). In
>>>> my case I
>>>> generate the output file, e.g. myheader.h, from myheader.h.in,
>>>> using
>>>> configure_file(). The problem is that I cannot get this to
>>>> work during
>>>> 'make', only during 'cmake'.
>>>>
>>>> Best regards,
>>>> Marcel Loose.
>>>>
>>>> On Fri, 2010-01-15 at 15:04 +0100, Smith Jack (Ext. - UGIS -
>>>> UniCredit
>>>>
>>>> Group) wrote:
>>>>> I do a similar thing with an XSD file from which I generate
>>>> c++
>>>> wrapper classes for accessing the corresponding XML
>>>>>
>>>>> Note the DEPENDS line !
>>>>>
>>>>> MACRO(XSD FILE NAMESPACE)
>>>>> ADD_CUSTOM_COMMAND(
>>>>> OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/xml/${FILE}.cpp
>>>>> OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/xml/${FILE}.h
>>>>> DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/xml/${FILE}.xsd
>>>>> COMMAND ${XAPI_CODESYNTH}/bin/xsd
>>>>> ARGS cxx-tree --generate-serialization
>>>> --hxx-suffix .h
>>>> --cxx-suffix .cpp --fwd-suffix -fwd.hxx --type-naming java
>>>> --function-naming java --namespace-map =${NAMESPACE}
>>>> --generate-polymorphic --output-dir
>>>> ${CMAKE_CURRENT_SOURCE_DIR}/xml
>>>> ${CMAKE_CURRENT_SOURCE_DIR}/xml/${FILE}.xsd
>>>>> COMMENT "generating Codesynthesis Wrappers")
>>>>> ENDMACRO(XSD)
>>>>>
>>>>>
>>>>>
>>>>>> -----Original Message-----
>>>>>> From: cmake-bounces at cmake.org
>>>>>> [mailto:cmake-bounces at cmake.org] On Behalf Of Marcel Loose
>>>>>> Sent: Friday, January 15, 2010 2:55 PM
>>>>>> To: cmake at cmake.org
>>>>>> Subject: [CMake] How to regenerate source file during
>>>> make?
>>>>>>
>>>>>> Hi all,
>>>>>>
>>>>>> I've been struggling with this for hours now and I can't
>>>> seem
>>>>>> to get a grip on it.
>>>>>>
>>>>>> I have a header file that must be (re)generated during
>>>> 'make'
>>>>>> when some external data have changed. I can successfully
>>>>>> generate this file during 'cmake' using configure_file(),
>>>> but
>>>>>> I haven't been able to figure out how I can trigger the
>>>>>> configure_file() during make.
>>>>>>
>>>>>> Should I define a target for this header file? Or can I
>>>>>> specify some kind of file dependency, such that when the
>>>>>> header file is missing our out-of-date, it will be
>>>> (re)generated?
>>>>>>
>>>>>> I guess it must be some clever combination of
>>>>>> add_custom_command() and add_custom_target().
>>>>>>
>>>>>> Best regards,
>>>>>> Marcel Loose.
>>>>
>>>>
>>>>
>>>> This should work already: if you change my_header.h.in then cmake
>>>> should re-run to re-configure your file at 'make' time.
>>>>
>>>>
>>>> If you have additional dependencies that should trigger a
>>>> re-configure, you should probably convert it to an add_custom_command
>>>> such that it happens at build time.
>>>
>>> It's not the myheader.h.in that's changing; myheader.h should be
>>> regenerated because the value of one of the variables in myheader.h.in
>>> (that get expanded) change.
>>>
>>> To be more precise, I try to record the svn revision number (and some
>>> more svn info). I carefully read
>>> http://www.mail-archive.com/cmake@cmake.org/msg25922.html, because it
>>> closely matches my problem, but I couldn't figure out what
>>> update_version.cmake should do exactly. In my case, I would need the
>>> values of a number CMake variables (like CMAKE_CURRENT_BINARY_DIR), but
>>> of course, these values are not around anymore when running 'make'.
>>> Should all these variables be passed using -D?
>>>
>>> Best regards,
>>> Marcel Loose.
>>
>> You configure_file a CMake script at CMake time which you then use in an
>> add_custom_command to run at make-time. So you put all the "static" data you
>> need (such as CMAKE_BINARY_DIRECTORY, etc.) in the script file and then you
>> have them available at make time:
>>
>> some_script.cmake:
>> ------------------
>> set(CMAKE_SOURCE_DIR "@CMAKE_SOURCE_DIR@")
>> set(CMAKE_BINARY_DIR "@CMAKE_BINARY_DIR@")
>> set(SVN_EXECUTABLE "@SVN_EXECUTABLE@")
>> # ... do what you need to to ...
>> -------------------
>>
>>
>> But I still don't see why you have to extract version-information at build
>> time, because IMHO that shouldn't change between CMake-runs.
>>
>>
> I'm assuming he wants to encode "up-to-the-minute" svn status output in the
> build, which changes the second you make a local mod to any source file
> anywhere in your tree...
>
> Admirable goal, but sure does suck to depend on everything. :-)
Ahhh. I see. That DOES suck. Hope the configured file gets compiled into only one single object file and doesn't trigger an avalanche of recompiling/relinking...
Michael
More information about the CMake
mailing list