2010年05月28日
Portable C Compiler をビルドしてみる
最近では gcc、clang に押され気味 (?) ですが、老舗の C コンパイラとして PCC (Portable C Compiler) があります。
http://ja.wikipedia.org/wiki/Portable_C_Compiler
なぜいまPCC? - 高速さとクオリティの高いコード出力が魅力 (2007/10/16)
とりあえずビルドしてみましょう。
Windows ターゲットの場合、Visual Studio と flex/bison が必要とのこと。
building - pcc portable c compiler
とりあえず Visual Studio 2008 と、MinGW の flex/bison で試してみます。
bison.simple というファイルが何なのかよくわからないのですが、少なくとも bison 1.4.1 には入っていませんでした。
GnuWin32 のサイトから、bison-1.35-4-bin.zip を持ってきて展開したところ、share/bison 以下に bison.simple と bison.hairy がありました。
tarball の展開には MSYS の tar を使っていますが、何でも良いと思います。(以下は Visual Studio 2008 コマンドプロンプトなので、MSYS のツールを使用する際には絶対パスで指定しています。もちろん PATH を通しても良いのですが、今は tar.exe しか使わないので。)
Setting environment for using Microsoft Visual Studio 2008 x86 tools. c:\Program Files\Microsoft Visual Studio 9.0\VC>path c:\mingw\bin;%path% c:\Program Files\Microsoft Visual Studio 9.0\VC>flex --version flex version 2.5.4 c:\Program Files\Microsoft Visual Studio 9.0\VC>bison --version bison (GNU Bison) 2.1 (省略) c:\Program Files\Microsoft Visual Studio 9.0\VC>cd c:\work\pcc C:\work\pcc>c:\msys\1.0\bin\tar.exe zxvf pcc-100525.tgz C:\work\pcc>cd pcc-cvs-100524\os\win32
os/win32 に、bison.simple をコピーしておきます。
これで build.bat を /cl オプション(VC++ でビルドする場合)で実行してみると、_vsnprintf() 周りでエラーが出ます。
C:\work\pcc\pcc-100525\os\win32>cl.exe -D__MSC__ -o pcc.exe -DWIN32 -DGCC_COMPAT -DPCC_DEBUG -DCPP_DEBUG -DTARGOS=win32 -Dos_win32 -Dmach_i386 -DLIBEXECDIR="" - D_CRT_SECURE_NO_WARNINGS /nologo /Zi /MT /W2 -I..\..\cc\cc -I..\..\os\win32 -I.. \..\arch\i386 -I..\..\mip ..\..\cc\cc\cc.c ..\..\mip\compat.c cl : コマンド ライン warning D9035 : オプション 'o' の使用は現在推奨されていませ ん。今後のバージョンからは削除されます。 cc.c c:\Program Files\Microsoft Visual Studio 9.0\VC\INCLUDE\stdio.h(358) : error C31 63: '_vsnprintf': 属性が前の宣言と整合しません c:\Program Files\Microsoft Visual Studio 9.0\VC\INCLUDE\stdio.h(350) : ' _vsnprintf' の宣言を確認してください。 compat.c c:\Program Files\Microsoft Visual Studio 9.0\VC\INCLUDE\stdio.h(358) : error C31 63: '_vsnprintf': 属性が前の宣言と整合しません c:\Program Files\Microsoft Visual Studio 9.0\VC\INCLUDE\stdio.h(350) : ' _vsnprintf' の宣言を確認してください。
もともと Visual Studio 7 でしか確認されていないようですし、あまりメンテナンスされていない感じです。
そもそも後半の方で、pcc-libs というディレクトリ以下のソースコードが軒並み Not Found になっています。ファイル名で検索してみても、どこにもそんなディレクトリやファイルはありません。どうも不安です。
キーワードで検索してみたところ、VS 2008 でビルドに成功している方がいました。
いきちがいのぷろぐらむあ 雑記/2010-3-9[火] マイナーなCコンパイラをちょっと触る
なるほど、pcc-libs は pcc とは別にソースコードが必要なんですね。
pcc-libs-100525.tgz をダウンロードして、同様に展開しました。
上記記事を参考に、os/win32/config.h を修正し、ビルド。なるほど、先に stdio.h をインクルードしておかないと、vsnprintf() が置換されてしまってエラーになるんですね。
C:\work\pcc>c:\msys\1.0\bin\tar.exe zxvf pcc-libs-100525.tgz C:\work\pcc>cd pcc-100525\os\win32 C:\work\pcc\pcc-100525\os\win32>fc config.h config.h.orig ファイル config.h と CONFIG.H.ORIG を比較しています ***** config.h #if !defined(vsnprintf) #include <stdio.h> #define vsnprintf _vsnprintf ***** CONFIG.H.ORIG #if !defined(vsnprintf) #define vsnprintf _vsnprintf ***** C:\work\pcc\pcc-100525\os\win32>build /cl /pccsrcdir C:\work\pcc\pcc-100525 /pcclibssrcdir c:\work\pcc\pcc-libs-100525
なにやら大量の警告が出ていますが、一応 pcc.exe や libpcc.a はできてるみたいです。ビルドはすぐ終わります。私の環境では 30 秒もかかりませんでした。
C:\work\pcc\pcc-100525\os\win32>dir /b *.exe *.a mkext.exe pcc.exe libpcc.a
ちょっと長くなってしまいましたので、今回はここまでです。
追記: 実は上手く行ってませんでした。すいません…