2017-05-24 15:23 GMT+02:00 Elvis Stansvik <elvis.stans...@orexplore.com>: > Hi all, > > My application consists of an executable (orexplore-insight) and two > shared libraries (libinsightview and libinsightmodel). > > In addition to that, I'm linking against Qt 5.8.0, VTK 8.0.0.rc1, HDF5 > 1.8.18 and Qwt 6.1.2. > > My goal is to make a self-contained .app bundle (and eventually a .dmg). > > This is what otool -L looks like on my executable, when installed: > > Kevins-MacBook-Pro:build insight$ otool -L > ~/Insight/insight-inst/orexplore-insight.app/Contents/MacOS/orexplore-insight > /Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/MacOS/orexplore-insight: > @rpath/libinsightview.dylib (compatibility version 0.0.0, > current version 0.0.0) > @rpath/libinsightmodel.dylib (compatibility version 0.0.0, > current version 0.0.0) > @rpath/libhdf5.10.2.1.dylib (compatibility version 10.2.1, > current version 1.8.18) > @rpath/QtConcurrent.framework/Versions/5/QtConcurrent > (compatibility version 5.8.0, current version 5.8.0) > libvtkChartsCore-8.0.1.dylib (compatibility version 1.0.0, > current version 1.0.0) > libvtkImagingStatistics-8.0.1.dylib (compatibility version > 1.0.0, current version 1.0.0) > libvtkRenderingContextOpenGL2-8.0.1.dylib (compatibility > version 1.0.0, current version 1.0.0) > libvtkRenderingQt-8.0.1.dylib (compatibility version 1.0.0, > current version 1.0.0) > libvtkGUISupportQt-8.0.1.dylib (compatibility version 1.0.0, > current version 1.0.0) > @rpath/QtWidgets.framework/Versions/5/QtWidgets (compatibility > version 5.8.0, current version 5.8.0) > @rpath/QtGui.framework/Versions/5/QtGui (compatibility version > 5.8.0, current version 5.8.0) > @rpath/QtCore.framework/Versions/5/QtCore (compatibility > version 5.8.0, current version 5.8.0) > libvtkRenderingLabel-8.0.1.dylib (compatibility version 1.0.0, > current version 1.0.0) > libvtkRenderingVolumeOpenGL2-8.0.1.dylib (compatibility > version 1.0.0, current version 1.0.0) > libvtkRenderingOpenGL2-8.0.1.dylib (compatibility version > 1.0.0, current version 1.0.0) > /System/Library/Frameworks/Cocoa.framework/Versions/A/Cocoa > (compatibility version 1.0.0, current version 22.0.0) > libvtkImagingMath-8.0.1.dylib (compatibility version 1.0.0, > current version 1.0.0) > libvtkglew-8.0.1.dylib (compatibility version 1.0.0, current > version 1.0.0) > libvtkViewsContext2D-8.0.1.dylib (compatibility version 1.0.0, > current version 1.0.0) > libvtkRenderingContext2D-8.0.1.dylib (compatibility version > 1.0.0, current version 1.0.0) > libvtkViewsCore-8.0.1.dylib (compatibility version 1.0.0, > current version 1.0.0) > libvtkInteractionWidgets-8.0.1.dylib (compatibility version > 1.0.0, current version 1.0.0) > libvtkInteractionStyle-8.0.1.dylib (compatibility version > 1.0.0, current version 1.0.0) > libvtkRenderingAnnotation-8.0.1.dylib (compatibility version > 1.0.0, current version 1.0.0) > libvtkRenderingFreeType-8.0.1.dylib (compatibility version > 1.0.0, current version 1.0.0) > libvtkfreetype-8.0.1.dylib (compatibility version 1.0.0, > current version 1.0.0) > > /System/Library/Frameworks/ApplicationServices.framework/Versions/A/ApplicationServices > (compatibility version 1.0.0, current version 48.0.0) > > /System/Library/Frameworks/CoreServices.framework/Versions/A/CoreServices > (compatibility version 1.0.0, current version 775.19.0) > libvtkRenderingVolume-8.0.1.dylib (compatibility version > 1.0.0, current version 1.0.0) > libvtkRenderingCore-8.0.1.dylib (compatibility version 1.0.0, > current version 1.0.0) > libvtkFiltersSources-8.0.1.dylib (compatibility version 1.0.0, > current version 1.0.0) > libvtkFiltersGeneral-8.0.1.dylib (compatibility version 1.0.0, > current version 1.0.0) > libvtkFiltersCore-8.0.1.dylib (compatibility version 1.0.0, > current version 1.0.0) > libvtkImagingCore-8.0.1.dylib (compatibility version 1.0.0, > current version 1.0.0) > libvtkCommonExecutionModel-8.0.1.dylib (compatibility version > 1.0.0, current version 1.0.0) > libvtkCommonDataModel-8.0.1.dylib (compatibility version > 1.0.0, current version 1.0.0) > libvtkCommonTransforms-8.0.1.dylib (compatibility version > 1.0.0, current version 1.0.0) > libvtkCommonMisc-8.0.1.dylib (compatibility version 1.0.0, > current version 1.0.0) > libvtkCommonMath-8.0.1.dylib (compatibility version 1.0.0, > current version 1.0.0) > libvtkCommonCore-8.0.1.dylib (compatibility version 1.0.0, > current version 1.0.0) > libvtksys-8.0.1.dylib (compatibility version 1.0.0, current > version 1.0.0) > libvtkzlib-8.0.1.dylib (compatibility version 1.0.0, current > version 1.0.0) > libqwt.6.dylib (compatibility version 6.1.0, current version 6.1.2) > /usr/lib/libc++.1.dylib (compatibility version 1.0.0, current > version 307.5.0) > /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, > current version 1238.50.2) > Kevins-MacBook-Pro:build insight$ > > So from this I can see that Qt and HDF5 install libraries with an > "@rpath/..."-style install_name, while VTK and Qwt does not (they use > a filename-only install_name). > > So far so good I suppose. > > If I understand correctly, to make my application work as a > self-containing .app bundle in this scenario, I must: > > 1. Bundle all dependent frameworks/libraries inside the .app (of course) > > 2. Ensure my executable has an LC_RPATH pointing to > @executable_path/.., @executable_path/../Frameworks et.c., which makes > sure the bundled libraries with "@rpath/..."-style install_names are > found correctly. > > 3. Ensure my app is started with DYLD_LIBRARY_PATH pointing to > wherever I bundle the libraries that do not use "@rpath/..."-style > install_name's, so that they are found as well. > > Does this sound about right? > > Now on to my current problem: > > I can make sure my installed executable has e.g. an > @executable_path/../Frameworks LC_RPATH by setting the INSTALL_RPATH > target property. I've verified with otool -l on the installed > executable that this is working. E.g: > > Load command 59 > cmd LC_RPATH > cmdsize 48 > path @executable_path/../Frameworks (offset 12) > > However, if I try to make the bundle self-containing with > fixup_bundle(...) from BundleUtilities, using an install snippet like: > > fixup_bundle("${CMAKE_INSTALL_PREFIX}/orexplore-insight.app" "" "") > > (the above is from an install(SCRIPT ...) of mine), then I get > warnings and errors during `make install`, such as: > > warning: cannot resolve item '@rpath/libhdf5.10.2.1.dylib' > > and > > warning: target '@rpath/libhdf5.10.2.1.dylib' is not absolute... > > and > > warning: target '@rpath/libhdf5.10.2.1.dylib' does not exist... > > and > > warning: unexpected reference to '@rpath/libhdf5.10.2.1.dylib' > > And none of the libraries have been copied into the bundle.
Note also that the two libraries that _don't_ use @rpath install_name (VTK and Qwt) are not found/copied either. So I'm not sure my issue is related to @rpath at all. As a test, I've also tried passing in the path to the VTK library directory to the dirs parameter of fixup_bundle(..): fixup_bundle("${CMAKE_INSTALL_PREFIX}/orexplore-insight.app" "" "/Users/insight/Insight/VTK-8.0.0.rc1-inst/lib") but the problem is the same. The libraries are not found, and I'm getting warnings like: warning: cannot resolve item 'libvtkFiltersCore-8.0.1.dylib' possible problems: need more directories? need to use InstallRequiredSystemLibraries? run in install tree instead of build tree? and: warning: target 'libvtkFiltersCore-8.0.1.dylib' is not absolute... warning: target 'libvtkFiltersCore-8.0.1.dylib' does not exist... And the library is not copied. Elvis > > Furthermore, and what surprises me, is that after this failed install, > if I look at the installed executable again with otool -l, then it > seems fixup_bundle has removed the LC_RPATH :( > > I'm attaching the full output from `make install`. You can ignore that > the installed paths of my own libraries (libinsightview and > libinsightmodel) are a bit wrong, I'll fix that and I'm focusing on > the third party libs for now. > > My questions are: > > 1. Anyone know what is going wrong with the fixup_bundle(...) here? > Why can't it bundle the libraries? I've tried adding the directories > of the third party libraries to DYLD_LIBRARY_PATH during the `make > install`, to help fixup_bundle(...) find them, but it didn't make any > difference. > > 2. Why is fixup_bundle(...) stripping out the LC_RPATH I added by > means of setting the INSTALL_RPATH target property? I want that > LC_RPATH to be there, so that bundled libraries with @rpath are found. > > Many thanks in advance, > A confused Elvis -- 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