我的项目是以下树
|-- 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-A
,install-B
)提供不同的别名来解决此问题,并将其合并为两个,但我不想记住所有这些名称。我只是希望安装的行为与构建相关的当前位置相同。如何实现?
答案 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)