<div class="gmail_quote">On Sun, May 16, 2010 at 2:26 PM, Timothy M. Shead <span dir="ltr">&lt;<a href="mailto:tshead@k-3d.com">tshead@k-3d.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">

<div class="im">On 05/16/2010 12:11 PM, Marcus D. Hanwell wrote:<br>
&gt; On Sun, May 16, 2010 at 12:48 PM, Timothy M. Shead &lt;<a href="mailto:tshead@k-3d.com">tshead@k-3d.com</a><br>
</div><div class="im">&gt; &lt;mailto:<a href="mailto:tshead@k-3d.com">tshead@k-3d.com</a>&gt;&gt; wrote:<br>
&gt;<br>
&gt;     I&#39;d like to do the following:<br>
&gt;<br>
&gt;      # Build external project A<br>
&gt;      ExternalProject_Add(A ...)<br>
&gt;<br>
&gt;      # Import target B, which is exported by A in AConfig.cmake<br>
&gt;      ExternalProject_Get_Property(A, BINARY_DIR)<br>
&gt;      set(A_DIR ${BINARY_DIR})<br>
&gt;      find_package(A)<br>
&gt;<br>
&gt;      # Link with B<br>
&gt;      add_library(C ...)<br>
&gt;      target_link_libraries(C B)<br>
&gt;<br>
&gt;     Of course, this doesn&#39;t work because the external project hasn&#39;t been<br>
&gt;     built yet at configure-time, so AConfig.cmake doesn&#39;t exist.  Which<br>
&gt;     leads me to the following:<br>
&gt;<br>
&gt; Hi,<br>
&gt;<br>
&gt; If I understand your question correctly, then adding DEPENDS A to your<br>
&gt; ExternalProject_Add(B...) call will ensure that A has been built when B<br>
&gt; is configured, thus satisfying your need to find A&#39;s exported targets.<br>
&gt; Using the dependencies between external projects it is possible to<br>
&gt; control the build order, so that A&#39;s config file will be present before<br>
&gt; B attempts a configure step.<br>
<br>
</div>That wasn&#39;t quite what I was describing - &quot;B&quot; isn&#39;t another external<br>
project, it&#39;s a library that&#39;s built by external project &quot;A&quot;.  Because A<br>
hasn&#39;t been built (isn&#39;t even downloaded yet) at configure time, I can&#39;t<br>
use find_package to benefit from A&#39;s internal understanding of where<br>
its&#39; outputs are located.  Basically, I want the simplest possible<br>
add_library(... IMPORTED) call possible, one that doesn&#39;t end-up<br>
duplicating all of the platform-specific logic that CMake normally takes<br>
care of.  Since my last post, I&#39;ve switched to the following, which<br>
works on Linux and seems like it could work on Windows:<br>
<br>
  ADD_LIBRARY(B SHARED IMPORTED)<br>
  SET_TARGET_PROPERTIES(B PROPERTIES<br>
    IMPORTED_LOCATION<br>
&quot;${BINARY_DIR}/path/to/libB${CMAKE_SHARED_LIBRARY_SUFFIX}&quot;<br>
   IMPORTED_IMPLIB &quot;${BINARY_DIR}/path/to/libB.lib&quot;<br>
  )<br></blockquote><div><br></div><div>Ah, I understand now. This is one of the major reasons to avoid mixing external projects and traditional targets in the same build. I would solve that by adding another external project in the build, that would depend on A, and so A would be there at configure time and no guessing would be necessary.</div>

<div><br></div><div>Is there any particular reason why you cannot use that pattern in your case? Otherwise you can quickly end up writing a lot of code to predict where things will be, and that could be quite a fragile approach if the targets changed in a new release.</div>

<div><br></div><div>Marcus</div></div>