> I think it would be nice to move
> get_item_rpaths() from BundleUtilities.cmake to gp_item_get_rpaths() in
> GetPrerequisites.cmake.
Well, this function is generic enough to (possible) serve other routines or
even in CMakeLists.txt, so I'd leave it as it is.
> And how does your patch or patch set handle @loader_path being used in the
> rpath?
My patch doesn't change anything in this regard, this is handles as it was done
previously via ${context} which is expected to be the referencing
library/executable.
> Also, I think the function signature should include the rpath vs runpath
> distinction. I realize OS X doesn't have the runpath concept, but if one
> were to add support for Linux, one may need that where the runpath affects
> only finding immediate dependencies.
Well, this is fine. Can you please submit your patches once my code gets
merged. It would be best to do it step by step. WDYT?
> Below is what I have for Linux and OS X.
> It include rpath vs. runpath, and expands out the @loader_path variable.
Well I think this is incorrect, because @loader_path gets expanded to image
containing LC_RPATH not image that is actually loading image, which may be
different binary (library), e.g.:
bin/MyApp
-> @rpath/libsome.so
lib/libsome.so
-> @rpath/libsomeplugin.so
lib/plugins/libsomeplugin.so
Now let's assume bin/MyApp has following LC_RPATHs:
@loader_path/plugins
@loader_path/../lib
Then with your script plugins/ would be resolved to be bin/plugins/ but in fact
dyld will resolve it to lib/plugins/ because it is lib/libsome.so which is
loader of @rpath/libsomeplugin.so.
> (...)
> if(APPLE)
> execute_process(COMMAND otool -l "${binary}"
> COMMAND grep -A2 LC_RPATH
> COMMAND grep path
> OUTPUT_VARIABLE paths)
> string(REPLACE "\n" ";" paths "${paths}")
> foreach(str ${paths})
> string(REGEX REPLACE " path (.*) \\(offset.*" "\\1" rpath "${str}")
> string(STRIP "${rpath}" rpath)
> string(REPLACE "@loader_path" "${binary_dir}" rpath "${rpath}")
> list(APPEND myrpaths "${rpath}")
> endforeach()
> (...)
Current implementation with my patches doesn't do @loader|executable_path
substitution in LC_RPATH because of simple reason. If your binary has LC_RPATHs
with these then in 99% cases the dependencies are already in the bundle. So
only LC_RPATH with absolute paths will cause copy.
--Adam
--
Powered by www.kitware.com
Please keep messages on-topic and check the CMake FAQ at:
http://www.cmake.org/Wiki/CMake_FAQ
Kitware offers various services to support the CMake community. For more
information on each offering, please visit:
CMake Support: http://cmake.org/cmake/help/support.html
CMake Consulting: http://cmake.org/cmake/help/consulting.html
CMake Training Courses: http://cmake.org/cmake/help/training.html
Visit other Kitware open-source projects at
http://www.kitware.com/opensource/opensource.html
Follow this link to subscribe/unsubscribe:
http://public.kitware.com/mailman/listinfo/cmake-developers