Blame INSTALL-jp

Packit Service 8bf002
  ここでは、MCPP のソースをコンパイルして実行プログラムを生成する方法を
Packit Service 8bf002
説明します。詳細はさらに mcpp-porting.html を見てください。
Packit Service 8bf002
Packit Service 8bf002
1、実行プログラムの種類
Packit Service 8bf002
Packit Service 8bf002
  MCPP の実行プログラムは build する方法に応じて何種類かあります。Build
Packit Service 8bf002
する方法には次の2つの次元があります。
Packit Service 8bf002
Packit Service 8bf002
    1. stand-alone-build vs subroutine-build
Packit Service 8bf002
    2. compiler-independent-build vs compiler-specific-build
Packit Service 8bf002
Packit Service 8bf002
stand-alone-build: 1つのコマンドとして単体で動くプリプロセッサです。処
Packit Service 8bf002
    理系のコンパイラ・ドライバから呼び出されるものもあります。
Packit Service 8bf002
subroutine-build: 他のメインプログラムの中からサブルーチンとして(必要な
Packit Service 8bf002
    ら繰り返し)呼び出されるものです。
Packit Service 8bf002
Packit Service 8bf002
compiler-independent-build: 処理系からは独立して動くプリプロセッサです。
Packit Service 8bf002
    実行時オプションなどの仕様は処理系のいかんによらず一定です。プリプロ
Packit Service 8bf002
    セスだけすることができますが、処理系の一部として動作することはできま
Packit Service 8bf002
    せん。
Packit Service 8bf002
compiler-specific-build: 特定の処理系のプリプロセッサを(もし可能なら)
Packit Service 8bf002
    代替するためのものです。その処理系に専用の仕様を持ち、その処理系の専
Packit Service 8bf002
    用のディレクトリにインストールされます。
Packit Service 8bf002
Packit Service 8bf002
  Subroutine-build についてはここでは説明は略します。mcpp-porting.html 3.
Packit Service 8bf002
12 を見てください。以下はすべて stand-alone-build についての説明です。
Packit Service 8bf002
Packit Service 8bf002
2、configure と make
Packit Service 8bf002
Packit Service 8bf002
  MCPP をコンパイルするには、UNIX 系のシステムおよび CygWIN, MinGW では
Packit Service 8bf002
configure スクリプトを使うことができます。configure と make は任意のディ
Packit Service 8bf002
レクトリで実行できます。以下の説明では mcpp-${VERSION} ディレクトリのあ
Packit Service 8bf002
る path を ${mcpp-dir} と表記します。${VERSION} は 2.6.4, 2.7.1 等の
Packit Service 8bf002
MCPP のバージョンです。
Packit Service 8bf002
Packit Service 8bf002
Configure はコンパイラを cc (c++) または gcc (g++) という名前で、環境変
Packit Service 8bf002
数 $PATH にセットされた path list の順にサーチします。したがって、gcc-4.
Packit Service 8bf002
3.0, g++-4.3.0 といった名前のコンパイラを使うなら、configure する前にそ
Packit Service 8bf002
れを環境変数 CC, CXX で指定するか、または gcc, g++ にリンクしておいてく
Packit Service 8bf002
ださい。もし、path list 上で最初にサーチされるコンパイラ以外のコンパイラ
Packit Service 8bf002
を使うなら、$PATH を次のように変更しなければなりません。
Packit Service 8bf002
Packit Service 8bf002
    export PATH=/my/gcc/bin:$PATH
Packit Service 8bf002
Packit Service 8bf002
この設定は make が終わるまで維持してください。Path list 上で最初にサーチ
Packit Service 8bf002
されるコンパイラ以外のコンパイラを CC, CXX で指定してはいけません。たと
Packit Service 8bf002
え絶対パスで指定してもダメです。Path list は configure のすべてに影響を
Packit Service 8bf002
与えるからです。
Packit Service 8bf002
Packit Service 8bf002
2、1、compiler-independent-build
Packit Service 8bf002
Packit Service 8bf002
    ${mcpp-dir}/configure; make; make install
Packit Service 8bf002
Packit Service 8bf002
とすると、compiler-independent 版の実行プログラムが生成されて mcpp とい
Packit Service 8bf002
う名前でインストールされます。一部のドキュメントもインストールされます。
Packit Service 8bf002
Packit Service 8bf002
    ${mcpp-dir}/configure --prefix=/usr; make; make install
Packit Service 8bf002
Packit Service 8bf002
等とした場合は、prefix で指定されたディレクトリの中の bin ディレクトリに
Packit Service 8bf002
インストールされます。これを指定しないと /usr/local を指定したのと同じこ
Packit Service 8bf002
とになります。
Packit Service 8bf002
  make install には通常は root 権限が必要なので、
Packit Service 8bf002
Packit Service 8bf002
    sudo make install
