Skip to content

Commit db4a9a3

Browse files
committedOct 1, 2015
Add PYTHONPATH support and better module finding to Mac bundling
1 parent aa0a47a commit db4a9a3

File tree

2 files changed

+62
-38
lines changed

2 files changed

+62
-38
lines changed
 

‎mac/cmake/0vars.cmake.in

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,3 +44,24 @@ SET (WITH_QSPATIALITE "@WITH_QSPATIALITE@")
4444

4545
# tests
4646
SET (ENABLE_TESTS "@ENABLE_TESTS@")
47+
48+
# Python module search paths
49+
# Allows overriding build variables with PYTHONPATH
50+
# Handles case where resolved symlinked modules may not be where other resolved modules exist, e.g.
51+
# a site-packages directory where all packages/modules are symlinked in (like Homebrew),
52+
# and their respective install prefixes are completely different
53+
# This also handles migration to next-gen sip/PyQt setup where sipconfig and pyqtconfig don't exist
54+
# and the sys.paths used to import the modules dictates how the modules are found
55+
# see: https://github.com/qgis/QGIS/pull/1508
56+
SET (PYTHON_MODULE_PATHS)
57+
STRING(REPLACE ":" ";" _pythonpath "$ENV{PYTHONPATH}")
58+
LIST(APPEND PYTHON_MODULE_PATHS ${_pythonpath})
59+
IF (EXISTS "@PYQT4_MOD_DIR@")
60+
LIST(APPEND PYTHON_MODULE_PATHS "@PYQT4_MOD_DIR@")
61+
ENDIF ()
62+
IF (EXISTS "@SIP_MOD_DIR@")
63+
LIST(APPEND PYTHON_MODULE_PATHS "@SIP_MOD_DIR@")
64+
ENDIF ()
65+
IF (EXISTS "@PYTHON_SITE_PACKAGES_SYS@")
66+
LIST(APPEND PYTHON_MODULE_PATHS "@PYTHON_SITE_PACKAGES_SYS@")
67+
ENDIF ()

‎mac/cmake/1qt.cmake.in

Lines changed: 41 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -217,49 +217,52 @@ IF (@QSCINTILLA_LIBRARY@ MATCHES ".*libqscintilla2.dylib")
217217
ENDIF (QSCI_CHG)
218218
ENDIF ()
219219

220-
# PyQt
221-
222-
MESSAGE (STATUS "Copying PyQt...")
223-
IF (NOT EXISTS "${QGISPYDIR}/sip.so")
224-
MYMESSAGE ("ditto ${QARCHS} \"@SIP_MOD_DIR@/sip.so\" \"${QGISPYDIR}/\"")
225-
EXECUTE_PROCESS (COMMAND ditto ${QARCHS} "@SIP_MOD_DIR@/sip.so" "${QGISPYDIR}/")
226-
EXECUTE_PROCESS (COMMAND cp -fp "@SIP_MOD_DIR@/sipconfig.py" "${QGISPYDIR}/")
227-
ENDIF ()
228-
229-
# if PYQT4_MOD_DIR not defined, assume "PyQt4" next to SIP
230-
SET(PYQT4MODDIR "@SIP_MOD_DIR@/PyQt${QT_FWVER}")
231-
IF (EXISTS "@PYQT4_MOD_DIR@")
232-
SET(PYQT4MODDIR "@PYQT4_MOD_DIR@")
233-
# MESSAGE (STATUS "Defined PYQT4_MOD_DIR: @PYQT4_MOD_DIR@")
220+
# Tell user what Python paths are being searched for modules and packages
221+
# see: PYTHON_MODULE_PATHS in 0vars.cmake.in for why not all PyQt-related modules
222+
# can be assumed to exist in symlinked-resolved PyQt or sip module directories
223+
MESSAGE (STATUS "PYTHON_MODULE_PATHS to be searched:")
224+
FOREACH (PYPATH ${PYTHON_MODULE_PATHS})
225+
MESSAGE (STATUS " ${PYPATH}")
226+
ENDFOREACH (PYPATH)
227+
228+
# sip and PyQt
229+
230+
MESSAGE (STATUS "Copying sip...")
231+
PYTHONMODULEDIR("sip.so" SIPMODDIR)
232+
IF (SIPMODDIR)
233+
IF (NOT EXISTS "${QGISPYDIR}/sip.so")
234+
# MYMESSAGE ("ditto ${QARCHS} \"${SIPMODDIR}/sip.so\" \"${QGISPYDIR}/\"")
235+
EXECUTE_PROCESS (COMMAND ditto ${QARCHS} "${SIPMODDIR}/sip.so" "${QGISPYDIR}/")
236+
EXECUTE_PROCESS (COMMAND cp -fp "${SIPMODDIR}/sipconfig.py" "${QGISPYDIR}/")
237+
ENDIF ()
238+
ELSE ()
239+
MESSAGE (STATUS " sip module not found")
234240
ENDIF ()
235-
# also search python site-packages/PyQt4, in case module packages installed elsewhere and symlinked
236-
# (common with binary installers like homebrew)
237-
SET(PYQT4MODALT "@PYTHON_SITE_PACKAGES_SYS@/PyQt4")
238-
#MESSAGE (STATUS "Defined PYQT4MODALT: ${PYQT4MODALT}")
239241

