Inkscapeを手探る Inkscapeの環境開発(Ubuntu編)
この記事は、東京大学工学部電子情報工学科・電気電子工学科の3年後期実験の一つである「大規模ソフトウェアを手探る」のレポートとして、 作成したものです。 この記事では、UbuntuでのInkscapeの環境開発について説明したものになります。実験で取り組んだ内容をまとめた記事は以下のリンクから参照できます。
ビルドの方法
具体的なビルドの手順を示していきます。Inkscapeのソースコードは以下のレポジトリにあります。
実際にビルドをした際には、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++ のバージョンを変更しました。
今回 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に関しては、実験終了まで間に合いませんでした。なので、この実験を通して思ったことは、ソフトウェアをデバックしながら手探るのも重要でしたが、同じくらいにソースコードを上手にビルドができるようにすることも大切であるということです。
Inkscapeを手探る イントロ
この記事は、東京大学工学部電子情報工学科・電気電子工学科の3年後期実験の一つである「大規模ソフトウェアを手探る」のレポートとして、 作成したものです。
この実験は世の中で実際に使われている大きなソフトウェア一つを選定して、そのソフトウェアのコードを読んで理解して、 改良・機能拡張を実装してみるという実験になっています。
私たちの班ではベクタ画像編集ソフトであるInkscapeを取り扱い、機能拡張に挑戦しました。 挑戦して格闘した内容を書いていますが、完璧に実装ができたり、理解をしたわけではないので、 「ここはこういう意味じゃないよ」や「ちゃんと完成していないじゃないか」と言われてしまうようなことがあっても、 挑戦した努力だけでも受け取っていただければ幸いです。
目次
今回の実験で取り組んだ内容をいくつかの記事に分けて投稿しました。 各テーマとリンク先を添付しているので、お好きな内容からどうぞご覧になってください。 一応、目次に記載された順番がおすすめする読む順番になっているので、参考にしてください。
Inkscapeの環境開発(Ubuntu編)
Ubuntu環境でのInkscapeのビルドの方法をまとめました。 nineuts.hatenablog.com
Inkscapeの環境開発(macOS編)
macOS環境でのInkscapeのビルドを試みた概要が見れます。 syobonpastel.github.io
Inksacapeのコードを読んでみた概要
Inkscapeのコードを読んで分かったことをまとめました。 syobonpastel.github.io
機能の実装と結果
Inkscapeでレイヤの出力を便利にしました。 hara82.hatenablog.com