2007-07-31

SCons Tips

builder method で,ソースファイルの共通のディレクトリを指定できる.

env.Program('hello', ['foo.c', 'bar.c'], srcdir = 'src')

このことはドキュメントには書かれていない.man scons を参照せよ.

SCons での裸の builder method

SConstruct で Environment オブジェクトのメソッドでない builder method を記述できる.

Program('hello', ['hello.c'])

このとき scons を起動するマシンに最適化されたデフォルトの Environment オブジェクトに対して builder method が呼び出される.

このことはドキュメントには書かれていない.man scons を参照せよ.

2007-07-26

SCons における Options

  • scons コマンドのコマンドラインで指定する VAR=val 形式のビルドオプションは ARGUMENTS という辞書に入れられるので利用できる.
  • if (int(ARGUMENTS.get('debug', 0))):
        env.Append(CCFLAGS = '-g')
    
  • これでは面倒なので Options というクラスが用意してある.Options に指定した変数は,Environtment を作成するときに指定することで Construction Variable としてインクルードされる.
  • opts = Options(CC = 'special-gcc')
    env = Environtment(options = opts)
    
  • Options に指定された変数をコマンドラインでオーバーライドできる.また,Opitons の変数=値ペアをファイルから読み込むこともできる.
  • ビルドオプションの指定形式として,BoolOption, EnumOption, ListOption, PathOption, PackageOption が用意されている.

SCons と環境変数

  • SCons がツールを呼び出すときの環境は scons コマンドを呼び出したときの環境とは関係が無く,$ENV という Construction Variable に格納されている辞書から構成される新しい環境である.
  • 特に,PATH 環境変数もユーザが .bashrc などで設定したものでなく,デフォルトの /usr/local/bin:/bin:/usr/bin (Unixの場合) が使われる.

SCons における Construction Variable

  • Construction Variable はビルドツールの呼び出し方法を制御する.
  • Construction Variable の集合が Environment である.
  • Environment とは Construction Variable=Value pair の集合 + Builder Methods
  • 作成:
  • env = Environtment(VAR1 = 'val1', VAR2 = 'val2')
    
  • 値の取り出し
  • print env['VAR1']
    
  • 値の取り出し(再帰的に変数展開)
  • print env.subst('$VAR1')
    
  • 値の数え上げ
  • dict = env.Dictionary()
    keys = dict.keys()
    keys.sort()
    for key in keys:
    	print "[%s] => [%s]" % (key, dict[key])
    
  • 値の代入
  • env.Replace(VAR1 = 'val1a')
    
  • 値の追加
  • env.Append(VAR1 = ' val1b')
    

2007-07-13

SCons でのコンパイルオプション

ops = Option('config.py')
ops.Add('CONFIG_SUPPORT_HTML', '(help string)', 0)
env = Environtment(options = ops, CPPDEFINES = { 'CONFIG_SUPPORT_HTML' : '${CONFIG_SUPPORT_HTML}' })
env.Program('hello.c')

config.py が無い場合 -D CONFIG_SUPPORT_HTML=0

config.py が,

CONFIG_SUPPORT_HTML = '1'

のとき,-D CONFIG_SUPPORT_HTML=1

$ scons CONFIG_SUPPORT_HTML=2

と呼び出すと,config.py があっても無くても -D CONFIG_SUPPORT_HTML=2

2007-07-02

Perl における例外の基礎

croak と eval を使用.

use Carp;

sub f {
    ...
    if (something is bad) {
        croak "fail";
    }
    ...
    return something_good;
}

...
my $r = eval { f(); };
if ($@) {
    croak "f() fails.";
}
...

参照

2007-07-01

Perl の LWP でのタイムアウト

  •  $ua->request() でタイムアウトすると,'500 read timeout' のエラーを持つ response が返される.
  • $ua->request() で接続できないときには,'500 Can\'t connect to' のエラーを持つ response が返される.

Perl で euc-jp の端末に出力

Perl で euc-jp の端末に出力する.

binmode STDOUT, ':encoding(euc-jp)';