2007-04-01から1ヶ月間の記事一覧

var_expand_grammar その3

今日は残りの変数展開修飾子を実装しました。 差分 :D (親ディレクトリの選択) :D=path (親ディレクトリの置換) :B (ベースファイル名の選択) :B=base (ベースファイル名の置換) :S (拡張子の選択) :S=suf (拡張子の置換) :M (アーカイブメンバの選択) :M=me…

var_expand_grammar その2

var_expand_grammarをいくつかの修飾子に対応させました。 今日の成果物 修飾子は変数を展開するときに適用されるフィルタのようなもので、 X = abc ; ECHO $(X:U) ; # 「ABC」を出力のように使います。 実装した修飾子は以下の通りです。 [n]、[n-]、[n-m] …

ルールの呼び出し

bjamのルール呼び出しと代入を区別するのに四苦八苦しています。 ふと思いつきで、次のbjamコードを試したところ、ECHOルールの呼び出しとして解釈されました。 hoge = ECHO ; $(hoge) abc ; # 「abc」を出力次のコードも同様です。 hoge = ECHO abc ; $(hog…

bjam_win その13

bjamインタプリタの実装を検討中です。 bjamの実行の単位/スコープとしては、 グローバル ({〜}による)明示的なブロック if/for/while/switchのブロック rule(関数に相当) などがあります。 パースの段階でこれらを文字列のまま保存しておいて、必要に応じて…

1.34 beta

ここを読んでる人には言わずもがなですが、Boost 1.34のベータ版がリリースされました。 CVS追ってるので、今更感はありますが。 一時期Boost.Asioが間違って1.34ツリーに入ってたんで、ちょっと前まで1.34に入るとばかり思ってましたが、1.35まで入りません…

glob()

