我希望它熄灭之前,注入一个“清理”目标依赖于一些整理其他目标和gzip的一些日志文件。我不是早gzip压缩,因为这可能会导致一些工具失败,这一点很重要。

如何注入用于使用SCons执行清理目标?

e.g。我有目标,foo和酒吧。我要注入被称为“清理”依赖于foo和酒吧,并运行他们都完成后新的自定义目标,而无需用户不必指定

% scons foo cleanup

我希望他们输入:

% scons foo

,但具有执行scons的,就好像该用户已键入

% scons foo cleanup

我试图创建清理目标,并追加到sys.argv中,但似乎scons的已经它得到我的代码,以便它不处理的“清理”目标的时间已经处理sys.argv中,我手动附加到sys.argv中。

有帮助吗?

解决方案 3

在使用SCons的1.1.0.d20081104版本,则可以使用私人内部SCons的方法:

SCons.Script._Add_Targets( [ 'MY_INJECTED_TARGET' ] )

如果用户键入:

% scons foo bar 

在上面的代码段将导致SCons的表现就像用户已键入:

% scons foo bar MY_INJECTED_TARGET

其他提示

你不应该使用_Add_Targets或无证的功能,你可以添加你的清理目标BUILD_TARGETS

from SCons.Script import BUILD_TARGETS
BUILD_TARGETS.append('cleanup')

如果您使用此文件的目标,而不是无证的功能列表中,使用SCons不会做它的记账时混淆。这个注释块可以在SCons/Script/__init__.py找到:

# BUILD_TARGETS can be modified in the SConscript files.  If so, we
# want to treat the modified BUILD_TARGETS list as if they specified
# targets on the command line.  To do that, though, we need to know if
# BUILD_TARGETS was modified through "official" APIs or by hand.  We do
# this by updating two lists in parallel, the documented BUILD_TARGETS
# list, above, and this internal _build_plus_default targets list which
# should only have "official" API changes.  Then Script/Main.py can
# compare these two afterwards to figure out if the user added their
# own targets to BUILD_TARGETS.

,所以我想它旨在改变BUILD_TARGETS而不是调用内部辅助函数的

的一种方式是具有gzip的工具依赖于日志文件的输出。例如,如果我们有这个C文件, '的hello.c':

#include <stdio.h>
int main()
{
    printf("hello world\n");
    return 0;
}

和此SConstruct文件:

#!/usr/bin/python
env = Environment()
hello = env.Program('hello', 'hello.c')
env.Default(hello)
env.Append(BUILDERS={'CreateLog':
    Builder(action='$SOURCE.abspath > $TARGET', suffix='.log')})
log = env.CreateLog('hello', hello)
zipped_log = env.Zip('logs.zip', log)
env.Alias('cleanup', zipped_log)

然后运行“scons的清理”将运行以正确的顺序所需要的步骤:

gcc -o hello.o -c hello.c
gcc -o hello hello.o
./hello > hello.log
zip(["logs.zip"], ["hello.log"])

这是不是你指定什么比较,但这个例子和你的需求之间的唯一区别是,“清理”是实际创建的zip文件的步骤,所以这是你要运行的步骤。其依赖关系(运行生成日志的程序,创建程序)被自动计算。现在,您可以添加别名“foo”的如下,以获得所需的输出:

env.Alias('foo', zipped_log)
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top