SCons Builder动作中的调用函数

时间:2019-04-02 15:26:14

标签: scons

我正试图在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”输入已正确替换为C:\Program Files\...\blah.exe之类的输出(在调用scons时),但是无论DEBUG设置如何,该函数的输出都不会出现。

在函数内部加上print(debug)时会在解析SConstruct文件的同时打印$DEBUG(因此,它与if条件不匹配也就不足为奇了。)

我是否只需要使用 Generator 或按照第18.4章( Builders That Execute Python Functions )中的说明进行操作? Writing Builders That Execute External Commands 部分不是我在这里想要的吗?

我怀疑给定的理解,用户指南很清楚,但是在不知道答案的情况下,该指南对我来说有点模糊。

1 个答案:

答案 0 :(得分: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')