やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

Raspbian stretch に PyQt5 をインストールする6(SIPをインストールする)

 Qt5をPython3で使うための準備1。

前回まで

手順

 SIP をインストールする。

A. pip(失敗)

 SIPC++Pythonで使うライブラリで、PyQt5はSIPを使うらしい。

(Qt) $ pip install SIP
Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
Collecting SIP
  Could not find a version that satisfies the requirement SIP (from versions: )
No matching distribution found for SIP

 Python 3.7.1でインストールできるSIPはないっぽい……。なお、3.6.7, 3.5.3でも同様だった。

B. ソースコードからコンパイル

 SIP Downloadからソースコードを入手する。(今回のバージョンはsip-4.19.13.tar.gzだった)

(Qt) $ cd /home/pi/root/lib/sip-4.19.13
(Qt) $ python configure.py
(Qt) $ make
(Qt) $ sudo make install

 各コマンドの結果は以下。

(Qt) $ cd /home/pi/root/lib/sip-4.19.13
(Qt) $ python configure.py
This is SIP 4.19.13 for Python 3.7.1 on linux.
The SIP code generator will be installed in /home/pi/root/env/py/Qt/bin.
The sip.h header file will be installed in
/home/pi/root/env/py/Qt/include/python3.7m.
The sip module will be installed in
/home/pi/root/env/py/Qt/lib/python3.7/site-packages.
The sip.pyi stub file will be installed in
/home/pi/root/env/py/Qt/lib/python3.7/site-packages.
The default directory to install .sip files in is
/home/pi/root/env/py/Qt/share/sip.
Creating sipconfig.py...
Creating top level Makefile...
Creating sip code generator Makefile...
Creating sip module Makefile...
(Qt) $ make
make[1]: ディレクトリ '/home/pi/root/lib/sip-4.19.13/sipgen' に入ります
gcc -c -pipe -O2 -Wall -W -DNDEBUG -I. -o main.o main.c
main.c: In function ‘warning’:
main.c:525:9: warning: ‘wstr’ may be used uninitialized in this function [-Wmaybe-uninitialized]
         fprintf(stderr, "%s: %s: ", sipPackage, wstr);
         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
gcc -c -pipe -O2 -Wall -W -DNDEBUG -I. -o transform.o transform.c
gcc -c -pipe -O2 -Wall -W -DNDEBUG -I. -o gencode.o gencode.c
gcc -c -pipe -O2 -Wall -W -DNDEBUG -I. -o extracts.o extracts.c
gcc -c -pipe -O2 -Wall -W -DNDEBUG -I. -o export.o export.c
gcc -c -pipe -O2 -Wall -W -DNDEBUG -I. -o type_hints.o type_hints.c
gcc -c -pipe -O2 -Wall -W -DNDEBUG -I. -o heap.o heap.c
gcc -c -pipe -O2 -Wall -W -DNDEBUG -I. -o parser.o parser.c
gcc -c -pipe -O2 -Wall -W -DNDEBUG -I. -o lexer.o lexer.c
g++  -o sip main.o transform.o gencode.o extracts.o export.o type_hints.o heap.o parser.o lexer.o 
make[1]: ディレクトリ '/home/pi/root/lib/sip-4.19.13/sipgen' から出ます
make[1]: ディレクトリ '/home/pi/root/lib/sip-4.19.13/siplib' に入ります
gcc -c -pipe -fPIC -O2 -Wall -W -DNDEBUG -I. -I/home/pi/.pyenv/versions/3.7.1/include/python3.7m -o siplib.o siplib.c
siplib.c: In function ‘wrapInstance’:
siplib.c:1693:42: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
         return sip_api_convert_from_type((void *)addr, wt->wt_td, NULL);
                                          ^
siplib.c: In function ‘parsePass2’:
siplib.c:5748:32: warning: ‘owner’ may be used uninitialized in this function [-Wmaybe-uninitialized]
                         *owner = arg;
                         ~~~~~~~^~~~~
