scons on windows その1

blenderとかtolua++のビルドシステムに使われているsconsを調べているのでメモ。sconsはプロジェクトビルドのうち、makeの機能を代替するpython製のツールだ。依存性を解決してコンパイラを呼び出して、リンカを呼び出すというあれ。blenderだとsconsに加えてcmakeもビルドツールに採用されているが、sconsとcmakeは守備範囲が微妙に違う。cmakeはconfigureみたいにMakefileとかvcプロジェクトを生成するというものだ。
sconsは、Unix系とWindowsの両方が考慮されていてるのと、makeの代行ということでコンパイラ等の呼び出しを自分でやるというところがいい。要するにcl.exeを使いたいときに、nmake使ったり、vcbuildがあったりなかったりするのに悩まなくていい(ide使えw)。

ことはじめ

64bitWindows7にpython2.7とscons-2.1.0.alpha.20101125.win32.exeをインストールした。
PATHを C:\Python27とC:\Python27\Scriptsに通した。
sconsのチュートリアルにならって、c++hello worldをビルドしてみる。

SConstruct

env=Environment()
env.Program(target='hello', source=['hello.cpp'])

dosで実行

> dir
hello.cpp SConstruct
> scons
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
cl /Fohello.obj /c hello.cpp /TP /nologo
'cl' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
scons: *** [hello.obj] Error 1
scons: building terminated because of errors.

clはパス通ってないから仕方ない。あらためて、vcをインストールするとスタートメニューにできる「Visual studio コマンドプロンプト」でdosを開始して中で再度実行。

'cl' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。

なぜだー。

FAQの先頭に書いてあった。
http://www.scons.org/wiki/FrequentlyAskedQuestions#shell_env
sconsはデフォルトでは環境変数見ねぇ。
環境変数使うには下記のようする

import os
env=Environment(ENV=os.environ)
env.Program(target='hello', source=['hello.cpp'])

ビルドできた。

改良版

import os
env=Environment(ENV=os.environ, tools=['default', 'msvc'])
print 'MSVC_VERSION: %s' % env['MSVC_VERSION']
env['CCFLAGS']+=['/EHsc']
env.Program(target='hello', source=['hello.cpp'])

最小限必要な環境変数を探る

import os
env=Environment(
        ENV={
            'PATH': os.environ['PATH'],
            'INCLUDE': os.environ['INCLUDE'],
            'LIB': os.environ['LIB'],
            },
        tools=['default', 'msvc']
        )
print 'MSVC_VERSION: %s' % env['MSVC_VERSION']
env['CCFLAGS']+=['/EHsc']
env.Program(target='hello', source=['hello.cpp'])

Visual studio コマンドプロンプト」でビルドできた。

import os

vs_path='C:\\Program Files (x86)\\Microsoft Visual Studio 10.0'
vc_path=vs_path+'\\VC'
sdk_path='C:\\Program Files (x86)\\Microsoft SDKs\\Windows\\v7.0A'

env=Environment(
        ENV={
            'PATH': ';'.join([
                vc_path+'\\BIN',
                vs_path+'\\Common7\\IDE',
                ]),
            'INCLUDE': ';'.join([
                vc_path+'\\INCLUDE',
                sdk_path+'\\include',
                ]),
            'LIB': ';'.join([
                vc_path+'\\LIB',
                sdk_path+'\\lib',
                ]),
            },
        tools=['default', 'msvc']
        )
print 'MSVC_VERSION: %s' % env['MSVC_VERSION']
env['CCFLAGS']+=['/EHsc']
env.Program(target='hello', source=['hello.cpp'])

素のdos promptでビルドできた。