2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Linux Mint (LMDE6) で watchman をソースコードからビルドすることに挑戦

Last updated at Posted at 2024-09-12

はじめに

Linux Mint (LMDE6) の PC にwatchmanをソースコードからビルドしてインストールしました。

2024 年 9 月初旬現在、わかりにくかったのでメモします。

実行環境

公式インストール方法

公式ドキュメントによると、Debian 向けのやり方は複数あります。

ソースコードからビルドすることになった経緯

Homebrew は使っていないので除外することにしました。

まずビルド済みバイナリをダウンロードする方法を試してみました。
ところが、手順通りにインストールしましたが、エラーがでて使えませんでした。

watchman: error while loading shared libraries: libcrypto.so.1.1: cannot open shared object file: No such file or directory

どうも Issues にもいくつか上がっているようですが、長い間解決していない問題のようです。

Releases を見てみると、最近のリリースに Linux 版のバイナリが含まれていません。Linux 版のバイナリはあまりメンテナンスされていないのかもしれません。

そういう経緯があってソースコードからビルドしてみようということになりました。

ソースコードをダウンロードする

最新リリースからダウンロードするか、GitHub リポジトリからクローンします。

Git を使う場合は以下の通りです。

git clone https://github.com/facebook/watchman

そしてソースコードのディレクトリに移動します。

cd watchman

install-system-packages.sh

依存関係が公式ドキュメントには見当たらなかったですが、リポジトリを見た印象だとinstall-system-packages.shスクリプトを実行すれば必要なものがインストールされる設計になっているようです。

残念ながら、執筆時点では Linux Mint には対応してないようでした。

$ ./install-system-packages.sh
++ dirname ./install-system-packages.sh
+ python3 ./build/fbcode_builder/getdeps.py install-system-deps --recursive watchman
I don't know how to install any packages on this system linux-lmde-6

Debian 12 の Docker コンテナで色々試しているときに遭遇したエラーメッセージをもとに必要なパッケージを見つけ出すことができました。

手動でインストールする方針で行きます。

autogen.sh

このスクリプトを実行するだけでビルドできるようです。

必要なパッケージがインストールされいない状態だと様々なエラーがでます。

やってみる

必要なパッケージをインストール

システム上のパッケージリストを更新します。

apt update -yqq

Dockerコンテナ内で./install-system-packages.shを実行したときにたまたま遭遇したエラーメッセージに以下のコードがありました。それをそのまま使います。ソースコードのどこかにあるのかもしれません。

apt install -yqq \
  autoconf \
  automake \
  binutils-dev \
  cmake \
  libboost-all-dev \
  libbz2-dev \
  libdouble-conversion-dev \
  libdwarf-dev \
  libevent-dev \
  libfast-float-dev \
  libffi-dev \
  libgflags-dev \
  libgmock-dev \
  libgoogle-glog-dev \
  libgtest-dev \
  liblz4-dev \
  liblzma-dev \
  libncurses-dev \
  libpcre2-dev \
  libsnappy-dev \
  libsodium-dev \
  libtool \
  libunwind-dev \
  libzstd-dev \
  ninja-build \
  python3-all-dev \
  zlib1g-dev

更に、以下は様々なエラーに対処しているときにインストールしたものです。詳しくは覚えてません。

エラーメッセージをヒントに適宜足りないものをインストールしてください。

apt install \
  build-essential \
  curl \
  git \
  libssl-dev \
  m4 \
  pkg-config \
  python3

ビルドを実行

ソースコードのディレクトリ内で./autogen.shを実行します。

./autogen.sh

何度もエラーに遭遇しましたが、ほとんどの場合が依存関係の不備でした。

ビルド結果を確認

builtディレクトリが生成され、その中にビルド結果が格納されます。以下は一例です。

$ tree ./built
./built
├── bin
│   ├── watchman
│   └── watchmanctl
└── lib
    ├── libevent-2.1.so.7
    ├── libgflags.so.2.2
    ├── libglog.so.0
    ├── libsnappy.so.1
    └── libunwind.so.8

3 directories, 7 files

動作確認をします。

./built/bin/watchman --version
./built/bin/watchmanctl --help

たしかこの時点では./built/bin/watchman --versionの方でエラーがでたと記憶しています。

./built/bin/watchman: error while loading shared libraries: /usr/local/lib/libglog.so.0: cannot open shared object file: No such file or directory

必要なファイルをつくり、ビルド結果を適切な場所にコピー

  • ./built/bin/*/usr/local/bin/
  • ./built/lib/*/usr/local/lib
sudo mkdir -p /usr/local/{bin,lib}
sudo mkdir -p /usr/local/var/run/watchman

cd path/to/watchman
cp -iv built/bin/* /usr/local/bin/
cp -iv built/lib/* /usr/local/lib/

sudo chmod 755 /usr/local/bin/watchman
sudo chmod 2777 /usr/local/var/run/watchman

再度./built/bin/watchman --versionを実行すると成功するはずです。

$ ./built/bin/watchman --version
20240905.175743.0

また、パスの通っている場所にコピーを置いたので、watchman --versionも機能するはずです。

$ watchman --version
20240905.175743.0

おわりに

依存関係さえしっかりインストールされていれば、スクリプトを実行するだけで簡単にビルドできることがわかりました。

2024 年 9 月初旬現在、ドキュメント上ではわかりにくい部分があったので、このメモが何らかの一助になれば幸いです。

なにか情報があれば、ぜひお便りください :bow:

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?