On 10/12/2011 07:38 PM, Harelick, Matthew wrote: > Hello: > > > I am working on a project that relies on third party libraries, for example > MyVendor.so. I am using cmake 2.6. [...]
Uh-oh... No chance to upgrade? > [...] When the third party shared object is checked out, it is installed in > svnroot/Thirdparty/MyVendor/lib/MyVendor.so > > I add the library has an imported library. When I build the application, the > location of the library is linked to the precise location above. > > How do I: > > 1) Encode cmake to generate a make file that copies the library into a > location relative to the binary, like > ../lib so that I can then use that directory as an import location. I can > copy the file myself manually but it would nice if I could use cmake to help > with doing this automatically. I know that if I was handwriting a makefile I > could in effect build a library target by copying one from a different > location. You might use a custom command for this purpose, look here: CMAKE_MINIMUM_REQUIRED(VERSION 2.8 FATAL_ERROR) PROJECT(THIRDPARTY C) SET(CMAKE_VERBOSE_MAKEFILE ON) FILE(WRITE ${CMAKE_BINARY_DIR}/f.c "void f(void){}\n") EXECUTE_PROCESS(COMMAND gcc -fPIC -c f.c) EXECUTE_PROCESS(COMMAND gcc -shared -o libf.so f.o) ADD_CUSTOM_COMMAND(OUTPUT ${CMAKE_BINARY_DIR}/lib/libf.so COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_BINARY_DIR}/libf.so ${CMAKE_BINARY_DIR}/lib/libf.so DEPENDS ${CMAKE_BINARY_DIR}/libf.so) ADD_LIBRARY(f SHARED IMPORTED) SET_TARGET_PROPERTIES(f PROPERTIES IMPORTED_LOCATION "./lib/libf.so") FILE(WRITE ${CMAKE_BINARY_DIR}/main.c "int main(void){f(); return 0;}\n") ADD_EXECUTABLE(main main.c ${CMAKE_BINARY_DIR}/lib/libf.so) TARGET_LINK_LIBRARIES(main f) The custom command copies the "third-party" library libf.so from CMAKE_BINARY_DIR to CMAKE_BINARY_DIR/lib, and the main target refers to that library by an IMPORTED_LOCATION property with a relative path as desired. Note that the custom command's OUTPUT must be referred to by a target; if necessary, use a custom one instead of ADD_EXECUTABLE(). > > 2) How do I ensure that CPack maintains that relative structure so that > internally the application looks in ../lib for the file to dynamically load? Does CPack fail in this regard? I'm not quite sure what you mean; what happens now, and what do you want to happen instead? Regards, Michael -- Powered by www.kitware.com Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html Please keep messages on-topic and check the CMake FAQ at: http://www.cmake.org/Wiki/CMake_FAQ Follow this link to subscribe/unsubscribe: http://www.cmake.org/mailman/listinfo/cmake