// -*- coding: utf-8 -*-
:source-highlighter: pygments


= Gaucheのコンパイルとインストール

NOTE: Gaucheは開発中のシステムで、頻繁に更新しています。次のURLで最新の
情報が得られます:
https://practical-scheme.net/gauche/

このドキュメントでは、配布されるtarballからGaucheをコンパイルしてインストールする
方法を説明します。ソースリポジトリをcloneしてコンパイルする場合はさらに準備が必要です。
詳しくは link:HACKING.adoc[] ファイルを参照してください。


== 必要なもの


Unix環境の標準的なビルドツールとGNU makeが必要です。

それに加え、以下のツールとライブラリをあらかじめ入れておくことを
推奨します。無くてもGaucheはビルドできますが、一部機能が使えなくなります。

- Makeinfo (バージョン5.0以降) - infoドキュメントをビルドするのに使います。
入ってなければドキュメントはインストールされません (その場合、REPLでのオンラインドキュメント
も使えません)
- Gzip - 同じくドキュメントビルド時に使われます。
- Libiconv - 文字エンコーディング変換に使われます。下の説明も参照。
- link:https://tls.mbed.org/[Mbed TLS] - TLS/SSL接続に使われます。下の説明も参照。

他のオプショナルなライブラリについては以下で順次説明します。

Windows上では、MSYS/MinGWを使ってビルドできます。
詳しくはlink:doc/HOWTO-mingw.adoc[]を参照してください。


== 簡単な方法

[source,console]
----
% ./configure
% make
% make check
% make install
----

これで、Gaucheシステムが `/usr/local/bin`, `/usr/local/lib/gauche` 及び
`/usr/local/share/gauche` 以下にインストールされます。

既にGaucheがインストールされているシステムで、
全く同じconfigurationオプションで新しいバージョンのGaucheをインストール
する場合、`configure` の代わりに次のコマンドを使うこともできます。

[source,console]
----
% gauche-config --reconfigure | sh
----

`--reconfigure` オプションが与えられると、 `gauche-config` は現在
インストールされているGaucheがconfigureされた時のコマンドラインを
標準出力に書き出します。それをシェルに評価させれば、同じオプションで
configureすることができます。Gaucheをアップデートする場合に便利です。



== スレッドサポート

主要なプラットフォームの多くで、Gaucheはネイティブスレッドをサポートします。
スレッドが使用可能かどうかはconfigure時に自動判定されます。
スレッドサポートが有効かどうかはconfigureスクリプトの出力の最後に表示されます。

何らかの理由で、スレッドサポートが可能なプラットフォームでそれを無効にしたい場合、
あるいは本来可能であるはずなのにconfigureスクリプトが判定を間違えて有効になっていない
場合には、次のconfigureオプションで強制的にスレッドサポートの有効/無効を
切り替えることができます。

[horizontal]
`--enable-threads=none`     :: turn off the thread support
`--enable-threads=pthreads` :: turn on the thread support (pthread)
`--enable-threads=win32`    :: turn on the thread support (windows)


== 文字エンコーディングの選択

デフォルトでは、Gaucheは内部文字エンコーディングとして UTF-8 を使います。
`--enable-multibyte=ENCODING` というオプションをconfigureに渡すことで、
内部文字エンコーディングを変えることができます。

[horizontal]
`--enable-multibyte=utf-8`   :: UTF-8 (default)
`--enable-multibyte=euc-jp`  :: EUC-JP
`--enable-multibyte=sjis`    :: Shift JIS
`--enable-multibyte=no`      :: No multibyte string


GaucheはUnicode(UTF-8, 16, 32)、Latin-N、および代表的な日本語文字エンコーディングを
認識し変換することができますが、それ以外のエンコーディングに関しては、iconvが利用可能で
あればそれを利用して変換を行います。iconvが標準でインストールされていないシステムでは、
`--with-iconv` オプションで外部のiconvライブラリを利用することができます。

[source,sh]
----
--with-iconv=DIR
----


例えば `--with-iconv=/usr/local` とすれば、Gaucheは `iconv.h` を `/usr/local/include`
から、 `libiconv` を `/usr/local/lib` から探します。もしあなたのiconvライブラリが
libiconv以外の名前 ( `libmyconv` とか) だったとしたら、
`--with-iconv-lib=myconv` というオプションも指定して下さい。

外部のiconvライブラリとしては、Bruno Haible氏のlibiconvが以下から入手可能です。
https://www.gnu.org/software/libiconv/


== ローカルライブラリパス

Gaucheのビルドに、標準でない場所にインストールされているライブラリを
使用したい場合、次のオプションでその場所を指定することができます。

[source,sh]
----
--with-local=PATH:PATH2:...
----

これで、`PATH/include` 、`PATH2/include` 、... がインクルードパスに、
`PATH/lib` 、`PATH2/lib` 、... がライブラリサーチパスに追加されます。

例えば、`/usr/local` にインストールされたgdbmライブラリを使用したい
場合は次のようにします。

[source,sh]
----
--with-local=/usr/local
----


== IPv6サポート

