Open11

PHPにコントリビュートするための周辺知識

にゃんだーすわんにゃんだーすわん

暇なときにまとめていく

にゃんだーすわんにゃんだーすわん

語りたくなることは無限にあるけど、できるだけ事前知識とか頭に入れなくてもさくっと手を動かし始められるように。必要なことはできるだけ本文に書くので、関連リンクとかは暇なときに読めばいいよ。

にゃんだーすわんにゃんだーすわん

PHPのソースコード

PHPはC言語で書かれている。ソースコードはhttps://github.com/php/php-srcにある。

https://github.com/php/php-src

C言語で書かれたプログラムなので、Cコンパイラが必要になる。その他に必要なコンパイル方法などはREADMEに書かれているので、必ず最新のものを自分で確認してほしい。

For a minimal PHP build from Git, you will need autoconf, bison, and re2c. For a default build, you will additionally need libxml2 and libsqlite3.

On Ubuntu, you can install these using:

sudo apt install -y pkg-config build-essential autoconf bison re2c \
                    libxml2-dev libsqlite3-dev

On Fedora, you can install these using:

sudo dnf install re2c bison autoconf make libtool ccache libxml2-devel sqlite-devel

個別のツールが何をしてくれるのかはあまり気にしなくていい。

にゃんだーすわんにゃんだーすわん

いちおうどんなものを入れておけと言われているのかというと…

  • build-essential
    • Debian -- sid の build-essential パッケージに関する詳細
    • Debianのパッケージをビルドするために必要なものをまとめて入れてくれるやつ
      • gcc (GNU C Compiler)
        • C言語のコンパイラ
      • libc (GNU C Library)
        • C言語の標準的な関数ライブラリ
      • make (GNU Make)
        • C言語のコンパイルなどの作業を自動化してくれるツール
        • make コマンドを実行すると Makefile に書かれた内容に沿って処理してくれる
      • autoconf
        • configureスクリプトやMakefileを生成してくれるツール
      • libtool
        • C言語の動的ライブラリを作成するときに使うツール
  • pkg-config (pkgconf/pkgconf: package compiler and linker metadata toolkit)
    • コンパイルするのに必要なライブラリを探してきてくれるツール
  • bison (GNU Bison)
    • プログラミング言語の構文規則から構文解析器を生成してくれるツール
  • re2c
  • libxml2
    • C言語からXMLをパースしたりするためのツール
  • libsqlite3 (SQLite)
    • プログラムに組み込んで使えるDB(SQL)
にゃんだーすわんにゃんだーすわん
にゃんだーすわんにゃんだーすわん

ここでは詳しく説明しないが、macOSを使っている各位はそこまで苦戦することはないだろう。

私は以下のようなコマンドでHomebrewから依存パッケージをインストールし、PATH環境変数を通した。

brew install bison m4 re2c libiconv sqlite3 libxml2
export PATH="/opt/homebrew/opt/bison/bin:/opt/homebrew/opt/m4/bin:/opt/homebrew/opt/libiconv/bin:$PATH"

私の環境では後述する ./configure スクリプトでlibiconvを要求された。

configure: error: Please specify the install prefix of iconv with --with-iconv=<DIR>

brew info libiconvでPATHを調べることができる。

% brew info libiconv

(中略)

For compilers to find libiconv you may need to set:
  export LDFLAGS="-L/opt/homebrew/opt/libiconv/lib"
  export CPPFLAGS="-I/opt/homebrew/opt/libiconv/include"

このようなパスが表示されるので、この二つのパスの共通部分の /opt/homebrew/opt/libiconv を指定してやればいい。

私の環境での最終的なconfigureの起動オプションはこうなった。

./configure --with-iconv=/opt/homebrew/opt/libiconv
にゃんだーすわんにゃんだーすわん

PHPをコンパイルしてみよう

README の通りに環境を用意できたら、PHPをコンパイルしてみよう。

説明通りに ./buildconf スクリプトを実行すると ./configure というスクリプトが生成される。

./configure を実行すると、PHPのコンパイルに必要なツールが揃っているかどうかをチェックしてくれる。

私の環境ではiconvとm4が足りないと言われたので追加でインストールした。

configureに成功すると以下のようなメッセージが出る。

これが確認できればコンパイルする準備が整ったということなので、折角コンパイルしてみよう。

以下のコマンドを実行してしばらく待つだけでコンパイルが開始するので、茶でもすすって待とう。

make -j$(nproc)

-j は並列数を指定するオプションで、 nproc コマンドは実行しているコンピュータのプロセッサー数(CPUのコア数)を表示してくれる。

macOSで nproc コマンドがないと怒られたときはこうする。

make -j $(nproc 2>/dev/null || sysctl -n hw.logicalcpu)

コンパイルに成功したら、PHPの実行ファイルは ./sapi/cli/php にできてるはず。実行してみよう。

% ./sapi/cli/php --version
PHP 8.4.0-dev (cli) (built: Mar 27 2024 03:10:37) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.4.0-dev, Copyright (c) Zend Technologies

これが通ったら大成功。

にゃんだーすわんにゃんだーすわん

あなただけのPHPを作ろう

せっかくなので、PHPを魔改造してしまおう。

PHPのバージョン番号は main/php_version.h というファイルで以下のように定義されている。

/* automatically generated by configure */
/* edit configure.ac to change version number */
#define PHP_MAJOR_VERSION 8
#define PHP_MINOR_VERSION 4
#define PHP_RELEASE_VERSION 0
#define PHP_EXTRA_VERSION "-dev"
#define PHP_VERSION "8.4.0-dev"
#define PHP_VERSION_ID 80400

#define PHP_VERSION "8.4.0-dev" のところを 1.2.3 でも 6.0.0 でも 9.9.9 でもなんでもいいので、好きな数字に変えてみよう。

終わったらまた make -j$(nproc) でコンパイルしなおす。それが終わったら ./sapi/cli/php --version を実行してみよう。

PHP 9.9.9-dev (cli) (built: Mar 27 2024 04:25:20) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.4.0-dev, Copyright (c) Zend Technologies

これでこの瞬間、PHPはあなたのものになった。