Packit Service 8bf002
Packit Service 8bf002
とします。あるいは su してから configure; make; make install とします。
Packit Service 8bf002
なお、FreeBSD では make ではなく gmake を使ってください。
Packit Service 8bf002
  実行プログラムを strip するには、make install のかわりに
Packit Service 8bf002
Packit Service 8bf002
    make install-strip
Packit Service 8bf002
Packit Service 8bf002
とします。
Packit Service 8bf002
Packit Service 8bf002
    make uninstall
Packit Service 8bf002
Packit Service 8bf002
とすると、MCPP の実行プログラムは削除されます。
Packit Service 8bf002
Packit Service 8bf002
  make (un)install では DESTDIR=DIR というオプションを指定すると、DIR 以
Packit Service 8bf002
下のディレクトリにインストールされます。例えば、
Packit Service 8bf002
Packit Service 8bf002
    make DESTDIR=/tmp/mcpp install
Packit Service 8bf002
Packit Service 8bf002
とすると、/tmp/mcpp/usr/local/bin/ に MCPP がインストールされます(存在
Packit Service 8bf002
しないディレクトリは作成される。configure で --prefix=DIR オプションを指
Packit Service 8bf002
定していると '/usr/local' の部分が 'DIR' に置き換わる)。バイナリ・パッ
Packit Service 8bf002
ケージを作るにはこの方法を使います。
Packit Service 8bf002
Packit Service 8bf002
  GCC 4.1 以降には -fstack-protector (-fstack-protector-all) というオプ
Packit Service 8bf002
ションがありますが、make で CFLAGS+='-fstack-protector' というオプション
Packit Service 8bf002
を指定することでこれを有効にすることができます。これは GCC-specific-
Packit Service 8bf002
build でも同様です。MCPP を gdb でデバッグする時には CFLAGS+='-ggdb -O0'
Packit Service 8bf002
とします。
Packit Service 8bf002
Packit Service 8bf002
  compiler-independent-build では make install で最小限のドキュメントが
Packit Service 8bf002
インストールされるようにしました。これはバイナリ・パッケージを作るつごう
Packit Service 8bf002
に合わせたものです。
Packit Service 8bf002
Packit Service 8bf002
  Linux, Mac OS X, CygWIN, MinGW ではシステムの標準ヘッダに欠陥があるの
Packit Service 8bf002
で、compiler-independent-build の MCPP ではその対策が必要です。この問題
Packit Service 8bf002
については mcpp-manual.html 3.9.9 を見てください。
Packit Service 8bf002
Packit Service 8bf002
2、2、compiler-specific-build
Packit Service 8bf002
Packit Service 8bf002
    ${mcpp-dir}/configure --enable-replace-cpp; make; make install
Packit Service 8bf002
Packit Service 8bf002
とすると、compiler-specific 版の実行プログラムが生成されて、その処理系の
Packit Service 8bf002
専用のディレクトリにインストールされます。
Packit Service 8bf002
  make install-strip, make uninstall は compiler-independent-build と同
Packit Service 8bf002
じです。
Packit Service 8bf002
  prefix ディレクトリは GCC の path から自動的に設定されます。例えば GCC
Packit Service 8bf002
の path が /usr/local/bin/gcc であれば、/usr/local を prefix とします。
Packit Service 8bf002
configure の --prefix オプションを指定しても、それが GCC の path と矛盾
Packit Service 8bf002
していれば無視されます。また、make での DESTDIR オプションも、実行プログ
Packit Service 8bf002
ラムのインストールには関係しません。
Packit Service 8bf002
Packit Service 8bf002
  ただし、GCC 以外の処理系では先に移植作業を行い、configure でさらにいく
Packit Service 8bf002
つかのオプションを指定しないと、適切なコンパイルとインストールがされませ
Packit Service 8bf002
ん。
Packit Service 8bf002
Packit Service 8bf002
2、2、1、処理系が GCC の場合
Packit Service 8bf002
Packit Service 8bf002
2、2、1、1、make install
Packit Service 8bf002
  --enable-replace-cpp オプションで configure した場合、make install で
Packit Service 8bf002
はコンパイラの置かれるディレクトリ(/usr/libexec, /usr/lib/gcc-lib/i686-
Packit Service 8bf002
pc-linux-gnu/VERSION 等)に実行プログラムがインストールされます。これは
Packit Service 8bf002
gcc の呼び出す cc1 (cpp0) が置かれているディレクトリです。make install
Packit Service 8bf002
は GCC / cc1, cc1plus (cpp0) を保存した上で、gcc, g++ から MCPP が呼び出
Packit Service 8bf002
されるように適切な設定をします。この設定は GCC が V.2.* であるか V.3.*,
Packit Service 8bf002
4.* であるかによって違っています(mcpp-manual.html 3.9.5, 3.9.7 を参照の
Packit Service 8bf002
こと)。また、GCC のバージョンに応じたヘッダファイルが compiler-specific
Packit Service 8bf002
な include directory の中の mcpp-gcc* というディレクトリに生成されます。
Packit Service 8bf002
Packit Service 8bf002
2、2、1、2、make check
Packit Service 8bf002
  MCPP の検証セットには GCC の testsuite に対応した edition があります。
