libgccjit は GCC に含まれるモジュールで, Gcc Emacs によって使用される.
そのコンパイル手順を整理したので, メモとしてまとめておく.
(1) OpenBSD の ports で提供される GCC 11.2.0 用のパッチを利用するため, GCC 11.2.0 をダウンロードする.
ソースコードは, \$HOME/src/gcc-11.2.0 以下に展開した.
(2) 作業用のディレクトリーを作成する. ここでは \$HOME/src/obj/obj-jit とする.
$ mkdir -p ~/src/obj/obj-jit
(3) ports によって提供されている GCC 11.2.0 用のパッチをコピーする.
$ cp -r /usr/ports/lang/gcc/11/patches ~/src/obj/obj-jit
(4) libgccjit 用のパッチファイル patch-gcc_jit_libgccjit_c:
Index: gcc/jit/libgccjit.c
--- gcc/jit/libgccjit.c.orig
+++ gcc/jit/libgccjit.c
@@ -3474,3 +3474,9 @@
RETURN_IF_FAIL (asm_stmts, ctxt, NULL, "NULL asm_stmts");
ctxt->add_top_level_asm (loc, asm_stmts);
}
+
+const char *
+fname_as_string(int pretty_p __attribute__((__unused__)))
+{
+ return NULL;
+}
を作成して \$HOME/src/obj/obj-jit/patches 以下に置く.
(5) パッチを適用する.
$ cd ~/src/gcc-11.2.0
$ for i in ~/src/obj/obj-jit/patches/*; do \
patch -p0 < $i \
done
(6) GCC をコンパイルする.
$ cd ~/src/obj/obj-jit
$ ~/src/gcc-11.2.0/configure \
'CFLAGS=-I/usr/include -I/usr/local/include' \
'LDFLAGS=-L/usr/lib -L/usr/local/lib' \
--with-as=/usr/local/bin/gas \
--verbose \
--program-transform-name=s,^,e, \
--disable-nls \
--with-system-zlib \
--disable-libmudflap \
--disable-libgomp \
--disable-libssp \
--disable-tls \
--with-gnu-ld \
--with-gnu-as \
--enable-threads=posix \
--enable-wchar_t \
--with-gmp=/usr/local \
--enable-languages=c++,jit \
--enable-host-shared \
--disable-libstdcxx-pch \
--enable-default-ssp \
--enable-default-pie \
--without-isl \
--disable-bootstrap
$ gmake
ここで configure スクリプトに与えているオプションは, ports の GCC の Makefile: /usr/ports/lang/gcc/11/Makefile を参考にしたものである.
--enable-languages オプションの引数に jit を与えて libgccjit の作成を指定し, そのために必要な --enable-host-shared オプションも指定する.
また, 途中で発生するコンパイルエラーを回避するために --disable-bootstrap オプションを追加している.
これにより, 共有ライブラリー libgccjit.so.0.0.1 が作成される.
ただしその後, 本体の gcc のコンパイルの途中で失敗する.
configure: error: Link tests are not allowed after GCC_NO_EXECUTABLES.
この原因は掴めていないので今後調べる.
(7) libgccjit をインストールする. インストール先は /usr/local 以下でもよいが, 今回は \$HOME/opt 以下とする.
$ install -c -m 644 ~/src/gcc-11.2.0/gcc/jit/libgccjit.h ~/opt/include
$ install -c -m 755 ~/src/obj/obj-jit/gcc/libgccjit.so.0.0.1 ~/opt/lib
$ cd ~/opt/lib
$ ln -s libgccjit.so.0.0.1 libgccjit.so.0
$ ln -s libgccjit.so.0 libgccjit.so
この手順では libgccjit が標準的でない場所にインストールされている.
したがって, この libgccjit を使ってコンパイルされたプログラム (たとえば Gcc Emacs) を実行する際には環境変数 LD_LIBRARY_PATH を指定する.
$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:~/opt/lib