cfg1.8.0をMinGWとBoostでビルドする

cfgが1.8.0にあがったので、チェックを含めて再掲します。
cfgをビルドするに当たって、以下の環境を用意しました

  • MinGW
  • gcc (4.6.1)
  • boost (1.49)
  • cfg (1.8.0)
  • VisualStudio 2010 Express

Boost 1.49のビルド

Visual Studioコマンドプロンプトを起動し、解凍したBoostフォルダへ移動します。
続いて、以下のコマンドでbjamを作成します。

>bootstrap.bat

VSのコマンドプロンプトを終了し、以下はMinGWのShellで実行します

$ bjam -sTOOLS=mingw --toolset=gcc --without-python --without-mpi --build-type=complete variant=release link=static threading=multi runtime-link=static release debug stage -j2 install

boostがビルドされて、C:\Boostフォルダ配下にインストールされます。

cfgのビルド

cfg1.8.0を展開し、cfgフォルダの配下でconfigureを行います。

$ ./configure --with-headers="C:/Boost/include/boost-1_49" --with-libraries="C:/Boost/lib"

以下のように出力されます。

LIBBOOST_SUFFIX=-mgw46-mt-s-1_49
BOOST_VERSION=1_49
BOOST_DIR=C:/Boost/include/boost-1_49
LIBBOOST_DIR=C:/Boost/lib
OPTIONS=

もしエラーが出た場合は、Makefile.configのパラメータを環境に合わせてエディタで変更してもよいです。

$ make

で、cfg\cfg.exeが生成されます。

MinGWでXerces-c(3.1.1)をビルドする(ICUライブラリを使う)

icu49.1ライブラリの作成

icu49.1を使用しました。

$ ../runConfigureICU MinGW --disable-shared --enable-static
$ make

でビルドしていきますが,どうやらMinGWのシェルとconfigureがマッチしていない模様。
それでもライブラリファイルは作成されているので,手動でrenameすればビルドが通ります。

$ make install

で/usr/local/bin,/usr/local/lib,/usr/local/includeにコピーされます。

Xerces-c

../configure --disable-pretty-make --disable-network --enable-transcoder-icu --disable-shared --with-icu=/usr/local CFLAGS=-O3 CXXFLAGS=-O3

configure: Report:
configure:   File Manager: Windows
configure:   Mutex Manager: Windows
configure:   Transcoder: icu
configure:   NetAccessor: disabled
configure:   Message Loader: inmemory

と出力されれば,xercesでICUが使えるようになります。*1

*1:ライブラリがあるのにconfigureでicuを検知してもらえない場合は,$xerces_cv_icu_presentを強制的にYESにします

cfgファイルの内容を変更する quick hack

本当はTESRYの書式を変更して,Rubyでのメモリの持ち方を変更…なんてことをしなければいけないのですが,とりあえず手早くcfgファイルの内容を変更したいわけです。*1

{TTSP}\tools\ttg\bin\builder\CBuilder.rbのmake_cfg()が出力をしているところなので,ここで変更できるものであれば直接修正できます。

例えば

    def make_cfg()
      # 出力コードの臨時文字列
      sCfgCode = <<-EOS
#{VERSION}
INCLUDE("target_timer.cfg");
INCLUDE("syssvc/syslog.cfg");
INCLUDE("syssvc/serial.cfg");
#include "#{@sFileName}.h"

      EOS

    def make_cfg()
      # 出力コードの臨時文字列
      sCfgCode = <<-EOS
#{VERSION}
INCLUDE("target_mem.cfg");
KERNEL_DOMAIN {
	INCLUDE("target_timer.cfg");
	INCLUDE("syssvc/syslog.cfg");
	INCLUDE("syssvc/serial.cfg");
}
#include "#{@sFileName}.h"

ATT_MOD("out.o");
ATT_MOD("log_output.o");
ATT_MOD("vasyslog.o");
ATT_MOD("t_perror.o");
ATT_MOD("strerror.o");

