syobon's note

2023/11/12

Inkscape ビルド苦闘記

#eeic

東大 eeic 3A の実験の一つに『大規模ソフトウェアを手探る』というものがあります。
ざっくり言うと、任意の OSS のコードを読んで、機能を(勝手に)拡張したり、 Issue を直したりしようという実験です。

この実験で、我々の班は Inkscape という描画ソフトの機能拡張をしました。

本当は Chromium をやりたかったのですが、実験でやるにはビルドに時間がかかりすぎるなどの障壁があったので……(そのうち commit してみたいですね)

という訳で、実験レポート(ブログ)その 1 、 Inkscape を macOS でビルドしようと苦闘した挙句、上手く行かなかったという話です。

0. 作業の前に

公式ドキュメント

公式ドキュメントは ↓ です。ほぼほぼこの手順に従いました。
https://wiki.inkscape.org/wiki/index.php?title=CompilingMacOsX

Homebrew or MacPorts ?

Inkscape では、依存しているパッケージのインストールに用いるパッケージマネージャーとして、 MacPorts あるいは Homebrew を選ぶことができます。
今回は、普段開発で Homebrew を使っているので、(共存させないほうが良いらしいですし) Homebrew を使うことにしました。

環境

要は Intel の CPU がのっている MacBook Pro に、 Homebrew が入っています。

1$ system_profiler SPHardwareDataType 2Hardware: 3 4 Hardware Overview: 5 6 Model Name: MacBook Pro 7 Model Identifier: MacBookPro16,2 8 Processor Name: Quad-Core Intel Core i7 9(略) 10$ sw_vers 11ProductName: macOS 12ProductVersion: 13.6 13BuildVersion: 22G120 14$ brew -v 15Homebrew 4.1.16

1. brew install

必要なパッケージをインストールします。

1$ brew install \ 2 adwaita-icon-theme \ 3 bdw-gc \ 4 boost \ 5 cairomm \ 6 ccache \ 7 cmake \ 8 double-conversion \ 9 gettext \ 10 gsl \ 11 gspell \ 12 gtk-mac-integration \ 13 gtkmm3 \ 14 imagemagick \ 15 intltool \ 16 lcms2 \ 17 libomp \ 18 libsoup@2 \ 19 libxslt \ 20 ninja \ 21 poppler \ 22 potrace

💡 path が通っていない

command が見つからないというエラー ( -bash: brew: command not found ) が出たので、 path を通しました。

1$ which brew 2/usr/local/bin/brew 3$ export PATH="/usr/local/bin:$PATH"

2. clone

データを置きたいところに移動した上で GitLab からレポジトリを clone してきます。

1$ git clone https://gitlab.com/inkscape/inkscape.git 2$ cd inkscape/ 3$ git submodule init && git submodule update

3. cmake

ここの手順は公式ページの記載通りに行うと、 Intel の CPU を使っている場合、詰まってしまうので注意が必要です。公式の手順から変更が必要な点はコメントに書いてある通りです。

1$ LIBPREFIX="/opt/homebrew" # LIBPREFIX="/usr/local/" for intel CPU 2$ export PATH="$LIBPREFIX/bin:/usr/bin:/bin:/usr/sbin:/sbin" 3$ export PKG_CONFIG_PATH="$LIBPREFIX/opt/icu4c/lib/pkgconfig" 4$ export PKG_CONFIG_PATH="$PKG_CONFIG_PATH:$LIBPREFIX/opt/libsoup@2/lib/pkgconfig" 5$ export PKG_CONFIG_PATH="$PKG_CONFIG_PATH:$LIBPREFIX/opt/libxslt/lib/pkgconfig" 6$ export PKG_CONFIG_PATH="$PKG_CONFIG_PATH:$LIBPREFIX/opt/libxml2/lib/pkgconfig" 7$ PREFIX="$PWD/install-prefix" 8$ mkdir -p build 9$ cd build 10$ cmake \ 11 -G Ninja \ 12 -DCMAKE_SHARED_LINKER_FLAGS="-L$LIBPREFIX/lib" \ 13 -DCMAKE_EXE_LINKER_FLAGS="-L$LIBPREFIX/lib" \ 14 -DCMAKE_INSTALL_PREFIX=$PREFIX \ 15 -DCMAKE_C_COMPILER_LAUNCHER=ccache \ 16 -DCMAKE_CXX_COMPILER_LAUNCHER=ccache \ 17 -DWITH_DBUS=OFF \ 18 ..

