SCons:如何将cpp文件添加到源列表

时间:2015-03-06 21:03:52

标签: python scons

在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'

我猜它是因为即使我从命令的目标中清除了虚拟文件条目,这也会在它注册到构建系统之后发生(并且会产生预期的目标。

所有这些 - 你将如何实现以下内容:

  • 命令会生成一堆CPP文件
  • 这些文件将添加到传入的文件列表中
  • 我们从这个cpp文件列表中构建一个dll。

有什么建议吗?

3 个答案:

答案 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语句来生成文件。有时,最短的路径是最好的:)