TESTED WITH: - Qt-dev (git) - Python-3.5.2 - sip-4.19.1 - PyQt-5.8 NOTES: - installs sip, python, pyqtdeploy, etc to dev SYSROOT, symlink to ~/bin in each SYSROOT as needed - other 'python' exes are used from respective SYSROOT SERVER ============================================================== - pip3 install PyQt5 (installs 5.9) - pip3 install git+https://github.com/webpy/webpy#egg=web.py - sudo systemctl enable pkdiagram - sudo service pkdiagram - journalctl -efu pkdiagram - tail -f ~/server.log BUILD INSTRUCTIONS ============================================================== EDIT BASH PROFILE: # call the appropriate one before building/using each SYSROOT function pyqt-dev { export SYSROOT=$HOME/dev/vendor/pyqt-sysroot-dev export DYLD_LIBRARY_PATH=$SYSROOT/lib export PATH=$SYSROOT/bin:$PATH } function pyqt-ios { export SYSROOT=$HOME/dev/vendor/pyqt-sysroot-ios-64 export DYLD_LIBRARY_PATH=$SYSROOT/lib export PATH=$SYSROOT/bin:$PATH } function pyqt-simulator { export SYSROOT=$HOME/dev/vendor/pyqt-sysroot-iphonesimulator export DYLD_LIBRARY_PATH=$SYSROOT/lib export PATH=$SYSROOT/bin:$PATH } function pyqt-osx { export SYSROOT=$HOME/dev/vendor/pyqt-sysroot-osx-64 export DYLD_LIBRARY_PATH=$SYSROOT/lib export PATH=$SYSROOT/bin:$PATH } PULL QT REPO: - git clone https://code.qt.io/qt/qt5.git ~/dev/vendor/pyqt-sysroot-base/src/qt5-src - ./init-repository --module-subset=qtbase CREATE BUILD ENVIRONMENTS pyqt-sysroot-dev (debug): - mkdir -p $SYSROOT/build && cd $SYSROOT/build - Qt: - mkdir qt5 && cd qt5 - ../../../pyqt-sysroot-base/src/qt5/configure -opensource -confirm-license -nomake examples -nomake tests -prefix $PWD - ../../../pyqt-sysroot-base/src/qt5/configure -opensource -confirm-license -developer-build -debug -no-framework -nomake examples -nomake tests -prefix $PWD - make -j10 && make -j10 install - Python: - tar zxvf ../../pyqt-sysroot-base/src/Python-3.5.2.tar.gz - cd Python-3.5.2 - export CFLAGS="-I$(brew --prefix openssl)/include -I$(xcrun --show-sdk-path)/usr/include -Wno-nullability-completeness -Wno-strict-prototypes" - export LDFLAGS="-L$(brew --prefix openssl)/lib -I$(xcrun --show-sdk-path)/usr/lib" - uncomment/set SSL chunk in Modules/Setup.dist to look like this: # Socket module helper for socket(2) _socket socketmodule.c # Socket module helper for SSL support; you must comment out the other # socket line above, and possibly edit the SSL variable: SSL=/usr/local/Cellar/openssl/1.0.2l _ssl _ssl.c \ -DUSE_SSL -I$(SSL)/include -I$(SSL)/include/openssl \ -L$(SSL)/lib -lssl -lcrypto - ./configure --with-pydebug --prefix=$SYSROOT -with-ensurepip=install --with-system-expat - make -j10 && make -j10 install - pip install --upgrade pip - pip install pyqtdeploy - patch pyqtdeploy (see APPENDIX 1) - sip: - tar zxvf ../../pyqt-sysroot-base/src/sip-4.19.1.tar.gz - python configure.py —-sysroot=$SYSROOT - make -j10 && make -j10 install - PyQt: - tar zxvf ../../pyqt-sysroot-base/src/PyQt5_gpl-5.8.tar.gz - python configure.py --enable=QtCore --enable=QtGui --enable=QtWidgets --enable QtPrintSupport --enable QtNetwork --enable QtTest --concatenate -b $SYSROOT/bin --qmake $SYSROOT/build/qt5/bin/qmake --no-designer-plugin --no-qml-plugin --debug --confirm-license - make -j10 && make -j10 install pyqt-sysroot-osx (release): - SYSROOT - mkdir -p $SYSROOT/build - Qt: - cd $SYSROOT/build && makedir qt5 - ../../../pyqt-sysroot-base/src/qt5/qtbase/configure -opensource -confirm-license -nomake examples -nomake tests -prefix $PWD -static - make install -j10 - Python: - pyqtdeploycli --package python --target osx-64 configure - qmake SYSROOT=$SYSROOT - make -j10; make install - mkdir -p $SYSROOT/bin - cd $SYSROOT/bin - ln -s ../../pyqt-sysroot-dev/bin/python* . - ln -s ../build/qt5/bin/qmake . - pyqtdeploycli --package python --target osx-64 configure && qmake SYSROOT=$SYSROOT && make -j10 && make install - sip: - pyqtdeploycli --package sip --target osx-64 configure - python configure.py --static --sysroot=$SYSROOT --use-qmake --configuration=sip-osx.cfg - qmake - cp sipgen/sip ../../bin # ????? - PyQt: - pyqtdeploycli --package pyqt5 --target osx-64 configure - python configure.py --static --sysroot=$SYSROOT --no-qsci-api --no-designer-plugin --no-qml-plugin --configuration=pyqt5-osx.cfg -b $SYSROOT/bin --enable=QtCore --enable=QtGui --enable=QtNetwork --enable=QtWidgets --enable=QtPrintSupport --concatenate --qmake $SYSROOT/build/qt5/bin/qmake -u --confirm-license - make -j10; make install - ## for i in `find . -name "*_debug.a"`; do ln -sf `echo $i | sed "s/.*\///"` "${i/_debug/}"; done # if doing a debug build - ## for i in `find . -name "*_debug.la"`; do ln -sf `echo $i | sed "s/.*\///"` "${i/_debug/}"; done # if doing a debug build pyqt-sysroot-ios (debug, release): - SYSROOT - mkdir -p $SYSROOT/build $SYSROOT/bin - ln -s $SYSROOT/../pyqt-sysroot-dev/bin/pyqtdeploy* $SYSROOT/bin - ln -s $SYSROOT/../pyqt-sysroot-dev/bin/python* $SYSROOT/bin - ln -s $SYSROOT/../pyqt-sysroot-dev/bin/sip $SYSROOT/bin - Qt - mkdir $SYSROOT/build/qt5 && cd $SYSROOT/build/qt5 - ../../../pyqt-sysroot-base/src/qt5/qtbase/configure -static -debug-and-release -xplatform macx-ios-clang -nomake examples -nomake tests -opensource -confirm-license -qt-pcre -developer-build - make install -j10 - Python - pyqtdeploycli --package python --target ios-64 configure - $SYSROOT/build/qt5/bin/qmake SYSROOT=$SYSROOT - make -j10 && make install - python.pro: # Modules/_scproxy.c - Modules/posixmodule.c: #undef HAVE_SYSTEM - sip: - pyqtdeploycli --package sip --target ios-64 configure - python configure.py --static --sysroot=$SYSROOT --no-tools --use-qmake --configuration=sip-ios.cfg - $SYSROOT/build/qt5/bin/qmake - make -j10 && make install - PyQt: - pyqtdeploycli --package pyqt5 --target ios-64 configure - python configure.py --static --sysroot=$SYSROOT --no-qsci-api --no-designer-plugin --no-qml-plugin --configuration=pyqt5-ios.cfg -b $SYSROOT/bin --enable=QtCore --enable=QtGui --enable=QtWidgets --enable=QtNetwork --concatenate --confirm-license --qmake=$SYSROOT/build/qt5/bin/qmake - make -j10 && make install pyqt-sysroot-osx-64-release - SYSROOT - mkdir -p $SYSROOT/build $SYSROOT/bin - ln -s $SYSROOT/../pyqt-sysroot-dev/bin/pyqtdeploy* $SYSROOT/bin - ln -s $SYSROOT/../pyqt-sysroot-dev/bin/python* $SYSROOT/bin - ln -s $SYSROOT/../pyqt-sysroot-dev/bin/sip $SYSROOT/bin - Qt - ../../../pyqt-sysroot-base/src/qt5/qtbase/configure -static -release -opensource -confirm-license -nomake examples -nomake tests -prefix $PWD - make install -j10 - Python: - pyqtdeploycli --package python --target osx-64 configure - $SYSROOT/build/qt5/bin/qmake SYSROOT=$SYSROOT - make -j10; make install - mkdir -p $SYSROOT/bin - cd $SYSROOT/bin - pyqtdeploycli --package python --target osx-64 configure && qmake SYSROOT=$SYSROOT && make -j10 && make install - sip: - pyqtdeploycli --package sip --target osx-64 configure - python configure.py --static --sysroot=$SYSROOT --use-qmake --configuration=sip-osx.cfg - qmake - cp sipgen/sip ../../bin # ????? - PyQt: - pyqtdeploycli --package pyqt5 --target osx-64 configure - python configure.py --static --sysroot=$SYSROOT --no-qsci-api --no-designer-plugin --no-qml-plugin --configuration=pyqt5-osx.cfg -b $SYSROOT/bin --enable=QtCore --enable=QtGui --enable=QtNetwork --enable=QtWidgets --enable=QtPrintSupport --concatenate --qmake $SYSROOT/build/qt5/bin/qmake --confirm-license - make -j10; make install APPENDIX 1: PYQTDEPLOY PATCHES - site-packages/pyqtdeploy/python/configurations/config_py3.c: extern PyObject* PyInit_time(void); extern PyObject* PyInit_math(void); extern PyObject* PyInit__pickle(void); extern PyObject* PyInit__datetime(void); extern PyObject* PyInit__struct(void); extern PyObject* PyInit_binascii(void); extern PyObject* PyInit__decimal(void); extern PyObject* PyInit__sha512(void); extern PyObject* PyInit__sha256(void); extern PyObject* PyInit__sha1(void); extern PyObject* PyInit__md5(void); extern PyObject* PyInit__random(void); extern PyObject* PyInit_zlib(void); extern PyObject* PyInit__socket(void); extern PyObject* PyInit_select(void); -- {"time", PyInit_time}, {"math", PyInit_math}, {"pickle", PyInit__pickle}, {"_datetime", PyInit__datetime}, {"_struct", PyInit__struct}, { "binascii", PyInit_binascii}, { "_sha512", PyInit__sha512}, { "_sha256", PyInit__sha256}, { "_sha1", PyInit__sha1}, { "_md5", PyInit__md5}, { "_random", PyInit__random}, { "_zlib", PyInit_zlib}, { "_socket", PyInit__socket}, { "select", PyInit_select}, - $PYTHON/site-packages/pyqtdeploy/python/configurations/python.pro: Modules/timemodule.c \ Modules/mathmodule.c \ Modules/_math.c \ Modules/_pickle.c Modules/_scproxy.c \ Modules/_datetimemodule.c \ Modules/_struct.c \ Modules/binascii.c \ Modules/sha512module.c \ Modules/_randommodule.c \ Modules/sha256module.c \ Modules/sha1module.c \ Modules/md5module.c \ Modules/zlibmodule.c \ Modules/socketmodule.c - FUTURE (for xlsxwriter compression support): Modules/zlib/adler32.c \ Modules/zlib/deflate.c \ Modules/zlib/gzlib.c \ Modules/zlib/infback.c \ Modules/zlib/inftrees.c \ Modules/zlib/uncompr.c \ Modules/zlib/compress.c \ Modules/zlib/example.c \ Modules/zlib/gzread.c \ Modules/zlib/inffast.c \ Modules/zlib/minigzip.c \ Modules/zlib/zutil.c \ Modules/zlib/crc32.c \ Modules/zlib/gzclose.c \ Modules/zlib/gzwrite.c \ Modules/zlib/inflate.c \ Modules/zlib/trees.c - site-packages/pyqtdeploy/builder/builder.py: (make sure vars are not random in .pro output for source control) - replace: " = {}" => " = Orderedict()" - replace: "set()" => "OrderedSet()" - $PYTHON/pyqtdeploy/builder/orderedset.py: import collections class OrderedSet(collections.MutableSet): def __init__(self, iterable=None): self.end = end = [] end += [None, end, end] # sentinel node for doubly linked list self.map = collections.OrderedDict() # key --> [key, prev, next] if iterable is not None: self |= iterable def __len__(self): return len(self.map) def __contains__(self, key): return key in self.map def add(self, key): if key not in self.map: end = self.end curr = end[1] curr[2] = end[1] = self.map[key] = [key, curr, end] def discard(self, key): if key in self.map: key, prev, next = self.map.pop(key) prev[2] = next next[1] = prev def update(self, keys): for k in keys: self.add(k) def __iter__(self): end = self.end curr = end[2] while curr is not end: yield curr[0] curr = curr[2] def __reversed__(self): end = self.end curr = end[1] while curr is not end: yield curr[0] curr = curr[1] def pop(self, last=True): if not self: raise KeyError('set is empty') key = self.end[1][0] if last else self.end[2][0] self.discard(key) return key def __repr__(self): if not self: return '%s()' % (self.__class__.__name__,) return '%s(%r)' % (self.__class__.__name__, list(self)) def __eq__(self, other): if isinstance(other, OrderedSet): return len(self) == len(other) and list(self) == list(other) return set(self) == set(other) APPENDIX 2: HockeyApp deployment - Add sdk framework - File -> "Add files to Family Diagram..." - Run script build phase FILE="${SRCROOT}/HockeySDK-Mac/BuildAgent" if [ -f "$FILE" ]; then "$FILE" fi - Copy Files build phase - HockeyAppSDK.framework -> Frameworks - Linker flags: - rpath @executable_path/../Frameworks