I am trying to use ExternalProject_add() to download/install dependencies. It installs fine, but I can't figure out how to actually link the libraries after they are downloaded.
I want to call target_link_libraries() on the library that was just downloaded, but the path to the library will vary by system.
If this were a system dependency, I could just call find_package() - but the packages weren't installed on the default search path. I don't think you can specify a search path for find_package in module mode.
Here's a snippet of my CMakeLists.txt that doesn't work:
ExternalProject_Add( protobuf URL http://protobuf.googlecode.com/files/protobuf-2.4.1.tar.gz CONFIGURE_COMMAND <SOURCE_DIR>/configure --prefix=<INSTALL_DIR> PREFIX ${MYPROJ_SOURCE_DIR}/dependencies ) find_package(protobuf REQUIRED) set(LIBS ${LIBS} ${PROTOBUF_LIBRARIES}) target_link_libraries (mybinary ${LIBS})
Because you're downloading the external project, you already know where everything is because you just downloaded it, so it doesn't need 'finding'.
I got it working with add_library. This is my actual code that works:
ExternalProject_Add(ForexConnectDownload PREFIX 3rd_party #--Download step-------------- URL http://fxcodebase.com/bin/forexconnect/1.3.1/ForexConnectAPI-1.3.1-Linux-x86_64.tar.gz URL_HASH SHA1=7fdb90a2d45085feb8b76167cae419ad4c211d6b #--Configure step------------- CONFIGURE_COMMAND "" #--Build step----------------- BUILD_COMMAND "" #--Install step--------------- UPDATE_COMMAND "" # Skip annoying updates for every build INSTALL_COMMAND "" ) SET(FXCM_INCLUDE_DIR ${CMAKE_CURRENT_BINARY_DIR}/3rd_party/src/ForexConnectDownload/include) SET(FXCM_LIB_DIR ${CMAKE_CURRENT_BINARY_DIR}/3rd_party/src/ForexConnectDownload/lib) add_library(ForexConnect SHARED IMPORTED) set_target_properties(ForexConnect PROPERTIES IMPORTED_LOCATION ${FXCM_LIB_DIR}/libForexConnect.so)
From there, each program that depends on it needs a add_dependencies
and of course target_link_libraries
. Eg:
include_directories(${FXCM_INCLUDE_DIR}) add_executable(syncDatabase syncDatabase.cpp trader/database.cpp trader/fxcm.cpp) target_link_libraries(syncDatabase ForexConnect) add_dependencies(syncDatabase ForexConnectDownload)
The add_dependencies makes it wait before trying to include the dirs needed.
That does the trick for me. Works with make -j4. Get's all the dependencies right.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With