我正在尝试在SCons中编写一个Builder来调用命令行可执行文件,其中包含一些由(系列)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)
会在解析SConstruct文件时打印$DEBUG
(所以它与if条件不匹配并不奇怪)。
我只需要使用Generator或按照第18.4章(Builders That Execute Python Functions)中的说明进行操作吗?部分Writing Builders That Execute External Commands不是我想要的吗?
我怀疑,鉴于理解,用户指南很清楚,但是在不知道答案的情况下,指南对我来说有点不透明。
试试这个:
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')