1

共通のシステム ディレクトリのソース コードを使用する階層プロジェクトがあり、SConsRepository()関数を使用しており、すべてのビルド出力 (ローカル コードとリポジトリから取得したコード) を variant_dir に配置したいと考えています。

Repository()単純なシナリオ (サブディレクトリ SConscripts を呼び出さない非階層的) で関数を使用すると、コンパイルされた Repository() オブジェクト ファイルは、予想どおり variant_dir に配置されます。しかし、階層ビルドで同じことを行うと、コンパイルされたRepository()オブジェクト ファイルはプロジェクトのルート ディレクトリに配置されます。

システム ディレクトリにある次のソース コードを使用するとします。

/usr/local/repoDir/repoFile.cc

そして、私は次のプロジェクト構造を持っています:

# tree .
.
|-- SConstruct
|-- build
|   `-- linux_x86_64
`-- moduleA
    |-- localFile.cc
    `-- SConscript

ビルド スクリプトは次のとおりです。

Sコンストラクト

編集:指摘してくれた users@scons.tigris.org の Dirk Ba​​echle に感謝し、Repository() の呼び出しからファイル名を削除しました。

env = Environment()

env.Repository('/usr/local/repoDir')

env['variantDir'] = 'build/linux_x86_64'

SConscript('moduleA/SConscript',
           exports = ['env'],
           variant_dir = env['variantDir'],
           duplicate = 0)

moduleA/Sコンスクリプト

import os

Import('env')

srcFiles = [
  'localFile.cc',
  #os.path.join(env['variantDir'], 'repoFile.cc'),          # fails to find source file
  #'#%s' % os.path.join(env['variantDir'], 'repoFile.cc'),  # fails to find source file
  #'repoFile.cc',                                           # fails to find source file
  '#repoFile.cc',  # only option that works, but places object in root proj dir
]

env.Append(CPPPATH = ['.', '#'])
env.Program(target = 'myApp', source = srcFiles)

repoFile.ccファイルをコンパイルして、そのオブジェクト ファイルを に配置したいのですbuild/linux_x86_64が、代わりに、ルート SConstruct と同じディレクトリに配置します。

のコメントからわかるように、いくつかの異なる方法をmoduleA/SConscript参照してみましたが、機能する唯一の方法はそこに記載されているとおりです。さらに、 で関数をrepoFile.cc呼び出してみましたが、何も変わりませんでした。Repository()moduleA/SConscript

編集:コンパイル出力は次のとおりです

# scons
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
g++ -o repoFile.o -c -Ibuild/linux_x86_64 -ImoduleA -I/usr/local/repoDir/moduleA -I/usr/local/repoDir/build/linux_x86_64 -I. -I/usr/local/repoDir /usr/local/repoDir/repoFile.cc
g++ -o build/linux_x86_64/localFile.o -c -Ibuild/linux_x86_64 -ImoduleA -I/usr/local/repoDir/moduleA -I/usr/local/repoDir/build/linux_x86_64 -I. -I/usr/local/repoDir moduleA/localFile.cpp
g++ -o build/linux_x86_64/myApp build/linux_x86_64/localFile.o repoFile.o
scons: done building targets.

結果のディレクトリ構造は次のとおりです。

# tree .
.
|-- repoFile.o    <=== This file should be in build/linux_x86_64 NOT here
|-- SConstruct
|-- build
|   `-- linux_x86_64
|       |-- localFile.o
|       `-- myApp
`-- moduleA
    |-- localFile.cpp
    `-- SConscript

私は周りをチェックしてこれを見つけましたが、まったく同じではありません:

リポジトリ ディレクトリを使用した Scons 階層ビルド

オブジェクトファイルを適切な場所に配置する方法について何か提案はありますか?

4

1 に答える 1

0

SCons-users メーリング リストでこれと同じ質問をしたところ、この質問に部分的に答える情報を受け取りました。Dirk Baechleこの問題で私を助けてくれてありがとう。

このRepository()関数は、渡されたディレクトリを SCons プロジェクトのルート (つまり、ファイルがあるディレクトリ) に効果的にマウントします。SConstructrepo サブディレクトリ内のファイルを SCons プロジェクトのサブディレクトリで参照する必要がある場合、サブディレクトリ名 (repo ディレクトリと scons プロジェクト ディレクトリの名前) が一致する必要があります。上記の質問のファイルのさまざまなオプションがSConscriptリポジトリ ファイルを見つけられないのはそのためです。

repo サブディレクトリmoduleAがファイルとともに存在する場合、repoFile.cc期待どおりに検出され、コンパイルされたオブジェクトが variant_dir に期待どおりに配置されます。

この関数の制限の 1 つは、repo ディレクトリを SCons プロジェクトのサブディレクトリにマウントRepository()できないことです。これは機能要求のように聞こえます。

SCons がコンパイルされたオブジェクト ファイルをソース ディレクトリに配置するという事実は、私にはバグのように思えます。少なくとも、variant_dir ルート ディレクトリに配置する必要があります。

于 2012-04-29T14:29:06.550 に答える