SCons在多个环境下构建

0 投票
1 回答
558 浏览
提问于 2025-04-19 13:51

简短版 在SConstruct脚本结束之前,能否先建立一个SCons环境?

详细版 我正在把一些软件从Windows移植到Linux。在Windows上,它是在Visual Studio 2013中构建的,使用的是MSVC++和Intel Fortran。而在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 个回答

1

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

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

SCons会发现第二次使用时,FORTRANMODPATH 不一样,所以它会根据需要重新构建。

撰写回答