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

2024-10-01 22:34:13 发布

您现在位置:Python中文网/ 问答频道 /正文

在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,但我似乎无法解决依赖关系-无论如何分配依赖项,我的扫描仪都会在任何其他操作之前运行

我试着做另一个命令来收集一份文件-

^{pr2}$

然而,这在

fatal error LNK1181: cannot open input file 'dummy-file.obj'

我想这是因为即使我清除了命令目标中的伪文件条目,但在它注册到buildsystem之后(并且生成了预期的目标)也会发生这种情况。在

所有这些都是为了说明—您将如何实现以下目标:

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

有什么建议吗?在


Tags: 文件oftheto命令env目标列表
3条回答

正如myaut正确地指出的,在您的情况下使用的方法是定义一个自定义生成器。它应该将当前的命令字符串作为Action,然后您可能还需要定义一个自定义发射器。请参见http://www.scons.org/wiki/ToolsForFools了解如何将所有“点放在i”上的更详细的描述。 发射器很重要,因为它在解析构建脚本时运行,所以当环境BigCatBuilder被称为。它的返回值是实际构建步骤(将来)将生成的目标列表。SCons将这些目标作为节点存储在一个内部结构中,在这个结构中它跟踪信息如下:这个节点是否具有隐式依赖关系?,是不是其中一个子对象不是最新的,所以目标需要重建?。。。 Glob()调用将在本地文件系统中搜索,但也会遍历提到的“虚拟文件树”…并且,像这样,能够跟踪对物理上还不存在的文件的依赖关系。 你不必到处传递生成的建造者的文件。Glob()通常为您完成大部分工作。。。在

如果您想告诉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'))

最后,我只需在scons中运行exec语句来生成文件。有时,最短的路径是最好的:)

相关问题 更多 >

    热门问题