1

我有一个项目,其中包含几个单独的 Sconstruct 文件和一个顶级 SConstruct 文件。

project/SConstruct -- toplevel SConstruct file
project/binary1/SConstruct -- lower level SConstructs
project/binary2/SConstruct
project/binary3/src/SConstruct

我希望能够使用选项调用各个 SConstruct 文件。所以每个 SConstruct 都可以这样调用:

scons install --prefix=/usr/local/bin

他们在 SConstruct 文件中有一个关于该选项的部分:

AddOption('--prefix',
          dest='prefix',
          type='string',
          nargs=1,
          action='store',
          metavar='DIR',
          default=prefix,
          help='installation prefix')

另外,在顶层 SConstruct 文件中,我希望能够调用所有较低级别的 SConstruct 文件,因此我将其添加到顶层 SConstruct 中:

SConscript(binary1/SConstruct)
SConscript(binary2/SConstruct)
SConscript(binary3/src/SConstruct)

但是,如果我尝试这样做,我会得到一个OptionConflictErroron,binary2/SConstruct因为该--prefix选项已经定义(在 中binary1/SConstruct):

OptionConflictError: option --prefix: conflicting option string(s): --prefix:

有没有办法解决这个问题OptionConflictError

我知道我可以AddOption()用一个try块来包围调用,但是有更好的方法吗?我可以添加一个conflict_handler吗?我可以检查该--prefix选项是否已经存在吗?

我可以更好地组织事情吗?不幸的是,我需要单独的 SConstruct 文件,所以我不能重新组织太多。

4

1 回答 1

1

我认为最好通过在子目录中定义 SConscript 文件来做到这一点:binary1、binary2 和 binary3。

我最近回答了一个类似的问题,并提出了如何组织 SConstruct 和 SConscript 文件,我认为这个答案会对您有所帮助:

使用 SCons 进行真正的分层构建?

这样你就可以--prefix在 SConstruct 文件中定义选项,并从根 SConstruct 文件中调用子目录 SConscript 文件,从而避免上述错误。

于 2012-04-11T14:20:14.837 回答