在 SCons Builder 的操作中调用函数

Call function inside SCons Builder's action

我正在尝试在 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 设置如何。

在解析 SConstruct 文件时,在函数内部预置 print(debug) 打印 $DEBUG(因此它不符合 if 条件也就不足为奇了)。

我只需要使用 Generator or follow the instructions in chapter 18.4 (Builders That Execute Python Functions) to make this work? Is the section 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')