RSS2.0

Linux 環境で LWJGL ライブラリをビルドしてみる

2013 年 4 月 21 日に LWJGL 2.9.0 がリリースされました。maven リポジトリにも ver 2.9.0 がアップされているので、maven を使う場合には pom.xml のバージョン番号を更新するだけで新しい jar ファイルを入手することができます。

今回はそこからさらに一歩踏み込んで、自分で LWJGL をビルドしてみたいと思います。環境はいつも通り Linux (Fedora17) です。LWJGL のビルドでは、jar ファイルの他に JNI として呼び出されるネイティブライブラリも生成されます。これはビルド環境用のライブラリのみビルドされるので、Windows 用のネイティブライブラリを作りたい場合は Windows でビルドしなければなりません。
また、LWJGL はビルドプロセス中で Annotation Processing Tool を使ってソースコードを自動生成しているため、リポジトリ内に必要なすべてのソースコードがコミットされている訳ではありません。もしリポジトリからソースコードを持ってきて自分で LWJGL の開発環境を作るのであれば、一度ビルドしてから eclipse などの IDE に読み込ませてください。

ビルドに必要なものをインストールする

LWJGL のビルドには、java の他にもいくつか必要なツールがあります。まずはこれらを用意してください。

git

git は LWJGL の git リポジトリからソースコードを取ってくるのに必要になります。yum でインストールできます。
# yum install -y git
LWJGL のリポジトリも時代の流れを受けてか github に移行したようです。
ちなみに source forge の旧 svn リポジトリも現段階では残ってはいますが、2013 年 1 月頃からあまりコミット(git からのマージなど)されなくなっているので、素直に git リポジトリを見に行った方が良さそうです。

ant

ビルドスクリプトを動かすためのツールです。LWJGL では JNI で呼び出すネイティブライブラリのビルドも含まれるため、maven ではなくこちらを採用しているようです。
ant も yum コマンドでインストールできます。
# yum install -y ant
ただ、私は一緒に openjdk もインストールされるのが嫌(jdk は oracle のものを使っています)なので、公式ページからアーカイブを取ってきて、自分で PATH を通しました。

各種ヘッダーファイル

LWJGL のネイティブライブラリをビルドするのに、ヘッダーファイル等が必要になります。
Fedora 17 にはデフォルトインストールではこれらが含まれないようで、C 言語のコンパイルエラーを解決するのがなかなか面倒でした。以下のパッケージをインストールすることでビルドできるので、まとめて入れておいてください。
# yum install -y \
	libX11-devel \
	libXt-devel \
	libXcursor-devel \
	libXxf86vm-devel \
	libXrandr-devel
ネイティブライブラリのビルドエラー時のメッセージはトラブルシューティングのために末尾に載せておきます。

LWJGL をビルドする

ビルド手順はとてもシンプルです。
LWJGL のリポジトリを git clone してソースコードを取ってきたら、あとは ant を叩くだけです。
$ git clone https://github.com/LWJGL/lwjgl.git
$ cd lwjgl
$ ant

ビルドが成功すると、libs 下に成果物が生成されます。libs ディレクトリ内にはあらかじめビルドされた jar ファイルが配置されていますが、ビルド後にはタイムスタンプが更新されているはずです。
$ ll libs/
合計 2024
-rwxrwxr-x 1 momokan momokan   4189  6月 24 21:35 AppleJavaExtensions.jar
-rw-rw-r-- 1 momokan momokan 321450  6月 24 21:35 asm-debug-all.jar
-rw-rw-r-- 1 momokan momokan 214859  6月 24 21:35 jinput.jar
drwxrwxr-x 3 momokan momokan   4096  6月 24 22:19 linux
-rw-rw-r-- 1 momokan momokan 996627  6月 24 22:24 lwjgl.jar
-rw-rw-r-- 1 momokan momokan 283392  6月 24 22:24 lwjgl_test.jar
-rw-rw-r-- 1 momokan momokan 173360  6月 24 22:24 lwjgl_util.jar
-rw-rw-r-- 1 momokan momokan  36200  6月 24 22:24 lwjgl_util_applet.jar
-rw-rw-r-- 1 momokan momokan   5762  6月 24 21:35 lzma.jar
drwxrwxr-x 2 momokan momokan   4096  6月 24 21:35 macosx
drwxrwxr-x 2 momokan momokan   4096  6月 24 21:35 solaris
drwxrwxr-x 2 momokan momokan   4096  6月 24 21:35 windows
linux, windows, macosx などのディレクトリにはネイティブライブラリが入っています。
ネイティブライブラリはビルドする環境用のものだけが作られるので、64bit Linux 環境での成果物は libs/linux/liblwjgl64.so になります。

