Next: , Previous: , Up: Installing GMP   [Index]


2.1 ビルド時のオプション

GMPでは通常のautoconfの設定オプションをすべて利用することができるようになっており,‘./configure --help’でその概要を読むことができます。INSTALL.autoconfファイルにも一般的なインストールのための情報が記述されています。

ツール類

configure’スクリプトは沢山のUNIXツールを使用します。Notes for Particular Systemsを参照してください。 UNIXではないOS上での設定方法を記述してあります。

configure’スクリプトを使わなくても,全てのコードが揃っていれば,ビルドすることは 可能ではあります。但し,ツールの代わりに全部自力で設定を行わなければなりません。

ビルドするディレクトリ

ビルドするディレクトリを別のところに設定する際には,cdコマンドでそこへ移動し,プレフィックスを,GMPのソースが置いてあるディレクトリへのパスをくっつけてconfigureを実行します。例えば次のように行います。

cd /my/build/dir
/my/sources/gmp-6.1.2/configure

この場合,‘make’プログラムがコンパイルに必要な全ての情報(VPATH)を保持しているわけではありません。特に,SunOSやクソトロいSolarisのmakeコマンドはバグのおかげで上記のように別のディレクトリでのビルドができません。やりたければGNU makeを使って下さい。

--prefix--exec-prefix

--prefixオプションを使うと,GMPをインストールするディレクトリを指定できます。 デフォルトのディレクトリは‘/usr/local’です。

--exec-prefixオプションを指定すると,libgmp.aのようにCPUアーキテクチャごとに生成されるファイルを異なるディレクトリに設置できます。このオプションではドキュメントのようにアーキテクチャに依存しないファイルも指定ディレクトリに設置できますが,分離することも可能です。 gmp.hlibgmpを生成する際に作られますので,アーキテクチャ依存のファイルになります。従ってビルド時には$prefix/include$exec_prefix/includeの両方をコンパイラに周知しておく必要があります。

--disable-shared, --disable-static

デフォルトでは静的ライブラリも動的ライブラリも両方ビルドされますが,片方だけビルドすることもできます。動的ライブラリは実行ファイルを小さくしたい時に有効で,動作しているプロセス間で同じGMPのコードを共有します。但し,CPUのタイプによっては,関数呼び出しに要する時間のため,若干低速になります。

ネイティブコンパイル, --build=CPU-VENDOR-OS

通常のネイティブコンパイルを行うには,対象システムを‘--build’で指定できます。デフォルトでは‘./configure’時において,‘./config.guess’の実行結果を利用します。‘./config.guess’で正確なCPUタイプを知ることもできますが,コンパイル時にこのオプションを使って明示的にCPUタイプを指定することもできます。 例えば下記のように指定します。

./configure --build=ultrasparc-sun-solaris2.7

どんなケースでも‘OS’の部分は重要で,これによってlibtoolが動的ライブラリを生成する方法を指定できます。‘OS’が不明の場合は‘./config.guess’を動作することで簡単に判明します。

クロスコンパイル, --host=CPU-VENDOR-OS

クロスコンパイルを行う時には,コンパイルに使用したいシステムを‘--build’に指定し, ライブラリを動かしたいシステムを‘--host’に指定します。下記の例では,FreeBSD Athlonシステムを利用してコンパイルし,GNU/Linux m68k用のバイナリを生成しています。

./configure --build=athlon-pc-freebsd3.5 --host=m68k-mac-linux-gnu

コンパイラツールは最初にホストシステムのタイプを見に行きます。例えば m68k-mac-linux-gnu-ranlibが指定された場合,標準のranlibが使用されます。 これによって,ネイティブツールと共存しているクロスコンパイル用のツール群が指定できるようになります。 プレフィックスは‘--host’に指定でき,これは‘m68k-linux’のようにエイリアスが利用できます。但し,ツール類はここで指定するのではなく,クロスコンパイル用のccを含むパス(PATH)が通っているだけで十分です。

同じファミリーに属する異なるCPUに対してコンパイルを行うには,クロスコンパイルとして行うこともできますが,ネイティブコンパイラにオプションをつけるだけで済ますことも可能です。どんなケースでも,‘./configure’はビルドするシステムの影響は受けずに実行できますので,ビルドを実行するシステム上では動作しない,新しいCPU向けのバイナリの生成も可能です。

いかなる場合でも,コンパイラは標準Cのmain関数を含むソースから,実行ファイル(の形式はともかく)を生成できなければなりません。オブジェクトファイルはlibgmpの構成物になるだけですが,‘./configure’コマンドは,例えば実行対象のホストシステムで動作する関数を確定するために,リンクテストを使うことになります。

現状ではクロスコンパイルの際に‘--build’オプションの指定がないと警告が出ます。これは, PATHが通ったディレクトリにクロスコンパイル用のccしかない場合は正しくビルドシステムのタイプを認識できない可能性があるからです。

--target’オプションは,GMPのクロスコンパイル用としては適切ではありません。これはビルド用のコンパイラツールを指定するだけのもので, ‘--host’によって動作する環境を,‘--target’ によってコード生成の対象となるアーキテクチャを指定しています。GMPのような通常のプログラムやライブラリは,‘--host’部分だけ指定すれば事足ります(以前のGMPは‘--target’を不正確に使っていました)。

