[CMake] How to regenerate source file during make?

Marcel Loose loose at astron.nl
Fri Jan 15 12:06:44 EST 2010


On Fri, 2010-01-15 at 16:45 +0100, Michael Wild wrote:
> 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

Yep, 

David and Michael, you're both right. I should put this into a .cc file,
not a .h file. I'm working on the configure_file(some_script.cmake.in)
solution now. Seems that's the best way to do it. Thanks for your input.

Best regards,
Marcel Loose.




More information about the CMake mailing list