インタプリタ自体の実装になかなか取り掛かる気になれず、現実逃避的にGLOBルール相当のglob()関数を作りました。 std::vector<std::string> glob( const boost::filesystem::path& work, // 作業ディレクトリ(フルパス) const std::string& dir, // 調べるディレクトリ(</std::string>…

pattern_match

case文と組み込みのGLOBルール用にbjamのパターンマッチを実装しました。 bjamで使えるパターンはワイルドカード("*","?")とキャラクタークラス("[a-z]"等)で、一般的な正規表現と表記が異なるためBoost.Regexをそのまま使うことは出来ません。 http://artic…

var_expand_grammar

簡易bjamインタプリタ実装の手始めとして、変数の展開を行うパーサー(?)var_expand_grammarを作りました。 bjam(というかjam)の変数展開は直積集合を形成するのが特徴的です。 X = a b c ; ECHO t$(X) ; # 「ta tb tc」を出力これを素直に表現するため、変数…

bjam_win その12

bjam_winのパース精度を上げるため、BoostのJamfile.v2の傾向を調査しました。 ターゲット名に直接関係のあるルール32個中14個は、 ルール名にtestやrun等を含む 仮引数の名前にnameやsources等を含む もので、わずかにターゲット名が異なるのが15個でした。…

bjam_win その11

今日はinstallとboostbookに対応しただけです。 今日の差分 boostbook用のアクターがかなりいい加減です。 class push_back_boostbook_actor { public: explicit push_back_boostbook_actor(std::vector<std::string>& vs) : vs_(vs) { } template<class Iterator> void operator()(Iterat</class></std::string>…

bjam_win その10

今度はBoostのルートJamfile.v2で問題が発生しました。 libraries = [ libraries-to-install $(all-libraries) ] ;これが、スキップパーサーのせいで、 lib raries = [ lib raries-to-install $(all-libraries) ] ;のように分割されてしまいました。 libルー…

bjam_win その9

昨日の予想通りの方法で、テストのターゲット名取得を実装しました。 これでBoostのtest用Jamfile.v2の大半はパースできるようになりました。 以下、実装の解説です。

bjam_win その8 clean

今日はバグ修正とパーサーの改良が主です。 バグ修正の差分 clean対応の差分 「a"b"c」のようなリテラルに対応 「〜-fail」のパースがおかしかったのを修正 「bpl-test」に対応 ターゲットのCleanに対応 BoostのJamfile.v2をいろいろ試して、新たに見つかっ…

bjam_win その7

Boost 1.34でも無事に動くようになったので、機能追加です。 昨日実装したexe/libに加え、testing.jamで定義される、 compile compile-fail link link-fail run run-fail に対応しました。 テストのソースファイル名が「hoge.cpp」なら「hoge.test」がターゲ…

Boost 1.34 のスキップパーサー

昨日のBoost 1.34で上手くパースできない問題ですが、CVSの履歴を二分探索で追ったところ、2005/10/18の変更が影響していました。 http://boost.cvs.sourceforge.net/boost/boost/boost/spirit/core/scanner/impl/skipper.ipp?r1=1.8&r2=1.9 Boost 1.33.1ま…

bjam_win その6

bjam_grammarがそれなりに動くようになったので、bjam_winに組み込んでみました。 今日の差分 名前はbjam_grammarですが、exe/libのターゲット名を取り出すことにしか使えません。 exe = "exe" >> literal[push_back_a(self.storage)] >> ':' >> *( varexp |…

bjam_grammar

bjamのパーサーをBoost.Spiritで書いています。 これまでBoost.Spiritで大きなパーサーは書いたことなかったので四苦八苦しています。 ↓とりあえず、これでかなり悩みました。 Boost.Spirit FAQ: The lexeme_d directive and rules FAQに従うと、jamのリテラ…

bjam_win その5

bjam_winでvariant/threading/link/runtime-linkのオプションを指定できるようにしました。 差分 実装はtoolsetの選択と大差ないので簡単です。 手間の大部分はrebarの処理とコードの整理に費やしています。 あと、bjamの実行ログを自動スクロールするように…

toolsetの指定方法

Boost.Build v2でツールセットを指定する場合、「gcc-mingw-3.4.2」のような指定は駄目なようで、この場合「gcc-3.4.2/toolset-gcc:flavor=mingw」とするのが正しいようです。 以下、有効な指定方法 gcc-3.4.2/toolset-gcc:flavor=mingw gcc/toolset-gcc:fla…

redirect_stream_to_stdout()

標準エラー出力から標準出力へのリダイレクトを実装しました。 差分 よく使うであろうパターンはこうなります。 context ctx; // 標準入力と標準出力をパイプで捕捉 ctx.stdin_behavior(capture_stream()); ctx.stdout_behavior(capture_stream()); // 標準…

bjam_win その4

bjam_winにツールセットを選択するためのコンボボックスを追加しました。 今日の差分 とりあえずツールセットは、 msvc-8.0 msvc-7.1 gcc-mingw-3.4.2 の三つに固定されています。 コンボボックスはrebarの上に置いているんですが、rebarは扱いが面倒ですね…

bjam_win その3

今日はあまり進みませんでした。 UI周りの微調整だけです。 今日の差分 Jamfile.2のパスをタイトルバーに表示するようにした ファイルのドラッグ&ドロップに対応した コマンドラインでファイル名を指定できるようにした bjamの起動オプションを変更できるよ…

bjam_win その2

bjamのGUIも少し改良しました。 ログのリストボックスに水平スクロールバーを追加 プロセスの起動状態とメニュー項目のオン/オフを同期させるようにした 今日の成果物 まだ、コマンドプロンプトで実行するのと大差ないです。

shell_expand

昨日作ったlaunch_shell()のラッパーとして、シェルのコマンド展開のような働きをする関数を追加しました。 実装はこんな感じです。 std::string shell_expand(const std::string& cmd) { // 標準出力のみパイプで受け取る context ctx; ctx.stdout_behavior…

launch_shell

今日は昨日のbjam_winの実装で気付いた点をいろいろ修正しました。 Boost.Processに合わせてipc_mapをcontextに改名 作業ディレクトリを設定するcontext::work_directory()を追加 ライブラリのオートリンクに対応 子プロセスの実行時にコマンドプロンプトが…

bjam_win

Hamigaki.Processを使って、bjamのGUIフロントエンドを作成中です。 またもやGoogle SoC 2007とネタがかぶってますが、気にしてはいけません。 目標は、 test-suiteルールに含まれるテストを選択的に実行する exeルールで作成した実行ファイル(ディレクトリ…

ファイル記述子の継承とマルチスレッド

今日は昨日の話のPOSIX版です。 Windowsのハンドルに対応する概念はPOSIXではファイル記述子です。 ファイル記述子もハンドルと同じく子プロセスに継承させることができます。(というかWindowsの方がマネしているんでしょうが。) 面倒なことに、ファイル記述…

ハンドルの継承とマルチスレッド

今日は子プロセス問題のWindows版についてです。 Windowsで子プロセスと標準入出力を使って通信するためには、通常、 親プロセスが無名パイプを作成する パイプの一端のハンドルを「継承可能」にする STARTUPINFO構造体のhStdInput等に継承可能にしたパイプ…

Hamigaki.Process for POSIX

POSIX用の実装もとりあえずできました。 POSIX用差分 execve()したsortが上手く動かないと思ったら、argvの終端をNULLポインタでなく、空文字列("")にしていました。 その他の修正 child::wait()の戻り値用にstatusクラスを作った chileのデストラクタで(ま…

Hamigaki.Process

Windows版のHamigaki.Processを作りました。 今日の成果物 とりあえず必要最低限の機能だけです。 機能の例はおおよそこうなります。 #include <hamigaki/process/child.hpp> #include <iostream> namespace proc = hamigaki::process; int main() { try { proc::ipc_map ipc; ipc.stdin_behavior(p</iostream></hamigaki/process/child.hpp>…