💡 "libsoup-2.4" というパッケージが見つからない

メッセージ

上記の手順を公式通りにやった場合は、以下のようなエラーが出ます。(以下、パスの一部を <Path> と表記しています。)

1$ cmake \ 2 -G Ninja \ 3 -DCMAKE_SHARED_LINKER_FLAGS="-L$LIBPREFIX/lib" \ 4 -DCMAKE_EXE_LINKER_FLAGS="-L$LIBPREFIX/lib" \ 5 -DCMAKE_INSTALL_PREFIX=$PREFIX \ 6 -DCMAKE_C_COMPILER_LAUNCHER=ccache \ 7 -DCMAKE_CXX_COMPILER_LAUNCHER=ccache \ 8 -DWITH_DBUS=OFF \ 9 .. 10CMake Deprecation Warning at CMakeLists.txt:2 (cmake_minimum_required): 11 Compatibility with CMake < 3.5 will be removed from a future version of 12 CMake. 13 14 Update the VERSION argument <min> value or use a ...<max> suffix to tell 15 CMake that the project does not need compatibility with older versions. 16 17 18------------------------------ 19Building Makefile for Inkscape 20------------------------------ 21Source Dir: <Path> 22Binary Dir: <Path> 23-- Mac OS X build detected, setting default features 24CMake Warning at /usr/local/Cellar/cmake/3.27.7/share/cmake/Modules/Platform/Darwin-Initialize.cmake:306 (message): 25 Ignoring CMAKE_OSX_SYSROOT value: 26 27 /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.1.sdk 28 29 because the directory does not exist. 30Call Stack (most recent call first): 31 /usr/local/Cellar/cmake/3.27.7/share/cmake/Modules/CMakeSystemSpecificInitialize.cmake:34 (include) 32 CMakeLists.txt:35 (project) 33 34 35-- Creating build files in: <Path> 36-- Checking for modules 'harfbuzz;pangocairo>=1.44;pangoft2;fontconfig;gsl;gmodule-2.0;libsoup-2.4>=2.42;bdw-gc;lcms2' 37-- No package 'libsoup-2.4' found 38CMake Error at /usr/local/Cellar/cmake/3.27.7/share/cmake/Modules/FindPkgConfig.cmake:607 (message): 39 A required package was not found 40Call Stack (most recent call first): 41 /usr/local/Cellar/cmake/3.27.7/share/cmake/Modules/FindPkgConfig.cmake:829 (_pkg_check_modules_internal) 42 CMakeScripts/DefineDependsandFlags.cmake:122 (pkg_check_modules) 43 CMakeLists.txt:147 (include)
状況の確認
1$ brew list # パッケージがインストールされているかの確認 2==> Formulae 3...() 4libsoup 5libsoup@2 6...()

→ パッケージは入っているのに見つからないという状況です。

原因と解決策

Mac に搭載の CPU が intel か Apple Silicon かで Homebrew パッケージがインストールされるディレクトリが異なることが原因です。

1LIBPREFIX="/usr/local/"

としてそこから先の手順をやり直せばうまくいきます。

参考: https://github.com/clementine-player/Clementine/issues/6983#issuecomment-821927036

4. ninja

ninja を使ってビルドファイルを生成します。

1$ ninja 2$ ninja install

💡 linker の error

