[CMake] Imported ExternalProject Libraries with Ninja

Attila Krasznahorkay attila.krasznahorkay at gmail.com
Sun Nov 22 03:41:56 EST 2015


Hi Zac,

In recent versions of CMake (not sure when it was introduced, but it's available in 3.2.X) you have an extra argument for ExternalProject_Add: BUILD_BYPRODUCTS.

https://cmake.org/cmake/help/v3.2/module/ExternalProject.html

I use this in a setup very similar to yours to declare all the shared libraries that my external project target will make. This way Ninja knows where to expect those files from.

Cheers,
             Attila

> On 20 Nov 2015, at 19:02, Zac Bergquist <zbergquist99 at gmail.com> wrote:
> 
> Hello,
> 
> I'm using ExternalProject to build libxml2 into a static library, which I link my application to.  I've read a few warnings about combining ExternalProject with standard CMake targets, but I'm pretty sure this is the approach I want to take.  I do not want to install libxml2 globally because I'm configuring it with a very specific set of options.
> 
> I have something like this:
> 
> # build libxml2
> ExternalProject_Add(libxml2
>    BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/libxml2-2.9.1
>    CONFIGURE_COMMAND ${XML_SRC}/configure ${CONFIGURE_FLAGS}
>    ...
> )
> 
> # tell CMake that the ExternalProject generated a library
> add_library(xml2 STATIC IMPORTED GLOBAL)
> set_property(TARGET xml2 PROPERTY
>     IMPORTED_LOCATION ${CMAKE_CURRENT_BINARY_DIR}/libxml2-2.9.1/.libs/libxml2.a
> )
> 
> add_executable(foo ${SOURCES})
> 
> add_dependency(foo libxml2)
> 
> target_link_libraries(foo xml2)
> 
> I realize that this isn't as portable as it could [should] be because I'm including information about where the build files will be generated, but I'm okay with this.
> 
> With the standard Unix makefile generator, everything works fine.  I can run `make foo` and it configures and builds libxml2, then builds foo and links to the static library.
> 
> However, with the ninja generator, I get an error:
> 
> ninja: error: "libxml2-2.9.1/.libs/libxml2.a', needed by 'out/bin/foo', missing and no known rule to make it
> 
> For some reason the Ninja build is not picking up on the fact that libxml2.a is generated by the external project.  The only way I'm able to get this to build is to run `ninja xml2` followed by `ninja foo`.
> 
> Am I doing something wrong or could this be a bug in CMake?  If so, are there any workarounds.  I just started using Ninja and am really enjoying the speed advantage over make.
> 
> Thanks,
> Zac
> -- 
> 
> 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



More information about the CMake mailing list