我正在开发一个C ++项目,它包含一些手动编码的源文件,以及一些由命令行工具生成的源文件和头文件。 生成的实际源文件和头文件由该工具读取的JSON文件的内容确定,因此无法硬编码到scons脚本中。 我想设置scons,这样如果我清理项目,然后制作它,它将知道运行命令行工具生成生成的源文件和头文件作为第一步,然后编译之后我的手编码文件和生成的源文件并链接它们以生成我的二进制文件。 这可能吗?我对如何实现这一点感到茫然,所以任何帮助都会非常感激。
答案 0 :(得分:1)
是的,这是可能的。根据您用来创建标题/源文件的工具,您需要在https://bitbucket.org/scons/scons/wiki/ToolsIndex检查我们的ToolIndex,或者阅读我们的指南https://bitbucket.org/scons/scons/wiki/ToolsForFools来编写您自己的Builder。 根据您的描述,您可能需要编写自己的发射器,它会解析JSON输入文件并返回最终由调用产生的文件名。然后,您需要做的就是:
# 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)。
答案 1 :(得分:0)
答案 2 :(得分:0)
感谢Dirk Baechle,我得到了这个工作 - 对于任何感兴趣的人都是我使用过的代码。
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'))