[CMake] Generated files?

Chris Johnson cxjohnson at gmail.com
Fri Jan 30 09:27:21 EST 2015


That does clarify a few things yes.  Thank you.

By "configure" time I had meant the first two items you listed as Configure
and Generate.  By "run" time I had meant what you called Build.

One place I am unclear on is exactly which commands in CMakeLists.txt get
translated into Build time commands in buildsystem files (in my case,
make).  For example, make is fairly powerful at generating substitution
file names, e.g. creating prog.o from prog.cpp, or file1.out from file1.in.
Make is also capable of running full shell scripts within a makefile.  But
there's no obvious way to drive any kind of automation from CMake that make
is capable of.

As a programmer, my first thought when having to process a large list of
files is to do it through some sort of automation, rather than generate a
brute force solution.  It appears that with CMake, the best one can hope
for is to automate the creation of the brute-force solution.

--
Cheers,
..chris

On Fri, Jan 30, 2015 at 4:32 AM, Petr Kmoch <petr.kmoch at gmail.com> wrote:

> It's not clear to me what you mean with "run" time. There are the
> following "times" involved in a CMake-based project:
>
> * Configure time:
> CMake is parsing CMakeLists.txt files and files included from those and
> executing ALL CMake commands found in them. Variables expansion takes
> place. Data structures in CMake's memory are filled.
>
> * Generate time:
> CMake processes the data structures in its memory to write buildsystem
> files (Makefiles, solutions etc.) to disk. Generator expressions are
> expanded. Files are generated from data specified in file(GENERATE ...)
> commands. cmake_install.cmake file is written based on the contents of data
> structures filled by install() commands.
>
> * Build time:
> CMake is not running (except for driving the build if you do that with
> `cmake --build`). The build tool (make, ninja, devenv, msbuild, ...) is
> running, processing the buildsystem files and generating compiled binaries.
> At this time, commands which were set up by add_custom_command() and
> add_custom_target() are executed as driven by the build tool.
>
> * Install time (optional):
> Running `make install` or similarly triggering the install process causes
> CMake to run in installation mode. This CMake reads the cmake_install.cmake
> file and executes the commands there. These are mainly file() commands
> which copy files to the desired location.
>
> CMake commands in CMakeLists.txt and included files are all executed
> during configure time, as the files are parsed and processed by CMake. Some
> of these commands have immediate effects on the outside environment (e.g.
> file(WRITE), execute_process(), try_compile()), some affect the CMake
> processing control flow (e.g. include(), foreach()), some fill in or modify
> CMake's data structures (e.g. set(), add_executable(), install(),
> add_custom_command()).
>
> So there are no CMake commands executed after configure time. The value
> specified in a COMMAND argument of add_custom_command() executes at build
> time (driven by the build system), but the add_custom_command() itself
> executes at CMake time.
>
> I hope I've clarified it a little bit.
>
> Petr
>
>
>
> On Thu, Jan 29, 2015 at 9:36 PM, Chris Johnson <cxjohnson at gmail.com>
> wrote:
>
>> Thanks; I appreciate the suggestions.
>>
>> One thing that jumped out is the thought that foreach() is executed at
>> "configuration" time, not "run" time.  To me, that was counter-intuitive,
>> but makes more sense once more thoroughly considered.
>>
>> But I have to admit, I've never seen anything in the documentation which
>> lists all of the commands which execute at configuration time, and which
>> are executed at run time.  Is there such documentation?  A link to it would
>> be great.
>>
>> On Thu, Jan 29, 2015 at 9:51 AM, Thompson, KT <kgt at lanl.gov> wrote:
>>
>>>  Hi Chris,
>>>
>>>
>>>
>>> Why not use a foreach loop? Something like this…
>>>
>>>
>>>
>>> add_executable(myprog myprog.cpp)
>>>
>>> set( files file001 fiile002 …)
>>>
>>> foreach( file in files)
>>>
>>>     add_custom_command(OUTPUT ${file}.out
>>>
>>>         COMMAND /bin/cp ${CMAKE_CURRENT_SOURCE_DIR}/${file}.in .
>>>
>>>         COMMAND myprog ${file}.in ${file}.out
>>>
>>>         DEPENDS ${file}.in myprog.cpp
>>>
>>>     )
>>>
>>> endforeach()
>>>
>>>
>>>
>>> For portability, you might want to use ‘${CMAKE_COMMAND} –E
>>> copy_if_different’ in place of ‘/bin/cp’ and CMAKE_CURRENT_BINARY_DIR in
>>> place of ‘.’
>>>
>>>
>>>
>>> -kt
>>>
>>>
>>>
>>> *From:* CMake [mailto:cmake-bounces at cmake.org] *On Behalf Of *Chris
>>> Johnson
>>> *Sent:* Thursday, January 29, 2015 8:09 AM
>>> *To:* cmake at cmake.org
>>> *Subject:* [CMake] Generated files?
>>>
>>>
>>>
>>> ​I am looking for suggestions on how to solve the following problem.  I
>>> need a solution which is easy to understand and safe from future
>>> maintenance errors.
>>>
>>>
>>>
>>> There is a project directory with one C++ program and a large number of
>>> "input" data files.
>>>
>>>
>>>
>>> The C++ program needs to be compiled, and then run against each of the
>>> input files to generate an output file of the same base name but with a
>>> different output suffix.  E.g. from the command line it might be:
>>>
>>>
>>>
>>>     % myprog  file001.in  file001.out
>>>
>>>
>>>
>>> Finally, the output files need to be installed in the proper location.
>>>
>>>
>>>
>>> For one input file, it might look like this:
>>>
>>>
>>>
>>>     add_executable(myprog myprog.cpp)
>>>
>>>     add_custom_command(OUTPUT file001.out
>>>
>>>         COMMAND /bin/cp ${CMAKE_CURRENT_SOURCE_DIR}/file001.in .
>>>
>>>         COMMAND myprog file001.in file001.out
>>>
>>>         DEPENDS files001.in myprog.cpp
>>>
>>>     )
>>>
>>>     install(FILES ${CMAKE_CURRENT_BINARY_DIR}/file001.out DESTINATION
>>> share/docs)
>>>
>>>
>>>
>>>
>>>
>>> Listing all of the input files in my CMakeLists.txt file is not a
>>> problem, but it would be nice to avoid having to list the corresponding
>>> output files.
>>>
>>>
>>>
>>> How can I build a CMakeLists.txt file which will succinctly handle this
>>> situation?
>>>
>>>
>>>
>>> --
>>>
>>> Thanks,
>>>
>>> ..chris​
>>>
>>
>>
>> --
>>
>> Powered by www.kitware.com
>>
>> Please keep messages on-topic and check the CMake FAQ at:
>> http://www.cmake.org/Wiki/CMake_FAQ
>>
>> Kitware offers various services to support the CMake community. For more
>> information on each offering, please visit:
>>
>> CMake Support: http://cmake.org/cmake/help/support.html
>> CMake Consulting: http://cmake.org/cmake/help/consulting.html
>> CMake Training Courses: http://cmake.org/cmake/help/training.html
>>
>> Visit other Kitware open-source projects at
>> http://www.kitware.com/opensource/opensource.html
>>
>> Follow this link to subscribe/unsubscribe:
>> http://public.kitware.com/mailman/listinfo/cmake
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://public.kitware.com/pipermail/cmake/attachments/20150130/26ce1708/attachment-0001.html>


More information about the CMake mailing list