[CMake] fixup_bundle() doesn't like libglut.3.dylib
Michael Jackson
mike.jackson at bluequartz.net
Tue May 22 11:35:33 EDT 2012
You have a bad install of Lion (OS X 10.7.x). I just checked 3 different Lion machines and ALL have OpenCL.framework installed. So I would suspect your Lion Machine. Lion uses OpenCL for lots of system level calls so a Lion Install without OpenCL is just plain Broken.
___________________________________________________________
Mike Jackson Principal Software Engineer
BlueQuartz Software Dayton, Ohio
mike.jackson at bluequartz.net www.bluequartz.net
On May 22, 2012, at 11:18 AM, Joe Ping-Lin Hsiao wrote:
> Sorry I forgot to mention what the framework is. I believe the OpenCL
> framework is from MacOS since I checked two Snow Leopard machines and
> both have the framework.
>
> I am building my program in Snow Leopard. The program uses a library
> called 'ImageMagick', which uses the OpenCL framework. In Snow
> Leopard, I don't have to do anything special to OpenCL. It is just
> like any other system library, and my bundle and installer work fine
> in Snow Leopard.
>
> The problem is the OpenCL framework is not included in Lion (MacOS
> 10.7). I don't know why Apple changed that. So my program would crash
> if running in Lion.
> My work around was to copy 'libclparser.dylib' into my bundle and
> manually change it's install_name, and also the one used by
> ImageMagick. Luckily it works. Now I am trying to make CMake to do it.
>
>
> On Tue, May 22, 2012 at 10:48 AM, David Cole <david.cole at kitware.com> wrote:
>> My previous email was your first hint that this might not be a good idea.
>>
>> This error message is the second hint that this might not be a good idea.
>>
>> You can try setting "BU_COPY_FULL_FRAMEWORK_CONTENTS" to ON before calling
>> fixup_bundle. That will recursively copy the framework into the bundle
>> rather than selectively copying just the framework library and its
>> "Resources" folder.
>>
>> I am very hesitant to recommend copying a "/System" framework into a bundle
>> without knowing more details about where that framework came from.
>>
>>
>> On Tue, May 22, 2012 at 10:33 AM, Joe Ping-Lin Hsiao <phsiao at cs.unc.edu>
>> wrote:
>>>
>>> After setting the framework type to 'other', the framework structure
>>> is copied into my bundle, including the file OpenCL, but missing
>>> libclparser.dylib.
>>>
>>> And I got the following errors:
>>>
>>> CPack: Create package using DragNDrop
>>> CPack: Install projects
>>> CPack: - Run preinstall target for: CISMM_VIDEO
>>> CPack: - Install project: CISMM_VIDEO
>>> resolving
>>> /System/Library/Frameworks/OpenCL.framework/Versions/A/Libraries/libclparser.dylib
>>> // print out by me
>>> resolving /System/Library/Frameworks/OpenCL.framework/Versions/A/OpenCL
>>> // print out by me
>>> resolving
>>> /System/Library/Frameworks/OpenCL.framework/Versions/A/Libraries/libclparser.dylib
>>> // print out by me
>>> resolving
>>> /System/Library/Frameworks/OpenCL.framework/Versions/A/Libraries/libclparser.dylib
>>> // print out by me
>>> resolving /System/Library/Frameworks/OpenCL.framework/Versions/A/OpenCL
>>> // print out by me
>>> exe_dotapp_dir/='/Users/phsiao/dev/video/video_spot_tracker.app/'
>>> item_substring='/System/Library/Frameworks/OpenCL.framework/Ver'
>>>
>>> resolved_embedded_item='/System/Library/Frameworks/OpenCL.framework/Versions/A/Libraries/libclparser.dylib'
>>>
>>> Install or copy the item into the bundle before calling fixup_bundle.
>>> Or maybe there's a typo or incorrect path in one of the args to
>>> fixup_bundle?
>>>
>>> CMake Error at /Applications/CMake
>>> 2.8-7.app/Contents/share/cmake-2.8/Modules/BundleUtilities.cmake:568
>>> (message):
>>> cannot fixup an item that is not in the bundle...
>>> Call Stack (most recent call first):
>>> /Applications/CMake
>>> 2.8-7.app/Contents/share/cmake-2.8/Modules/BundleUtilities.cmake:656
>>> (fixup_bundle_item)
>>> /Users/phsiao/dev/video/video_spot_tracker_install.cmake:17
>>> (fixup_bundle)
>>> /Users/phsiao/dev/video/cmake_install.cmake:127 (INCLUDE)
>>>
>>>
>>> CPack Error: Error when generating package: CISMM_VIDEO
>>> make: *** [package] Error 1
>>>
>>>
>>>
>>> On Tue, May 22, 2012 at 6:53 AM, David Cole <david.cole at kitware.com>
>>> wrote:
>>>> Yes, it's possible. But I would only advise it if you do it on a
>>>> per-framework basis, you built & installed it yourself, and you know for
>>>> certain that the framework in question works fine when moved from its
>>>> "/System/Library" location.
>>>>
>>>> Is this an OpenCL that you built yourself, or did it come from some
>>>> package
>>>> manager?
>>>>
>>>> The set of "type" values that GetPrerequisites assigns to files are:
>>>> set(type "system")
>>>> set(type "embedded")
>>>> set(type "local")
>>>> set(type "other")
>>>>
>>>> "system" means never copy, never fixup
>>>> "embedded" means it will be inside the app bundle, and may be addressed
>>>> relative to @executable_path after fixup_bundle is done
>>>> "local" means it is in exactly the same directory as the executable
>>>> "other" is everything else
>>>>
>>>> So, in your case, you'd want to match on the file path beginning and set
>>>> the
>>>> type to "other". Just add another chunk inside your override function
>>>> that
>>>> looks like this:
>>>>
>>>> if(resolved_file MATCHES
>>>> "^/System/Library/Frameworks/OpenCL.framework")
>>>> message("resolving ${resolved_file} as other")
>>>> set(${type_var} other PARENT_SCOPE)
>>>> endif()
>>>>
>>>>
>>>> HTH,
>>>> David
>>>>
>>>>
>>>> On Mon, May 21, 2012 at 4:01 PM, Joe Ping-Lin Hsiao <phsiao at cs.unc.edu>
>>>> wrote:
>>>>>
>>>>> Thanks, David. It works!
>>>>>
>>>>> Is it possible to do the other way around?
>>>>> I want fixup_bundle() to treat
>>>>>
>>>>>
>>>>> /System/Library/Frameworks/OpenCL.framework/Versions/A/Libraries/libclparser.dylib
>>>>> as an external library instead of a system lib. I looked at functions
>>>>> in BundleUtilities.cmake and GetPrerequisites.cmake but didn't get any
>>>>> clue how to do that.
>>>>>
>>>>> Thanks,
>>>>> Joe
>>>>>
>>>>> On Mon, May 14, 2012 at 8:47 PM, David Cole <david.cole at kitware.com>
>>>>> wrote:
>>>>>> Rather than just doing a "fixup_bundle" as an INSTALL(CODE snippet,
>>>>>> put
>>>>>> it
>>>>>> in a separate CMake script, and use install(SCRIPT to execute it. You
>>>>>> can
>>>>>> configure the script with configure_file if you need to put stuff in
>>>>>> it
>>>>>> that
>>>>>> depends on CMake variables.
>>>>>>
>>>>>> Then, in your script:
>>>>>>
>>>>>> # Define the function before including BundleUtilities:
>>>>>> function(gp_resolved_file_type_override resolved_file type_var)
>>>>>> if(resolved_file MATCHES "^/usr/X11/lib")
>>>>>> message("resolving ${resolved_file} as system")
>>>>>> set(${type_var} system PARENT_SCOPE)
>>>>>> endif()
>>>>>> endfunction()
>>>>>>
>>>>>> include(BundleUtilities)
>>>>>>
>>>>>> fixup_bundle( ... )
>>>>>>
>>>>>> ParaView's install rules on the Mac do something like this, if you
>>>>>> want
>>>>>> to
>>>>>> look at some example code.
>>>>>>
>>>>>>
>>>>>> HTH,
>>>>>> David
>>>>>>
>>>>>>
>>>>>> On Mon, May 14, 2012 at 5:27 PM, Joe Ping-Lin Hsiao
>>>>>> <phsiao at cs.unc.edu>
>>>>>> wrote:
>>>>>>>
>>>>>>> Thanks, this is exactly what I need.
>>>>>>>
>>>>>>> Just one question. Why the function
>>>>>>> gp_resolved_file_type_override()
>>>>>>> cannot be seen if it is implemented in my project's CMakeLists.txt?
>>>>>>> I
>>>>>>> have to add it in GetPrerequisite.cmake module, but that's not good.
>>>>>>>
>>>>>>> Thanks,
>>>>>>> Joe
>>>>>>>
>>>>>>> On Mon, May 7, 2012 at 11:04 AM, David Cole <david.cole at kitware.com>
>>>>>>> wrote:
>>>>>>>> /usr/X11/lib/libglut.dylib should probably be considered a "system
>>>>>>>> library" that is not included in your final bundle.
>>>>>>>>
>>>>>>>> Therefore, all users of your application will have to have the Mac
>>>>>>>> OS
>>>>>>>> X version of X installed and available in order to run your
>>>>>>>> program.
>>>>>>>> (Is that all Macs nowadays anyway...?)
>>>>>>>>
>>>>>>>> In order to classify it as a system library, you can provide a
>>>>>>>> CMake
>>>>>>>> function named gp_resolved_file_type_override to look for that
>>>>>>>> library
>>>>>>>> (probably anything starting with "/usr/X11/lib") and set its type
>>>>>>>> to
>>>>>>>> "system" -- that will cause fixup_bundle to ignore it for copying
>>>>>>>> and
>>>>>>>> fixup purposes.
>>>>>>>>
>>>>>>>>
>>>>>>>> HTH,
>>>>>>>> David
>>>>>>>>
>>>>>>>>
>>>>>>>> On Mon, May 7, 2012 at 10:57 AM, Joe Ping-Lin Hsiao
>>>>>>>> <phsiao at cs.unc.edu>
>>>>>>>> wrote:
>>>>>>>>> Hi,
>>>>>>>>>
>>>>>>>>> I use CMake to create an installer for a Mac program which uses
>>>>>>>>> GLUT.
>>>>>>>>> The GLUT library that the program links against with is
>>>>>>>>> /usr/X11/lib/libglut.dylib.
>>>>>>>>>
>>>>>>>>> When I use fixup_bundle() to create an installer, I get the
>>>>>>>>> following
>>>>>>>>> error message:
>>>>>>>>>
>>>>>>>>> install_name_tool: changing install names or rpaths can't be
>>>>>>>>> redone
>>>>>>>>> for:
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> /Users/phsiao/dev/video/video_spot_tracker.app/Contents/MacOS/libglut.3.dylib
>>>>>>>>> (for architecture ppc7400) because larger updated load commands
>>>>>>>>> do
>>>>>>>>> not
>>>>>>>>> fit (the program must be relinked, and you may need to use
>>>>>>>>> -headerpad
>>>>>>>>> or -headerpad_max_install_names)
>>>>>>>>>
>>>>>>>>> The first thing I tried was to add -headerpad_max_install_names
>>>>>>>>> and
>>>>>>>>> -headerpad to the linker flags, but no success. (Actually
>>>>>>>>> -headerpad_max_install_names already exists in CMakeFies/link.txt
>>>>>>>>> before I put it in.)
>>>>>>>>>
>>>>>>>>> The next thing I tried was to add '-arch x86_64' to both
>>>>>>>>> CXX_FLAGS
>>>>>>>>> and
>>>>>>>>> LINKER_FLAGS to avoid fixup_bundle() to fix dependencies for
>>>>>>>>> architecture ppc7400, but the error remains.
>>>>>>>>>
>>>>>>>>> Any idea how to get around this?
>>>>>>>>>
>>>>>>>>> Thanks,
>>>>>>>>> Joe
>>>>>>>>> --
>>>>>>>>>
>>>>>>>>> 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
>>>>>>
>>>>>>
>>>>
>>>>
>>
>>
> --
>
> 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
More information about the CMake
mailing list