[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