Inkscapeを手探る Inkscapeの環境開発(Ubuntu編)

この記事は、東京大学工学部電子情報工学科・電気電子工学科の3年後期実験の一つである「大規模ソフトウェアを手探る」のレポートとして、 作成したものです。 この記事では、UbuntuでのInkscapeの環境開発について説明したものになります。実験で取り組んだ内容をまとめた記事は以下のリンクから参照できます。

nineuts.hatenablog.com

ビルドの方法

具体的なビルドの手順を示していきます。Inkscapeソースコードは以下のレポジトリにあります。

gitlab.com

実際にビルドをした際には、InkscapeのHPにあるGetting Startedや、レポジトリにあるCONTRIBUTING.mdを参考に行いました。ただ、このサイトだけ頼ってビルドするときに、手順が分かりづらかったり、うまくビルドできなかったので、以下に示した手順を参考にしてビルドするとうまくいくはずです。

0. ninja をインストールする

今回は ninja を使ってビルドを行ったので、ninja をインストールしていない人はインストールを行ってください。

$ sudo apt-get install ninja-build ccache

1.クローンをする

まず、レポジトリからソースコードをクローンします。この時、サブモジュールも同時にクローンしないとビルドの際にエラーが出てしまいますので、--recurse-submodulesをつけてクローンしてください。

$ git clone --recurse-submodules https://gitlab.com/inkscape/inkscape.git

--recurse-submodulesをつけ忘れたときは以下のコマンドを実行することで、サブモジュールをインストールすることができます。

$ git submodule update --init --recursive

2.必要な依存をインストールする

このままでは依存関係が足りなくビルドが実行できないので、以下のコマンドで必要な依存をインストールします。

$ wget -v https://gitlab.com/inkscape/inkscape-ci-docker/-/raw/master/install_dependencies.sh -O install_dependencies.sh
$bash install_dependencies.sh --recommended

3. build ディレクトリを用意する

次に、Inkscape の共有フォルダへのシンボリックリンクを持つビルドディレクトリを用意し、プロファイルディレクトリを追加し、bin フォルダを設定します。

$ ln -s $PWD/share ./share/inkscape
$ mkdir -p build/conf
$ cd build
$ export INKSCAPE_PROFILE_DIR=$PWD/conf
$ PATH=$PWD/bin/:$PATH

4.CMakeでコンパイルする

ビルドをするためにCMakeでコンパイルします。手順通りに進めば build ディレクトリにいるはずですが、もしいなかったら build ディレクトリに移動してCMakeを実行してください。

$ cmake -DCMAKE_INSTALL_PREFIX:PATH=$PWD/../ -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache -DCMAKE_BUILD_TYPE=Debug -G Ninja ..

5. ninja でビルドする

最後に、ninja でビルドします。ビルドには時間がかかるので高速化するために以下のコマンドを実行してください。 -jオプションは同時に実行するタスクの数を指定するので、以下のコマンドでは8つのタスクを同時に実行しています。

$ ninja -j 8

ビルド完了後には、 build ディレクトリ内の bin ディレクトリに Inkscape が生成されているので、これを実行することで、Inkscape を起動することができます。

$ ./bin/inkscape

ビルドがうまくいかなかったときの原因と対処法

最後に、実験でビルドを行ったときに、実際に起こったエラーの原因と対処法についてまとめました。 以下の対処法だけですべてのエラーに対処できるとは限りませんが、だいたいは以下の対処法で解消できると思います。

1. 依存関係不足

CMake を実行したときに以下のエラーが出たときは依存関係が不足している可能性が高いです。

$ cmake -DCMAKE_INSTALL_PREFIX:PATH=$PWD/../ -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache -DCMAKE_BUILD_TYPE=Debug -G Ninja ..
------------------------------
Building Makefile for Inkscape
------------------------------

... 中略 ..

CMake Error at /usr/share/cmake-3.22/Modules/FindPkgConfig.cmake:603 (message):
  A required package was not found
Call Stack (most recent call first):
  /usr/share/cmake-3.22/Modules/FindPkgConfig.cmake:825 (_pkg_check_modules_internal)
  CMakeScripts/DefineDependsandFlags.cmake:122 (pkg_check_modules)
  CMakeLists.txt:147 (include)


-- Configuring incomplete, errors occurred!
... 略 ..

対処法としては2. 必要な依存をインストールする に書かれているコマンドを実行すればよいです。

2. git の submodules の設定エラー

CMakeを実行したときに以下のように ieeefp.h ファイルが見つからない(人によって別のファイルの可能性もある)などのエラーが起こったときは git の submodules の設定エラーが起こっていると考えられます。

$ cmake -DCMAKE_INSTALL_PREFIX:PATH=$PWD/../ -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache -DCMAKE_BUILD_TYPE=Debug -G Ninja ..
------------------------------
Building Makefile for Inkscape
------------------------------

