如何设置 scons 来构建已生成源文件的项目?

How do I set up scons to build a project that has generated source files?

我正在开发一个 C++ 项目,该项目具有一些手工编码的源文件,以及一些由命令行工具生成的源文件和头文件。 实际生成的源文件和头文件由工具读取的 JSON 文件的内容决定,因此不能硬编码到 scons 脚本中。 我想设置 scons,这样如果我清理项目,然后创建它,它将知道 运行 命令行工具生成生成的源文件和头文件作为第一步,然后编译我的手编码文件和生成的源文件和 link 它们来制作我的二进制文件。 这可能吗?我不知道如何实现这一点,所以任何帮助将不胜感激。

是的,这是可能的。根据您用来创建 header/source 文件的工具,您想要查看我们位于 https://bitbucket.org/scons/scons/wiki/ToolsIndex , or read our guide https://bitbucket.org/scons/scons/wiki/ToolsForFools 的 ToolIndex 以编写您自己的生成器。 根据您的描述,您可能必须编写自己的 Emitter,它会解析 JSON 输入文件和 returns 调用最终产生的文件名。那么,您需要做的就是:

# creates foo.h/cpp and bar.h/cpp
env.YourBuilder('input.json') 

env.Program(Glob('*.cpp'))

Glob 将找到创建的文件,即使它们在硬盘驱动器上还不存在,并将它们添加到整体依赖项中。 如果您还有其他疑问或问题,请考虑在 scons-users@scons.org 订阅我们的用户邮件列表(另请参阅 http://scons.org/lists.html)。

有一个例子:

https://github.com/SCons/scons/wiki/UsingCodeGenerators

我也会响应 Dirk 的建议,加入用户邮件列表。

多亏了 Dirk Ba​​echle,我才开始工作 - 对于其他感兴趣的人,这里是我使用的代码。

import subprocess

env = Environment( MSVC_USE_SCRIPT = "c:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\bin\vcvars32.bat")

def modify_targets(target, source, env):
    #Call the code generator to generate the list of file names that will be generated.
    subprocess.call(["d:/nk/temp/sconstest/codegenerator/CodeGenerator.exe", "-filelist"])
    #Read the file name list and add a target for each file.
    with open("GeneratedFileList.txt") as f:
        content = f.readlines()
        content = [x.strip('\n') for x in content]
        for newTarget in content:
            target.append(newTarget)
    return target, source

bld = Builder(action = 'd:/nk/temp/sconstest/codegenerator/CodeGenerator.exe', emitter = modify_targets)
env.Append(BUILDERS = {'GenerateCode' : bld})

env.GenerateCode('input.txt')

# Main.exe depends on all the CPP files in the folder. Note that this
# will include the generated files, even though they may not currently
# exist in the folder.
env.Program('main.exe', Glob('*.cpp'))