在SCons Builder的操作中调用函数

问题描述 投票:0回答:1

我正在尝试在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不是我想要的吗?

我怀疑,鉴于理解,用户指南很清楚,但是在不知道答案的情况下,指南对我来说有点不透明。

scons
1个回答
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')
© www.soinside.com 2019 - 2024. All rights reserved.