ビルドをやり直したい場合には、ant の clean ターゲットを実行すれば、ビルド途中のものを綺麗に削除できます。
$ ant clean

LWJGL ネイティブライブラリのビルドエラー集

ネイティブライブラリのビルドに必要なヘッダーファイルがないなどでコンパイルエラーとなる場合、自分で必要なヘッダーファイルを用意する必要があります。
私の環境で発生したエラーのメッセージと、エラーを解決するのに必要なパッケージをトラブるシューティングのため載せておきます。

ちなみに、あれこれビルドを試していたのは 32 bit Fedora 17 だったので、ディレクトリ名等は 32 bit 用のものになっています。

X11/Xlib.h

エラーメッセージ
compile32:
	[mkdir] Created dir: /home/momokan/workspace/lwjgl/bin/lwjgl/x32
	[apply] In file included from /home/momokan/workspace/lwjgl/src/native/common/org_lwjgl_opengl_AWTSurfaceLock.c:45:0:
	[apply] /usr/java/jdk1.6.0_35/jre/../include/linux/jawt_md.h:11:22: 致命的エラー: X11/Xlib.h: そのようなファイルやディレクトリはありません
	[apply] コンパイルを停止しました。
必要なパッケージ: libX11-devel

X11/Intrinsic.h

エラーメッセージ
compile32:
	[mkdir] Created dir: /home/momokan/workspace/lwjgl/bin/lwjgl/x32
	[apply] In file included from /home/momokan/workspace/lwjgl/src/native/common/org_lwjgl_opengl_AWTSurfaceLock.c:45:0:
	[apply] /usr/java/jdk1.6.0_35/jre/../include/linux/jawt_md.h:13:27: 致命的エラー: X11/Intrinsic.h: そのようなファイルやディレクトリはありません
	[apply] コンパイルを停止しました。
必要なパッケージ: libXt-devel

X11/Xcursor/Xcursor.h

エラーメッセージ
compile32:
	[apply] /home/momokan/workspace/lwjgl/src/native/generated/opencl/org_lwjgl_opencl_CL12.c: 関数 ‘Java_org_lwjgl_opencl_CL12_nclCompileProgramMulti’ 内:
	[apply] /home/momokan/workspace/lwjgl/src/native/generated/opencl/org_lwjgl_opencl_CL12.c:87:3: 警告: 1 番目の ‘strlen’ の引数を渡すときのポインタの先の符号が異なります [-Wpointer-sign]
	[apply] In file included from /home/momokan/workspace/lwjgl/src/native/common/common_tools.h:44:0,
	[apply]				  from /home/momokan/workspace/lwjgl/src/native/common/extcl.h:44,
	[apply]				  from /home/momokan/workspace/lwjgl/src/native/generated/opencl/org_lwjgl_opencl_CL12.c:4:
	[apply] /usr/include/string.h:399:15: 備考: expected ‘const char *’ but argument is of type ‘cl_char *’
	[apply] /home/momokan/workspace/lwjgl/src/native/linux/org_lwjgl_input_Cursor.c:44:33: 致命的エラー: X11/Xcursor/Xcursor.h: そのようなファイルやディレクトリはありません
	[apply] コンパイルを停止しました。
必要なパッケージ: libXcursor-devel

X11/extensions/xf86vmode.h

エラーメッセージ
compile32:
	[apply] /home/momokan/workspace/lwjgl/src/native/generated/opencl/org_lwjgl_opencl_CL12.c: 関数 ‘Java_org_lwjgl_opencl_CL12_nclCompileProgramMulti’ 内:
	[apply] /home/momokan/workspace/lwjgl/src/native/generated/opencl/org_lwjgl_opencl_CL12.c:87:3: 警告: 1 番目の ‘strlen’ の引数を渡すときのポインタの先の符号が異なります [-Wpointer-sign]
	[apply] In file included from /home/momokan/workspace/lwjgl/src/native/common/common_tools.h:44:0,
	[apply]				  from /home/momokan/workspace/lwjgl/src/native/common/extcl.h:44,
	[apply]				  from /home/momokan/workspace/lwjgl/src/native/generated/opencl/org_lwjgl_opencl_CL12.c:4:
	[apply] /usr/include/string.h:399:15: 備考: expected ‘const char *’ but argument is of type ‘cl_char *’
	[apply] /home/momokan/workspace/lwjgl/src/native/linux/org_lwjgl_opengl_LinuxKeyboard.c: 関数 ‘Java_org_lwjgl_opengl_LinuxKeyboard_keycodeToKeySym’ 内:
	[apply] /home/momokan/workspace/lwjgl/src/native/linux/org_lwjgl_opengl_LinuxKeyboard.c:81:2: 警告: ‘XKeycodeToKeysym’ は廃止されました (宣言位置 /usr/include/X11/Xlib.h:1695) [-Wdeprecated-declarations]
	[apply] /home/momokan/workspace/lwjgl/src/native/linux/opengl/display.c:44:38: 致命的エラー: X11/extensions/xf86vmode.h: そのようなファイルやディレクトリはありません
	[apply] コンパイルを停止しました。
