大規模ソフトウェアを手探るをやる (1: gnuplot 5.0.1のビルドまで)

本記事は以前はてなブログに投稿していた記事の内容を加筆修正して移行したものです。

大規模ソフトウェアを手探るとは?

東京大学工学部電子情報学科の学生実験の資料です。 本資料では、gnuplotのコードをいじることを通してある程度大きなソフトウェアソースコードを探るというもので、 数年前に話題になっていたのを思い出したので、取り組んでみました。

gnuplot 5.0.1 をビルドする

とりあえずビルドしてみるが…

まずSOURCEFORGE: gnuplot Filesから5.0.1のソースを取得して解凍します。

1
2
3
wget https://sourceforge.net/projects/gnuplot/files/gnuplot/5.0.1/gnuplot-5.0.1.tar.gz
tar -xzvf gnuplot-5.0.1.tar.gz
cd gnuplot-5.0.1

そのソースツリーの中にbuildディレクトリを作成してビルドを実行するためにconfigureを実行してみます。 ここで、デバッグ実行をしてソースコードを探ることが目的なので、 ビルドオプションとして最適化なしかつデバッグシンボルを保持する-O0 -gを渡しています。

1
2
3
mkdir build
cd build
CFLAGS="-O0 -g" ../configure --prefix=$HOME/gnuplot_5.0.1_install

しかし、libcerfが見つからずにコケてしまいました。そこで以下を実行してlibcerfをインストールしました。

1
sudo pacman -S libcerf

今度は、configureの実行に成功しました。 続いてmakeでビルドをしようとすると、以下のメッセージが出てビルドに失敗してしまいました。 luaL_checkint()という関数周りが原因のようです。

1
2
3
4
5
6
7
In file included from ../../src/term.h:414,
                 from ../../src/term.c:1194:
../../term/lua.trm: In function ‘LUA_GP_int_error’:
../../term/lua.trm:254:15: error: implicit declaration of function ‘luaL_checkint’; did you mean ‘luaL_checkany’? [-Wimplicit-function-declaration]
  254 |       t_num = luaL_checkint(L, 1);
      |               ^~~~~~~~~~~~~
      |               luaL_checkany

そこでソースツリーのINSTALLを読んでみると、gnuplot-5.0.1ではLua5.2系を要求していました。

Lua5.2.4をソースからビルドする

そこで、 自分の環境にinstallされているLuaのバージョンを調べてみると5.4.7でした。 そこで、Lua5.2.4をソースからビルドしてそのヘッダ、ライブラリを使ってgnuplot-5.0.1をビルドすることを考えました。

Lua5.2.4のビルドは以下のようにソースコードを取得して行います。

1
2
3
4
5
wget https://sourceforge.net/projects/luabinaries/files/5.2.4/Docs%20and%20Sources/lua-5.2.4_Sources.tar.gz
tar -xzvf lua-5.2.4_Sources.tar.gz
cd lua52
make linux -j11
make INSTALL_TOP=$HOME/Learn/search_large_scale_software/lua5.2.4/ install

Lua5.2.4のビルドは無事成功しました。

気を取り直してgnuplot-5.0.1をビルドする

まず、$HOME上にinstallしたlua5.2.4gnuplot-5.0.1に教えてあげるため以下ように環境変数設定用スクリプトを書いて

  • set_var.sh
1
2
3
4
5
6
PROJECT_DIR="$HOME/Learn/search_large_scale_software"

export LUA_CFLAGS="-I$PROJECT_DIR/lua5.2.4/include"
export LUA_LIBS="-L$PROJECT_DIR/lua5.2.4/lib -llua"
export PATH="$PROJECT_DIR/lua5.2.4/bin:$PATH"
export LD_LIBRARY_PATH="$PROJECT_DIR/lua5.2.4/lib:$LD_LIBRARY_PATH"

sourceで実行しました。

1
source set_var.sh

以上で準備が完了したので、ビルドを実行します。

1
2
3
4
5
6
cd gnuplot-5.0.1
mkdir build
cd build
CFLAGS="-O0 -g" ../configure --prefix=$HOME/gnuplot_5.0.1_install
make -j11 # OK!
make install

無事ビルドに成功しました。

CC BY
Hugo で構築されています。
テーマ StackJimmy によって設計されています。