やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

ソースコードのダウンロード・解凍・ビルド・インストール手順(make, autotools)

 OS標準のパッケージ管理を使ってインストールするとバージョンが古いことがある。そこでソースコードからビルドする。だが、この手順がよくわからないのでまとめた。

手順

  1. ソースコードのダウンロード
  2. ビルド&インストール

1. ソースコードのダウンロード

  1. github
  2. 圧縮ファイル

 配布方法はいくつかある。私が見たことあるのは上記2種類。

1-A. github

$ git clone ${GITHUB_URL}

 これでカレントディレクトリ配下に指定したURLのソースコードがダウンロードできる。

1-B. 圧縮ファイル

$ wget ${FILE_URL}

 wgetの代わりにcurlでも可。これでカレントディレクトリ配下に指定したURLの圧縮ファイルがダウンロードできる。

 さらに圧縮を展開(解凍)する必要がある。圧縮形式ごとに以下のようになる。

圧縮形式 コマンド
tar.bz2 tar xf ${FILE_PATH}
tar.gz gzip ${FILE_PATH}
zip unzip ${FILE_PATH}
rar unrar x ${FILE_PATH}

 厄介なことに展開された状態がどうなるかは不定である。圧縮ファイル次第。cd 展開後ディレクトリ名としてビルド作業に行きたいのだが自動化できない……。

 さらに文字コード問題がある。Shift-JISやEUCなどが使われて文字化けするとパスの指定すらできず自動化できない……。

2. ビルド&インストール

 C/C++言語はビルドからインストールまでに手間がかかる。そこで楽にするツールを使うことがある。だがそのせいで以下のように手順が分岐してしまう。

  1. すでに./configureファイルがある
  2. ./configureをツールによって作成する
    1. autotools
    2. cmake
    3. Meson

2-0. Configure? Makefile? なにそれ

 ビルドに必要な工程。

 C/C++言語ではソースコードからオブジェクトファイルを作成してリンクすることで実行バイナリファイルを作成する。その手順をmakeファイルに書く。makeコマンドでMakefileの通りにビルドを実行する。

  1. ソースコードを書く
  2. makeファイルを書く
    1. オブジェクトファイルを作成する(ソースコード単体を機械語に変換したバイナリ)
    2. 実行バイナリファイルを作成する
      1. オブジェクトファイルをリンクする
      2. ライブラリファイルをリンクする

 これを簡略化するツールがautotools, cmake, Mesonである。しかし、これらを持ってしてもなお複雑になってしまう。そもそもこれらのツールがあることで手順が煩雑化する。つまりC/C++のビルドは超面倒。

2-1. Configure, Makefile

 プロジェクトディレクトリの中にconfigure, Makefileがあれば、この方法でビルドできる。

 ビルドに必要なツールはbuild-essentialパッケージにある。make,gcc,g++等。

$ sudo apt install -y build-essential

 configureの内容はシェルスクリプトである。ターミナルで./configure --helpとするとビルドオプションを確認できる。sudo ./configure [option]とするとビルドオプションを指定できる。機能を追加したり削除する指定ができる。以下で説明するmakeの前に行う。

 Makefileは独自構文である。オブジェクトファイルの作成やリンクの指示をする。Makefileファイルが存在するカレントディレクトリでsudo makeコマンドを実行するとMakefileの内容が実行される。成功すれば実行バイナリファイルが作成される。

 最後にsudo make installとすると所定のディレクトリに配置される。大抵は/usr/localなどである。環境変数PATHが通っているであろうことからコマンド名だけで実行できるはず。これでインストール完了。

 ビルド&インストールするコマンドは以下。

cd SomeProject/
./configure --help
sudo ./configure 任意オプション
sudo make
sudo make install

 開発者はMakefile作成に苦労する。そこで後述するツールを使う。

2-1. autotools

 Makefileの次に広く使われていると思う。

 まずはツールをインストールする。

sudo apt install -y automake
sudo apt install -y autoconf

 開発者は以下のファイルを作成する。

 利用者は以下のコマンドを実行する。

cd SomeProject/
./autogen.sh
autoconf
automake
./configure --help
sudo ./configure 任意オプション
sudo make
sudo make install
コマンド 出力ファイル
$ ./autogen.sh *.in
$ autoconf configure
$ automake Makefile

 プロジェクトディレクトリに./autogen.shがあればautoconfautomakeもやってくれるかも? 一応すべて順にやっておく。

2-2. cmake

 autotoolsの後発。結局は使いづらいらしい。

2-3. Meson

 cmakeの後発。見やすいらしいがチューリング完全でない。

OS, 言語により煩雑化する

 実行バイナリのダウンロードにはパッケージマネージャを使う。RaspbianはDebian系なのでapt。OS非依存にnixがある。往々にしてバージョンが古い。そこでソースコードをダウンロードしてビルドする。

 ソースコードgithubなどのコードホスティングサイトにアップロードされていることが多い。ソースコードのダウンロードにはgitコマンドを使う。git clonegit pull

 C/C++以外では言語専用パッケージマネージャがある。gitを使わずともインストールできる。

言語 パッケージ管理
python pip, pip3
Node.js npm
ruby gem
Go dep, godep, glide
C# NuGet

 バージョンによって機能がなかったり別の名前だったりする。SDK自体のバージョン管理ツールもある。pyenvなど。さらに複数言語の*envを管理するanyenvまである。

 これらを駆使して環境を作っていくことになる。環境構築はとてつもなく大変でつまらない苦痛な作業である。

所感

 cmake, Mesonのプロジェクトはほとんど見たことがない。cmakeは1回だけあったが良くわからなくてインストールできなかった記憶がある。必要に迫られたら調べる。