如何让SCons Install的行为与在不同层次结构级别构建的行为相同?

时间:2014-08-29 01:16:25

标签: scons

我的项目是以下树

|-- A
|   `-- SConscript
|-- B
|   `-- SConscript
`-- SConstruct

我想将 A 的内容安装到/install/A,将 B 安装到/install/B,我通过从顶部SConstruct调用的两个相似的SConscripts实现了这一点。 SConstruct设置env['INSTALL_DIR'] = '/install'并导出它。 A SConscript看起来像这样:

Import('env')
env = env.Clone(
    INSTALL_DIR = os.path.join(env['INSTALL_DIR'], "A"))
env.Alias('install', env['INSTALL_DIR'])

build_result_obj = Program(...)
env.Install(env['INSTALL_DIR'], build_result_obj)

B 类似。

如果 A B 都已过时,并且我在 A 子目录中,我可以在那里运行scons -u,它只会构建 A 。但如果我在那里运行scons -u install,那么它也会尝试安装 B ,导致它也构建 B

我可以通过为安装(install-Ainstall-B)提供不同的别名来解决此问题,并将其合并为两个,但我不想记住所有这些名称。我只是希望安装的行为与构建相关的当前位置相同。如何实现?

1 个答案:

答案 0 :(得分:1)

您必须将安装目标添加到默认目标列表中。有一个方法env.Default(),请查看SCons的文档。请注意,您如何将别名添加到默认列表中(一旦定义它们就像文件目标一样)。

这里要考虑的另一件事是,您不应该将安装别名简单地定义为

Alias('name', path_to_folder)

与其他所有构建系统一样,SCons会将您的安装文件夹视为最新版本,只要它存在......然后就不会对您要安装的文件进行更新。 相反,在调用“安装”构建器之后定义Alias ,并添加返回值...,它表示" program"的路径。节点:

build_result_obj = Program(...)
instobj = env.Install(env['INSTALL_DIR'], build_result_obj)
env.Alias('install', instobj)