KERNEL_DOMAIN {
      EOS

とすると少し幸せになれます。

*1:本当に自分用のメモとしか言い用がない

MinGWでXerces-c(3.1.1)をビルドする

MinGWmingw-get-inst-20111118.exeを使いました。
昨日の続きです。実はこっちがやりたかったのですが,configureすら通らなかったり,ライブラリが大きく(40MBくらい)なったりしてどうしようと思っていました。

で今回はWinsockは使用しないので

 ../configure --disable-pretty-make --disable-network --enable-msgloader-iconv
CFLAGS=-O3 CXXFLAGS=-O3

でconfigureしてmake & make installで/usr/local以下にインストールされます。

ライブラリも

drwxr-xr-x 2 hoge Administrators        0 Mar  1 19:00 .
drwxr-xr-x 5 hoge Administrators        0 Mar  1 19:00 ..
-rw-r--r-- 1 hoge Administrators 10706760 Mar  1 19:00 libxerces-c.a
-rw-r--r-- 1 hoge Administrators      904 Mar  1 19:00 libxerces-c.la
-rw-r--r-- 1 hoge Administrators      905 Mar  1 19:00 libxerces-c.lai

と相成りました。めでたし。

CygwinでXerces-c(3.1.1)をビルドする

ここにconfigureのオプションがあるので,それに忠実であれば問題ないかと思います

スタティックリンクだけ必要だったので以下のようにconfigureしました

./configure --enable-transcoder-windows --disable-shared CFLAGS=-O3 CXXFLAGS=-O3 LDFLAGS=-no-undefined

あとはmakeすればサンプルコードもビルドしてくれます。
ライブラリはsrc/.libの下にできます。

-rw-r--r--  1 hogehoge Domain Users 9480166 2月  29 16:02 libxerces-c.a
lrwxrwxrwx  1 hogehoge Domain Users      17 2月  29 16:02 libxerces-c.la -> ../libxerces-c.la
-rw-r--r--  1 hogehoge Domain Users     942 2月  29 16:02 libxerces-c.lai

MinGW(gcc 4.6.2)とBoost 1.48を使ってcfg1.7.0をビルドする

いままで軟弱にVS+BoostProでcfgをビルドしてましたが,漢なら黙ってmsysだろと言われていそうな気がしたのでやりましたよ*1

まずはMinGWでBoost1.48をビルド

Boostを展開して,

$ bootstrap.sh

でうまくいくかなと思ったら,sys/wait.hが無いと言われました。*2
bootstrapではb2.exeやbjam.exeを作るところなので,他の環境でもいいだろうということで,今回はVS9のコマンドラインから

>bootstrap.bat

で作成しました。
続いて,msysからbjam.exeを使って

$ bjam -sTOOLS=mingw --toolset=gcc --stagedir="./stage/mingw" --without-python --without-mpi --build-type=complete variant=release link=static threading=multi runtime-link=static release debug stage -j2

しばしコーヒーブレイクします。
カレントディレクトリの./stage/mingw/libにMinGW用のBoostライブラリができあがります。

BOOSTのライブラリは

作成したライブラリをみると,libboost_(ライブラリ名)-mgw46-mt-s-1_48.aのような名前になっていると思います。

cfgのMakefile.config

cfgフォルダに移って
./configureでMakefile.configを作成します。

boostをmsysのhomeディレクトリで作成し,ライブラリディレクトリがstage/mingw/libにある場合
作成したMakefile.configファイルを以下のように修正します。

LIBBOOST_SUFFIX=-mgw46-mt-s-1_48
BOOST_VERSION=1_48
BOOST_DIR=/home/hoge/boost_1_48_0
LIBBOOST_DIR=/home/hoge/boost_1_48_0/stage/mingw/lib
OPTIONS=

私の使っているmsysではMakefileでOSTYPEをmsysで認識していません。
リンク時にエラーが出る場合はcfgフォルダのMakefileを修正すればできるはずです。

MinGWのDLLから逃れるためには

上までのステップでmsys環境でcfgが動作しますが,それ以外の環境で動かそうとするとDLLが足りないというメッセージがでます。
ので,DLLがいらないように静的リンクをするようにcfg/Makefileの以下の部分を書き換えます。

cfg: $(OBJFILES) $(LIBFILES)
	$(CXX) $(CXXFLAGS)  -std=c++0x -DBOOST_THREAD_USE_LIB -static-libgcc -static-libstdc++ -o cfg $(OBJFILES) -L$(LIBBOOST_DIR) $(LIBFILES) $(BOOST_LIBFILES)

これでcfg.exeの完成です。

*1:実は中で要請があったのです

*2:いまだにMinGWで無いのはなぜなんだろう

TTSP Tips

数日動かしてみてテストができるようになってきた(まだ全パス通っていない)が、これまでの間にはまったTipsというかBad Knowhowをいくつか紹介。

  • kernel libraryは作ったほうがよい

テストケースのビルドでエラーになる場合は、kernel library作成時にも起こるので問題を切り分けるためにもkernel libraryの作成の時にビルドエラーを発見しておいたほうがよい

  • ビルドエラーが出る場合はビルドログをオリジナルと比較する

libkernelができていて実行形式ファイルが作成されない場合は、オブジェクトファイルがオリジナルのビルドと足りなくないか確認すること。特にTTSPのターゲット依存部マクロ(KERNEL_COBJS_TARGET)はオリジナルのターゲット依存部のマクロ(KERNEL_COBJS)を上書きしてしまうので要注意。追加でよかったのでは?と思うのだけれども設計思想なのかな

  • 設定ファイルを変更した場合はTTSPを再起動させる

設定ファイルを変えても何でコマンドが変わらないのだろうとずーっとはまっていたのがコレ。おそらくRubyで設定ファイルを読み込んでからメニューに飛んでいるからだろう。リロード機能がほしいところ