<html dir="ltr"><head></head><body style="text-align:left; direction:ltr;"><div>On Thu, 2019-03-14 at 13:30 -0400, frodak17 wrote:</div><blockquote type="cite" style="margin:0 0 0 .8ex; border-left:2px #729fcf solid;padding-left:1ex"><div dir="ltr"><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Thu, Mar 14, 2019 at 12:53 PM frodak17 <<a href="mailto:frodak17@gmail.com">frodak17@gmail.com</a>> wrote:</div><blockquote type="cite" style="margin:0 0 0 .8ex; border-left:2px #729fcf solid;padding-left:1ex"><div dir="ltr"><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Thu, Mar 14, 2019 at 1:13 AM Paul Smith <<a href="mailto:paul@mad-scientist.net" target="_blank">paul@mad-scientist.net</a>> wrote:<br></div><blockquote type="cite" style="margin:0 0 0 .8ex; border-left:2px #729fcf solid;padding-left:1ex">I have a situation where I've created a custom command to generate .cpp<br>
files to be compiled (in my case running bison/flex).<br>
<br>
I'm using CMake 3.13.4<br>
<br>
  set(MyParserOutput<br>
      ${OUT_DIR}/MyParser.tab.cpp<br>
      ${OUT_DIR}/MyParser.tab.hpp)<br>
<br>
  add_custom_target(MyGenParser DEPENDS ${MyParserOutput})<br>
<br>
Then I have two different libraries, both depending on this:<br>
<br>
  add_library(OneLib STATIC ${MyParserOutput} ...)<br>

  add_dependencies(OneLib MyGenparser)<br>
<br>
<br>
  add_library(TwoLib STATIC ${MyParserOutput} ...)<br>

  add_dependencies(TwoLib MyGenparser)<br>
<br></blockquote><div>From add_custom_command() <br></div><div>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 the <span class="gmail-m_4849148754294519081gmail-target" id="gmail-m_4849148754294519081gmail-index-0-command:add_custom_target"></span><a class="gmail-m_4849148754294519081gmail-reference gmail-m_4849148754294519081gmail-internal" href="https://cmake.org/cmake/help/v3.14/command/add_custom_target.html#command:add_custom_target" title="add_custom_target" target="_blank"><code class="gmail-m_4849148754294519081gmail-xref gmail-m_4849148754294519081gmail-cmake gmail-m_4849148754294519081gmail-cmake-command gmail-m_4849148754294519081gmail-docutils gmail-m_4849148754294519081gmail-literal gmail-m_4849148754294519081gmail-notranslate"><span class="gmail-m_4849148754294519081gmail-pre">add_custom_target()</span></code></a> command to drive the
command and make the other targets depend on that one)</div></div></div></blockquote></div></div></blockquote><div><br></div><div>Yeah, I did see that in the manual and I do that, as above.  It wan't at all clear to me that <i>in addition</i> to those requirements, I <i>ALSO</i> could <b>NOT</b> list the output of the add_custom_command() in any of my other targets.</div><div><br></div><div>That's unfortunate :(.</div><div><br></div><blockquote type="cite" style="margin:0 0 0 .8ex; border-left:2px #729fcf solid;padding-left:1ex"><div dir="ltr"><div class="gmail_quote"><div>In that case you need to keep ${MyParserOutput} and set the GENERATED properties for the files.</div><div><br></div><div>Also the building the custom target needs to be done in a separate directory as the add_custom_commands() need to be in a different CMakeLists.txt file from the libraries.  Otherwise the rules get pulled into the libraries and cause the commands to be run multiple times.</div></div></div>
</blockquote><div><br></div><div>Ouch.  That's painful as it could mean moving my code around.</div><div><br></div><div>However in this case it ended up not being too horrible because my parser input files happened to be in a subdirectory already, so I created a new CMakeLists.txt file there that only ran the generators, then used <b>set(... PARENT_SCOPE)</b> to publish the variables to the parent directory.</div><div><br></div><div>I did then have to add a GENERATED property to those files in the parent directory, as you noted, so overall it's a bit leaky in terms of abstractions, but it seems to work... now when I run on Windows I see that the generators are run only one time.</div><div><br></div><div>Thanks for the help!!</div></body></html>