Packit Service 8bf002
GCC / testsuite がインストールされている場合は、make check によってこの
Packit Service 8bf002
testsuite 版検証セットで MCPP の Standard モードのテストをすることができ
Packit Service 8bf002
ます。Testsuite 版検証セットは GCC / testsuite の一部として使うようにな
Packit Service 8bf002
っているので、あらかじめ GCC / testsuite がインストールされ実行できる状
Packit Service 8bf002
態になっていることが必要です。GCC / testsuite は通常は GCC のソースの一
Packit Service 8bf002
部となっています(別のパッケージとなっている場合もある)。GCC V.2.95.*
Packit Service 8bf002
以降の testsuite が使えますが、V.4.3.* のものには若干の問題があるので、V.
Packit Service 8bf002
4.2.* までのものを使ってください。
Packit Service 8bf002
  また、configure する時に GCC / testsuite の置かれているディレクトリを
Packit Service 8bf002
指定しておく必要があります。そのためには次のようにします。
Packit Service 8bf002
Packit Service 8bf002
    ${mcpp-dir}/configure --with-gcc-testsuite-dir=DIR  \
Packit Service 8bf002
            --enable-replace-cpp
Packit Service 8bf002
Packit Service 8bf002
この 'DIR' は GCC のソースが置かれているディレクトリを ${gcc-source} と
Packit Service 8bf002
すると、
Packit Service 8bf002
Packit Service 8bf002
    ${gcc-source}/gcc/testsuite
Packit Service 8bf002
Packit Service 8bf002
となるはずです。
Packit Service 8bf002
  こうして configure しておいて、make; make install した後で
Packit Service 8bf002
Packit Service 8bf002
    make check
Packit Service 8bf002
Packit Service 8bf002
とすると、検証セットの testsuite 版が GCC / testsuite の中にコピーされ、
Packit Service 8bf002
GCC が V.2.* であるかそれとも V.3.*, 4.* であるかに応じて必要な設定がさ
Packit Service 8bf002
れます。Testsuite では gcc の名前は文字通り 'gcc' でなければなりませんが、
Packit Service 8bf002
MCPP をインストールした gcc の名前が違っている場合は、gcc という名前が一
Packit Service 8bf002
時的にその名前に symbolic link されます。そして testsuite が実行されます。
Packit Service 8bf002
通常のソフトウェアでは make install の前に make check しますが、MCPP の
Packit Service 8bf002
場合は順序が逆になります。gcc から MCPP が呼び出されるようにしておかない
Packit Service 8bf002
と testsuite が MCPP に適用できないからです。また、このため --enable-
Packit Service 8bf002
replace-cpp オプションも必要です。
Packit Service 8bf002
  ${gcc-source} のありかによっては make check は sudo make check としな
Packit Service 8bf002
ければなりませんが、その場合は root と現ユーザとで 'which gcc' の結果が
Packit Service 8bf002
一致していなければならないことに注意してください。
Packit Service 8bf002
  Testsuite 版検証セットは MCPP だけでなく、GCC V.2.95 以降の cc1,
Packit Service 8bf002
cc1plus (cpp0) にも適用することができます(cpp-test.html 3.2.3 参照)。
Packit Service 8bf002
Packit Service 8bf002
2、2、1、3、make uninstall
Packit Service 8bf002
  make uninstall とすると、MCPP の実行プログラムは削除されます。
Packit Service 8bf002
mcpp-gcc* ディレクトリのヘッダファイルも削除されます。gcc, cc1, cc1plus
Packit Service 8bf002
(cpp0) の設定は初期状態に戻ります。何かのつごうで make install した後で
Packit Service 8bf002
configure を再実行する場合は、その前に make uninstall しなければなりませ
Packit Service 8bf002
ん。Configure が調査すべきなのは GCC であり MCPP ではないからです。
Packit Service 8bf002
  GCC / testsuite の中に検証セットがインストールされていれば、それも
Packit Service 8bf002
make uninstall で削除されます。GCC に検証セットを適用するには、手動で検
Packit Service 8bf002
証セットをコピーしてください。
Packit Service 8bf002
  GCC-specific-build の configure で生成された何本かの Makefile は MCPP
Packit Service 8bf002
を uninstall するときに必要なので、そのまま残しておいてください。make
Packit Service 8bf002
distclean する場合は、その前に make uninstall を実行してください。手動で
Packit Service 8bf002
uninstall するのは少し手間がかかるからです。同様に、configure や
Packit Service 8bf002
Makefile.in が更新される場合は、その前に make uninstall; make distclean
Packit Service 8bf002
しておかなければなりません。MCPP を update する場合は注意してください。
Packit Service 8bf002
Packit Service 8bf002
2、2、2、処理系が Mac OS X の Apple-GCC の場合
Packit Service 8bf002
Packit Service 8bf002
  Mac OS X は UNIX 系とは言え、framework directory 等の独自の要素を持っ