GaucheはプラットフォームでIPv6がサポートされていればそれを使えるように
コンパイルされますが、何らかの事情でIPv6を全く使わないバージョンが必要で
あれば、`--enable-ipv6=no` を指定してください。


== TLS/SSL のサポート

Gaucheにはセキュアソケット通信のサポートが組み込まれています。ひとつは
バンドルされた link:http://axtls.sourceforge.net/[axTLS]
ライブラリを使うもので、それは自動的に含まれます。
もうひとつは外部の link:https://tls.mbed.org/[mbedTLS]
ライブラリを使うもので、そちらはconfigure時に
ライブラリがみつかればコンパイルされます。もしビルドに不都合が生じてどれかの
ライブラリを外したい場合は、次のオプションで使うライブラリを選べます。

[horizontal]
`--with-tls=none`          :: do not include TLS/SSL support
`--with-tls=axtls`         :: include only axTLS support
`--with-tls=axtls,mbedtls` :: (default) include TLS/SSL support using
                            axTLS library (source is included in Gauche),
                            and mbedTLS library (installed on the system).
`--with-tls=axtls,mbedtls--internal` :: During the build, MbedTLS source is downloaded
                                and compiled with Gauche.  See below.

できるだけMbed TLSを使うことを推奨します。AxTLSはサポートしている暗号スイートに
限りがあり、相手が正当な証明書を持っていても接続できないことがあります。
詳しくはマニュアルのrfc.tlsの項を参照してください。

`mbedtls` のかわりに `mbedtls-internal` を指定すると、ビルド中にMbedTLSのソースを
ダウンロードして、Gaucheの拡張ライブラリの一部として組み込みます。生成されるバイナリは
システムのMbedTLSライブラリには依存しないので、MbedTLSが入っていないターゲットシステムに
もバイナリをそのまま持って行けます。このオプションを使う場合はビルドにCMakeが必要です。

`mbedtls-internal`を使った場合、`rfc--tls--mbed.so`および`libgauche-static-*.a`に
MbedTLSのコードが含まれるため、バイナリの配布にあたってはMbedTLSのライセンスにも従う
必要があります (Apache License 2.0)。


== DBMデータベースのサポート

デフォルトでは、Gaucheはシステム中にgdbm, ndbm, odbm (original dbm)のライブラリ
があるかどうかを調べ、見つかったライブラリに対するインタフェースサポートをビルドします。