必要なパッケージ: libXxf86vm-devel

X11/extensions/Xrandr.h

エラーメッセージ
compile32:
	[apply] /home/momokan/workspace/lwjgl/src/native/generated/opencl/org_lwjgl_opencl_CL12.c: 関数 ‘Java_org_lwjgl_opencl_CL12_nclCompileProgramMulti’ 内:
	[apply] /home/momokan/workspace/lwjgl/src/native/generated/opencl/org_lwjgl_opencl_CL12.c:87:3: 警告: 1 番目の ‘strlen’ の引数を渡すときのポインタの先の符号が異なります [-Wpointer-sign]
	[apply] In file included from /home/momokan/workspace/lwjgl/src/native/common/common_tools.h:44:0,
	[apply]				  from /home/momokan/workspace/lwjgl/src/native/common/extcl.h:44,
	[apply]				  from /home/momokan/workspace/lwjgl/src/native/generated/opencl/org_lwjgl_opencl_CL12.c:4:
	[apply] /usr/include/string.h:399:15: 備考: expected ‘const char *’ but argument is of type ‘cl_char *’
	[apply] /home/momokan/workspace/lwjgl/src/native/linux/org_lwjgl_opengl_LinuxKeyboard.c: 関数 ‘Java_org_lwjgl_opengl_LinuxKeyboard_keycodeToKeySym’ 内:
	[apply] /home/momokan/workspace/lwjgl/src/native/linux/org_lwjgl_opengl_LinuxKeyboard.c:81:2: 警告: ‘XKeycodeToKeysym’ は廃止されました (宣言位置 /usr/include/X11/Xlib.h:1695) [-Wdeprecated-declarations]
	[apply] /home/momokan/workspace/lwjgl/src/native/linux/opengl/display.c:45:35: 致命的エラー: X11/extensions/Xrandr.h: そのようなファイルやディレクトリはありません
	[apply] コンパイルを停止しました。
必要なパッケージ: libXrandr-devel

ヘッダーファイルが含まれるパッケージの探し方

yum コマンドの provides オプションを使うと、特定のファイルがどのパッケージに含まれているかを検索することができます。
例えば X11/extensions/Xrandr.h を探したい場合は以下のようにして検索します。
# yum provides '*/X11/extensions/Xrandr.h'
読み込んだプラグイン:langpacks, presto, refresh-packagekit
rpmfusion-free-updates/filelists_db										  | 246 kB	 00:00	 
rpmfusion-nonfree-updates/filelists_db									   | 285 kB	 00:01	 
updates/filelists_db														 |  15 MB	 00:04	 
libXrandr-devel-1.3.1-3.fc17.i686 : X.Org X11 libXrandr development package
リポジトリー		: fedora
一致		  :
ファイル名	: /usr/include/X11/extensions/Xrandr.h



libXrandr-devel-1.3.1-3.fc17.x86_64 : X.Org X11 libXrandr development package
リポジトリー		: fedora
一致		  :
ファイル名	: /usr/include/X11/extensions/Xrandr.h



libXrandr-devel-1.3.1-3.fc17.x86_64 : X.Org X11 libXrandr development package
リポジトリー		: @fedora
一致		  :
ファイル名	: /usr/include/X11/extensions/Xrandr.h
上にあげたエラーメッセージ以外のコンパイルエラーが発生した場合には、参考にしてみてください。

Maven 用の jar ファイルとしてビルドする

ここまでで LWJGL 自体のビルドはできますが、他の maven プロジェクトでビルドしたライブラリを使うには、更に Maven 用の jar ファイルとしてビルドする必要があります。LWJGL のソースコードには maven で使える jar ファイルを作るためのビルドスクリプトが用意されているので、これを使うことで自分でビルドしたオレオレ LWJGL を、ローカル環境の maven リポジトリにインストールすることができます。
ここからは 2014/02/01 の追記になります。
ビルドする LWJGL は 2.9.2 開発用、ビルド環境は Fedora 20 です。
とはいえ、2.9.0 の頃とそれほどバージョン差による影響はありません。

Maven ant tasks をインストールする

