【发布时间】:2014-09-04 15:50:51
【问题描述】:
短版 是否可以在 SConstruct 脚本退出之前构建 SCons 环境?
加长版 我正在将一些软件从 Windows 移植到 Linux。在 Windows 上,它使用 MSVC++ 和 Intel Fortran 在 Visual Studio 2013 中构建。在 Linux 上,我们使用 g++ 和 gfortran 构建它。
我编写了一个 Python 脚本,它读取 Visual Studio 项目文件(对于 C++ 代码的 .vcxproj 或对于 Fortran 的 .vfproj)并执行相关的 SCons 构建器来创建构建。我的 SConstruct 文件基本上如下所示:
def convertVSProjectFile(filename):
...
projects = [ 'Source/Proj1/Proj1.vcxproj',
'Source/Proj2/Proj2.vcxproj',
'Source/Proj3/Proj3.vfproj',
...
];
for p in projects:
convertVSProjectFile(filename)
这将被重新设计以解释 .sln 文件,而不是手动列出项目。
对于 C++ 代码,这可以正常工作。不过,这对 Fortran 代码来说是个问题。当两个独立项目中的文件引用同一个 Fortran 模块时,就会出现问题。 Fortran 扫描程序发现了这一点,并使模块的源文件成为两个目标的依赖项。但是,对于两个目标,FORTRANMODPATH 构造变量的设置不同。 SCons 警告说,同一个目标是用同一个构建器构建的两次,但随后似乎只是或多或少地随机选择其中一个,因此很难预测 .mod 文件的最终位置。
我可以想出几种方法来解决这个问题:
- 分别构建每个环境,构建它,然后继续下一个。但我不知道是否有办法做到这一点。
- 为每个目标文件而不是每个项目设置 FORTRANMODPATH。然后 .mod 文件可以放在源文件的对象文件夹中,而不是将项目的所有 .mod 文件放在同一文件夹中。但我也找不到这样做的方法。我可以通过为每个源文件创建一个新的Environment 来实现这一点吗?
- 任何其他人都可以想出的任何东西。
【问题讨论】:
-
你不能
objs += env.Object(target=..., source=..., FORTRANMODPATH=...)吗? -
在阅读了上面的描述(短版和长版)之后,我仍然不清楚构建是否因错误而停止(你说你必须解决这个问题)或者只是发出目标是的警告从不同的环境构建(但具有相同的操作)。在后一种情况下,您不必担心...我猜您的构建器将模块作为每个子项目的依赖项,这就是为什么它被添加两次的原因?最后,SCons 不构建环境,而是单个目标(基于文件)......所以你的实际问题的答案必须是一个简单的“否”。
-
是的,它退出并出现错误。假设 A 和 B 都依赖于 C。A 和 B 来自不同的 VS 项目,projA 和 projB。在构建 projA 时,将构建 C 并将 .mod 文件放入 projA 模块目录中。然后我们构建 B 并且 scons 认为 C 已经构建所以不重建它。但是现在我们使用 projB 的模块目录来存放模块,而 C.mod 不存在,所以构建失败。
-
我想另一种解决方案是对 SCons 说,“我要添加这个目标两次,因为我真的希望它被构建两次。”但我不知道这样做的方法(或者)。
标签: python c++ fortran scons gfortran