242+
MESSAGE (STATUS "Copying PyQt...")
240243
EXECUTE_PROCESS (COMMAND mkdir -p "${QGISPYDIR}/PyQt${QT_FWVER}")
241244
FOREACH (PQ ${PYQTLIST})
242-
SET(MODNAME "${PQ}.so")
243-
IF(EXISTS "${PYQT4MODDIR}/${MODNAME}")
244-
SET(PYQT4MOD "${PYQT4MODDIR}/${MODNAME}")
245-
ELSEIF(EXISTS "${PYQT4MODALT}/${MODNAME}")
246-
SET(PYQT4MOD "${PYQT4MODALT}/${MODNAME}")
247-
ENDIF()
248-
IF (EXISTS "${PYQT4MOD}")
249-
IF (NOT EXISTS "${QGISPYDIR}/PyQt${QT_FWVER}/${MODNAME}")
250-
# MESSAGE (STATUS "ditto ${QARCHS} \"${PYQT4MOD}\" \"${QGISPYDIR}/PyQt${QT_FWVER}/${MODNAME}\"")
251-
EXECUTE_PROCESS (COMMAND ditto ${QARCHS} "${PYQT4MOD}" "${QGISPYDIR}/PyQt${QT_FWVER}/${MODNAME}")
245+
SET (MODNAME "${PQ}.so")
246+
SET (MODSUBPATH "PyQt${QT_FWVER}/${MODNAME}")
247+
# search for each module separately, instead of only in first found PyQt directory, since PyQt may
248+
# be installed to its a specific prefix, like with Homebrew, then symlinked into common 'site-packages'
249+
PYTHONMODULEDIR("${MODSUBPATH}" MODDIR)
250+
IF (MODDIR)
251+
IF (NOT EXISTS "${QGISPYDIR}/${MODSUBPATH}")
252+
# MESSAGE (STATUS "ditto ${QARCHS} \"${PYQT4MOD}\" \"${QGISPYDIR}/${MODSUBPATH}\"")
253+
EXECUTE_PROCESS (COMMAND ditto ${QARCHS} "${MODDIR}/${MODSUBPATH}" "${QGISPYDIR}/${MODSUBPATH}")
252254
ENDIF ()
253-
ELSE (EXISTS "${PYQT4MOD}")
254-
MESSAGE (STATUS "PyQt4 module ${MODNAME} not found")
255-
ENDIF (EXISTS "${PYQT4MOD}")
255+
ELSE (MODDIR)
256+
MESSAGE (STATUS " PyQt4 module ${MODNAME} not found")
257+
ENDIF (MODDIR)
256258
UNSET(PYQT4MOD)
257259
ENDFOREACH (PQ)
258-
FILE (GLOB PQPYLIST "${PYQT4MODDIR}/*.py")
260+
PYTHONMODULEDIR("PyQt${QT_FWVER}" PYQTMODDIR)
261+
FILE (GLOB PQPYLIST "${PYQTMODDIR}/PyQt${QT_FWVER}/*.py")
259262
FOREACH (PQPY ${PQPYLIST})
260263
EXECUTE_PROCESS (COMMAND cp -fp "${PQPY}" "${QGISPYDIR}/PyQt${QT_FWVER}/")
261264
ENDFOREACH (PQPY)
262-
EXECUTE_PROCESS (COMMAND cp -Rfp "${PYQT4MODDIR}/uic" "${QGISPYDIR}/PyQt${QT_FWVER}")
265+
EXECUTE_PROCESS (COMMAND cp -Rfp "${PYQTMODDIR}/PyQt${QT_FWVER}/uic" "${QGISPYDIR}/PyQt${QT_FWVER}")
263266

264267
# PyQt utilities
265268

@@ -277,17 +280,17 @@ ENDIF ()
277280

278281
# PyQwt
279282
# only if it's available, not compatible with newer PyQt
280-
281-
IF (EXISTS "${PYQT4MODDIR}/Qwt5/_iqt.so")
283+
PYTHONMODULEDIR("Qwt5/_iqt.so" QWT4MODDIR)
284+
IF (QWT4MODDIR)
282285
MESSAGE (STATUS "Copying PyQwt and updating library paths...")
283286
EXECUTE_PROCESS (COMMAND mkdir -p "${QGISPYDIR}/PyQt${QT_FWVER}/Qwt5")
284287
IF (NOT EXISTS "${QGISPYDIR}/PyQt${QT_FWVER}/Qwt5/_iqt.so")
285-
EXECUTE_PROCESS (COMMAND ditto ${QARCHS} "${PYQT4MODDIR}/Qwt5/_iqt.so" "${QGISPYDIR}/PyQt${QT_FWVER}/Qwt5/")
288+
EXECUTE_PROCESS (COMMAND ditto ${QARCHS} "${QWT4MODDIR}/Qwt5/_iqt.so" "${QGISPYDIR}/PyQt${QT_FWVER}/Qwt5/")
286289
ENDIF ()
287290
IF (NOT EXISTS "${QGISPYDIR}/PyQt${QT_FWVER}/Qwt5/Qwt.so")
288-
EXECUTE_PROCESS (COMMAND ditto ${QARCHS} "${PYQT4MODDIR}/Qwt5/Qwt.so" "${QGISPYDIR}/PyQt${QT_FWVER}/Qwt5/")
291+
EXECUTE_PROCESS (COMMAND ditto ${QARCHS} "${QWT4MODDIR}/Qwt5/Qwt.so" "${QGISPYDIR}/PyQt${QT_FWVER}/Qwt5/")
289292
ENDIF ()
290-
FILE (GLOB PQWPYLIST "${PYQT4MODDIR}/Qwt5/*.py")
293+
FILE (GLOB PQWPYLIST "${QWT4MODDIR}/Qwt5/*.py")
291294
FOREACH (PQWPY ${PQWPYLIST})
292295
EXECUTE_PROCESS (COMMAND cp -fp "${PQWPY}" "${QGISPYDIR}/PyQt${QT_FWVER}/Qwt5/")
293296
ENDFOREACH (PQWPY)

0 commit comments

Comments
 (0)
Please sign in to comment.