SCons使用多种环境构建

时间:2014-09-03 12:01:52

标签: python c++ fortran scons gfortran

简短版 是否可以在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来实现这一目标吗?   - 任何人都可以提出的任何其他内容。

1 个答案:

答案 0 :(得分:1)

可以为每个目标指定环境变量

objs += env.Object(target=..., source=..., FORTRANMODPATH=...)

SCons将看到第二次使用具有不同的FORTRANMODPATH,并且应该根据需要重建它。