【问题标题】:SCons does not ignore dependenciesSCons 不会忽略依赖项
【发布时间】:2016-06-08 11:55:17
【问题描述】:

我有以下文件系统结构

+-sources+-A
|          + source files 
|        +-B
|          + source files 
|        +-C
|          + source files 
|
sharedLib
     +-libA.so
     +-libB.so
     +-libC.so

libB.so 依赖于 libC.so。 libA.so 依赖于 libB.so

默认情况下,如果 source/C 目录下的文件发生更改,SCons 会重建所有三个库。我只需要重建 libC.so 共享库,不要碰其他两个。 我尝试添加environment.Ignore('sharedLib/libB.so', 'sharedLib/libC.so'),但没有帮助。

【问题讨论】:

  • 请向我们展示您的 SConstruct/SConscript,以便我们了解您如何设置构建。您可能还想尝试命令行选项--debug=explain(查看 MAN 页面)以了解更多关于为什么 SCons 认为您的目标需要重建。
  • 我无法显示我的 Sconstruct,因为它不存在。相关命令由在 SCons 内部运行的 Python 脚本而不是静态 Sconstruct 动态生成。
  • 嗯,带有生成命令的脚本也可以。或者您尝试派生一个与您的脚本中使用的结构相似的简单 MWE 并将其发布。也许您可以将 Kenneth 的初步回答作为起点?
  • 我真的不能把我的脚本放在这里。这是一个商业产品,我被禁止发布任何具体细节。

标签: dependencies scons


【解决方案1】:

你需要的是Requires函数...

在我放在一起展示您的用例的一个最小示例中,这似乎工作得很好......

>> scons --version
SCons by Steven Knight et al.:
    script: v2.3.6.rel_2.3.5:3347:d31d5a4e74b6[MODIFIED], 2015/07/31 14:36:10, by bdbaddog on hpmicrodog
    engine: v2.3.6.rel_2.3.5:3347:d31d5a4e74b6[MODIFIED], 2015/07/31 14:36:10, by bdbaddog on hpmicrodog
    engine path: ['/usr/lib/scons/SCons']
Copyright (c) 2001 - 2015 The SCons Foundation

>> tree  
.
├── SConstruct
├── sharedLib
└── sources
    ├── A
    │   └── libA.cpp
    ├── B
    │   └── libB.cpp
    └── C
        └── libC.cpp

5 directories, 4 files

>> cat SConstruct 
import os
env = Environment()
libC = env.SharedLibrary('sharedLib/libC.so', 'sources/C/libC.cpp')
envAB = env.Clone()
envAB.Append(LINKFLAGS=['-lC'],
             LIBPATH=['sharedLib'])
libA = envAB.SharedLibrary('sharedLib/libA.so', 'sources/A/libA.cpp')
envAB.Requires(libA, libC)
libB = envAB.SharedLibrary('sharedLib/libB.so', 'sources/B/libB.cpp')
envAB.Requires(libB, libC)

>> cat sources/A/libA.cpp 
#include <iostream>
void A(void) {std::cout << "A" << std::endl;}

>> cat sources/B/libB.cpp
#include <iostream>
void B(void) {std::cout << "B" << std::endl;}

>> cat sources/C/libC.cpp
#include <iostream>
void C(void) {std::cout << "C" << std::endl;}

>> scons                 
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
g++ -o sources/C/libC.os -c -fPIC sources/C/libC.cpp
g++ -o sharedLib/libC.so -shared sources/C/libC.os
g++ -o sources/A/libA.os -c -fPIC sources/A/libA.cpp
g++ -o sharedLib/libA.so -lC -shared sources/A/libA.os -LsharedLib
g++ -o sources/B/libB.os -c -fPIC sources/B/libB.cpp
g++ -o sharedLib/libB.so -lC -shared sources/B/libB.os -LsharedLib
scons: done building targets.

>> tree
.
├── SConstruct
├── sharedLib
│   ├── libA.so
│   ├── libB.so
│   └── libC.so
└── sources
    ├── A
    │   ├── libA.cpp
    │   └── libA.os
    ├── B
    │   ├── libB.cpp
    │   └── libB.os
    └── C
        ├── libC.cpp
        └── libC.os

5 directories, 10 files

>> echo "void E(void){}" >> sources/C/libC.cpp

>> cat sources/C/libC.cpp 
#include <iostream>
void C(void) {std::cout << "C" << std::endl;}
void E(void){}

>> scons
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
g++ -o sources/C/libC.os -c -fPIC sources/C/libC.cpp
g++ -o sharedLib/libC.so -shared sources/C/libC.os
scons: done building targets.

>> tree
.
├── SConstruct
├── sharedLib
│   ├── libA.so
│   ├── libB.so
│   └── libC.so
└── sources
    ├── A
    │   ├── libA.cpp
    │   └── libA.os
    ├── B
    │   ├── libB.cpp
    │   └── libB.os
    └── C
        ├── libC.cpp
        └── libC.os

5 directories, 10 files

【讨论】:

  • 不幸的是,它没有帮助
  • 您能详细说明一下吗?如果我理解您的问题,libA 和 libB 与 libC 相关联,但您希望更改 libC 的源代码以仅触发 libC 的重新构建。这就是 MWE 所做的......
  • 是的,您理解正确。真正发生的是,当我更改 libC 的源文件时,所有三个库都被重新链接。既不忽略也不需要帮助。我实际上已经解决了这个问题,但是从构建中删除了 libA 和 libB 目标。我通过生成依赖树并分析它来做到这一点。正如我对 dirkbaechle 所说的,SCons 命令是即时生成的,我已经修改了脚本来为必须构建的库发出命令。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多