[CMake] macosx fix bundle problems

Clinton Stimpson clinton at elemtech.com
Thu Sep 10 10:58:40 EDT 2009


The Qt plugins don't look right.
If you haven't seen it already <http://doc.trolltech.com/4.5/deployment-
mac.html>

Plugins should have a directory structure and the libraries end with .dylib.
So something like
plugins/accessible/libqtaccessiblecompatwidgets.dylib
plugins/accessible/libqtaccessiblewidgets.dylib
plugins/codecs/libqcncodecs.dylib
plugins/codecs/libqjpcodecs.dylib
plugins/codecs/libqkrcodecs.dylib
plugins/codecs/libqtwcodecs.dylib
..... etc..

Clint

On Thursday 10 September 2009 08:02:13 am Petr Vanek wrote:
> cool, thanks. It's working now. I had to play with order of the steps
> in install procedure. Something should go before fix_bundle call,
> something after. But plugins are packed together and contains correct
> (otool -L) paths.
>
> But - all plugins are stored in my.app/Contents/MacOS dir and aren't
> loaded even if I set qt.conf file - paths setup.
>
> It's strange, that plugins are "*.bundle" and not "*.dylib" or "*.so",
> but it's mac and it's still full of secret for me.
>
> Shouldn't be set some more env variables? Or anything else?
>
> all the best,
> Petr
>
> detailed info:
>
> these are steps before "bundle fix" - note that plugins are copied
> into Plugins dir in destination before fix:
>         install(DIRECTORY ${QT_PLUGINS_DIR}/
>                 DESTINATION ${PROJECT_BINARY_DIR}/Contents/Plugins/
>                 REGEX "(designer|script|phonon_backend|debug|sqlite)"
> EXCLUDE)
>
>         install(CODE "
>             # glob for previously installed qt plugins to include in
> fixup_bundle
>             file(GLOB_RECURSE PluginList
>                  ${PROJECT_BINARY_DIR}/Contents/Plugins/*.bundle)
>         ")
>
> and the final structure:
>
> rimmer:release pvanek$ tree TOra.app
> `-- TOra.app
>     `-- Contents
>
>         |-- Frameworks
>         |
>         |   |-- QtCore.framework
>         |   |   `-- Versions
>         |   |       `-- 4
>         |   |           `-- QtCore
>         |   |-- QtGui.framework
>         |   |   `-- Versions
>         |   |       `-- 4
>         |   |           `-- QtGui
>         |   |-- QtNetwork.framework
>         |   |   `-- Versions
>         |   |       `-- 4
>         |   |           `-- QtNetwork
>         |   |-- QtOpenGL.framework
>         |   |   `-- Versions
>         |   |       `-- 4
>         |   |           `-- QtOpenGL
>         |   |-- QtSql.framework
>         |   |   `-- Versions
>         |   |       `-- 4
>         |   |           `-- QtSql
>         |   |-- QtSvg.framework
>         |   |   `-- Versions
>         |   |       `-- 4
>         |   |           `-- QtSvg
>         |
>         |   `-- QtXml.framework
>         |       `-- Versions
>         |           `-- 4
>         |               `-- QtXml
>         |-- Info.plist
>         |-- Libraries
>         |
>         |   |-- libcrypto.0.9.8.dylib
>         |   |-- libiconv.2.dylib
>         |   |-- libjpeg.62.dylib
>         |   |-- liblcms.1.dylib
>         |   |-- libmng.1.dylib
>         |   |-- libmysqlclient_r.15.dylib
>         |   |-- libodbc.1.dylib
>         |   |-- libpng12.0.dylib
>         |   |-- libpq.5.dylib
>         |   |-- libqscintilla2.5.dylib
>         |   |-- libssl.0.9.8.dylib
>         |   |-- libtiff.3.dylib
>         |
>         |   `-- libz.1.dylib
>         |-- MacOS
>         |
>         |   |-- TOra
>         |   |-- libclntsh.dylib.10.1
>         |   |-- libocci.dylib.10.1
>         |   |-- libqcncodecs.bundle
>         |   |-- libqgif.bundle
>         |   |-- libqglgraphicssystem.bundle
>         |   |-- libqico.bundle
>         |   |-- libqjpcodecs.bundle
>         |   |-- libqjpeg.bundle
>         |   |-- libqkrcodecs.bundle
>         |   |-- libqmng.bundle
>         |   |-- libqsqlmysql.bundle
>         |   |-- libqsqlodbc.bundle
>         |   |-- libqsqlpsql.bundle
>         |   |-- libqsvg.bundle
>         |   |-- libqsvgicon.bundle
>         |   |-- libqtaccessiblewidgets.bundle
>         |   |-- libqtiff.bundle
>         |
>         |   `-- libqtwcodecs.bundle
>         |-- Resources
>         |
>         |   |-- qt.conf
>         |   |-- qt_menu.nib
>         |   |
>         |   |   |-- classes.nib
>         |   |   |-- info.nib
>         |   |
>         |   |   `-- keyedobjects.nib
>         |
>         |   `-- tora.icns
>
>         `-- Support
>
> rimmer:release pvanek$ cat TOra.app/Contents/Resources/qt.conf
> [Paths]
> Plugins = MacOS
>
> On Sep 9, 2009, at 5:22 PM, Clinton Stimpson wrote:
> > To install Qt plugins you can do something like the following.  You
> > can tweak
> > the regex to pick which plugins you want.
> > # include Qt plugins
> > install(DIRECTORY ${QT_PLUGINS_DIR}
> >       DESTINATION ${CMAKE_INSTALL_BINARY_DIR}
> >       COMPONENT Runtime
> >       REGEX "(.debug|d4.dll|designer|.exp|.lib|.ilk|.pdb)" EXCLUDE )
> >
> >
> > I also specify the Qt plugins when calling fixup_bundle() so
> > rerequisites
> > needed for plugins get satisfied as well.  For example, an image
> > plugin may
> > need QtSvg while you application does not.
> >
> > install(CODE "
> >  # glob for previously installed qt plugins to include in fixup_bundle
> >  file(GLOB_RECURSE QT_PLUGINS
> > \"\${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_BINARY_DIR}/plugins/*$
> > {CMAKE_SHARED_LIBRARY_SUFFIX}\")
> >  ...
> >  fixup_bundle(\"${app}\"  \"\${QT_PLUGINS}\" ....)
> >
> > Clint
> >
> > On Wednesday 09 September 2009 09:10:31 am Petr Vanek wrote:
> >> yup. The reaso was really in splitted CMakeListst.txt files. It looks
> >> like app is "fixed" now - from otool -L point of view.
> >>
> >> Of course it required more tweaking - add and empty qt.conf to
> >> prevent
> >> duplication of libs/frameworks etc. But it's much more clearer now.
> >>
> >> BTW is there any script/template for cmake to find and bundle all
> >> required (or specified) qt plugins? Something like macdeployqt. Or
> >> should I use this binary instead of scripting?
> >>
> >> thanks and cheers!
> >> Petr
> >>
> >> On Sep 8, 2009, at 11:22 PM, David Cole wrote:
> >>> These lines of output near the beginning:
> >>>
> >>> -- warning: *NOT* handled - .app directory case...
> >>> -- error: fixup_bundle: not a valid bundle
> >>>
> >>> ...indicate that fixup_bundle is not getting a .app bundle as its
> >>> input...
> >>>
> >>> The assumption made by fixup_bundle is that there is an executable
> >>> in the .app/Contents/MacOS folder to begin analyzing. Then, based on
> >>> what its prerequisites are, various libraries get copied into the
> >>> bundle as well. This output looks like that initial executable is
> >>> not there yet.
> >>>
> >>> Looks like your "INSTALL(SCRIPT" snippet occurs before the install
> >>> rule for the bundle executable. Make sure they both occur in the
> >>> same CMakeLists.txt file and that the script snippet comes after the
> >>> install rule for the executable. Then it should work like you
> >>> expect...
> >>>
> >>>
> >>> HTH,
> >>> David
> >>>
> >>>
> >>> On Sat, Sep 5, 2009 at 4:15 PM, Petr Vanek <petr at scribus.info>
> >>> wrote:
> >>> hi all,
> >>>
> >>> I have a Qt4 application with bundle build support taken from cmake
> >>> wiki example.
> >>>
> >>> When I run "deploy" phase with make install, the correct structure
> >>> is created in CMAKE_INSTALL_PREFIX.
> >>>
> >>> But it looks like cmake's fixup_bundle function from BundleUtilities
> >>> does its job only partially.
> >>>
> >>> All Qt frameworks are fixed correctly to use @executable_path, but
> >>> the main binary still contains links to my development environment.
> >>>
> >>> What could be the issue?
> >>>
> >>> thanks,
> >>> Petr Vanek
> >>>
> >>>
> >>> code:
> >>> http://tora.svn.sourceforge.net/viewvc/tora/trunk/tora/
> >>>
> >>> 1st make install run:
> >>>
> >>> rimmer:build-bundle pvanek$ make install
> >>> [  1%] Built target tora_loki_lib
> >>> [100%] Built target tora
> >>> Install the project...
> >>> -- Install configuration: "RELEASE"
> >>> Removing Previous TOra.app bundle at /Users/pvanek/oss/tora/bundle/
> >>> Copying TOra.app from the build tree to /Users/pvanek/oss/tora/
> >>> bundle/
> >>> -- fixup_bundle
> >>> --   app='/Users/pvanek/oss/tora/bundle/TOra.app'
> >>> --   libs=''
> >>> --   dirs='Plugins'
> >>> -- warning: *NOT* handled - .app directory case...
> >>> -- error: fixup_bundle: not a valid bundle
> >>> -- fixup_bundle: done
> >>> CMake Warning (dev) at cmake_install.cmake:31 (INCLUDE):
> >>> Policy CMP0011 is not set: Included scripts do automatic
> >>> cmake_policy PUSH
> >>> and POP.  Run "cmake --help-policy CMP0011" for policy details.  Use
> >>> the
> >>> cmake_policy command to set the policy and suppress this warning.
> >>>
> >>> The included script
> >>>
> >>> /Users/pvanek/oss/tora/trunk/tora/build-bundle/
> >>> TOra_OSX_MakeStandAloneBundle.cmake
> >>>
> >>> affects policy settings.  CMake is implying the NO_POLICY_SCOPE
> >>> option for
> >>> compatibility, so the effects are applied to the including context.
> >>> This warning is for project developers.  Use -Wno-dev to suppress
> >>> it.
> >>>
> >>> -- Installing: /Users/pvanek/oss/tora/bundle/tora.app
> >>> -- Installing: /Users/pvanek/oss/tora/bundle/tora.app/Contents
> >>> -- Installing: /Users/pvanek/oss/tora/bundle/tora.app/Contents/
> >>> Info.plist
> >>> -- Installing: /Users/pvanek/oss/tora/bundle/tora.app/Contents/MacOS
> >>> -- Installing: /Users/pvanek/oss/tora/bundle/tora.app/Contents/
> >>> MacOS/
> >>> tora
> >>> -- Installing: /Users/pvanek/oss/tora/bundle/tora.app/Contents/
> >>> Resources
> >>> -- Installing: /Users/pvanek/oss/tora/bundle/tora.app/Contents/
> >>> Resources/tora.icns
> >>>
> >>> 2nd make install
> >>> rimmer:build-bundle pvanek$ make install
> >>> [  1%] Built target tora_loki_lib
> >>> [100%] Built target tora
> >>> Install the project...
> >>> -- Install configuration: "RELEASE"
> >>> Removing Previous TOra.app bundle at /Users/pvanek/oss/tora/bundle/
> >>> Copying TOra.app from the build tree to /Users/pvanek/oss/tora/
> >>> bundle/
> >>> -- fixup_bundle
> >>> --   app='/Users/pvanek/oss/tora/bundle/TOra.app'
> >>> --   libs=''
> >>> --   dirs='Plugins'
> >>> -- fixup_bundle: preparing...
> >>> -- fixup_bundle: copying...
> >>> -- 1/28: *NOT* copying '/Users/pvanek/oss/tora/bundle/TOra.app/
> >>> Contents/MacOS/tora'
> >>> -- 2/28: copying '/opt/local/lib/libcrypto.0.9.8.dylib'
> >>> -- 3/28: copying '/opt/local/lib/libpng12.0.dylib'
> >>> -- 4/28: copying '/opt/local/lib/libssl.0.9.8.dylib'
> >>> -- 5/28: copying '/opt/local/lib/libz.1.dylib'
> >>> -- 6/28: copying '/opt/local/lib/oracle/libclntsh.dylib.10.1'
> >>> -- 7/28: copying '/opt/local/lib/oracle/libocci.dylib.10.1'
> >>> -- 8/28: copying '/opt/local/lib/postgresql83/libpq.5.dylib'
> >>> -- 9/28: copying '/opt/local/libexec/qt4-mac/lib/QtCore.framework/
> >>> Versions/4/QtCore'
> >>> -- 10/28: copying '/opt/local/libexec/qt4-mac/lib/QtGui.framework/
> >>> Versions/4/QtGui'
> >>> -- 11/28: copying '/opt/local/libexec/qt4-mac/lib/
> >>> QtNetwork.framework/Versions/4/QtNetwork'
> >>> -- 12/28: copying '/opt/local/libexec/qt4-mac/lib/QtSql.framework/
> >>> Versions/4/QtSql'
> >>> -- 13/28: copying '/opt/local/libexec/qt4-mac/lib/QtXml.framework/
> >>> Versions/4/QtXml'
> >>> -- 14/28: copying '/opt/local/libexec/qt4-mac/lib/
> >>> libqscintilla2.5.dylib'
> >>> -- fixup_bundle: fixing...
> >>> -- 15/28: fixing up '/Users/pvanek/oss/tora/bundle/TOra.app/
> >>> Contents/
> >>> MacOS/tora'
> >>> -- 16/28: fixing up '/Users/pvanek/oss/tora/bundle/TOra.app/
> >>> Contents/
> >>> Libraries/libcrypto.0.9.8.dylib'
> >>> -- 17/28: fixing up '/Users/pvanek/oss/tora/bundle/TOra.app/
> >>> Contents/
> >>> Libraries/libpng12.0.dylib'
> >>> -- 18/28: fixing up '/Users/pvanek/oss/tora/bundle/TOra.app/
> >>> Contents/
> >>> Libraries/libssl.0.9.8.dylib'
> >>> -- 19/28: fixing up '/Users/pvanek/oss/tora/bundle/TOra.app/
> >>> Contents/
> >>> Libraries/libz.1.dylib'
> >>> -- 20/28: fixing up '/Users/pvanek/oss/tora/bundle/TOra.app/
> >>> Contents/
> >>> MacOS/libclntsh.dylib.10.1'
> >>> -- 21/28: fixing up '/Users/pvanek/oss/tora/bundle/TOra.app/
> >>> Contents/
> >>> MacOS/libocci.dylib.10.1'
> >>> -- 22/28: fixing up '/Users/pvanek/oss/tora/bundle/TOra.app/
> >>> Contents/
> >>> Libraries/libpq.5.dylib'
> >>> -- 23/28: fixing up '/Users/pvanek/oss/tora/bundle/TOra.app/
> >>> Contents/
> >>> Frameworks/QtCore.framework/Versions/4/QtCore'
> >>> -- 24/28: fixing up '/Users/pvanek/oss/tora/bundle/TOra.app/
> >>> Contents/
> >>> Frameworks/QtGui.framework/Versions/4/QtGui'
> >>> -- 25/28: fixing up '/Users/pvanek/oss/tora/bundle/TOra.app/
> >>> Contents/
> >>> Frameworks/QtNetwork.framework/Versions/4/QtNetwork'
> >>> -- 26/28: fixing up '/Users/pvanek/oss/tora/bundle/TOra.app/
> >>> Contents/
> >>> Frameworks/QtSql.framework/Versions/4/QtSql'
> >>> -- 27/28: fixing up '/Users/pvanek/oss/tora/bundle/TOra.app/
> >>> Contents/
> >>> Frameworks/QtXml.framework/Versions/4/QtXml'
> >>> -- 28/28: fixing up '/Users/pvanek/oss/tora/bundle/TOra.app/
> >>> Contents/
> >>> Libraries/libqscintilla2.5.dylib'
> >>> -- fixup_bundle: cleaning up...
> >>> -- fixup_bundle: verifying...
> >>> --
> >>> =
> >>> =
> >>> =
> >>> =
> >>> =
> >>> =
> >>> =
> >>> ====================================================================
> >>> -- Analyzing app='/Users/pvanek/oss/tora/bundle/TOra.app'
> >>> -- bundle='/Users/pvanek/oss/tora/bundle/TOra.app'
> >>> -- executable='/Users/pvanek/oss/tora/bundle/TOra.app/Contents/
> >>> MacOS/
> >>> tora'
> >>> -- valid='1'
> >>> -- executable file: /Users/pvanek/oss/tora/bundle/TOra.app/Contents/
> >>> MacOS/tora
> >>> -- verified='1'
> >>> -- info='Verified 1 executable files in '/Users/pvanek/oss/tora/
> >>> bundle/TOra.app''
> >>> --
> >>> -- verified='1'
> >>> -- info=''
> >>> --
> >>> -- fixup_bundle: done
> >>> CMake Warning (dev) at cmake_install.cmake:31 (INCLUDE):
> >>> Policy CMP0011 is not set: Included scripts do automatic
> >>> cmake_policy PUSH
> >>> and POP.  Run "cmake --help-policy CMP0011" for policy details.  Use
> >>> the
> >>> cmake_policy command to set the policy and suppress this warning.
> >>>
> >>> The included script
> >>>
> >>> /Users/pvanek/oss/tora/trunk/tora/build-bundle/
> >>> TOra_OSX_MakeStandAloneBundle.cmake
> >>>
> >>> affects policy settings.  CMake is implying the NO_POLICY_SCOPE
> >>> option for
> >>> compatibility, so the effects are applied to the including context.
> >>> This warning is for project developers.  Use -Wno-dev to suppress
> >>> it.
> >>>
> >>> -- Installing: /Users/pvanek/oss/tora/bundle/tora.app
> >>> -- Installing: /Users/pvanek/oss/tora/bundle/tora.app/Contents
> >>> -- Up-to-date: /Users/pvanek/oss/tora/bundle/tora.app/Contents/
> >>> Info.plist
> >>> -- Installing: /Users/pvanek/oss/tora/bundle/tora.app/Contents/MacOS
> >>> -- Installing: /Users/pvanek/oss/tora/bundle/tora.app/Contents/
> >>> MacOS/
> >>> tora
> >>> -- Installing: /Users/pvanek/oss/tora/bundle/tora.app/Contents/
> >>> Resources
> >>> -- Up-to-date: /Users/pvanek/oss/tora/bundle/tora.app/Contents/
> >>> Resources/tora.icns
> >>>
> >>>
> >>>
> >>> rimmer:build-bundle pvanek$ otool -L ~/oss/tora/bundle/TOra.app/
> >>> Contents/MacOS/tora
> >>> /Users/pvanek/oss/tora/bundle/TOra.app/Contents/MacOS/tora:
> >>>    /opt/local/libexec/qt4-mac/lib/QtGui.framework/Versions/4/QtGui
> >>> (compatibility version 4.5.0, current version 4.5.1)
> >>>    /opt/local/lib/libpng12.0.dylib (compatibility version 39.0.0,
> >>> current version 39.0.0)
> >>>    /System/Library/Frameworks/Carbon.framework/Versions/A/Carbon
> >>> (compatibility version 2.0.0, current version 136.0.0)
> >>>    /System/Library/Frameworks/AppKit.framework/Versions/C/AppKit
> >>> (compatibility version 45.0.0, current version 949.54.0)
> >>>    /opt/local/libexec/qt4-mac/lib/QtXml.framework/Versions/4/QtXml
> >>> (compatibility version 4.5.0, current version 4.5.1)
> >>>    /opt/local/libexec/qt4-mac/lib/QtSql.framework/Versions/4/QtSql
> >>> (compatibility version 4.5.0, current version 4.5.1)
> >>>    /opt/local/libexec/qt4-mac/lib/QtNetwork.framework/Versions/4/
> >>> QtNetwork (compatibility version 4.5.0, current version 4.5.1)
> >>>    /usr/lib/libssl.0.9.7.dylib (compatibility version 0.9.7,
> >>> current version 0.9.7)
> >>>    /opt/local/libexec/qt4-mac/lib/QtCore.framework/Versions/4/
> >>> QtCore (compatibility version 4.5.0, current version 4.5.1)
> >>>    /usr/lib/libz.1.dylib (compatibility version 1.0.0, current
> >>> version 1.2.3)
> >>>    /opt/local/lib/oracle/libocci.dylib.10.1 (compatibility version
> >>> 0.0.0, current version 0.0.0)
> >>>    /opt/local/lib/oracle/libclntsh.dylib.10.1 (compatibility
> >>> version 0.0.0, current version 0.0.0)
> >>>    /opt/local/libexec/qt4-mac/lib/libqscintilla2.5.dylib
> >>> (compatibility version 5.1.0, current version 5.1.0)
> >>>    /opt/local/lib/postgresql83/libpq.5.dylib (compatibility
> >>> version 5.0.0, current version 5.1.0)
> >>>    /usr/lib/libstdc++.6.dylib (compatibility version 7.0.0,
> >>> current version 7.4.0)
> >>>    /usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current
> >>> version 1.0.0)
> >>>    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0,
> >>> current version 111.1.4)
> >>> _______________________________________________
> >>> 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