[CMake] CMake 2.8.1 + Qt/Cocoa + OS X Problem -- qt_menu.nib not getting copied

kent williams nkwmailinglists at gmail.com
Fri Apr 16 10:13:56 EDT 2010


If you have the URL of this example, I'd love to look at it. I have
been poring over the CMake wiki without finding anything.

But that's not what I was concerned about. What bothers me is that:

1, If you build against Qt-Carbon, this isn't a problem.
2. if qtmenu.nib is needed, and it isn't being fixed by
BundleUtilities::fixup_bundle, then fixup_bundle isn't actually fixing
up the bundle.

The bug 10000 I found in the CMake bug tracker actually is
specifically about working around this problem in the specific case of
building the Qt CMake client.

My broader philosophical concern is that actually making a proper OS X
bundle with CMake is a process with too many moving parts.  The whole
point of CMake is to eliminate boilerplate by dealing with the build
process at a higher level, and this strikes me as definitely something
that has to happen every time you build a bundle for OSX

On Thu, Apr 15, 2010 at 9:07 PM, Mike Jackson
<mike.jackson at bluequartz.net> wrote:
> I do not see any where in your code commands to actually copy the nib
> file from the qtgui framework into your app bundle. I know thatbthe
> way I set up my installation code I explicitly put a command to copy
> the nib file. I believe there is a qt example on the cmake wiki that
> shows how to do that.
>
> -----
> Mike Jackson                      www.bluequartz.net
> Principal Software Engineer       mike.jackson at bluequartz.net
> BlueQuartz Software               Dayton, Ohio
>
>
> On Apr 15, 2010, at 17:06, kent williams <nkwmailinglists at gmail.com>
> wrote:
>
>> I'll include my CMakeLists.txt at the end of this message, but the
>> long and the short of it is this: My ApplicationBundle crashes when I
>> try and open it with this classic error message:
>>
>> Qt internal error: qt_menu.nib could not be loaded. The .nib file
>> should be placed in QtGui.framework/Versions/Current/Resources/  or in
>> the resources directory of your application bundle.
>>
>> This is supposed to be fixed, as documented in this bug:
>>
>> http://public.kitware.com/Bug/view.php?id=10000
>>
>> I checked out the latest GIT CMake and verified that the file in
>> question is the same in 2.8.1 and current GIT trunk.
>>
>> So is there some magical extra step I need to get my bundle properly
>> fixed up?
>>
>> project( BRAINSTracerQT )
>> cmake_minimum_required(VERSION 2.8)
>> cmake_policy(VERSION 2.8)
>>
>> find_package( VTK REQUIRED )
>> include(${VTK_USE_FILE})
>>
>> find_package( ITK REQUIRED )
>> include(${ITK_USE_FILE})
>>
>> find_package( Qt4 REQUIRED )
>> if(QT_USE_FILE)
>>  include(${QT_USE_FILE})
>>  set(QT_USE_QTXML 1)
>> else(QT_USE_FILE)
>>  set( QT_LIBRARIES   ${QT_QT_LIBRARY})
>> endif(QT_USE_FILE)
>>
>> find_package(ModuledescriptionParser REQUIRED)
>> include(${ModuleDescriptionParser_USE_FILE})
>>
>> find_package(TCL REQUIRED)
>>
>> find_package( VTK REQUIRED )
>> include(${VTK_USE_FILE})
>>
>> find_package( ITK REQUIRED )
>> include(${ITK_USE_FILE})
>> include_directories(
>>  ${BRAINSTracerQT_SOURCE_DIR}
>>  ${BRAINSTracerQT_BINARY_DIR}
>> )
>>
>> configure_file(${CMAKE_CURRENT_SOURCE_DIR}/ExecutablePath.h.in
>>        ${CMAKE_BINARY_DIR}/ExecutablePath.h IMMEDIATE @ONLY)
>>
>> add_subdirectory(vtkRenderingAddOn)
>> include_directories(${BRAINSTracerQT_SOURCE_DIR}/vtkRenderingAddOn)
>>
>> set(BRAINSTracerQT_SRCS
>> main.cxx
>> BTMainWindow.cxx
>> vtkKWImage.cxx
>> vtkKWImage2D.cxx
>> QVtkImageViewer.cxx
>> vtkMultiWidgetBase.cxx
>> vtkMultiContourWidget.cxx
>> vtkBTPointSetWidget.cxx
>> vtkBTPointWidget.cxx
>> PolyDataUtils.cxx
>> BTContour.cxx
>> BTPolygon.cxx
>> DiscreteParticleFilter.cxx
>> PolygonFill.cxx
>> LoadMaskImage.cxx
>> qtcolorpicker.cxx
>> QVtkPropertyDialog.cxx
>> QModuleParameterWidget.cxx
>> QImageParameterWidget.cxx
>> QFileBrowserParameterWidget.cxx
>> )
>>
>> set(BRAINSTracerQT_HDRS
>> BTMainWindow.h
>> QVtkImageViewer.h
>> qtcolorpicker.h
>> QVtkPropertyDialog.h
>> QModuleParameterWidget.h
>> QImageParameterWidget.h
>> QFileBrowserParameterWidget.h
>> )
>>
>> set(BRAINSTracerQT_RCCS
>> BRAINSTracerQT.qrc)
>>
>> set(BRAINSTracerQT_UIS
>> qvtkpropertydialog.ui)
>>
>> QT4_WRAP_CPP( MOCSrcs ${BRAINSTracerQT_HDRS} )
>>
>> QT4_ADD_RESOURCES(RCC_SRCS ${BRAINSTracerQT_RCCS})
>>
>> QT4_WRAP_UI(UIHeaders ${BRAINSTracerQT_UIS} )
>>
>> set_source_files_properties(${BRAINSTracerQT_SRCS}
>> PROPERTIES OBJECT_DEPENDS ${UIHeaders})
>>
>> add_definitions(-DQT_GUI_LIBS -DQT_CORE_LIB -DQT3_SUPPORT)
>>
>> #set_source_files_properties(${BRAINSTracerQT_SRCS} PROPERTIES
>> #  OBJECT_DEPENDS "${UIHeaders}")
>>
>> add_executable( BRAINSTracerQT
>>               MACOSX_BUNDLE
>>               WIN32
>>               ${BRAINSTracerQT_SRCS}
>>               ${MOCSrcs}
>>               ${RCC_SRCS}
>> )
>> target_link_libraries( BRAINSTracerQT
>>  QVTK
>>  ${QT_LIBRARIES}
>>  ${ITK_LIBRARIES}
>>  vtkRenderingAddOn
>>  vtkRendering
>>  vtkFiltering
>>  vtkVolumeRendering
>>  ${TCL_LIBRARY}
>>  ModuleDescriptionParser
>> )
>>
>> GET_TARget_property(TARGET_EXEC_DIR BRAINSTracerQT
>> RUNTIME_OUTPUT_DIRECTORY)
>> set(TARGET_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/bin")
>>
>> set(DEFAULT_MODULE_SEARCH_PATH
>>        "${TARGET_EXEC_DIR}/Modules")
>>
>> #--
>> ---
>> ---
>> ---
>> ---------------------------------------------------------------------
>> # Now the installation stuff below
>> #--
>> ---
>> ---
>> ---
>> ---------------------------------------------------------------------
>> SET(plugin_dest_dir bin)
>> SET(qtconf_dest_dir bin)
>> SET(APPS "\${CMAKE_INSTALL_PREFIX}/bin/BRAINSTracerQT")
>> IF(APPLE)
>>  SET(plugin_dest_dir BRAINSTracerQT.app/Contents/MacOS)
>>  SET(qtconf_dest_dir BRAINSTracerQT.app/Contents/Resources)
>>  SET(APPS "\${CMAKE_INSTALL_PREFIX}/BRAINSTracerQT.app")
>> ENDIF(APPLE)
>> IF(WIN32)
>>  SET(APPS "\${CMAKE_INSTALL_PREFIX}/bin/BRAINSTracerQT.exe")
>> ENDIF(WIN32)
>>
>> #--
>> ---
>> ---
>> ---
>> ---------------------------------------------------------------------
>> # Install the BRAINSTracerQT application, on Apple, the bundle is at
>> the root of the
>> # install tree, and on other platforms it'll go into the bin
>> directory.
>> INSTALL(TARGETS BRAINSTracerQT
>>    BUNDLE DESTINATION . COMPONENT Runtime
>>    RUNTIME DESTINATION bin COMPONENT Runtime
>>    )
>>
>> #--
>> ---
>> ---
>> ---
>> ---------------------------------------------------------------------
>> # Install needed Qt plugins by copying directories from the qt
>> installation
>> # One can cull what gets copied by using 'REGEX "..." EXCLUDE'
>> INSTALL(DIRECTORY "${QT_PLUGINS_DIR}/imageformats" DESTINATION
>> ${plugin_dest_dir}/plugins COMPONENT Runtime)
>>
>> #--
>> ---
>> ---
>> ---
>> ---------------------------------------------------------------------
>> # install a qt.conf file
>> # this inserts some cmake code into the install script to write the
>> file
>> INSTALL(CODE "
>>    file(WRITE \"\${CMAKE_INSTALL_PREFIX}/${qtconf_dest_dir}/qt.conf
>> \" \"\")
>>    " COMPONENT Runtime)
>>
>>
>> #--
>> ---
>> ---
>> ---
>> ---------------------------------------------------------------------
>> # Use BundleUtilities to get all other dependencies for the
>> application to work.
>> # It takes a bundle or executable along with possible plugins and
>> inspects it
>> # for dependencies.  If they are not system dependencies, they are
>> copied.
>>
>> # directories to look for dependencies
>> SET(DIRS
>> ${QT_LIBRARY_DIRS}
>> ${ITK_DIR}
>> ${VTK_DIR}
>> ${CMAKE_INSTALL_PREFIX}/lib
>> ${ModuledescriptionParser_DIR}
>> ${BRAINSTracerQT_BINARY_DIR}/lib
>> )
>> MESSAGE(status QT_LIBRARY_DIRS ${QT_LIBRARY_DIRS} ${QT_PLUGINS_DIR})
>> # Now the work of copying dependencies into the bundle/package
>> # The quotes are escaped and variables to use at install time have
>> their $ escaped
>> # An alternative is the do a configure_file() on a script and use
>> install(SCRIPT  ...).
>> # Note that the image plugins depend on QtSvg and QtXml, and it got
>> those copied
>> # over.
>> INSTALL(CODE "
>>    file(GLOB_RECURSE QTPLUGINS
>>      \"\${CMAKE_INSTALL_PREFIX}/${plugin_dest_dir}/plugins/*$
>> {CMAKE_SHARED_LIBRARY_SUFFIX}\")
>>    include(BundleUtilities)
>>    fixup_bundle(\"${APPS}\" \"\${QTPLUGINS}\" \"${DIRS}\")
>>    " COMPONENT Runtime)
>>
>>
>> # To Create a package, one can run "cpack -G DragNDrop
>> CPackConfig.cmake" on Mac OS X
>> # where CPackConfig.cmake is created by including CPack
>> # And then there's ways to customize this as well
>> set(CPACK_BINARY_DRAGNDROP ON)
>> include(CPack)
>> _______________________________________________
>> 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