[CMake] How to have generated source compiled multiple ways?

Paul Smith paul at mad-scientist.net
Mon Aug 12 16:11:41 EDT 2013


Hi all.

I've got a situation where I'm creating generated source files (from
bison/flex, actually, but I'm writing my own rules for it since I need
specialized support for C++ output, etc.)

However I need to compile the generated output into two different
libraries, building two different ways (with different #defines/compiler
flags).

So I have tried using add_custom_command() with OUTPUT, but the
documentation says: 


        "Do not list the output in more than one independent target that
        may build in parallel or the two instances of the rule may
        conflict (instead use add_custom_target to drive the command and
        make the other targets depend on that one)."


Sure enough, it seems that if I have my different libraries depend on
these outputs I get problems during parallel builds.  So then I tried to
use add_custom_target(), but that says:


        "The target has no output file and is ALWAYS CONSIDERED OUT OF
        DATE"


and, sure enough, if I do it this way my source files (and everything
that depends on them) rebuild every time I run the build, even if
nothing has changed.  This is a big bummer.


How can I have generated source files compiled different ways into
different libraries, but not have them (and anything that depends on
them) rebuilt every time?


The only way I've thought of so far is to have two different
add_custom_command() options with the same input but different output
(in different directories maybe), one for each target.  This means I
need to generate the files twice even though the output source files
will have identical content.  But as long as I don't have to REBUILD
them every time maybe that's not so bad.  I haven't tried this yet
though.  Are there other options?
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.cmake.org/pipermail/cmake/attachments/20130812/5d145a18/attachment.htm>


More information about the CMake mailing list