В scons, как я могу ввести цель, которая будет построена? - PullRequest
5 голосов
/ 02 апреля 2009

Я хочу внедрить цель «Очистка», которая зависит от того, завершится ли ряд других целей до того, как она сработает, и некоторые файлы журнала gzip. Важно, чтобы я не использовал gzip раньше, так как это может привести к сбою некоторых инструментов.

Как я могу добавить цель очистки для выполнения Scons?

например. У меня есть цели Foo и Bar. Я хочу внедрить новую специальную цель с именем 'cleanup', которая зависит от foo и bar и запускается после того, как они оба выполнены, без необходимости указания пользователем

% scons foo cleanup

Я хочу, чтобы они набрали:

% scons foo

но scons выполняются так, как если бы пользователь набрал

% scons foo cleanup

Я попытался создать цель очистки и добавить ее в sys.argv, но кажется, что scons уже обработал sys.argv к тому времени, когда он добирается до моего кода, поэтому он не обрабатывает цель очистки, которую я вручную добавить к sys.argv.

Ответы [ 3 ]

12 голосов
/ 11 марта 2012

Вы не должны использовать _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 вместо вызова внутренних вспомогательных функций

2 голосов
/ 02 апреля 2009

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

В версии SCons версии 1.1.0.d20081104 вы можете использовать метод закрытых внутренних SCons:

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

Если пользователь вводит:

% scons foo bar 

Приведенный выше фрагмент кода приведет к тому, что SCons будет вести себя так, как если бы пользователь набрал:

% scons foo bar MY_INJECTED_TARGET
...