Packit Service 8bf002
ています。GCC も Apple による多くの拡張を施されたものがシステムコンパイ
Packit Service 8bf002
ラになっています。さらに Intel-Mac の登場以降は、x86 用のコンパイラシス
Packit Service 8bf002
テムと powerpc 用のコンパイラシステムとが(片方はネイティブコンパイラで
Packit Service 8bf002
他方はクロスコンパイラですが)同一マシンに共存するようになり、x86 用の実
Packit Service 8bf002
行プログラムと powerpc 用の実行プログラムを1つに束ねてどちらのマシンで
Packit Service 8bf002
も動くようにした universal binary というものまで作られるようになってきて
Packit Service 8bf002
いるので、かなり複雑な構成になっています。
Packit Service 8bf002
  この複雑なシステムに MCPP をインストールするのは、2、2、1、の方法だけ
Packit Service 8bf002
では足りません。そこで、Mac OS X / Apple-GCC の場合を、別にとりあげて説
Packit Service 8bf002
明します。私は Intel-Mac の Mac OS X Leopard を使っているのでそれを例に
Packit Service 8bf002
とりますが、Powerpc-Mac では i686 と powerpc を逆にして読んでください。
Packit Service 8bf002
また、Tiger では darwin9 を darwin8 に読み替えてください。
Packit Service 8bf002
  なお、ここでとりあげるのは GCC 4.0.1 です。そのほか GCC 3.3 も Apple
Packit Service 8bf002
によって用意されていますが、少なくとも Leopard 上のものは正しくコンパイ
Packit Service 8bf002
ルされていないので、とりあげません。
Packit Service 8bf002
Packit Service 8bf002
2、2、2、1、ネイティブコンパイラとクロスコンパイラ
Packit Service 8bf002
Packit Service 8bf002
  まず、native コンパイラ(Intel-Mac なら i686 用 GCC)用の MCPP をイン
Packit Service 8bf002
ストールのは簡単で、2、2、1、の方法ですみます。
Packit Service 8bf002
  しかし、クロスコンパイラ用の MCPP をインストールするのは、そう簡単では
Packit Service 8bf002
ありません。MCPP の configure は一般にはクロスコンパイリングに対応してい
Packit Service 8bf002
ません。サンプルプログラムをコンパイルして run させるテストがいくつか含
Packit Service 8bf002
まれているからです。ターゲット環境用のバイナリをビルド環境で実行すること
Packit Service 8bf002
は、普通はできません。また、ビルド環境のテストをしても、その結果はターゲ
Packit Service 8bf002
ット環境とは違っているかもしれません。
Packit Service 8bf002
  しかし、Mac OS X の場合は例外的に、クロスコンパイルに対応できる場合が
Packit Service 8bf002
多くあります。まず、Intel-Mac は ppc 用のバイナリをエミュレータで自動実
Packit Service 8bf002
行させるようになっています。また、CPU が違っても OS とそのバージョンも
Packit Service 8bf002
GCC のバージョンも同じであれば、ビルド環境でのテストでターゲット環境のテ
Packit Service 8bf002
ストの多くを代用できます。
Packit Service 8bf002
  Intel-Mac 上での compiler-independent-build ではまず、CC, CXX という環
Packit Service 8bf002
境変数で C コンパイラと C++ コンパイラを指定します。Mac OS X の /usr/bin
Packit Service 8bf002
にはいくつもの gcc や g++ がありますが、Intel-Mac の Mac OS X Leopard で
Packit Service 8bf002
は powerpc-apple-darwin9-gcc-4.0.1, powerpc-apple-darwin9-g++-4.0.1 とい
Packit Service 8bf002
うのが powerpc 用の C コンパイラと C++ コンパイラです(実際には /usr/bin
Packit Service 8bf002
の gcc, g++ はすべて i386, ppc 双方のバイナリを合わせた universal binary
Packit Service 8bf002
ですが)。さらに、ターゲットシステムを --target オプションで指定します。
Packit Service 8bf002
この場合はコンパイラの名前から -gcc-4.0.1 等の部分を削除した powerpc-
Packit Service 8bf002
apple-darwin9 を使います。結局、こうなります。
Packit Service 8bf002
Packit Service 8bf002
    ${mcpp-dir}/configure --target=powerpc-apple-darwin9    \
Packit Service 8bf002
            CC=powerpc-apple-darwin9-gcc-4.0.1  \
Packit Service 8bf002
            CXX=powerpc-apple-darwin9-g++-4.0.1