もし特定のdbmライブラリのサポートを除外したい場合は、configureスクリプトの`--with-dbm'
オプションに、*含めたいライブラリ*を列挙してください。例えば `--with-dbm=ndbm' と
すれば、gdbmやオリジナルのdbmのライブラリがシステムにあってもそれらは含まれず、
ndbmのサポートだけビルドされます。いずれのライブラリサポートも含めたくなければ
`--with-dbm=no' と指定してください。

== SLIBの場所

link:http://people.csail.mit.edu/jaffer/SLIB[SLIB]は、
ポータブルなSchemeライブラリで、いろいろ便利な機能が
完全にSchemeで書かれています。GaucheはSLIBがインストールされていれば
その機能を利用することができます。

configureスクリプトは、 `/usr/local/slib` や `/usr/share/slib` などいくつかの基本的なディレクトリ
からSLIBを自動的に探します。もしあなたのSLIBシステムが標準的ではない場所に
インストールされていたら、次のオプションでその場所を指定してください。

[source,sh]
----
./configure --with-slib=PATH
----

ここで、`PATH` はSLIBがインストールされたパスです。

GauchehはSLIB無しでも動作します。SLIBを使う必要がなければ、このオプションは
気にしなくてよいです。

SLIBは最初に使う前にGaucheのライブラリディレクトリにカタログファイルを
作成します。Gaucheのインストール時に既にSLIBが存在すればインストール
スクリプトがカタログファイルを作成しますが、Gaucheインストール後にSLIB
がインストールされた場合、最初にSLIBを使おうとした時点でカタログファイルが
作成されます。この時、Gauche使用者がライブラリディレクトリに書き込み権限を
持っていないとエラーとなります。書き込み権限を持つユーザが `gosh` を起動して
例えば次のような式を評価すればカタログファイルが正しく作られます。

[source,scheme]
----
(use slib)
(require 'logical)
----


== 実行時のライブラリパス

しばしば、環境のコントロールができない箇所でGaucheを走らせなければならない
場合があります。例えばCGIスクリプトをISPのサーバーで走らせる場合などです。
もし、Gaucheが標準的でない場所にインストールされた共有ライブラリに依存し
ている場合、それが問題となります。

例えば、最新の `libiconv.so` を自分でコンパイルして `/home/yours/lib` に
インストールしたとします。`--with-iconv=/home/yours/lib` としてconfigure
すれば、Gaucheはあなたのiconvを使うようにコンパイルされます。実行時に適切
な環境変数、例えば `LD_LIBRARY_PATH` などを設定しておけば、Gaucheの
インタプリタ `gosh` は `libiconv.so` を捜し出すことができます。しかし、
CGIスクリプトはWeb serverによって起動され、Web serverは `LD_LIBRARY_PATH`
を設定してくれないかもしれません。その場合、`gosh` は `libiconv.so` が見つけられずに
起動に失敗するかもしれません。

コンパイラによっては、プログラムが依存している共有ライブラリのパスをプログラム
本体に書き込んでしまえるオプションを持っています。 `configure` の `--with-rpath`
オプションはそれを利用します。 `--with-rpath=DIR` とすると、実行時に `DIR` から
共有ライブラリを探すような設定になります。このオプションは今のところ `gcc` でしか
動作しません。


== インストール先の指定

次のようにconfigureスクリプトを起動することにより、インストール先の
ディレクトリを指定できます。

[source,console]
----
% ./configure --prefix=$PREFIX  --exec-prefix=$EXEC_PREFIX
----


`--prefix` オプションが指定されなければ、 `/usr/local` が指定されたものとみなされます。
`--exec-prefix` オプションが指定されなければ、 `EXEC_PREFIX` は `PREFIX` と同じものに
なります。


インストールされるファイルの内訳は以下の通りです。

  `$EXEC_PREFIX/bin/*`::
     インタプリタ (`gosh`) とコンフィグレーションスクリプト (`gauche-config`)

  `$EXEC_PREFIX/lib/*`::
     ライブラリ (`libgauche.a`).

  `$PREFIX/share/gauche/VERSION/include/*`::
     libgaucheをリンクするアプリケーションに必要なヘッダーファイル

  `$PREFIX/share/gauche/VERSION/lib/*`::
     マシンに依存しないSchemeファイル

  `$PREFIX/share/info/*`::
     infoファイル

  `$EXEC_PREFIX/lib/gauche/VERSION/ARCHITECTURE/*`::
     マシンに依存するファイル (`.so`, `gosh`, `gauche-config`, `libgauche.a`)

  `$PREFIX/share/gauche/site/lib/*`::
  `$EXEC_PREFIX/lib/gauche/site/VERSION/ARCHITECTURE/*`::
     ユーザが独自にインストールするマシン非依存／依存ファイルのデフォルトの置き場所。


== 最適化オプション


Make時に、 `make` マクロ `OPTFLAGS` を用いて追加のコンパイルオプションを指定すること
ができます。 `configure` が設定する `OPTFLAGS` 以外のオプションを試したい場合は
次のように `make` を走らせて下さい。

[source,sh]
----
make OPTFLAGS="--some-compiler-option --other-option"
----


== アンインストール

インストールされたGaucheソフトウェアを取り除くには、ソースツリーのトップ
ディレクトリで

[source,sh]
----
make uninstall
----

として下さい。


== クロスコンパイル

Gaucheはautotool標準のクロスコンパイルをサポートしています。
つまり、 `configure` スクリプトに `--build` と `--host` オプションを与えて
makeするだけです (クロス開発に必要なツールはもちろんインストールされているとします)。
ただ、二つばかり気をつけることがあります。

- クロスコンパイルしようとしているのと同じバージョンのGaucheをビルドマシンに
  インストールしておいてください。
+
通常のビルドでは、Gaucheは作ったばかりの `gosh` を使って `ext/` 以下の拡張
ライブラリをビルドします。クロスコンパイル時には、作ったばかりの `gosh` は
ビルドマシンでは実行できないので、既にビルドマシンにインストールされている
`gosh` を使うことになります。

- `./configure` に `--with-libatomic-ops=no` オプションが必要かもしれません。
+
このオプションをつけることで、システムにインストールされている `libatomic_ops`
ではなく同梱されたソースを使うようになります。どうもconfigureスクリプトが
ビルドシステム用の `libatomic_ops` をホスト用と誤認するケースがあるようです。

例として、次のコマンドラインで、Windows (mingw-w64 32bit) 用バイナリを
あなたのシステム上でクロスコンパイルできます:

[source,sh]
----
./configure --build=`./config.guess` \
            --host=i686-w64-mingw32 \
            --with-libatomic-ops=no \
            --prefix=/usr/local
----

== 機種依存の情報


* MacOS X - 10.15 (Catalina) では、ダウンロードしたtarballから取り出されたファイル
  はセキュリティ機構にマークされているため、ビルド時に必要なシェルスクリプトを実行できません。
  tarballを展開した後、次のコマンドを実行してください。(VERSIONは配布バージョンに
  置き換えてください)。
  tarballが真正のものであるかどうかは、https://practical-scheme.net/vault/ に置いてある
  asc署名で確認してください。
+
[source,sh]
----
xattr -r -d com.apple.quarantine Gauche-VERSION/
----

* IRIX with 64bit binary - デフォルトの32bit ABIではなく64bit ABIでコンパイル
  したい場合は次のようにして下さい。
+
[source,sh]
----
CC="cc -64" AS="as -64" ./configure
----

* Linux/Crusoe TM5800 - 最近のLinuxでは Crusoe TM5800がi686互換とされる
  ようになったようですが、gc中でi686特有のprefetch命令を使っているところ
  でコンパイルに失敗するという報告がありました。
  この場合は以下のように環境依存の最適化を無効にして下さい。
+
[source,sh]
----
./configure --disable-heuristic-optimization
----