メッセージ
1$ ninja 2(略) 30 0x102e96f43 \_\_assert_rtn + 64 41 0x102d98f43 ld::AtomPlacement::findAtom(unsigned char, unsigned long long, ld::AtomPlacement::AtomLoc const*&, long long&) const + 1411 52 0x102db5431 ld::InputFiles::SliceParser::parseObjectFile(mach_o::Header const*) const + 19745 63 0x102dc5b71 ld::InputFiles::parseAllFiles(void (ld::AtomFile const\*) block_pointer)::$\_7::operator()(unsigned long, ld::FileInfo const&) const + 657 74 0x7ff80ef6c066 \_dispatch_client_callout2 + 8 85 0x7ff80ef7de09 \_dispatch_apply_invoke + 213 96 0x7ff80ef6c033 \_dispatch_client_callout + 8 107 0x7ff80ef7c0f6 \_dispatch_root_queue_drain + 683 118 0x7ff80ef7c768 \_dispatch_worker_thread2 + 170 129 0x7ff80f109c0f \_pthread_wqthread + 257 13ld: Assertion failed: (resultIndex < sectData.atoms.size()), function findAtom, file Relocations.cpp, line 1336. 14collect2: error: ld returned 1 exit status 15[10/948] Generating gl.gmo 16ninja: build stopped: subcommand failed.
原因と解決策 (?)

このエラーは MacOS に初期で入っているリンカーのうち、一部のバージョンがバグを抱えているため起きているようです。 ただ他のエラーが出てしまったので。これが本当に解決策なのかが不明です……。

g++ コマンドで使われるコンパイラを clang から gcc に変更した上で std=c++17 オプションをつけて cmake からやり直すと、別のエラーメッセージが出るようになりました。

clang から gcc への変更は

1brew install gcc 2$ which g++-{1..100} 3/usr/local/bin/g++-13

で、 gcc をインストールし、インストール先のパスを確認します。そして ~/.bashrc (= bash の設定ファイル ) に alias g++="/usr/local/bin/g++-13" のようにエイリアスを追加して、

1source ~/.bashrc

により ~/.bashrc を読み込み直せばできます。

cf. https://www.reddit.com/r/cpp_questions/comments/177vuyk/i_cannot_use_fmt_installed_by_brew/?rdt=64482

解決策以外に試したこと
Command Line Tools のインストール・ダウングレード

CLT (=Command Line Tools) の問題を疑って、バージョンを確認してみると、

1$ brew config 2() 3CLT: N/A 4Xcode: 15.0.1

とあり、そもそも CLT が入っていないようでした。 XCode の GUI 上では入っているようにも見えましたが、とりあえず CUI からインストールしてみます。

1$ xcode-select --install 2$ brew config 3macOS: 13.6-x86_64 4CLT: 15.0.0.0.1.1694021235 5Xcode: 15.0.1

しかしエラーメッセージは変わりませんでした。
引き続き CLT のバージョン問題を疑い、バージョン 14.3.1 をインストールしてみましたが、同じエラーメッセージが出てしまい、うまくいきませんでした。

参考: https://developer.apple.com/forums/thread/737707
CLT 14 台の入手元: https://developer.apple.com/download/all/?q=command%20line%20tools%2014

brew のバージョン

ChatGPT に解決策を尋ねてみると、brew のアップデート & アップグレードを勧められました。

1$ brew update 2$ brew upgrade

結果 → エラーメッセージは変わりませんでした。

💡 gsl パッケージが見つからない

g++ を変更すると、今度は linker で gsl パッケージが見つからないというエラーが出ました。このパッケージは、 結論から言うと、今回はここで詰まって諦めました。

1$ ninja 2ld: warning: search path '/lib' not found 3ld: library 'gsl' not found 4collect2: error: ld returned 1 exit status
試したこと
状況の確認

gsl はインストールされていそうです。

1$ brew list gsl 2/usr/local/Cellar/gsl/2.7.1/bin/gsl-config 3()
パッケージのインストール

似たエラーに関する他の OSS での議論を参考に、以下のコマンドを用いて、追加でパッケージをインストールしてみました。

1$ brew install gnuradio

結果 → エラーは変わりませんでした。

 

ここまでの作業で数日を溶かしてしまったので、今回は macOS でのビルドを諦め、別の作業をすることにしました。
ちなみに最後のエラーは、軽く調べてみて、 linker のパスやオプションの周りが怪しいのかなと思っています。

ビルドが大変そうだからと Chromium を避けることになったはずが、結局悪戦苦闘することになるとは……。

Inkscape のコードを読んだ話に続きます。


syobon