【问题标题】:Why can't scons find my project's source files?为什么scons找不到我项目的源文件?
【发布时间】:2013-03-10 23:23:16
【问题描述】:

这是 github 上的my project

这是我的 SConstruct 文件:

SConscript('main.scons', variant_dir = 'build', duplicate = 0)

这是我的 main.scons 文件:

import sys
import os
import fnmatch

def find_source_files(directory, ext = "cpp"):
    matches = []
    for root, dirnames, filenames in os.walk(directory):
      for filename in fnmatch.filter(filenames, '*.' + ext):
          matches.append(os.path.join(root, filename))
    return matches

if __name__ == '__main__':
    for f in find_source_files('src'):
        print f
else: 
    Program(target = 'main.bin', source = find_source_files('src'))

这是我运行它时得到的结果:

bitcycle @ cypher ~/git/IeiuniumTela $ find $(pwd) -name "*.bin" -or -name "*.o" -exec rm {} \;;  scons; find $(pwd) -name "*.bin" -or -name "*.o"

scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
scons: building associated VariantDir targets: build
gcc -o build/main.bin
gcc: fatal error: no input files
compilation terminated.
scons: *** [build/main.bin] Error 4
scons: building terminated because of errors.

当我运行 `python main.scons' 对其进行测试时会发生以下情况:

bitcycle @ cypher ~/git/IeiuniumTela $ python main.scons
src/main.cpp

我很难理解为什么它找不到我的源文件。这里有什么建议或想法吗?

[更新]在从邮件列表中获得一些好的指导后,我发现这对我来说“足够好”。

/SConstructSConscript('src/main.scons', variant_dir = 'build', duplicate = 0)

/src/main.sconsProgram(target = 'main.bin', source = Glob('*.cpp'))

查看 github 存储库以获取完整的源代码树。为了完整起见,我还在 repo 中添加了一个空的构建目录。我觉得有趣的是:

一个。在这个用于发现源的构建工具的上下文中,SCons 的 Glob 版本不是递归的。我希望递归发现选项是首选。 :(

b.我需要将 scons 文件放在与源文件相同的目录中(这很烦人)。

c。打印语句显然有效,但 sys.stdout.write 无效(来自 python 模块)。

【问题讨论】:

  • 我在 scons 用户邮件列表中有一个问题,我们会看看结果如何。

标签: c++ scons


【解决方案1】:

可能是因为您的main.scons 文件已经在src 目录中,而您的find_source_file 实际上正在搜索src/src? 当我将 scons 文件移动到顶层目录时,它为我找到了源代码。

更新: 经调查,variant_dir 将工作目录设置为build,因此您的find_source_filesbuild/src 中查找文件却一无所获。从 SConstruct 文件中调用 find_source_files 或者在 main.scons 中使用 VariantDir() 可能会更好。

【讨论】:

  • 如果find_source_files 失败,那么直接执行它(通过python main.scons)不会打印出src 文件列表。 :(
  • 很抱歉,它实际上对我也不起作用。我已经更新了答案。
【解决方案2】:

SCons 对相对目录路径的处理与 Python 不同,所以我不会惊讶地看到测试执行和 SCons 执行之间的差异。通常在 SCons 中,所有内容都与根 SConstruct 脚本或 SConscript 脚本相关。

您的代码看起来是正确的,但是如何在find_source_files() 中添加一些调试打印语句以查明到底发生了什么?

也许您计划稍后更广泛地使用find_source_files() 函数,但是对于一个源文件的简单情况,您似乎过于复杂了,您可以在main.scons 中使用以下内容:

Program(target = 'main.bin', source = 'src/main.cpp')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-13
    • 2020-02-10
    • 1970-01-01
    • 1970-01-01
    • 2011-09-30
    • 1970-01-01
    • 2021-06-05
    • 1970-01-01
    相关资源
    最近更新 更多