Packit Service 8bf002
Packit Service 8bf002
  他方で ppc-Mac では x86 のバイナリを実行できないので、この configure
Packit Service 8bf002
では compiler-independent-build のクロスコンパイルはできません。差分ファ
Packit Service 8bf002
イルと mac_osx.mak を使った手動コンパイルであればクロスコンパイルもでき
Packit Service 8bf002
るので、必要なら mcpp-porting.html#3.1.4, #3.11 を見てください。また、
Packit Service 8bf002
configure でも次節の方法を使えば、ppc-Mac の native compiler で
Packit Service 8bf002
universal binary を作ることはできます。
Packit Service 8bf002
  GCC-specific-build では CC, CXX は使わず、次のように --with-target-cc=
Packit Service 8bf002
というオプションで C コンパイラを指定します(その名前の gcc を g++ に変
Packit Service 8bf002
えたものを C++ コンパイラと解釈します)。
Packit Service 8bf002
Packit Service 8bf002
    ${mcpp-dir}/configure --target=powerpc-apple-darwin9    \
Packit Service 8bf002
            --with-target-cc=powerpc-apple-darwin9-gcc-4.0.1    \
Packit Service 8bf002
            --enable-replace-cpp
Packit Service 8bf002
Packit Service 8bf002
  これはターゲット環境の実行テストは含まないので、powerpc を i686 に置き
Packit Service 8bf002
換えれば ppcMac で使えるはずです。
Packit Service 8bf002
  デフォルトのネイティブコンパイラ(gcc, g++)と --with-target-cc= で指
Packit Service 8bf002
定するクロスコンパイラとで大きくバージョンが違っている場合は、そのクロス
Packit Service 8bf002
コンパイラになるべく近いバージョンのネイティブコンパイラを環境変数 CC,
Packit Service 8bf002
CXX で指定してください。CC (CXX) で指定するのは MCPP をビルドするための
Packit Service 8bf002
コンパイラであり、--with-target-cc= で指定するのは MCPP をインストールす
Packit Service 8bf002
るターゲットのコンパイラです。
Packit Service 8bf002
  クロスコンパイラはネイティブコンパイラとは libexec directory, compiler-
Packit Service 8bf002
specific include directory, 事前定義マクロ等が異なりますが、それらがこの
Packit Service 8bf002
オプション指定によって適切に設定されます。これらのオプションは make では
Packit Service 8bf002
なく configure で指定する必要があります。
Packit Service 8bf002
  なお、クロスコンパイラはホストシステム上で動作するものなので、その「ク
Packit Service 8bf002
ロスコンパイラに」インストールされる compiler-specific-build の MCPP も
Packit Service 8bf002
同様です。他方で「クロスコンパイラで」コンパイルされた compiler-
Packit Service 8bf002
independent-build の MCPP は、ターゲットシステムで動くものになります。ま
Packit Service 8bf002
た、GCC-specific-build はネイティブコンパイラにインストールされるものも
Packit Service 8bf002
クロスコンパイラにインストールされるものも、ともにネイティブコンパイラで
Packit Service 8bf002
コンパイルされます。このため、この双方をインストールする場合は、クロスコ
Packit Service 8bf002
ンパイラ用を先にインストールする必要があります。
Packit Service 8bf002
Packit Service 8bf002
2、2、2、2、Universal binary の make
Packit Service 8bf002
Packit Service 8bf002
  Universal binary を作るには、make する時に CFLAGS+='-arch i386 -arch
Packit Service 8bf002
ppc' というように、対象とする CPU を -arch オプションで指定します。指定
Packit Service 8bf002
できる CPU は i386, x86_64, ppc, ppc64 の4種類です。make CFLAGS+='-arch
Packit Service 8bf002
i386 -arch x86_64 -arch ppc -arch ppc64' とすると4種の CPU に対応したも
Packit Service 8bf002
のができます。configure は universal binary でない場合と同じで、特別なオ
Packit Service 8bf002
プションは必要ありません。
Packit Service 8bf002
  GCC には -isysroot DIR(または --sysroot=DIR)というオプションがありま
Packit Service 8bf002
す。これが指定されると、システムヘッダの include directory としてデフォ
Packit Service 8bf002
ルトの include directory に DIR を頭に付けたものが使われます。このオプシ
Packit Service 8bf002
ョンは Mac OS に限ったものではありませんが、Mac OS では universal binary
Packit Service 8bf002
のコンパイルにこれが使われています。Mac OS のバージョン間の互換性の範囲
Packit Service 8bf002
を広げるためです。例えば、-isysroot /Developer/SDKs/MacOSX10.4u.sdk とす
Packit Service 8bf002
ると、/usr/include が /Developer/SDKs/MacOSX10.4u.sdk/usr/include となり
Packit Service 8bf002
ます。この例は Mac OS X 10.5 (Leopard) 上で 10.4 (Tiger) と互換の
Packit Service 8bf002
universal binary をコンパイルするためのものです。MCPP の make でこれを使
Packit Service 8bf002
うためには、さらに -mmacosx-version-min= というオプションで SDK と同じバ
Packit Service 8bf002
ージョンを指定する必要があります。
Packit Service 8bf002
  MCPP の universal binary は、上記の configure オプションとこれらの
