[CMake] Can imported libraries depend on ExternalProject targets?

Kent Williams nkwmailinglists at gmail.com
Fri Jun 22 11:33:09 EDT 2012


Say I have an ExternalProject that generates several libraries

ExternalProject_Add(foo
  # the usual mumbo jumbo
)

set(foo_LIBRARIES)

# foo makes 3 libraries
foreach(lib a b c)
  # import the libraries
  add_library(${lib} STATIC IMPORTED)

 # tell CMake where the library file is
  set_property(TARGET ${lib} PROPERTY
     IMPORTED_LOCATION
     ${imported_library_filename})

  # add to the library list
  list(APPEND foo_LIBRARIES ${lib})

  # this doesn't work apparently
  add_dependencies(${lib} foo)
endforeach()

In order for parallel make to work, the foo ExternalProject must
complete successfully before any programs that link to
${foo_LIBRARIES} are compiled and linked.

I thought that making the imported library targets depend on the
ExternalProject target would behave in a transitive manner - i.e.

add_executable(foo_user foo.cxx)
target_link_libraries(foo_user ${foo_LIBRARIES})

But this is not the case. In a parallel build, the foo_user build
doesn't wait for the foo ExternalProject to finish.

If I add

add_dependencies(foo_user foo)

Everything behaves fine.  But that requires explicitly add a
dependency on an ExternalProject target everywhere it's outputs are
used.

Is this a bug? A feature request? Or is there another way to make this work?


More information about the CMake mailing list