#はじめに
これは、OpenCV Advent Calendar 2016 10日目の記事の続き、をもったいないので、14日代行で上げておきます。
OpenCVのfreetypeモジュールを、contribとして追加申請した感じの話になります。
ただし、基本的には感想文なので、得るものは少ないかもしれません。ただし、「新しいモジュール作ったる!!」って人がPR送る前に、一度でも参考にしていただければ幸いに存じます。
#後悔先に立たず…(2016/12/15 23:24JST追記)
コメント欄に記載していただいた記事ですが、もし、先にこちらをきちんと読み込んでからPRしていたら、この悲しい記事は生まれなかった/半分くらいの修正になっていた、かもしれません。PRしてやるぜって方はまずは下記を是非ご覧ください。
OpenCVのバグ(Pull Request)
http://opencv.org/contribute.html
https://github.com/opencv/opencv/wiki/How_to_contribute
https://github.com/opencv/opencv/wiki/Coding_Style_Guide
という要望がリプライできまして
と、やっちゃいました!!
#即座にレスポンスがきた!
まず、めちゃくちゃびっくりしたのが、commit直後にレスポンスがものすごく早かったことですね。
もしfreetype対応必要だって中の人も考えていた・・・としたらうれしい限りですね(勝手な妄想)。
10:35 commit
10:47 最初の指摘
#レビューでは、どんな指摘があったのか?
いくつかカテゴライズしてみましょう。
単純ミス
- PKG_CONFIG無い環境への配慮が足りていない
- もうSphinxなんて使ってないから、RSTなんて要らない
- descriptionが古いままだよ
- cv::Matはインスタンスで抱え込まないで、参照にしましょうね。
え?そんなルールがあったの・・・?
- namespaceでindentなんてしないよ
- precomp.cpp?要らないよ…
あれ?そういえば・・・
- interfaceとimplementは分けてね
- モジュール使えないときは、ocv_module_disable(freetype)してね
その他指摘以外で直したもの
- そもそもヘッダの位置がおかしくてコンパイルできないよ
- whilespaceが行末にあるよ!(docのコンパイルで引っかかる)
- pythonのwrapper作るときに、unsigned intはダメ(ライブラリのコンパイルで引っかかる)
- CV_Assert()で保護やってなかった(自主リテイク)
#何が問題だったのか?
##1 他モジュールの書き方をまねた→そっち自体が問題だった
"namespaceでindentなんてしないよ"とか、"precomp.cpp"とか、別モジュールの書き方をそのままマネていました。
でもダメーってことで直さざるを得ませんでした。
##2 行末のwhitespaceチェックしなければならないことに気が付かなかった。
前部のソースコードの行末は、スペース入っているとNGになります!!
っていうのがDoxygen実行のbuild botで警告されて初めて知りました。
おおお、そういう話が合ったのですね・・・
##3 Pythonのwrapper作るときに、unsigned intがおかしくなる
これは原因がわからなかったのですが、挙動を見て頭を悩ませた結果、
unsigned int でエラー。
→ 他関数のintのところは問題起きない。
→ もしかし、unsigned は Python Wrapper対象になるが、intは対象外になっている?
→ 試しに、intにしてみる。
→ 問題なくなる(いろいろ不思議)
##4 ビルド環境と自分の環境で、ライブラリバージョンが違ってた!
最初は、"freetype/***.h"という形でcommitしたが、通らない。
#include <ft2build.h>
#include <freetype/freetype.h>
#include <freetype/outline.h>
ログを見ると、そんなパス/ファイルはないよー、と言われてしまう。でもこれでいいはずなんだけどなー。
バージョン違うんかなー、などと、頭を悩めてfreetypeのマニュアルをよーく読んだら、
#include <ft2build.h>
#include FT_FREETYPE_H
#include FT_OUTLINE_H
という形で書くべきだったと。ただ、ビルド環境に入っているのと同じバージョンが手元になくて確認できなかったのが辛かった…
#まとめ(と反省点)
わけわからないまま、ほかのモジュールをパクると、大変な事になる、が今回の教訓でございました。
commitは計画的に
「自分の裏環境のバックアップにも、git便利だなー」ってちょこちょこcommitしてたら、ゴミcommitが消せなくなって、泣きながら再度ブランチ作り直しからやり直すはめになりました。特に、大本の(github上の)コードとマージしちゃうとダメです!!
自分の修正 → githubのコードをfetch → 自分の新たな修正
こうなるともうどうしようもなくなる。
これから先、やらなきゃいけないこと。
testやsampleの実装充実などを図って、来年中にはマスターへのマージができるといいなあ、というのを夢見て生きていきます。
M+ Projectのフォントあたりを使って・・・ですかね。
あと、Linuxは対応したけど、WindowsやらMacやらでも対応した方がいいんですかね?
pkg-config 使わずにharfbuzzのライブラリ位置を探索するしかないですね。
webkitのfindHardbuzz.cmakeパクってしまうのが一番楽ですが…
module開発者向けにOpenCVの中の人に要望する事
「このテンプレにそってやれば、モジュール作れるよ!」っていうサンプルモジュールを、contribにcommitしておくと、みんな幸せになってどんどんモジュールが増えるのかも!!誰かPRしてください(必死)
以上、よろしくお願いいたします。