Packit Service 8bf002
make オプションを組み合わせることで、compiler-independent-build, GCC-
Packit Service 8bf002
specific-build のどちらでも、native-compiler, cross-compiler のどちらで
Packit Service 8bf002
も生成することができます。例えば compiler-independent-build で Tiger 互
Packit Service 8bf002
換の i386 と ppc 用のものを作るにはこうします(実際には、'*' の中を \ で
Packit Service 8bf002
2行に分けることはできない)。
Packit Service 8bf002
Packit Service 8bf002
    ${mcpp-dir}/configure
Packit Service 8bf002
    make CFLAGS+='-isysroot /Developer/SDKs/MacOSX10.4u.sdk     \
Packit Service 8bf002
            -mmacosx-version-min=10.4 -arch i386 -arch ppc'
Packit Service 8bf002
    sudo make install
Packit Service 8bf002
Packit Service 8bf002
2、2、3、処理系が GCC でない場合
Packit Service 8bf002
Packit Service 8bf002
  処理系が GCC でない場合は configure でいくつかのオプションを指定しなけ
Packit Service 8bf002
ればなりません。また、その処理系のプリプロセッサと置換できるように、ソー
Packit Service 8bf002
スコードを書き足す「移植」作業が必要です。作者自身は Linux, FreeBSD, Mac
Packit Service 8bf002
OS X, CygWIN, MinGW 等で GCC を使っているので移植がすんでおり、configure
Packit Service 8bf002
で情報を収集することもできるのですが、UNIX 系システムの他の処理系につい
Packit Service 8bf002
ては知らないので、移植はおろが configure で何をどう調べれば良いのかもわ
Packit Service 8bf002
からないからです。
Packit Service 8bf002
  UNIX 系システムの GCC 以外の処理系では、次のような手順でコンパイルを進
Packit Service 8bf002
めてください。
Packit Service 8bf002
Packit Service 8bf002
2、2、3、1、オプションを指定して configure
Packit Service 8bf002
  まず、いくつかのオプションを指定して configure してみます。例えば次の
Packit Service 8bf002
ようにします。
Packit Service 8bf002
Packit Service 8bf002
    ${mcpp-dir}/configure --enable-replace-cpp --bindir=DIR \
Packit Service 8bf002
            --with-cxx-include-dir=CXXDIR   \
Packit Service 8bf002
            --enable-SYSTEM-STD-macro=_MACRO=val
Packit Service 8bf002
Packit Service 8bf002
  --bindir で指定するのは、コンパイラドライバから呼び出されるプリプロセ
Packit Service 8bf002
ッサが置かれるディレクトリです。さらに C++ 固有のインクルードディレクト
Packit Service 8bf002
リを --with-cxx-include-dir で、また処理系固有の事前定義マクロを
Packit Service 8bf002
--enable-SYSTEM-STD-macro その他のオプションで指定します。
Packit Service 8bf002
Packit Service 8bf002
    ${mcpp-dir}/configure --help
Packit Service 8bf002
Packit Service 8bf002
とするとオプションが表示されます。
Packit Service 8bf002
  そして make; make install して、さらにコンパイラドライバから MCPP が呼
Packit Service 8bf002
び出されるように細工をします。その方法については、GCC での設定方法を参考
Packit Service 8bf002
にしてください。
Packit Service 8bf002
Packit Service 8bf002
2、2、3、2、「移植」作業
Packit Service 8bf002
  処理系のプリプロセッサを MCPP に置き換えて使うためには、ソースコードを
Packit Service 8bf002
書き足す「移植」作業が必要です。処理系固有の実行時オプションや #pragma
Packit Service 8bf002
等の実装です。中でもしばしば使われる実行時オプションで MCPP と異なるもの
Packit Service 8bf002
があれば、最低限、その実装が必要です。そのためには、configed.H でそのコ
Packit Service 8bf002
ンパイラを表すマクロを定義した上で、system.c にコードを書き加えます
Packit Service 8bf002
(mcpp-porting.html のことに 4.2 を参照)。
Packit Service 8bf002
Packit Service 8bf002
2、2、3、3、オプションを追加して configure しなおす
Packit Service 8bf002
  ソースの移植ができたら、--with-compiler-name=COMPILER というオプション
Packit Service 8bf002
を追加して configure し直します。COMPILER は configed.H で定義したそのコ
Packit Service 8bf002
ンパイラを表すマクロです。
Packit Service 8bf002
  make; make install ができたら、さらに make clean; make とすると、MCPP
