PHPにコントリビュートするための周辺知識
暇なときにまとめていく
PHPのソースコード
PHPはC言語で書かれている。ソースコードは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
- re2c — re2c 3.0 documentation
- 字句解析器(スキャナーともいう)を生成してくれるツール
-
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はあなたのものになった。
Hello関数を定義してみよう
(続く)