【问题标题】:How to prevent scons from cleaning parent and sibling directories?如何防止 scons 清理父目录和兄弟目录?
【发布时间】:2013-10-24 17:59:01
【问题描述】:

我正在为一个大型软件项目使用 scons 实现构建系统。有一个目录结构将各个库和程序的代码分隔到它们自己的目录中。使用我们现有的 make 系统,我可以在单个程序目录中执行“make clean”,它只会清理与该目录中的源关联的文件。但是,如果我执行“scons -c”,它会识别出该程序依赖于同级(或表亲)目录中的大量库,并清理这些文件的所有文件。这不是我想要的,因为我必须重建所有这些库,这可能需要几分钟。

我尝试过使用“NoClean()”命令,但没有让它以我需要的方式工作。考虑到代码库的大小和目录结构的复杂性,我实际上不可能为每个库中的每个文件都有一个 NoClean() 行。

有没有办法告诉 scons 在进行清理时忽略当前目录之上的任何依赖项(即 scons -c)?

【问题讨论】:

    标签: scons


    【解决方案1】:

    我很想亲自回答这个问题。

    目前我能提供的唯一解决方案是让 Noclean 正常工作。 所以在你的图书馆里,你应该有这样的东西

    lib_objs = SharedObject(source_list)
    mylib = SharedLibrary('libname', lib_objs)
    

    因此,为此我们希望保护库和源不被清理。

    NoClean([mylib, lib_objs])
    

    请注意,我必须从库中拆分目标文件的构建,因为我也希望能够将它们传递给 NoClean。

    【讨论】:

    • 这似乎适用于最小测试。这是一个很好的解决方案。我仍然无法让它为整个项目工作,但我相当确定这是因为我在几乎每个源目录中都克隆了环境。谢谢你。它绝对让我更好地了解我应该如何尝试解决这个问题。
    • 只是为了结束这个循环,我能够使用 Avatar33 的建议获得我想要的行为。我需要添加的是检查每个源目录是启动目录还是后代。 CurrentDir = env.Dir('.').srcnode().abspath if not CurrentDir.startswith(env.GetLaunchDir()): env.NoClean([myobjs, mylib, installed]) 这只会正确清理当前目录及其后人。如果我从最顶层目录执行 'scons -c',整个源代码树都会被清除。
    • 通过目录控制清理的好主意。我希望 SCons 有一个选择。这对我的用例没有帮助,当我有时想清理所有单元测试结果时,这些结果分散在整个项目中,链接到“测试”目标。但是清理“测试”会一直传播到测试所依赖的所有其他内容,直到 C++ 源文件
    【解决方案2】:

    清理时尝试使用目标名称。

    scons -c aTargetName
    

    您可以使用SCons Alias() 函数来简化目标名称,并将多个目标名称归为一个别名。

    使用这种方法,您必须在每个适当的子目录中添加一个别名,这不一定是坏事 :)

    【讨论】:

    • 据我所知,这根本没有帮助。 Scons 仍然会删除目标或别名的所有依赖项。
    • 是的,我看到它也删除了所有内容。我相信当你指定一个特定的目标时,scons 也会自动添加它的所有依赖项。
    • 关于依赖关系也被清理的好点。这样做会缩小被清理的范围。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-30
    • 2018-05-31
    • 1970-01-01
    相关资源
    最近更新 更多