Confusion with fixup_bundle(..) and RPATH on macOS

classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Confusion with fixup_bundle(..) and RPATH on macOS

Elvis Stansvik
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.

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

make_install.out.txt (99K) Download Attachment
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: Confusion with fixup_bundle(..) and RPATH on macOS

Elvis Stansvik
2017-05-24 15:23 GMT+02:00 Elvis Stansvik <[hidden email]>:

> 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
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: Confusion with fixup_bundle(..) and RPATH on macOS

Elvis Stansvik
2017-05-24 15:44 GMT+02:00 Elvis Stansvik <[hidden email]>:

> 2017-05-24 15:23 GMT+02:00 Elvis Stansvik <[hidden email]>:
>> 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

Okay, nevermind, it was just a matter of specifying _all_ library
directories to the third parameter to fixup_bundle(...), since there
were some interdependencies involved among my third party libraries.

With all library directories specified, fixup_bundle(..) seems to have
succeeded in bundling everything:

Kevins-MacBook-Pro:build insight$ find ~/Insight/insight-inst
/Users/insight/Insight/insight-inst
/Users/insight/Insight/insight-inst/libinsightmodel.dylib
/Users/insight/Insight/insight-inst/libinsightview.dylib
/Users/insight/Insight/insight-inst/orexplore-insight.app
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/Frameworks
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/Frameworks/QtConcurrent.framework
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/Frameworks/QtConcurrent.framework/QtConcurrent
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/Frameworks/QtConcurrent.framework/Resources
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/Frameworks/QtConcurrent.framework/Versions
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/Frameworks/QtConcurrent.framework/Versions/5
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/Frameworks/QtConcurrent.framework/Versions/5/QtConcurrent
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/Frameworks/QtConcurrent.framework/Versions/5/Resources
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/Frameworks/QtConcurrent.framework/Versions/5/Resources/Info.plist
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/Frameworks/QtConcurrent.framework/Versions/Current
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/Frameworks/QtCore.framework
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/Frameworks/QtCore.framework/QtCore
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/Frameworks/QtCore.framework/Resources
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/Frameworks/QtCore.framework/Versions
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/Frameworks/QtCore.framework/Versions/5
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/Frameworks/QtCore.framework/Versions/5/QtCore
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/Frameworks/QtCore.framework/Versions/5/Resources
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/Frameworks/QtCore.framework/Versions/5/Resources/Info.plist
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/Frameworks/QtCore.framework/Versions/Current
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/Frameworks/QtGui.framework
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/Frameworks/QtGui.framework/QtGui
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/Frameworks/QtGui.framework/Resources
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/Frameworks/QtGui.framework/Versions
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/Frameworks/QtGui.framework/Versions/5
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/Frameworks/QtGui.framework/Versions/5/QtGui
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/Frameworks/QtGui.framework/Versions/5/Resources
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/Frameworks/QtGui.framework/Versions/5/Resources/Info.plist
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/Frameworks/QtGui.framework/Versions/Current
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/Frameworks/QtOpenGL.framework
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/Frameworks/QtOpenGL.framework/QtOpenGL
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/Frameworks/QtOpenGL.framework/Resources
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/Frameworks/QtOpenGL.framework/Versions
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/Frameworks/QtOpenGL.framework/Versions/5
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/Frameworks/QtOpenGL.framework/Versions/5/QtOpenGL
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/Frameworks/QtOpenGL.framework/Versions/5/Resources
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/Frameworks/QtOpenGL.framework/Versions/5/Resources/Info.plist
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/Frameworks/QtOpenGL.framework/Versions/Current
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/Frameworks/QtPrintSupport.framework
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/Frameworks/QtPrintSupport.framework/QtPrintSupport
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/Frameworks/QtPrintSupport.framework/Resources
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/Frameworks/QtPrintSupport.framework/Versions
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/Frameworks/QtPrintSupport.framework/Versions/5
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/Frameworks/QtPrintSupport.framework/Versions/5/QtPrintSupport
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/Frameworks/QtPrintSupport.framework/Versions/5/Resources
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/Frameworks/QtPrintSupport.framework/Versions/5/Resources/Info.plist
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/Frameworks/QtPrintSupport.framework/Versions/Current
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/Frameworks/QtSvg.framework
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/Frameworks/QtSvg.framework/QtSvg
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/Frameworks/QtSvg.framework/Resources
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/Frameworks/QtSvg.framework/Versions
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/Frameworks/QtSvg.framework/Versions/5
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/Frameworks/QtSvg.framework/Versions/5/QtSvg
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/Frameworks/QtSvg.framework/Versions/5/Resources
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/Frameworks/QtSvg.framework/Versions/5/Resources/Info.plist
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/Frameworks/QtSvg.framework/Versions/Current
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/Frameworks/QtWidgets.framework
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/Frameworks/QtWidgets.framework/QtWidgets
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/Frameworks/QtWidgets.framework/Resources
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/Frameworks/QtWidgets.framework/Versions
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/Frameworks/QtWidgets.framework/Versions/5
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/Frameworks/QtWidgets.framework/Versions/5/QtWidgets
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/Frameworks/QtWidgets.framework/Versions/5/Resources
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/Frameworks/QtWidgets.framework/Versions/5/Resources/Info.plist
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/Frameworks/QtWidgets.framework/Versions/Current
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/Info.plist
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/MacOS
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/MacOS/libhdf5.1.8.18.dylib
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/MacOS/libhdf5.10.2.1.dylib
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/MacOS/libinsightmodel.dylib
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/MacOS/libinsightview.dylib
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/MacOS/libqwt.6.1.2.dylib
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/MacOS/libqwt.6.dylib
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/MacOS/libszip.2.1.dylib
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/MacOS/libvtkalglib-8.0.1.dylib
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/MacOS/libvtkChartsCore-8.0.1.dylib
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/MacOS/libvtkCommonColor-8.0.1.dylib
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/MacOS/libvtkCommonComputationalGeometry-8.0.1.dylib
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/MacOS/libvtkCommonCore-8.0.1.dylib
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/MacOS/libvtkCommonDataModel-8.0.1.dylib
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/MacOS/libvtkCommonExecutionModel-8.0.1.dylib
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/MacOS/libvtkCommonMath-8.0.1.dylib
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/MacOS/libvtkCommonMisc-8.0.1.dylib
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/MacOS/libvtkCommonSystem-8.0.1.dylib
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/MacOS/libvtkCommonTransforms-8.0.1.dylib
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/MacOS/libvtkDICOMParser-8.0.1.dylib
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/MacOS/libvtkexpat-8.0.1.dylib
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/MacOS/libvtkFiltersCore-8.0.1.dylib
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/MacOS/libvtkFiltersExtraction-8.0.1.dylib
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/MacOS/libvtkFiltersGeneral-8.0.1.dylib
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/MacOS/libvtkFiltersGeometry-8.0.1.dylib
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/MacOS/libvtkFiltersHybrid-8.0.1.dylib
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/MacOS/libvtkFiltersModeling-8.0.1.dylib
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/MacOS/libvtkFiltersSources-8.0.1.dylib
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/MacOS/libvtkFiltersStatistics-8.0.1.dylib
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/MacOS/libvtkFiltersTexture-8.0.1.dylib
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/MacOS/libvtkfreetype-8.0.1.dylib
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/MacOS/libvtkglew-8.0.1.dylib
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/MacOS/libvtkGUISupportQt-8.0.1.dylib
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/MacOS/libvtkImagingColor-8.0.1.dylib
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/MacOS/libvtkImagingCore-8.0.1.dylib
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/MacOS/libvtkImagingFourier-8.0.1.dylib
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/MacOS/libvtkImagingGeneral-8.0.1.dylib
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/MacOS/libvtkImagingHybrid-8.0.1.dylib
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/MacOS/libvtkImagingMath-8.0.1.dylib
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/MacOS/libvtkImagingSources-8.0.1.dylib
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/MacOS/libvtkImagingStatistics-8.0.1.dylib
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/MacOS/libvtkInfovisCore-8.0.1.dylib
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/MacOS/libvtkInteractionStyle-8.0.1.dylib
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/MacOS/libvtkInteractionWidgets-8.0.1.dylib
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/MacOS/libvtkIOCore-8.0.1.dylib
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/MacOS/libvtkIOImage-8.0.1.dylib
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/MacOS/libvtkIOXML-8.0.1.dylib
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/MacOS/libvtkIOXMLParser-8.0.1.dylib
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/MacOS/libvtkjpeg-8.0.1.dylib
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/MacOS/libvtklz4-8.0.1.dylib
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/MacOS/libvtkmetaio-8.0.1.dylib
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/MacOS/libvtkpng-8.0.1.dylib
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/MacOS/libvtkRenderingAnnotation-8.0.1.dylib
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/MacOS/libvtkRenderingContext2D-8.0.1.dylib
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/MacOS/libvtkRenderingContextOpenGL2-8.0.1.dylib
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/MacOS/libvtkRenderingCore-8.0.1.dylib
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/MacOS/libvtkRenderingFreeType-8.0.1.dylib
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/MacOS/libvtkRenderingLabel-8.0.1.dylib
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/MacOS/libvtkRenderingOpenGL2-8.0.1.dylib
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/MacOS/libvtkRenderingQt-8.0.1.dylib
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/MacOS/libvtkRenderingVolume-8.0.1.dylib
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/MacOS/libvtkRenderingVolumeOpenGL2-8.0.1.dylib
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/MacOS/libvtksys-8.0.1.dylib
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/MacOS/libvtktiff-8.0.1.dylib
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/MacOS/libvtkViewsContext2D-8.0.1.dylib
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/MacOS/libvtkViewsCore-8.0.1.dylib
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/MacOS/libvtkzlib-8.0.1.dylib
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/MacOS/libz.1.2.dylib
/Users/insight/Insight/insight-inst/orexplore-insight.app/Contents/MacOS/orexplore-insight
Kevins-MacBook-Pro:build insight$

So my question is now: Is there some environment variable I can set
instead, to guide the fixup_bundle(..) library search? I don't like
hardcoding these paths in my CMake config, but would like to set them
in my CI/package build job.

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
Loading...