... 中略 ..

-- Creating build files in: 
/build ディレトリへの絶対パス
-- Looking for include file ieeefp.h
-- Looking for include file ieeefp.h - not found

... 中略 ..

CMake Error at src/3rdparty/CMakeLists.txt:2 (add_subdirectory):
  The source directory

    /inkscapeのソースコードがあるディレクトリの絶対パス/src/3rdparty/libcroco

  does not contain a CMakeLists.txt file.

... 中略 ..

------------------------------------------------------------------------
-- Configuring incomplete, errors occurred!
... 略 ..

対処法としては1. クローンをするに書かれている--recurse-submodulesをつけ忘れたときのコマンド

$ git submodule update --init --recursive

を実行すればよいです。

3. build ディレクトリで CMake を実行していない

CMake を実行したときに以下のエラーが出たときは build ディレクトリに居ない可能性が高いです。 build ディレクトリに移動してCMake を実行しましょう。

$ cmake -DCMAKE_INSTALL_PREFIX:PATH=$PWD/../ -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache -DCMAKE_BUILD_TYPE=Debug -G Ninja ..
CMake Error: The source directory "/inkscapeのソースコードがあるディレクトリの絶対パス" does not appear to contain CMakeLists.txt.
Specify --help for usage, or press the help button on the CMake GUI.

4. g++ のバージョンが古い

ビルドを実行したときに concepts というヘッダがないというエラーが出たときは g++ のバージョンが古い可能性が高いです。

$ ninja
[1/609] Generating inkscape-version.cpp
revision is c6607c2817, 2023-10-13
[2/609] Building CXX object

... 中略 ..

src/CMakeFiles/inkscape_base.dir/extension/internal/vsd-input.cpp.o.d -o src/CMakeFiles/inkscape_base.dir/extension/internal/vsd-input.cpp.o -c ../src/extension/internal/vsd-input.cpp
In file included from ../src/extension/internal/vsd-input.cpp:39:
../src/ui/controller.h:16:10: fatal error: concepts: そのようなファイルやディレクトリはありません
   16 | #include <concepts>
    |       ^~~~~~~~~~
compilation terminated.

... 中略 ..

ninja: build stopped: subcommand failed. 

Inkscape をビルドするためには、g++ のバージョンが10以上必要なため、g++のバージョンを変える操作が必要になります。そこでUbuntuでgccのバージョンを変更するというサイトを参考にしてg++ のバージョンを変更しました。

students-tech.blog

今回 g++ のバージョンを変更するためにupdate-alternativesコマンドを使用しました。以下に変更手順を示します。 まず、バージョンごとに実行ファイルを登録します。新しいバージョン(今回は10)と今まで使っていたバージョン(今回は9)を登録します。現在の g++ のバージョンが分からないときはg++ --versionで確認できるので、コマンドを実行して確認をしてください。

$ sudo update-alternatives --install /usr/bin/g++ gcc /usr/bin/g++-10 10

$ sudo update-alternatives --install /usr/bin/g++ gcc /usr/bin/g++-9 9

これは、/usr/bin/g++ のリンクの候補として /usr/bin/g++-10 を優先度10で登録する、/usr/bin/g++-9 を優先度9で登録するということをしています。

次にバージョンの変更をします。以下のコマンドを実行して、選択肢にある /usr/bin/g++-10 を選んでください。 自動モードと手動モードで2つの /usr/bin/g++-10 が出た場合はどちらを選んでも問題ないです。

$ sudo update-alternatives --config g++
alternative g++ (/usr/bin/g++ を提供) には 2 個の選択肢があります。

  選択肢 パス          優先度  状態
------------------------------------------------------------
* 0         /usr/bin/g++-10   10        自動モード
  1         /usr/bin/g++-10   10        手動モード
  2         /usr/bin/g++-9  9       手動モード

現在の選択 [*] を保持するには <Enter>、さもなければ選択肢の番号のキーを押してください: 0

最後にg++ --versionを実行して g++ のバージョンが10以上になっていれば成功です。バージョンが変更できたら CMake からビルドをやり直してください。

Inkscapeは大部分がC++で書かれているファイルで構成されていますが C言語で書かれているファイルもあるので、念のために gcc のバージョンも10以上にしてください。 gcc のバージョン変更の方法は g++ の方法で、g++ の部分を gcc に書き換えればよいです。

感想

Inkscapeを実際にビルドをしてみた感想としては、サイトに書かれている手順そのまま従ってもなかなかうまくいかなかったので、実際にコードを読むことよりも時間がかかってしまう作業である思いました。実際Ubuntuのビルドのエラーの対処は実験の1日分ほど使ってしまい。macOSに関しては、実験終了まで間に合いませんでした。なので、この実験を通して思ったことは、ソフトウェアをデバックしながら手探るのも重要でしたが、同じくらいにソースコードを上手にビルドができるようにすることも大切であるということです。