Packit Service 8bf002
を使って MCPP のリコンパイルが行われます。これが通れば、最低限の移植はで
Packit Service 8bf002
きています。
Packit Service 8bf002
Packit Service 8bf002
2、2、4、configure の制約
Packit Service 8bf002
Packit Service 8bf002
  compiler-specific-build の MCPP のコンパイルではターゲット処理系(MCPP
Packit Service 8bf002
をプリプロセッサとして使う予定の処理系)の仕様を詳しく知る必要があります。
Packit Service 8bf002
同時に、コンパイルする処理系についても別の側面の仕様を知る必要があります。
Packit Service 8bf002
MCPP のソースはこの両者の処理系が違っていてもかまわないように、両者の設
Packit Service 8bf002
定を分けてヘッダファイル (configed.H) を書いてあります。しかし、
Packit Service 8bf002
configure ではこの両者を同時に調べることができません。そのため、ターゲッ
Packit Service 8bf002
トとする処理系とコンパイルする処理系は同じであるという前提で調査をします。
Packit Service 8bf002
  もしこの両者の処理系が違う場合は、configed.H の Part 2 を編集すること
Packit Service 8bf002
が必要です。
Packit Service 8bf002
  MCPP の configure は同様にクロスコンパイルにも対応していません。また、
Packit Service 8bf002
クロスコンパイルでは実行できないテストもいくつか含まれています。クロスコ
Packit Service 8bf002
ンパイルではその場合はデフォルト値をセットしますが、うまくゆかないかもし
Packit Service 8bf002
れません。
Packit Service 8bf002
Packit Service 8bf002
3、Windows 上の処理系での make
Packit Service 8bf002
Packit Service 8bf002
  Windows 上の処理系は CygWIN, MinGW 以外は configure の対象にならないの
Packit Service 8bf002
で、ソースを修正して make することが必要です。すでに移植ずみの処理系につ
Packit Service 8bf002
いては差分ファイルを用意してあるので、これを使ってパッチをあてることがで
Packit Service 8bf002
きます。差分ファイルを使う場合の手順を以下に説明します。
Packit Service 8bf002
  また、configure の対象になる処理系でも、ヘッダファイルや makefile を直
Packit Service 8bf002
接、編集することできめのこまかい制御をすることができます。
Packit Service 8bf002
Packit Service 8bf002
3、1、パッチをあてる
Packit Service 8bf002
  noconfig というディレクトリに各種処理系用の差分ファイルと makefile が
Packit Service 8bf002
用意されています。MCPP のソースはデフォルトでは FreeBSD / GCC 3.4 用の設
Packit Service 8bf002
定になっています。差分ファイルはこれを別の処理系用に修正するものです。
Packit Service 8bf002
Makefile は各処理系に付属する make を使うように書かれています。
Packit Service 8bf002
  src ディレクトリに入って次のようにします。以下の作業はすべて src ディ
Packit Service 8bf002
レクトリで行います。
Packit Service 8bf002
Packit Service 8bf002
    patch -c < ..\noconfig\which-compiler.dif
Packit Service 8bf002
    copy ..\noconfig\which-compiler.mak Makefile
Packit Service 8bf002
Packit Service 8bf002
  patch は UNIX 系システムのコマンドですが、Windows にも移植されているの
Packit Service 8bf002
で、それを使います。もちろん、差分ファイルを見て、エディタで修正してもか
Packit Service 8bf002
まいません。
Packit Service 8bf002
Packit Service 8bf002
3、2、必要ならさらに noconfig.H, Makefile を修正する
Packit Service 8bf002
  差分ファイルでは各種ディレクトリの設定が筆者の環境を元にしているので、
Packit Service 8bf002
自分の環境に合わせて修正します。
Packit Service 8bf002
  使う処理系が差分ファイルのものとはバージョンが違っている場合は、ヘッダ
Packit Service 8bf002
ファイル noconfig.H にさらに修正を加えます(noconfig.H そのものおよび
Packit Service 8bf002
mcpp-porting.html 3.1 を参照)。通常使う multi-byte character が日本語で
Packit Service 8bf002
はない場合も同様に、nocongig.H の MBCHAR というマクロの定義を書き換えま
Packit Service 8bf002
す。
Packit Service 8bf002
  また、実行プログラムをインストールするディレクトリを Makefile の
Packit Service 8bf002
BINDIR という変数に書きます。Visual C 用の Makefile では次の行の # を削
Packit Service 8bf002
除して、install ターゲットを有効にしてください。
Packit Service 8bf002
Packit Service 8bf002
    #install :
Packit Service 8bf002
Packit Service 8bf002
3、3、compiler-independent-build
Packit Service 8bf002
  これで  make して make install すると、compiler-independent 版の実行プ
Packit Service 8bf002
ログラムが生成されてインストールされます(Visual C++ では make ではなく
Packit Service 8bf002
nmake を使う)。
Packit Service 8bf002
Packit Service 8bf002
3、4、compiler-specific-build
Packit Service 8bf002
  compiler-specific 版を生成するためには、まず Makefile の BINDIR をその
