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

kent williams nkwmailinglists at gmail.com
Thu Apr 15 17:06:49 EDT 2010


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)


More information about the CMake mailing list