モブ沢工房

プログラミングとかLinux関連(特にOSSのグラフィックツール関連)とかレトロゲームとか3Dプリンタやら日曜大工等、色々。

mypaint 2.0.0-alphaへの追従で四苦八苦

Mypaintの自作ブランチにupstreamのmergeを長期間怠っていたら、大変な作業量が待っていました…備忘録的に

目に付いた主な変更点

  • ビルドシステムがSConsからsetup.pyへ移行している
    • scons debug=trueに相当するのは、python setup.py build --debug
    • この結果、build/以下にlib.linux-x86_64-3.6 等のディレクトリが出来て、何かカッコいい。
  • scons cleanしておく必要がある(重要)
  • mypaintbrush 2.0が必要らしいので、gitから持ってきてmake installした。これが多分正しい。
    • エラーがでたので手当り次第に処置したけど、実はよくわかっていない…
  • python2.7でビルドするとlib/gettext.pyのfrom gettext import gettextでImportErrorが起きるように見える。
    • git cloneしたバニラなmypaint 2.0でも起きた
      • しかしpython3で一旦ビルド成功後は、python2.7でビルドし動かしても動いたりして二度と再現されない。要追跡。
    • いずれにせよ、そろそろpython3に本格的に乗り換えないとなぁ…という感じ。他の自作スクリプトも随時書き換えて行かねば。
  • update-alternativesで3をデフォにしてもいいけど、python-moinmoinが3非対応だったりして別の部分でつらい

_mypaintlib.soが見つからないエラーが出る

前述の通り、cleanしておかないとSConsで作られた古いmypaintlib.pyが lib/に残りこのエラーが起きる。削除すること。また、当然ながら以前のlib/_mypaintlib.so自体も削除しておくのが良い。

ビルドスクリプトの追加修正

独自のcppモジュールを追加するには、lib/mypaintlib.iのみならず、 setup.pyの576行目近辺

    mypaintlib = Extension(
        'lib._mypaintlib',
        [
            'lib/mypaintlib.i',
            'lib/fill.cpp',
            'lib/gdkpixbuf2numpy.cpp',
            'lib/pixops.cpp',
            'lib/fastpng.cpp',
            'lib/brushsettings.cpp',
            'lib/pyramidfill.cpp', # XXX for pyramid-fill
            'lib/opencv_util.cpp', # XXX for adjust tool
        ],

のように改変。(以前、SConstructにやっていたのと同じ)

Python3対応

  • SWIG(cpp)においてPyInt_AsLongはpython3のAPIでは存在しないので、PyLong_AsLongに変更する。(lib/pyramidfill.cpp)
  • from _future_ import division, print_functionはスクリプト先頭に置かねばならない。
    • git mergeでの自作部分とのコンフリクト検出時に不用意に済ませるとpython3ではこれがエラーとなる

importの厳密化

例えばgui/drawwindow.py でimport sizechangepopupとしてもエラーになるようになっている。 これは、

from . import sizechangepopup 
# もしくは
import gui.sizechangepopup as sizechangepopup # 若干美しくない気がする

と書かなければならない。これが物凄い多いので、普段からディレクトリを明示する等して徹底しておくべきだったorz

with_wait_cursor

このデコレータはgui.drawwindowから、gui.widgetsに移管されている。