CPUの種別

一般的に,ライブラリをできるだけ高速に動作させたい時には,GMPの設定を,使用している正確なCPU種別に合わせる必要があります。とはいえ,そのCPUファミリーの古いタイプで動かすこともあるのか,他のCPUファミリーでは遅くなることもあり得るのか,古いCPUか新しいCPUか,といったことを示すことになりますが,最良の方法は,正しいマシンタイプに対してGMPをビルドすることです。

下記に挙げるCPUは特別なサポートがなされています。どんなコードでどんなコンパイラオプションが使えるのかは,configure.acで確認して下さい。

上記のリストに上がっていないCPUについては汎用Cコードが適用されます。

汎用Cコードのビルド

アセンブラコードの利用に問題が発生したり,利用したくない時には--disable-assemblyを指定し,汎用Cコードを使用してビルドして下さい。

汎用Cコードを使うと計算速度がガクッと遅くなってしまいますが,可搬性は上がりますし,多少問題含みの環境でも動かすことはできるようになります。

ファットバイナリ, --enable-fat

--enable-fatオプションを使うとx86系のシステムでは“ファットバイナリ”ビルドができるようになります。 これによって,CPUに対して最適化された基盤関数群が利用できるようになります。つまり,全てのx86 CPU用のコードを持ちつつ,パフォーマンスの最適化が適宜できるようになる訳です(このオプションは将来的に他のアーキテクチャに対しても使えるようになる予定です)。

ABI

ある種のシステム上では,GMPは複数のABI(Application Binary Interface)をサポートしています。これはデータ型のサイズや関数呼び出しに関係してきます。デフォルトではGMPは利用できるABIのうち最適なものを選択しますが,下記のように特定のABIを指定することもできます。

./configure --host=mips64-sgi-irix6 ABI=n32

使用できるオプション指定やCPU,アプリケーション側でできること等については,ABI and ISAをご覧下さい。

CC, CFLAGS

デフォルトのCコンパイラは,gccをはじめ,通常使われることの多いコンパイラの中から選択して指定します。通常は ‘CC=whatever’というオプションで‘./configure’に渡され,デフォルトでは選ばれないものも使用可能になります。

デフォルトのコンパイラのフラグは,CPUやCコンパイラによって変わってきます。 通常は‘CFLAGS="-whatever"’というオプションで‘./configure’に渡され,デフォルトとは異なるフラグや,GMPが感知しえない適切なフラグを指定することができるようになります。

CC’ や ‘CFLAGS’といったオプションを使うと, ‘./configure’実行中にその指定値が表示され,生成されたMakefileの中に書き込まれます。オプションのの値を変えたり何か追加したりしたい時にはまずこのデフォルト値を確認するのがいいでしょう。

CC’ や ‘CFLAGS’といったオプション値を,複数のABIをサポートするシステムで指定したい時には,明示的に‘ABI=whatever’というオプションをしてしておくことで,GMPが間違ったフラグやアセンブラコードを各ABIに指定することを防ぎます。

CC’だけを指定した場合は,そのコンパイラに対してのデフォルト値を ‘CFLAGS’に与えます(GMPがその値を知っていた場合)。例えば‘CC=gcc’とすると,強制的にGCCがCコンパイラとして指定され,そのデフォルト値(とデフォルトのABI)が付加されます。

CPPFLAGS

プリプロセッサが必要とするフラグ,例えば‘-D’による定義や,‘-I’によるインクルードファイルのディレクトリ指定は,‘CFLAGS’ではなく,‘CPPFLAGS’で指定して下さい。‘CPPFLAGS’ と ‘CFLAGS’の両方を指定してコンパイルすることもできますが,プリプロセッサは前者しか使いません。プリプロセッサとコンパイラの指定可能なフラグには相違があるのが普通だからです。いくつかのconfigure時のテストでも,プリプロセッサは分離して実行されます。

CC_FOR_BUILD

ビルド時に利用されるプログラムはコンパイルされ,ホスト指定のデータテーブルを生成するために実行されます。 ‘CC_FOR_BUILD’オプションはこの目的のために使用されるコンパイラの指定ができます。どんなABIやモードでも特段指定の必要がないオプションで,実行ファイルを構築するためだけのオプションです。 デフォルトでは,指定済みの‘CC’,探索して見つかった動作可能なCコンパイラ,例えば‘cc’や‘gcc’になります。

単純に‘cc foo.c’のようにフラグなしでコンパイルするだけなので,‘CC_FOR_BUILD’に対するフラグは利用できません。 どうしてもフラグ指定をしたければ,‘CC_FOR_BUILD="cc -whatever"’のように,このオプション指定に取り込んで下さい。

C++のサポート, --enable-cxx

GMPをC++で使えるようにするには‘--enable-cxx’オプションでコンパイルします。 これによりC++コンパイラを要求するようになります。‘--enable-cxx=detect’オプション を使うと,C++コンパイラが使用可能な時のみサポートされますので便利です。C++利用のためには libgmpxx.laライブラリと,gmpxx.hヘッダファイルがセットで必要となります (see Headers and Libraries)。

