如何使用 SCons 在不同的环境中构建?

How to build in different environments with SCons?

我刚刚发现了 SCons,这是一个很棒的构建工具。

我需要在多个环境中构建我的项目,即使用不同的库路径和包含路径,具体取决于机器。

由于 SConstruct 有所有可用的 Python,我可以想象各种方法来实现这一点。一种可能性是拥有一个 SConstruct 脚本并实例化多个 Environment 对象。

1
2
3
4
5
envFoo = Environment()
envFoo.Append(CPPPATH = [...])

envBar = Environment()
envBar.Append(CPPPATH = [...])

然后以某种方式选择这些 Environment 对象之一,可能带有 scons 的命令行参数。

有经验的 scons 用户的问题:这是要走的路吗?这样做最方便的方法是什么?


你可以这样做

1
2
3
4
5
6
7
8
9
10
envSelect = ARGUMENTS.get('env',"default")

if envSelect =="default":
    env = Environment()
elif envSelect =="env2":
    env = Environment(whatever you want to do here)
elif envSelect =="env3":
    env = Environment(whatever you want to do here)
else:
    env = Environment(whatever you want to do here)

使用 ARGUMENTS.get 可以在运行命令 scons 时指定默认值
否则你会做 scons env=env2 希望这能回答你的问题

编辑:这里是我正在处理的项目的一个片段,我想在 scons 运行时确定操作系统

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import sys
import os
import glob
import subprocess
#Find the host Operating System
platform = sys.platform

if platform !="win32":
    env = Environment()
else:
    #Specify to compile in 32-bit mode for Visual Studio
    #This is needed as Qt libraries on Windows for Visual
    #Studio are 32-bit only
    env = Environment(TARGET_ARCH = 'x86')

#Get Qt directory as scons argument or use default setting
if platform !="win32":
    qtDir = ARGUMENTS.get('qt', '/usr/local/Trolltech/Qt-4.8.4/')
else:
    qtDir = ARGUMENTS.get('qt', 'C:\\\\Qt\\\\4.8.4\\\')

这肯定会奏效,并且对于更简单的情况可能是一个很好的解决方案。我有一个更复杂的情况,我实际上使用 Python 类创建了一个 EnvironmentFactory,如下所示:

1
env = EnvironmentFactory.createEnv(cmdLineArgs)

另一个有用的 SCons 工具是使用本章所述的 ParseFlags()、ParseConfig() 和 MergeFlags() 从命令行选项"自动"填充环境。