# 1qt - bundle Qt frameworks and PyQt # ! cmakecache vars not available to external scripts # so we configure it first to do substitutions # make sure to use @varname@ # kill boolean warnings CMAKE_POLICY (SET CMP0012 NEW) INCLUDE (@CMAKE_BINARY_DIR@/mac/0vars.cmake) INCLUDE (@CMAKE_SOURCE_DIR@/cmake/MacBundleMacros.cmake) # Qt framework version is major version SET (QT_FWVER @QT_VERSION_MAJOR@) # build list of Qt frameworks to bundle # core list, includes dependencies SET (QTLISTQG QtCore QtGui phonon QtXml QtNetwork QtSvg QtSql QtWebKit QtXmlPatterns) SET (PYQTLIST Qt QtCore QtGui phonon QtXml QtNetwork QtSvg QtSql QtWebKit QtXmlPatterns) # see if QtWebKit links QtDBus EXECUTE_PROCESS (COMMAND otool -L @QT_QTWEBKIT_LIBRARY@/QtWebKit OUTPUT_VARIABLE QTWEBKIT_DBUS) IF (QTWEBKIT_DBUS MATCHES ".*QtDBus.framework.*") SET (QTLISTQG ${QTLISTQG} QtDBus) ENDIF () # additional Qt may be needed by plugins SET (QTLISTQG ${QTLISTQG} QtMultimedia QtOpenGL) SET (PYQTLIST ${PYQTLIST} QtMultimedia QtOpenGL) # for tests IF (ENABLE_TESTS) SET (QTLISTQG ${QTLISTQG} QtTest) SET (PYQTLIST ${PYQTLIST} QtTest) ENDIF () MYMESSAGE ("Qt list: ${QTLISTQG}") # symlinks when only @executable_path used IF (NOT @OSX_HAVE_LOADERPATH@) EXECUTE_PROCESS (COMMAND ln -sfh ../Frameworks "${QAPPDIR}/") IF (IS_DIRECTORY "${QLIBXIR}/grass/bin") EXECUTE_PROCESS (COMMAND ln -sfh ../@QGIS_LIBEXEC_SUBDIR_REV@/@QGIS_FW_SUBDIR@ "${QLIBXDIR}/grass/Frameworks") ENDIF () EXECUTE_PROCESS (COMMAND ln -sfh @QGIS_CGIBIN_SUBDIR_REV@/@QGIS_LIB_SUBDIR@ "${QCGIDIR}/lib") ENDIF (NOT @OSX_HAVE_LOADERPATH@) ### copy files # Qt frameworks MESSAGE (STATUS "Copying Qt frameworks...") EXECUTE_PROCESS (COMMAND mkdir -p "${QFWDIR}") FOREACH (QFW ${QTLISTQG}) IF (NOT IS_DIRECTORY "${QFWDIR}/${QFW}.framework") COPY_FRAMEWORK("@QT_LIBRARY_DIR@" ${QFW} "${QFWDIR}") ENDIF () ENDFOREACH (QFW) # Qt plugins EXECUTE_PROCESS (COMMAND mkdir -p "${QPLUGDIR}/../imageformats") IF (NOT EXISTS "${QPLUGDIR}/../imageformats/libqjpeg.dylib") EXECUTE_PROCESS (COMMAND ditto ${QARCHS} "@QT_PLUGINS_DIR@/imageformats/libqjpeg.dylib" "${QPLUGDIR}/../imageformats/libqjpeg.dylib") ENDIF () EXECUTE_PROCESS (COMMAND mkdir -p "${QPLUGDIR}/../codecs") FOREACH (QTC cn;jp;kr;tw) IF (NOT EXISTS "${QPLUGDIR}/../codecs/libq${QTC}codecs.dylib") EXECUTE_PROCESS (COMMAND ditto ${QARCHS} "@QT_PLUGINS_DIR@/codecs/libq${QTC}codecs.dylib" "${QPLUGDIR}/../codecs/libq${QTC}codecs.dylib") ENDIF () ENDFOREACH (QTC) EXECUTE_PROCESS (COMMAND mkdir -p "${QPLUGDIR}/../sqldrivers") IF (NOT EXISTS "${QPLUGDIR}/../sqldrivers/libqsqlite.dylib") EXECUTE_PROCESS (COMMAND ditto ${QARCHS} "@QT_PLUGINS_DIR@/sqldrivers/libqsqlite.dylib" "${QPLUGDIR}/../sqldrivers/libqsqlite.dylib") ENDIF () # Qwt # assumes shared libraries MESSAGE (STATUS "Copying Qwt and updating library paths...") IF (NOT EXISTS "${QLIBDIR}/libqwt.dylib") EXECUTE_PROCESS (COMMAND ditto ${QARCHS} "@QWT_LIBRARY@" "${QLIBDIR}/libqwt.dylib") ENDIF () GET_INSTALL_NAME ("@QWT_LIBRARY@" "libqwt" QWT_CHG) IF (QWT_CHG) INSTALLNAMETOOL_CHANGE ("${QWT_CHG}" "${ATEXECUTABLE}/@QGIS_LIB_SUBDIR@/libqwt.dylib" "${QAPPDIR}/@QGIS_APP_NAME@") ENDIF (QWT_CHG) # PyQt MESSAGE (STATUS "Copying PyQt...") IF (NOT EXISTS "${QGISPYDIR}/sip.so") MYMESSAGE ("ditto ${QARCHS} \"@SIP_MOD_DIR@/sip.so\" \"${QGISPYDIR}/\"") EXECUTE_PROCESS (COMMAND ditto ${QARCHS} "@SIP_MOD_DIR@/sip.so" "${QGISPYDIR}/") EXECUTE_PROCESS (COMMAND cp -fp "@SIP_MOD_DIR@/sipconfig.py" "${QGISPYDIR}/") ENDIF () # for now assume "PyQt4" next to SIP EXECUTE_PROCESS (COMMAND mkdir -p "${QGISPYDIR}/PyQt${QT_FWVER}") FOREACH (PQ ${PYQTLIST}) IF (NOT EXISTS "${QGISPYDIR}/PyQt${QT_FWVER}/${PQ}.so") MYMESSAGE ("ditto ${QARCHS} \"@SIP_MOD_DIR@/PyQt${QT_FWVER}/${PQ}.so\" \"${QGISPYDIR}/PyQt${QT_FWVER}/${PQ}.so\"") EXECUTE_PROCESS (COMMAND ditto ${QARCHS} "@SIP_MOD_DIR@/PyQt${QT_FWVER}/${PQ}.so" "${QGISPYDIR}/PyQt${QT_FWVER}/${PQ}.so") ENDIF () ENDFOREACH (PQ) FILE (GLOB PQPYLIST "@SIP_MOD_DIR@/PyQt${QT_FWVER}/*.py") FOREACH (PQPY ${PQPYLIST}) EXECUTE_PROCESS (COMMAND cp -fp "${PQPY}" "${QGISPYDIR}/PyQt${QT_FWVER}/") ENDFOREACH (PQPY) EXECUTE_PROCESS (COMMAND cp -Rfp "@SIP_MOD_DIR@/PyQt${QT_FWVER}/uic" "${QGISPYDIR}/PyQt${QT_FWVER}") # PyQt utilities FOREACH (PU pylupdate4;pyrcc4) IF (NOT EXISTS "${QBINDIR}/${PU}") EXECUTE_PROCESS (COMMAND ditto ${QARCHS} "@PYQT4_BIN_DIR@/${PU}" "${QBINDIR}/") ENDIF () ENDFOREACH (PU) IF (NOT EXISTS "${QBINDIR}/pyuic4") EXECUTE_PROCESS (COMMAND sed -E "s, /.*/PyQt4/uic/pyuic.py, ${QDATADIR}/python/PyQt4/uic/pyuic.py," "@PYQT4_BIN_DIR@/pyuic4" OUTPUT_VARIABLE PYUIC_CONTENTS) FILE (WRITE "${QBINDIR}/pyuic4" "${PYUIC_CONTENTS}") EXECUTE_PROCESS (COMMAND chmod +x "${QBINDIR}/pyuic4") ENDIF () # PyQwt # only if it's available, not compatible with newer PyQt IF (EXISTS "@SIP_MOD_DIR@/PyQt${QT_FWVER}/Qwt5/_iqt.so") MESSAGE (STATUS "Copying PyQwt and updating library paths...") EXECUTE_PROCESS (COMMAND mkdir -p "${QGISPYDIR}/PyQt${QT_FWVER}/Qwt5") IF (NOT EXISTS "${QGISPYDIR}/PyQt${QT_FWVER}/Qwt5/_iqt.so") EXECUTE_PROCESS (COMMAND ditto ${QARCHS} "@SIP_MOD_DIR@/PyQt${QT_FWVER}/Qwt5/_iqt.so" "${QGISPYDIR}/PyQt${QT_FWVER}/Qwt5/") ENDIF () IF (NOT EXISTS "${QGISPYDIR}/PyQt${QT_FWVER}/Qwt5/Qwt.so") EXECUTE_PROCESS (COMMAND ditto ${QARCHS} "@SIP_MOD_DIR@/PyQt${QT_FWVER}/Qwt5/Qwt.so" "${QGISPYDIR}/PyQt${QT_FWVER}/Qwt5/") ENDIF () FILE (GLOB PQWPYLIST "@SIP_MOD_DIR@/PyQt${QT_FWVER}/Qwt5/*.py") FOREACH (PQWPY ${PQWPYLIST}) EXECUTE_PROCESS (COMMAND cp -fp "${PQWPY}" "${QGISPYDIR}/PyQt${QT_FWVER}/Qwt5/") ENDFOREACH (PQWPY) IF (QWT_CHG) IF (@OSX_HAVE_LOADERPATH@) SET (QWT_CHG_TO "${ATLOADER}/../../../@QGIS_DATA_SUBDIR_REV@/@QGIS_LIB_SUBDIR@/libqwt.dylib") ENDIF (@OSX_HAVE_LOADERPATH@) FOREACH (PW _iqt;Qwt) INSTALLNAMETOOL_CHANGE ("${QWT_CHG}" "${QWT_CHG_TO}" "${QGISPYDIR}/PyQt${QT_FWVER}/Qwt5/${PW}.so") ENDFOREACH (PW) ENDIF (QWT_CHG) ENDIF () # don't load plugins from system-installed Qt FILE (WRITE "${QAPPDIRC}/Resources/qt.conf" "") FOREACH (QA ${QGAPPLIST}) FILE (WRITE "${QBINDIR}/${QA}.app/Contents/Resources/qt.conf" "") ENDFOREACH (QA) ### update lib paths MESSAGE (STATUS "Updating Qt library paths...") FOREACH (QFW ${QTLISTQG}) # get install names from installed in case bundled copy already changed # from a previous install attempt GET_INSTALL_NAME ("@QT_LIBRARY_DIR@/${QFW}.framework/${QFW}" ${QFW}.framework QQ) SET (QFW_CHG "${QQ}") # qgis stuff UPDATEQGISPATHS ("${QFW_CHG}" ${QFW}) SET (LIBPOST "${QFW}.framework/${QFW}") # Qwt IF (@OSX_HAVE_LOADERPATH@) SET (QFW_CHG_TO "${ATLOADER}/${QGIS_LIB_SUBDIR_REV}/${QGIS_FW_SUBDIR}/${LIBPOST}") ENDIF () INSTALLNAMETOOL_CHANGE ("${QFW_CHG}" "${QFW_CHG_TO}" "${QLIBDIR}/libqwt.dylib") # qt plugs IF (@OSX_HAVE_LOADERPATH@) SET (QFW_CHG_TO "${ATLOADER}/@QGIS_PLUGIN_SUBDIR_REV@/${QGIS_FW_SUBDIR}/${LIBPOST}") ENDIF () INSTALLNAMETOOL_CHANGE ("${QFW_CHG}" "${QFW_CHG_TO}" "${QPLUGDIR}/../imageformats/libqjpeg.dylib") FOREACH (QC cn;jp;kr;tw) INSTALLNAMETOOL_CHANGE ("${QFW_CHG}" "${QFW_CHG_TO}" "${QPLUGDIR}/../codecs/libq${QC}codecs.dylib") ENDFOREACH (QC) INSTALLNAMETOOL_CHANGE ("${QFW_CHG}" "${QFW_CHG_TO}" "${QPLUGDIR}/../sqldrivers/libqsqlite.dylib") # qt fw IF (@OSX_HAVE_LOADERPATH@) SET (QFW_CHG_TO "${ATLOADER}/../../../${LIBPOST}") ENDIF () FOREACH (QF ${QTLISTQG}) INSTALLNAMETOOL_CHANGE ("${QFW_CHG}" "${QFW_CHG_TO}" "${QFWDIR}/${QF}.framework/${QF}") ENDFOREACH (QF) # PyQt IF (@OSX_HAVE_LOADERPATH@) SET (QFW_CHG_TO "${ATLOADER}/../../@QGIS_DATA_SUBDIR_REV@/${QGIS_FW_SUBDIR}/${LIBPOST}") ENDIF () FOREACH (PQ ${PYQTLIST}) INSTALLNAMETOOL_CHANGE ("${QFW_CHG}" "${QFW_CHG_TO}" "${QGISPYDIR}/PyQt${QT_FWVER}/${PQ}.so") ENDFOREACH (PQ) # PyQwt IF (@OSX_HAVE_LOADERPATH@) SET (QFW_CHG_TO "${ATLOADER}/../../../@QGIS_DATA_SUBDIR_REV@/${QGIS_FW_SUBDIR}/${LIBPOST}") ENDIF () FOREACH (PW _iqt;Qwt) IF (EXISTS "${QGISPYDIR}/PyQt${QT_FWVER}/Qwt5/${PW}.so") INSTALLNAMETOOL_CHANGE ("${QFW_CHG}" "${QFW_CHG_TO}" "${QGISPYDIR}/PyQt${QT_FWVER}/Qwt5/${PW}.so") ENDIF () ENDFOREACH (PW) # bin - PyQt utils SET (QFW_CHG_TO "${ATEXECUTABLE}/@QGIS_BIN_SUBDIR_REV@/${QGIS_FW_SUBDIR}/${LIBPOST}") FOREACH (PB pylupdate4;pyrcc4) INSTALLNAMETOOL_CHANGE ("${QFW_CHG}" "${QFW_CHG_TO}" "${QBINDIR}/${PB}") ENDFOREACH (PB) ENDFOREACH (QFW)