このビルドスクリプトは内部で ant から maven を呼び出して使用する箇所があるため、Maven ant tasks をビルド環境にインストールしておく必要があります。現時点での最新版は maven-ant-tasks-2.1.3.jar です。これをダウンロードしたら、~/.ant/lib/ 下に配置し、ant からタスクとして呼び出せるようにしておきます。
$ mkdir -p ~/.ant/lib/
$ cd ~/.ant/lib/
$ wget http://www.apache.org/dyn/closer.cgi/maven/ant-tasks/2.1.3/binaries/maven-ant-tasks-2.1.3.jar

ant が Maven タスクを認識できないと、出来上がった jar ファイルをローカルリポジトリにインストールする段階で、以下のエラーが発生します。
$ ant install
Buildfile: /home/momokan/workspace2/lwjgl/temp/maven/build.xml

install:

execute-install:

BUILD FAILED
/home/momokan/workspace2/lwjgl/temp/maven/build.xml:7: The following error occurred while executing this line:
/home/momokan/workspace2/lwjgl/temp/maven/build.xml:105: Problem: failed to create task or type antlib:org.apache.maven.artifact.ant:mvn
Cause: The name is undefined.
Action: Check the spelling.
Action: Check that any custom tasks/types have been declared.
Action: Check that any <presetdef>/<macrodef> declarations have taken place.
No types or tasks have been defined in this namespace yet

This appears to be an antlib declaration. 
Action: Check that the implementing library exists in one of:
        -/usr/java/ant/lib
        -/home/momokan/.ant/lib
        -a directory added on the command line with the -lib argument


Total time: 0 seconds

ビルドするライブラリのバージョンを変更する

ビルドするオレオレ LWJGL ライブラリのバージョンを任意のバージョンに指定しておきます。本家で公開されているバージョンと同じ値にしてしまうと、同じバージョンの jar のはずがローカル環境だけ動作が異なるというような混乱を引き起こしかねないので、必ず違うバージョンを設定しておきましょう。
ビルドするライブラリのバージョンは、platform_build/build-definitions.xml 内の lwjgl.version というプロパティの値として設定します。
  1 <project name="definitions">
  2     <!-- ================================================================== -->
  3     <!-- Global properties for build                                                                                -->
  4     <!-- ================================================================== -->
...
 15     <property name="lwjgl.version"              value="2.9.1.momokan" />
...
ここでは、2.9.1.momokan としておきます。

Maven 用にビルドしてローカルリポジトリにインストールする

まず、オレオレの LWJGL ライブラリを Maven 用の jar ファイルとしてビルドするには、プロジェクトのトップディレクトリで ant の maven-full ターゲットを実行します。
$ ant maven-full -Doverridejinput=true
-Doverridejinput=true を指定しない場合、以下のエラーが発生します。
...
-checkjinputversion:
   [script] JINPUT Version: 2.0.0-b01 - DeclaredVersion: 2.0.5
   [script] JINPUT Version don't match

BUILD FAILED
/home/momokan/workspace2/lwjgl/platform_build/build-maven.xml:83: The following error occurred while executing this line:
/home/momokan/workspace2/lwjgl/platform_build/build-maven.xml:73: Jinput version in project (2.0.0-b01) is different from the declared jinput version for maven (2.0.5) add -Doverridejinput=true as a command line option to avoid this check

Total time: 29 seconds
エラーメッセージを読む限り、これは JInput のバージョンチェックに関するエラーのようです。LWJGL 自体のソースコードが開発中のもの(master ブランチのもの)なので、それの影響で出ているのかもしれません。

次にビルドした Maven 用の jar ファイルを、maven のローカルリポジトリにインストールします。
$ cd temp/maven/
$ ant install
今度はプロジェクトのトップではなく、temp/maven ディレクトリで実行してください。

maven のローカルリポジトリを覗いてみると、オレオレ LWJGL ライブラリがインストールされているのがわかります。
$ ls -1 ~/.m2/repository/org/lwjgl/lwjgl/lwjgl/
2.9.1
2.9.1.momokan
maven-metadata-local.xml
$ ls -1 ~/.m2/repository/org/lwjgl/lwjgl/lwjgl/2.9.1.momokan/
lwjgl-2.9.1.momokan-javadoc.jar
lwjgl-2.9.1.momokan-sources.jar
lwjgl-2.9.1.momokan.jar
lwjgl-2.9.1.momokan.pom

あとはいつも通り、LWJGL を使う側のプロジェクト(ゲーム本体のほう)でビルドしたバージョンの LWJGL を使うように設定するだけです。
pom.xml の lwjgl.jar のバージョンを修正し、mvn clean eclipse:eclipse してみてください。

  LWJGLLinux  コメント (0)  2013/06/24 23:49:28


公開範囲:
プロフィール HN: ももかん
ゲーム作ったり雑談書いたり・・・していた時期が私にもありました。
カレンダー
<<2019, 9>>
1234567
891011121314
15161718192021
22232425262728
293012345