[CMake] Installing shared libs with symlinks

Martin Apel martin.apel at simpack.de
Mon Jan 12 03:34:31 EST 2009


Philip Lowman wrote:
> On Fri, Dec 12, 2008 at 9:34 AM, Martin Apel <martin.apel at simpack.de
> <mailto:martin.apel at simpack.de>> wrote:
>
>     Philip Lowman wrote:
>     > On Wed, Dec 10, 2008 at 4:04 AM, Martin Apel
>     <martin.apel at simpack.de <mailto:martin.apel at simpack.de>
>     > <mailto:martin.apel at simpack.de <mailto:martin.apel at simpack.de>>>
>     wrote:
>     >
>     >     Hi there,
>     >
>     >     I am trying to install the boost libraries my software needs
>     into the
>     >     target installation directory as follows:
>     >
>     >     Find_Package(Boost 1.34.1 COMPONENTS filesystem system signals
>     >     program_options REQUIRED)
>     >     FOREACH (Lib ${Boost_FILESYSTEM_LIBRARY} ${Boost_SYSTEM_LIBRARY}
>     >     ${Boost_SIGNALS_LIBRARY} ${Boost_PROGRAM_OPTIONS_LIBRARY})
>     >      INSTALL(PROGRAMS ${Lib} DESTINATION run/bin)
>     >     ENDFOREACH (Lib ${Boost_FILESYSTEM_LIBRARY}
>     ${Boost_SYSTEM_LIBRARY}
>     >     ${Boost_SIGNALS_LIBRARY} ${Boost_PROGRAM_OPTIONS_LIBRARY})
>     >
>     >     The variables returned from FindBoost contain symlinks to
>     the real
>     >     libraries, e.g.
>     >      libboost_system-gcc43-mt-1_35.so ->
>     >     libboost_system-gcc43-mt-1_35.so.1.35.0
>     >
>     >     When installing these the files in the destination directory are
>     >     symlinks again, which is not what I want. I tried using
>     >        GET_FILENAME_COMPONENT(LibWithoutSymLink ${Lib} ABSOLUTE)
>     >     in the above loop, but this does not help, the returned path
>     still
>     >     does
>     >     not contain the resolved name. This looks to me like a bug
>     in the
>     >     implementation
>     >     of GET_FILENAME_COMPONENT. Is there any recommended way to
>     install
>     >     referenced libraries including resolving any symlinks?
>     >
>     >
>     > You could file a feature request to have that implemented.
>      Ultimately
>     > though that won't be portable because on Windows it would
>     resolve to a
>     > ".lib" when you would want a ".dll".  And you probably want
>     something
>     > that works now for this.
>     >
>     >
>     > Boost_INCLUDE_DIR in conjuction with FILE(GLOB...) and INSTALL()
>     would
>     > probably work much better for you.  Perhaps something like this?
>     >
>     > FILE(GLOB my_boost_system_libs
>     > ${Boost_INCLUDE_DIR}/lib/libboost_system*.so)
>     > IF(my_boost_system_libs)
>     >      INSTALL(FILES ${my_boost_system_libs} DESTINATION lib)
>     > ENDIF()
>     >
>     > Obviously you would need two GLOB's for this to be portable to
>     WIN32.
>     Hi Philip,
>
>     I tried to avoid this, because the naming scheme for Boost
>     libraries is
>     complicated (compiler version, threading). Therefore I used the
>     variables provided by FindBoost to get the names. Anyway I would have
>     expected GET_FILENAME_COMPONENT to return the referenced file,
>     which it
>     doesn't. I'm still not sure, if this is a bug or expected behaviour?
>
>
> This looks like a missing feature request and not a bug.  I would
> request an option be added to GET_FILENAME_COMPONENT that follows
> symbolic links recursively back to their source (CANONICALIZE
> perhaps?).  In the meantime you can use the "readlink" program to do
> this for you.
Hi Philip,

to me it looks more like a bug, because the documentation for
GET_FILENAME_COMPONENT states, that for ABSOLUTE the file name is
returned without symlinks.
Anyway at least under Unix I could use readlink, but then I will have to
do platform-dependant stuff here, which I tried to avoid.

Regards,

Martin

____________
Virus checked by G DATA AntiVirus
Version: AVF 19.219 from 12.01.2009




More information about the CMake mailing list