WebページでOpenTypeの対応がしたくなった。通常、ブラウザが対応しておれば問題ないのだろうが、自分の使用方法が文字列を受け取って1文字単位でのアウトラインデータを取得する必要があるためサーバー側で対応する必要ができた。(フォントが特殊でブラウザ側に書体データを渡したくない)HarfbuzzのユーティリティコマンドをPHPからshellexecで実行してと思ったが、どのコマンドも微妙に機能がたらない。いくつかのユーティリティコマンドを組み合わせればできるかもと思ったが、shellexecを何回も実行するのはレスポンスを考えるとやりたくない。ということでPHP Extensionでharfbuzzの関数を直接呼び出して自分のほしい結果を取得することを考える。
まずPHPのソースをダウンロードする必要があるらしい。
いくつかのページで
git clone git@github.com:php/php-src.git
でよいと書いてあるが、これはうまくいかない。メッセージからするとgithubのアカウントを設定しているかどうかのような気がするが匿名でダウンロードしたい。といろいろ探し回っていると下記のコマンドでダウンロードできた。
git clone http://git.php.net/repository/php-src.git
次にエクステンションのスケルトン生成だがこれも
cd ext ./ext_skel --extname=myext
でいけるとなっているが–extnameというオプションはないと怒られる。これは
cd ext ./ext_skel --ext myext
でいけた。こんなところで微妙な違いがあるのがなにかを間違えているのではという気がしてしまうがとりあえずこのまますすむ。ちなみにPHPバージョンは7.4(サーバーと開発機で微妙にバージョンが違うがそのうちサーバーのバージョンを上げたいのでこのまま進む)
うまくいくと下記のような表示がでてビルド方法を教えてくれる。
Success. The extension is now ready to be compiled. To do so, use the following steps: cd /path/to/php-src/harfbuzz phpize ./configure make Don't forget to run tests once the compilation is done: make test Thank you for using PHP!
外部ライブラリの読み込み設定
外部ライブラリを使うことを宣言しておくと./configureやmakeを使うのに便利(というか必須)のためconfig.m4を書き換える。このファイルはpkg-configが対応している外部ライブラリを使う場合とそうでない場合で書き換える箇所がことなる。自分はharfbuzzとfreetype2を必要としており両方pkg-configに対応しているため下記のような記述となった。
dnl If your extension references something external, use 'with': PHP_ARG_WITH([harfbuzz], [for harfbuzz support], [AS_HELP_STRING([--with-harfbuzz], [Include harfbuzz support])]) if test "$PHP_HARFBUZZ" != "no"; then dnl Write more examples of tests here… dnl Remove this code block if the library does not support pkg-config. PKG_CHECK_MODULES([LIBFOO], harfbuzz) PHP_EVAL_INCLINE($LIBFOO_CFLAGS) PHP_EVAL_LIBLINE($LIBFOO_LIBS, HARFBUZZ_SHARED_LIBADD) PKG_CHECK_MODULES([LIBFO1], freetype2) PHP_EVAL_INCLINE($LIBFO1_CFLAGS) PHP_EVAL_LIBLINE($LIBFO1_LIBS, HARFBUZZ_SHARED_LIBADD) PHP_SUBST(HARFBUZZ_PHP_SHARED_LIBADD) dnl In case of no dependencies AC_DEFINE(HAVE_HARFBUZZ, 1, [ Have harfbuzz support ]) PHP_NEW_EXTENSION(harfbuzz, harfbuzz.c, $ext_shared) fi
dnlがついていない場所のみ抜粋(メモは残してある)。最初ファイルの記述が多いためこれだけの内容を自分が使いたいライブラリに合わせて書き換えるのかとげんなりしたが、よくよくメモを読んでみると一部のコメントアウトを外した上で使いたいライブラリ名を書くだけだった。これでphpizeと./configureを行うとライブラリの存在確認をしてくれるし、make時にパスを通したりライブラリのリンク設定もしてくれる。VisualStudio等のIDEのありがたみを実感した。