9

カスタム ビルダーの一部として、2 つのプログラムを順番に実行する必要があります。

そのうちの 1 つは、私が立ち往生していて、絶対/相対パスを処理できないプログラムであるchdir=1ため、ビルダーのオプションを使用して、そのアクションがターゲットと同じディレクトリで実行されるようにする必要があります。

tools2 つ目は、プロジェクトのサブディレクトリにあるスクリプトです。SConstruct ファイルはプロジェクトのルートにあります。このスクリプトを実行するアクションを作成する必要がありますが、プロジェクトへの絶対パスも、ターゲットが配置されているtoolsディレクトリからスクリプトが配置されているサブディレクトリまでの相対パスもないため、問題が発生しています。どうにかしてプロジェクトのルート ディレクトリへの絶対パスを取得できれば、準備は万端です。`tools/myscript.bar' を連結するだけで済みます。

多かれ少なかれ、私が持っているものは次のとおりです。

env['BUILDERS']['FooBar'] = Builder(action = [
    'c:/bin/foo.exe ${SOURCE.filebase}',
    'c:/bin/bar-interpreter.exe myscript.bar ${SOURCE.filebase}',
    ], chdir=1);

問題は、「myscript.bar」が見つかるように、問題のアクションを次のように変更する必要があることです。

env['BUILDERS']['FooBar'] = Builder(action = [
    'c:/bin/foo.exe ${SOURCE.filebase}',
    'c:/bin/bar-interpreter.exe $PATHTOHERE/tools/myscript.bar ${SOURCE.filebase}',
    ], chdir=1);

これはとても簡単に思えますが、方法がわかりません。

4

2 に答える 2

19

ソースディレクトリの先頭を示すには、「#」を使用する必要があります。

print Dir('#').abspath

このバージョンは、バリアントディレクトリを使用する場合にも機能します。たとえば、SConstructの場合:

SConscript('main.scons', variant_dir="build")

次に、main.sconsで:

print Dir('.').abspath
print Dir('#').abspath

1つ目はを印刷/path/to/project/buildし、2つ目は正しいを表示します/path/to/project

于 2009-09-22T19:32:14.143 に答える
2

うーん。簡単です; これはうまくいくようです。

env['BUILD_ROOT'] = Dir('.');
Builder(action = ['somecmd ${BUILD_ROOT.abspath}/tools/myscript.bar ...']);
于 2009-09-22T19:03:04.597 に答える