siplib.c: In function ‘slot_richcompare’:
siplib.c:11355:52: warning: ‘st’ may be used uninitialized in this function [-Wmaybe-uninitialized]
     if ((f = (PyObject *(*)(PyObject *,PyObject *))findSlot(self, st)) == NULL)
                                                    ^~~~~~~~~~~~~~~~~~
gcc -c -pipe -fPIC -O2 -Wall -W -DNDEBUG -I. -I/home/pi/.pyenv/versions/3.7.1/include/python3.7m -o apiversions.o apiversions.c
gcc -c -pipe -fPIC -O2 -Wall -W -DNDEBUG -I. -I/home/pi/.pyenv/versions/3.7.1/include/python3.7m -o descriptors.o descriptors.c
gcc -c -pipe -fPIC -O2 -Wall -W -DNDEBUG -I. -I/home/pi/.pyenv/versions/3.7.1/include/python3.7m -o qtlib.o qtlib.c
gcc -c -pipe -fPIC -O2 -Wall -W -DNDEBUG -I. -I/home/pi/.pyenv/versions/3.7.1/include/python3.7m -o threads.o threads.c
gcc -c -pipe -fPIC -O2 -Wall -W -DNDEBUG -I. -I/home/pi/.pyenv/versions/3.7.1/include/python3.7m -o objmap.o objmap.c
gcc -c -pipe -fPIC -O2 -Wall -W -DNDEBUG -I. -I/home/pi/.pyenv/versions/3.7.1/include/python3.7m -o voidptr.o voidptr.c
gcc -c -pipe -fPIC -O2 -Wall -W -DNDEBUG -I. -I/home/pi/.pyenv/versions/3.7.1/include/python3.7m -o array.o array.c
gcc -c -pipe -fPIC -O2 -Wall -W -DNDEBUG -I. -I/home/pi/.pyenv/versions/3.7.1/include/python3.7m -o int_convertors.o int_convertors.c
g++ -c -pipe -fPIC -O2 -Wall -W -DNDEBUG -I. -I/home/pi/.pyenv/versions/3.7.1/include/python3.7m -o bool.o bool.cpp
g++ -shared -Wl,--version-script=sip.exp -o sip.so siplib.o apiversions.o descriptors.o qtlib.o threads.o objmap.o voidptr.o array.o int_convertors.o bool.o 
make[1]: ディレクトリ '/home/pi/root/lib/sip-4.19.13/siplib' から出ます
(Qt) $ sudo make install
make[1]: ディレクトリ '/home/pi/root/lib/sip-4.19.13/sipgen' に入ります
cp -f sip /home/pi/root/env/py/Qt/bin/sip
cp -f /home/pi/root/lib/sip-4.19.13/siplib/sip.h /home/pi/root/env/py/Qt/include/python3.7m/sip.h
make[1]: ディレクトリ '/home/pi/root/lib/sip-4.19.13/sipgen' から出ます
make[1]: ディレクトリ '/home/pi/root/lib/sip-4.19.13/siplib' に入ります
cp -f sip.so /home/pi/root/env/py/Qt/lib/python3.7/site-packages/sip.so
strip /home/pi/root/env/py/Qt/lib/python3.7/site-packages/sip.so
cp -f /home/pi/root/lib/sip-4.19.13/sip.pyi /home/pi/root/env/py/Qt/lib/python3.7/site-packages/sip.pyi
make[1]: ディレクトリ '/home/pi/root/lib/sip-4.19.13/siplib' から出ます
cp -f sipconfig.py /home/pi/root/env/py/Qt/lib/python3.7/site-packages/sipconfig.py
cp -f /home/pi/root/lib/sip-4.19.13/sipdistutils.py /home/pi/root/env/py/Qt/lib/python3.7/site-packages/sipdistutils.py
/home/pi/root/env/py/Qt/bin/python /home/pi/root/lib/sip-4.19.13/mk_distinfo.py "" /home/pi/root/env/py/Qt/lib/python3.7/site-packages/sip-4.19.13.dist-info installed.txt

確認

$ pip list
Package    Version
---------- -------
pip        10.0.1 
setuptools 39.0.1 
sip        4.19.13

 インストールされた。

所感

 aptpipも使えないとか……一体何のためにあるんだよ。