SCons使用多个环境构建

SCons build with multiple environments

本文关键字:环境 构建 SCons      更新时间:2023-10-16

短版本在SConstruct脚本退出之前,是否可以构建SCons环境?

长版本我正在将一些软件从Windows移植到Linux。在Windows上,它使用MSVC++和英特尔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将看到第二次使用具有不同的FORTRANMODPATH,并应根据需要重建它。