在SCons中,我有一个预生成步骤,可生成未知数量的文件。生成这些文件后,我需要能够将cpp文件添加到源列表中。我是SCons的绝对初学者,我不确定正确的道路是什么。这样做的最佳方法是什么?
原始 基本/原始构建步骤如下:
fpmFile = Dir('#').Dir('src').entry_abspath("FabricKINECT.fpm.json")
# The next step generates a bunch of source files
cppHeader = env.Command(
[env.File(target + '.h')],
klSources,
[[kl2edkBin, fpmFile, "-o", hdir, "-c", cppdir]]
)
env.Depends(cppSources, cppHeader)
# We pass in the supplied filelist to the build command
# however, this list does not include the cpp files generated above
# Currently I am hard-coding the generated files into
# the cppSources list, but I want to add them in dynamically
return env.SharedLibrary(
'-'.join([target, buildOS, buildArch]),
cppSources
)
我尝试过的事情 我尝试了几个不同的角度:
http://www.scons.org/wiki/DynamicSourceGenerator,但根据我的想法,这会为每个文件创建单独的构建目标,而我希望它们都包含在我的库构建中
使用发射器:SCons to generate variable number of targets,但我似乎无法解决依赖问题 - 无论我如何分配依赖项,我的扫描程序都先运行,
我尝试制作另一个命令来收集文件列表 -
def gatherGenCpp(target, source, env):
allFiles = Glob('generated/cpp/*.cpp')
# clear dummy target
del target[:]
for f in allFiles:
target.append(f)
genSources = env.Command(['#dummy-file'], cppdir, gatherGenCpp)
env.Depends(genSources, cppSources)
allSources = genSources + cppSources
return env.SharedLibrary(
'-'.join([target, buildOS, buildArch]),
allSources
)
然而
失败了致命错误LNK1181:无法打开输入文件' dummy-file.obj'
我猜它是因为即使我从命令的目标中清除了虚拟文件条目,这也会在它注册到构建系统之后发生(并且会产生预期的目标。
所有这些 - 你将如何实现以下内容:
有什么建议吗?
答案 0 :(得分:1)
如果您想告诉SCons某些文件是使用他不知道的工具生成的,请使用Builders。
即:
env = DefaultEnvironment()
# Create a builder that uses sed to replace all of occurrences
# of `lion` word to `tiger`
BigCatBuilder = Builder(action = Action('sed "s/lion/tiger/g" $SOURCE > $TARGET'))
env.Append(BUILDERS = {'BigCatBuilder': BigCatBuilder})
# Create tiger.c from pre/lion.c
tiger_c = env.BigCatBuilder('tiger.c', 'pre/lion.c')
# tiger.c is globbed by Glob('*.c')
Program('tiger', Glob('*.c'))
答案 1 :(得分:1)
正如myaut所说,在您的情况下使用的方法是定义自定义构建器。它应该将您当前的Command字符串作为Action,然后您可能还需要定义自定义Emitter。有关如何将所有"点放在i"上的更详细说明,请参阅http://www.scons.org/wiki/ToolsForFools。 发送器很重要,因为它在解析构建脚本时运行,所以当调用env.BigCatBuilder时。它的返回值是实际Build步骤将产生的目标列表(将来)。 SCons将这些目标作为节点存储在内部结构中,在那里它跟踪以下信息:这个节点是否具有隐式依赖性?,它的子节点之一是不是最新的,因此目标需要重建?... Glob()调用将在本地文件系统中进行搜索,但也会遍历提到的"虚拟文件树" ...并且像这样,能够跟踪对物理上不存在的文件的依赖性还存在。 您不必管理生成的文件列表并将它们传递给不同的构建器。 Glob()通常会为您完成大部分工作......
答案 2 :(得分:0)
最后,我只是在scons中运行了一个exec语句来生成文件。有时,最短的路径是最好的:)