libgmpxx.laを分離してあるのは,C++オブジェクトをlibgmp.laに同梱するよりも 使いやすいからです。これにより,ダイナミックリンクを利用しているCプログラムがC++標準ライブラリを要求したり,C++コンパイラがCプログラムのリンクを要求したりすることがなくなります。

libgmpxx.laは内部でligmp.laを使っているため,どちらも同じGMPバージョンのものでなくてはなりません。バージョンアップの度にルーチンの名前変更などがありますので,異なるバージョンのGMPを使うと,挙動がおかしくなるというより,シンボル未定義が頻発することが多くなると思います。

一般にlibgmpxx.laはビルド時にC++コンパイラを必要としますので,違うコンパイラでGMPを使うと名前修飾(name mangling)やランタイムサポートの違いで必ずトラブります。

CXX, CXXFLAGS

C++を利用する際にはC++コンパイラとそのオプションを‘CXX’ と ‘CXXFLAGS’に指定するのが普通のやり方です。‘CXX’のデフォルト値は望ましいC++コンパイラの候補の先頭にあるものが選ばれます。g++が使える場合はこれが筆頭になります。‘CXXFLAGS’のデフォルト値は‘CFLAGS’のうち,‘-g’を除いたものになります。例えば,g++の場合は‘-g -O2’が‘-O2’になり,他のコンパイラでは‘-g’が単なるオプションなし,となります。‘CFLAGS’を流用するのは‘gcc’と‘g++’を共に利用する際に便利だからで,コンパイラオプションが大体共通なのです。

ちなみに,‘CXX’と‘CC’を全く同一の値にすることは望ましくありません。例えばgccの場合,foo.ccをC++プログラムであると理解はしますが,g++のように正しくリンカを実行して,C++オブジェクトファイルから実行ファイルや共有ライブラリを生成することはできません。

一時メモリ領域, --enable-alloca=<choice>

GMPは一時メモリ領域を,下記に挙げる3つの方法で確保します。方法の選択は例えば ‘--enable-alloca=malloc-reentrant’というオプションで指定可能です。

オプション指定を簡便にするため,下記のような簡易指定も可能です。例えば ‘--disable-alloca’は‘no’と指定したものと同じ意味になります。

allocaは再入可能で,高速に実行できるのでお勧めです。スタック上に小さいメモリブロックを確保します。もっと大きなメモリブロックが欲しい場合はmalloc-reentrantを利用して下さい。

malloc-reentrant’はその名前の通り, 再入可能でスレッドセーフです。 ‘malloc-notreentrant’は高速だが再入可能性が不要の時に使用します。

この二つのmallocを利用する方法は,mp_set_memory_functionsで指定したメモリ割り当て関数を使います。デフォルトではmalloc関数やその類似の関数が使われます。(See Custom Allocation)

追加して使えるオプションとしては‘--enable-alloca=debug’があり,メモリに関連するデバッグを行いたい時には重宝します(see Debugging)。

FFT乗算, --disable-fft

デフォルトでは,乗算はKaratsuba, 3-way Toom-Cook, 高次Toom-Cook,フェルマーFFT アルゴリズムを使って実行されます。FFTは特別デカいオペランドに対してのみ適用されるものなので,コードサイズを小さくしたいのであれば,このオプションを使って使用不可にしておくこともできます。

アサーションによるチェック, --enable-assert

このオプションを利用してライブラリ内の整合性のチェックができるようになります。デバッグ時 see Debugging に利用う可能です。

実行時プロファイル, --enable-profiling=prof/gprof/instrument

プロファイリング方法はいくつかありますがsee Profiling,そのうちの一つがこのオプション指定で使えるようになります。

MPN_PATH

mpnサブルーチンチン用のアセンブラプログラムは多様なものが提供されており,各CPU用のものは自動で検索されますが,このオプションを使うとmpn用のコードのフォルダを指定できるようになります。例えば,下記は‘sparcv8’用の指定です。

MPN_PATH="sparc32/v8 sparc32 generic"

この例では,まず最初にv8コードを読みに行き,次にsparc32コード(v7用),最後に汎用Cコードを読みに行きます。ハードウェアに詳しいユーザが特定の目的で利用したい時には,異なるパスを指定しても結構です。通常は無用のオプションになります。

文書類

あなたが今読んでいるこのマニュアルのソースは doc/gmp.texiにあり,Texinfoフォーマットで記述されています。詳細は Texinfo in Texinfoを読んで下さい。

Infoフォーマットの文書‘doc/gmp.info’はこのGMPのTARボールの中に入っています。通常のautomakeを利用して,PostScript, DVI, PDF, HTMLを生成することができます(但し,TeXやTexinfoツールが使える環境であること)。

DocBookやXML形式の文書はTexinfoのmakeinfoプログラムから生成できます。詳細はOptions for makeinfo in Texinfoをご覧下さい。

追記的なメモについてはdoc以下に置いてあります。


Next: , Previous: , Up: Installing GMP   [Index]