#scons
#scons
Вопрос:
Я пытаюсь написать конструктор в SCons для вызова исполняемого файла командной строки с некоторыми аргументами, которые генерируются (серией) функций python.
cmdVars = Variables(None, ARGUMENTS)
cmdVars.AddVariables(
EnumVariable('DEBUG', 'help for debug', 'a', allowed_values=('a','b','c')),
PathVariable('CLI', 'path to cli exe', 'C:...blah.exe', PathVariable.PathIsFile)
)
env = Environment(variables = cmdVars)
def generateSomeExtraBitsDependingOnFlag(debug):
if (debug == 'a'):
return "-DDEBUG -DBlah myTextHere"
return ''
myBuilder = Builder(
action = '"$CLI" generateSomeExtraBitsDependingOnFlag("$DEBUG")'
)
<extra stuff to add myBuilder to env and call env.myBuilder>
Ввод «$ CLI» правильно заменяется на вывод (при вызове scons) чем-то вроде C:Program Files...blah.exe
, но вывод из функции никогда не появляется, независимо от DEBUG
настройки.
Добавление print(debug)
внутри функции печатает $DEBUG
во время синтаксического анализа файла SConstruct (поэтому неудивительно, что оно не соответствует условию if).
Нужно ли мне просто использовать генератор или следовать инструкциям в главе 18.4 (Конструкторы, которые выполняют функции Python), чтобы это сработало? Является ли раздел написанием сборщиков, которые выполняют внешние команды, не тем, что я хочу здесь?
Я подозреваю, что, учитывая понимание, руководство пользователя понятно, но, не зная ответа, руководство немного непрозрачно для меня.
Ответ №1:
Попробуйте это:
cmdVars = Variables(None, ARGUMENTS)
cmdVars.AddVariables(
EnumVariable('DEBUG', 'help for debug', 'a', allowed_values=('a','b','c')),
PathVariable('CLI', 'path to cli exe', 'C:...blah.exe', PathVariable.PathIsFile)
)
env = Environment(variables = cmdVars)
def generateSomeExtraBitsDependingOnFlag(source, target, env, for_signature):
if (env['DEBUG'] == 'a'):
return "-DDEBUG -DBlah myTextHere"
return ''
env['generateSomeExtraBitsDependingOnFlag'] =generateSomeExtraBitsDependingOnFlag
myBuilder = env.Builder(
action = '"$CLI" ${generateSomeExtraBitsDependingOnFlag}'
)
env.Append(BUILDERS = {'myBuilder' : myBuilder})
env.myBuilder('dummy','input')
Комментарии:
1. Похоже, что это в основном те же идеи, что и генератор, обсуждаемый в главе 18.5 (или, по крайней мере, функция имеет ту же подпись). Есть ли преимущество в использовании функции таким образом (т. Е. В построителе
action
, а не в немgenerator
)?2. Вы можете использовать ${generateSomeExtraBitsDependingOnFlag} в любой командной строке. Вместо всего одного .. или используйте его как часть CPPFLAGS и т.д..