SSH でサーバーに接続
% ssh abcabc@abcabc.sakura.ne.jp abcabc@abcabc.sakura.ne.jp's password:
ファイルのダウンロードと解凍
ダウンロード用のフォルダを作成
ファイルをダウンロードする前に、ダウンロード用のフォルダを作ります。下記のコマンドで「work」フォルダとその配下に「libffi」フォルダを作成します。
% mkdir -p ~/work/libffi
wget でファイルをダウンロード
作成した「libffi」フォルダに移動して、圧縮ファイルをダウンロードします。
% cd work/libffi % wget ftp://sourceware.org/pub/libffi/libffi-3.2.1.tar.gz
*初めは最新の「libffi-3.3.tar.gz」で進めたのですが後述の make のところで下記のエラーを返され、すぐに原因も分からなかったので一旦全部ファイルを削除して「libffi-3.2.1.tar.gz」で再チャレンジしました。
gcc: warning: '-x assembler-with-cpp' after last input file has no effect
gcc: No input files specified
*** [libffi.map] Error code 1
上記の wget コマンドを実行してから ls を実行すると圧縮ファイルがダウンロードされたのが確認できます。
% ls libffi-3.2.1.tar.gz %

ファイルを解凍する
ダウンロードした圧縮ファイルを解凍します。
% tar xvfz libffi-3.2.1.tar.gz
ファイルが解凍され、元々ダウンロードした圧縮ファイルとは別に「libffi-3.2.1」という名前のフォルダが作成されています。

インストール
「libffi-3.2.1」のフォルダへ移動し ./configure を実行します。prefix でインストール先を指定します。
% cd libffi-3.2.1 % ./configure --prefix=$HOME/local/libffi/3_2_1
実行するとプロセスが走ってドバドバとターミナルに表示されるので入力待ちになるのを待ちます。
make そして make install を順に実行します。
% make % make install
.configure の prefix で指定した場所にインストールされました。

インストール後の設定
シンボリックリンクの作成
% mkdir -p ~/local/include % ln -s $HOME/local/libffi/3_2_1/lib/libffi-3.2.1/include/ffi.h $HOME/local/include/ % ln -s $HOME/local/libffi/3_2_1/lib/libffi-3.2.1/include/ffitarget.h $HOME/local/include/ % mkdir -p ~/local/lib % ln -s $HOME/local/libffi/3_2_1/lib/libffi.a $HOME/local/lib/ % ln -s $HOME/local/libffi/3_2_1/lib/libffi.la $HOME/local/lib/ % ln -s $HOME/local/libffi/3_2_1/lib/libffi.so $HOME/local/lib/ % ln -s $HOME/local/libffi/3_2_1/lib/libffi.so.6 $HOME/local/lib/ % mkdir -p ~/local/lib/pkgconfig/ % ln -s $HOME/local/libffi/3_2_1/lib/pkgconfig/libffi.pc $HOME/local/lib/pkgconfig/
上記を実行すると下記の様に local 配下に include、lib、lib > pkgconfig が作成され、その配下のシンボリックリンクも確認できます。

環境変数の設定
シンボリックリンクを作成したのでそれぞれ LD_LIBRARY_PATH と PKG_CONFIG_PATH に追加します。他のソースをビルドするときやコマンド実行するときに役立ちます。
シェルの種類 | ユーザプロファイル |
Bourne シェル (sh) または Korn シェル (ksh) | .profile |
Bourne Again シェル (bash) | .bash_profile |
C シェル (csh) | .login と .cshrc |
TC シェル (tcsh) | .tcshrc と .cshrc |
Z シェル (zsh) | .zlogin と .zshrc |
今回はサーバーのシェルが csh なので .cshrc を編集して環境変数を設定します。
.cshrc の編集
% cd ~/ % vi .cshrc
.cshrc に下記を追記します。
setenv LD_LIBRARY_PATH $HOME/local/lib setenv PKG_CONFIG_PATH $HOME/local/lib/pkgconfig
.cshrc で追記した内容を反映させます。
% source ~/.cshrc % rehash
echo コマンドで確認すると、指定したパスが表示されます。
% echo $LD_LIBRARY_PATH /home/abcabc/local/lib % echo $PKG_CONFIG_PATH /home/abcabc/local/lib/pkgconfig
以上で libffi のインストール作業は完了です。
LD_LIBRARY_PATH と PKG_CONFIG_PATH
LD_LIBRARY_PATH 変数
LD_LIBRARY_PATHは、アプリケーションがリンクされている動的共有ライブラリを検索する際の対象ディレクトリを動的リンクローダーに指示します。複数のディレクトリをコロン (:) で区切ったもので、コンパイルされた検索パスと標準の場所(大抵 /lib、/usr/lib 等)の前に検索されます。
PKG_CONFIG_PATH 変数
pkg-config は、プログラムのコンパイルとシステムにインストールされているライブラリとの接続に必要な情報を提供します。
この情報は .pc ファイルに保存されており、pkg-config ツールで認識されている特定の場所にあります。
pkg-config が .pc ファイルを検索する際、デフォルトでは /usr/lib/pkgconfig と /usr/share/pkgconfig を検索します。しかし、一部のローカルモジュールは /usr/local などの別のプレフィックスにインストールされる場合があるため、PKG_CONFIG_PATH 変数で検索対象のパスを追加します。