如何管理导入 SCons 项目

How to manage importing an SCons project

我有一个基于 SCons 的项目,它有一个相当专业的 SConstruct 文件(由于 CUDA),我们称它为项目 A。我将它用作我正在处理的另一个项目的子模块,我们可以称之为项目 B这也将有一些相当特殊的编译要求(由于 MEX)。

我想让项目 A 保持原状,因为它是我组中的一个公共库。我如何让项目 B 获得它“编译通过”所需的所有包含、库等信息。在 CMake 中,这实际上只是 add_subdirectory()target_link_libraries() 的组合。 SCons 中是否有等效的概念,或者更严格独立的 SConstruct(不能被另一个 SConstruct 调用)?

(这对于评论来说太长了,不确定这是一个“答案”...)

SConstructs 是独一无二的 top-level 东西,但话又说回来,它们也不是 - 您可以在调用 SConscript() 时调用任何文件,包括名为 subdir/SConstruct 的文件,只要因为后者是以一种有意义的方式构建的,并且有一个 Export() 项目调用它的东西会对 Import()ing 感兴趣。

也没有什么可以阻止您为 A 编写一个真正最小的 SConstruct,它 构建独立 A 可能独有的东西,以及所有实际(常见)工作由 A 的 SConstruct 调用的 SConscript 完成,但 B 的 SConstruct 也可以调用。

或者,您可以向 A 添加一个步骤,将您认为项目 B 需要的所有变量信息写入一个文件,例如以赋值语句的形式 exports.py,然后让 B 使用 a 读取该文件Variables(files="exports.py") 调用——这有点像 ExportImport 但跨越了 scons 调用的边界。如果该文件不存在,假设您必须调用 scons 到 运行 A 的构建,因此该文件用作两个独立构建的同步点。

如果您编写一个脚本来调用,将信息从 A 转换为 B 可以使用的表单,您也许还可以使用 ParseConfig 函数做一些事情。

但是,所有这些都意味着 一些 对 A 构建的更改。从 A 的角度来看,它们应该是无害的:写入文件或导出一些变量是一次性操作,除非有人正在监听这些操作 - 假设 A 的构建是适当的干净。

也许这里的一些想法(虽然不完全相同)可能适用? https://github.com/SCons/scons/wiki/SconstructMultiple