2014-09-03 52 views
0

短版本 是否可以在SConstruct脚本退出之前构建SCons环境?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

难道你不能'objs + = env.Object(target = ...,source = ...,FORTRANMODPATH = ...)'? – 2014-09-03 12:29:32

+0

在阅读了上面的描述(短版和长版)之后,我仍然不清楚构建是否因错误而停止(你说你必须解决这个问题),或者只是发出警告,说明目标是从不同的环境构建的同样的动作)。在后一种情况下,你不应该担心......我猜你的Builders将模块作为每个子项目的依赖项,这就是为什么它会被添加两次?最后,SCons不会构建环境,而是单个目标(基于文件)...因此,对您的实际问题的答案必须是简单的“否”。 – dirkbaechle 2014-09-03 17:41:31

+0

是的,它退出时出现错误。假设A和B都依赖于C.A和B来自不同的VS项目,projA和projB。在构建projA时,C被构建并且.mod文件被放入projA模块目录中。然后我们建立B和scons认为C已经建成,所以不重建它。但是现在我们正在为模块使用projB的模块目录,并且C.mod不在那里,所以构建失败。 – Tom 2014-09-04 00:21:00

回答

1

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

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

SCons的会看到第二个用途有不同的FORTRANMODPATH并在必要时应该重建它。