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

Reply via email to