我对SCons的目标功能有点困惑。我目前正在尝试创建一个简单的目标check
来启动Boost.Test
位于我的tests
文件夹中的套件。为了启动所有测试,我有一个文件,我只需调用该方法tests/SConscript
即可在其中注册包含我的测试的 cpp 文件。Program
我只想告诉SCons,如果请求目标,他需要调用该tests/SConscript
文件check
,否则,只需通过调用来构建程序src/SConscript
$> scons check
scons
正如您在回答中提到的,您可以使用 SCons Alias() 函数为一个或多个目标分配名称,但是如果您只是执行而不指定目标,这不会告诉 SCons 何时构建目标。当您不指定任何目标时,您会注意到将构建和/或执行单元测试。
要告诉 SCons 应该构建什么,您可以使用SCons Default() 函数。当您不使用此功能时,默认情况下会构建每个目标:显然只有那些需要构建的目标,根据依赖关系等。
要仅在默认情况下构建目标src/SConscript
,然后假设它是一个库,您可以执行以下操作:
libTarget = env.Library('yourLib', theSourceFiles)
env.Default(libTarget)
您可以对几个不同的目标使用 Default() 函数。
现在,当您在scons
没有任何目标的情况下执行时,只会构建那些使用 Default() 函数设置的目标。如果您执行scons check
,则将构建检查目标及其依赖项(假设您使用检查目标调用 Alias() 并且还没有使用检查目标调用 Default() )
我要回答我自己的问题。根据我所见,您可以使用 SCons 中的别名将Builder绑定到rule
.
我在这个地址阅读了 Chris Foster 的一篇文章:http ://www.scons.org/wiki/UnitTests提出了以下想法:
对于我们要添加的每个测试,我们将其添加到check
目标中,如下所示:
prog = env.Program(...)
env.Alias('check', prog)
env.Alias(nameOfTheTest, prog)
这样,我可以通过两种不同的方式调用我的测试:
$> scons check # Calls all the tests of the suite
$> scons nameOfTheTest # Only calls the test we added
希望有帮助。谢谢