一种方法是让 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 cleanup”将以正确的顺序运行所需的步骤:
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)