Одним из способов является использование инструмента 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)