Packit Service 8bf002
処理系の実行プログラムの置かれているディレクトリに書き換えます。そして、
Packit Service 8bf002
noconfig.H の次の行の 'INDEPENDENT' をそのコンパイラを表すマクロに書き換
Packit Service 8bf002
えて、'make' し 'make install' します。
Packit Service 8bf002
Packit Service 8bf002
    #define COMPILER    INDEPENDENT
Packit Service 8bf002
Packit Service 8bf002
'COMPILER' は make のオプションで上書きすることもできるので、noconfig.H
Packit Service 8bf002
は必ずしも書き換える必要はありません。例えば、Visual C では 'nmake
Packit Service 8bf002
COMPILER=MSC' として 'nmake COMPILER=MSC install' します。Borland C では
Packit Service 8bf002
'make -DCOMPILER=BORLANDC' として 'make -DCOMPILER=BORLANDC install' し
Packit Service 8bf002
ます。
Packit Service 8bf002
Packit Service 8bf002
  もし、ターゲット処理系とコンパイルする処理系とが違っている場合は、
Packit Service 8bf002
noconfig.H / Part 1 をターゲット処理系の仕様に合わせ、Part 2 をコンパイ
Packit Service 8bf002
ルする処理系の仕様に合わせます。Makefile はコンパイルする処理系用のもの
Packit Service 8bf002
を使い、インストールするディレクトリをターゲット処理系用に変更します。
Packit Service 8bf002
Packit Service 8bf002
  しかし、Windows の処理系の多くはプリプロセッサがコンパイラ本体と一体に
Packit Service 8bf002
なっているので、MCPP をインストールしてもプリプロセッサを置換することが
Packit Service 8bf002
できません。そうした処理系で MCPP を使うためには、そのように makefile を
Packit Service 8bf002
書く必要があります。noconfig ディレクトリの各 makefile には、MCPP を使っ
Packit Service 8bf002
て MCPP をリコンパイルする設定が書いてあるので、それを参考にしてください。
Packit Service 8bf002
  Visual C++ ではそうした makefile を使って、IDE で「メイクファイルプロ
Packit Service 8bf002
ジェクト」を作成すると、IDE のソースレベルデバッグ等の機能がすべて使えま
Packit Service 8bf002
す(mcpp-manual.html 2.10 参照)。
Packit Service 8bf002
Packit Service 8bf002
3、5、テスト
Packit Service 8bf002
  Windows では MinGW / GCC-specific-build および CygWIN 以外では include
Packit Service 8bf002
directory は設定されないので、INCLUDE という環境変数で設定します(必要な
Packit Service 8bf002
ら CPLUS_INCLUDE も)。
Packit Service 8bf002
  Windows では GCC / testsuite は使えないので、test-t, test-c, test-l デ
Packit Service 8bf002
ィレクトリにあるテスト用サンプルを直接、プリプロセスして確かめます。tool
Packit Service 8bf002
/cpp_test.c を使うと、一部のテストだけですが、自動的に実行できます(cpp-
Packit Service 8bf002
test.html 3.2.2 参照)。
Packit Service 8bf002
  compiler-specific-build では、MCPP 自身をプリプロセッサとして使って、
Packit Service 8bf002
MCPP の "pre-preprocess" という機能を使って MCPP をリコンパイルしてみる
Packit Service 8bf002
と、その処理系でとりあえず使えるようになったかどうかを確かめることができ
Packit Service 8bf002
ます(mcpp-porting.html 3.7 参照)。
Packit Service 8bf002
Packit Service 8bf002
4、移植のための情報をお寄せください
Packit Service 8bf002
Packit Service 8bf002
  MCPP をまだ移植されてない処理系に移植するためには、多くの情報が必要で
Packit Service 8bf002
す。みなさんの情報をお待ちしています。
Packit Service 8bf002
  GCC 以外の処理系について configure のオプションで指定する値がおわかり
Packit Service 8bf002
のかたは教えてください。configure.ac に取り込んでゆきたいと思います。
Packit Service 8bf002
Packit Service 8bf002
5、「検証セット」とは
Packit Service 8bf002
Packit Service 8bf002
  MCPP には「検証セット」というものが付属しています。これは C/C++ プリプ
Packit Service 8bf002
ロセッサについて 265 項目にわたる徹底的なテストと評価をするものです。
Packit Service 8bf002
MCPP だけでなく任意のプリプロセッサに適用することができます。その使い方
Packit Service 8bf002
については、cpp-test.html 3.1, 3.2 を参照してください。
Packit Service 8bf002
Packit Service 8bf002
2008/11
Packit Service 8bf002
                                         松井 潔 <kmatsui@t3.rim.or.jp>
Packit Service 8bf002