Scons:仅当目标发生更改时才生成版本文件

2024-03-09

我需要从 SCons 脚本生成 version.cc 文件。仅当目标的任何源文件发生更改时才应生成此文件。

假设 SCons 脚本有以下语句

#python function which generates version.cc in the same folder where libtest.a is generated. This will always generate a differnt version.cc because the version string contained inside  that will have timestamp
GenerateVersionCode() 

#target which uses version.cc
libtest = env.Library('test', ['a.cc', 'b.cc', 'version.cc'])

当我第一次运行上面的代码时一切都很好。但是当我再次运行相同的脚本时,由于生成了新的 version.cc,目标“测试”将被重建。 我的要求是,如果文件已经存在并且任何源(即本例中的 a.cc 和 b.cc)没有更改,我们不应该生成 version.cc 文件的新版本





   if not version_file_present:
        GenerateVersionCode()
    else 
        if no_changes_in_source:  
            GenerateVersionCode()


    #target which uses version.cc which could be newly generated one or previous one
    libtest = env.Library('test', ['a.cc', 'b.cc', 'version.cc'])

  

该网站上的一个相关问题建议如下




    env.Command(target="version.c", source="version-in.c",
        action=PythonFunctionToUpdateContents)
    env.Program("foo", ["foo.c", "version.c"])

  

对于上述建议,我想知道函数 PythonFunctionToUpdateContents 的内容,该函数检查自上次构建以来源文件中的更改。


据我了解,您只想在任何源文件更改时生成 version.cc,并且您只想在 version.cc 更改或任何库源文件更改时构建库。也就是说,将 version.cc 视为该库的源文件之一。

如果是这种情况,您可以考虑 2 组依赖项,这两组依赖项都将由 SCons 依赖项检查控制。

目前尚不清楚 version.cc 生成由什么组成,但我们假设 python 函数GenerateVersionCode() 会执行此操作:生成 version.cc,但不会有任何依赖项检查相关逻辑。

这是 SConscript 代码:

def GenerateVersionCode(env, target, source):
   # fill in generation code here

# The version.cc checking
env.Command(target='version.cc',
            source=['a.cc', 'b.cc'],
            action=GenerateVersionCode)

# The library
env.Library(target='test', source=['version.cc', 'a.cc', 'b.cc'])

这应该不是必需的,但可以通过使用 SCons Depends() 函数显式设置从 Library 目标到 version.cc 目标的依赖关系来更进一步。

这是我构建时得到的输出,我没有使用GenerateVersionCode()函数,而是使用了一个简单的shell脚本versionGen.sh,从而将对Command()的调用更改为:

env.Command(target='version.cc',
            source=['a.cc', 'b.cc'],
            action='./versionGen.sh')

这是第一个构建:

> scons
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
g++ -o a.o -c a.cc
g++ -o b.o -c b.cc
./versionGen.sh
g++ -o version.o -c version.cc
ar rc libtest.a version.o a.o b.o
ranlib libtest.a
scons: done building targets.

然后,在没有更改任何内容的情况下,我再次构建,但它什么也没做:

> scons
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
scons: `.' is up to date.
scons: done building targets.

然后,我修改a.cc,并再次构建,它生成了新版本的version.cc:

> vi a.cc
> scons
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
g++ -o a.o -c a.cc
./versionGen.sh
g++ -o version.o -c version.cc
ar rc libtest.a version.o a.o b.o
ranlib libtest.a
scons: done building targets.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Scons:仅当目标发生更改时才生成版本文件 的相关文章

  • scons 实用说明(一)

    还在为写一个makefile发愁吗 还在为难记的make参数而苦恼吗 有了scons一切都边的简单了 最近研究了下scons 发现和makefile相比 soncs编译c和c 程序真的太方便了 搞程序什么做好 当然是简单实用最好下面大家就一
  • 为什么 SCons VariantDir() 不将输出放入给定目录中?

    我正在考虑使用SCons一个新项目 它看起来真的很好 虽然我发现VariantDir相当混乱 我有一个简单的项目 在一个目录中包含一些 C 源文件 我想以 正常 和 配置文件 模式构建 使用两组不同的 gcc 选项 我希望输出分别进入正常
  • 使用 SCons 管理 Python 3 代码

    在工作中 我的任务是将 Python 2 7 代码的大型库转换为 Python 3 x 该库包含许多使用 boost python for C 制作的脚本和扩展 所有这些都是用 SCons 构建的 它不能与 Python 3 x 解释器一起
  • COBOL 的 Scons

    我想在 scons 中创建一个与 COBOL 一起使用的构建器 这是一个开始 import re Import env Source src cpy COPYBK1 cpy src cpy COPYBK2 cpy src cpy COPYB
  • 如何为使用 SCons 构建的程序内置 gprof 支持?

    问候 这是我的 SConstruct 文件 env Environment env Append CCFLAGS g pg env Program target program1 source program1 c 这也是编译的输出 sco
  • 为什么 dlopen 函数内传递的 std::any 的 std::any_cast 会引发错误

    我正在摆弄 c 17 和插件 并且遇到了一个无法解决的错误 在下面的 MWE 中 我可以调用一个本地函数 该函数接受std any 当我尝试阅读内容时 一切都按预期进行 当我通过插件 dlopen 加载这个完全相同的函数时 它正确地看到了a
  • 如何告诉 scons 使用 C++11 标准

    我无法找到如何告诉 scons 接受 c 11 标准 SConstruct 文件 env Environment CPPPATH usr include boost CPPDEFINES LIBS SCONS CXX STANDARD c
  • 如何将 scons 指向安装在我的主目录中的不同编译器?

    我尝试编辑 SConstruct 以指向不同的 gcc 编译器 但它似乎总是使用 usr bin gcc 和 usr bin g 中定义的编译器 env DefaultEnvironment env CC home aaron devel
  • 如何测量 scons 构建的每个组件的构建时间?

    我有一个使用 scons 构建的大型 C 项目 它的构建速度很慢 我想进行一些更改以使其构建速度更快 现在我想集中时间加速构建中最慢的部分 如何找出哪些文件的编译时间最长 我知道这个问题很旧 并且已经被接受 但最近从另一个问题中引用了它 我
  • 如何过滤 SCons Glob 结果?

    我有时想从 SCons 的 Glob 结果中排除某些源文件 通常是因为我想用不同的选项编译该源文件 像这样的事情 objs env Object Glob cc objs env Object SpeciallyTreatedFile cc
  • 如何将交叉编译器与 Scons 一起使用?

    遵循建议关于斯康斯常见问题解答 http www scons org wiki FrequentlyAskedQuestions Why doesn 27t SCons find my compiler 2BAC8 linker 2BAC8
  • SCons配置文件和默认值

    我有一个使用 SCons 构建的项目 以及 MinGW gcc 具体取决于平台 这个项目依赖于其他几个库 我们称它们为libfoo and libbar 可以为不同的用户安装在不同的地方 目前 我的SConstruct文件嵌入了这些库的硬编
  • SCons - 非标准位置的标头/库

    我正在尝试使用 SCons 编译一个程序 该程序需要一组我已安装在非标准位置的依赖项 我已将依赖项安装在 home dja ocr 中 现在我正在尝试编译主程序 但不知道如何告诉 SCons 在哪里查找库和标头 我已经尝试过 除其他外 sc
  • “cl”未被识别为内部或外部命令

    下面是我在 windows7 中运行 scons 编译器时的错误消息 cl is not recognized as an internal or external command operable program or batch fil
  • 告诉 SCons 不要自动创建目录?

    我正在尝试让 SCons 查看我需要的 git 存储库 并希望使该存储库保持最新 问题是我必须告诉它 git 存储库包含哪些文件才能在构建中使用它们 如果我这样做 SCons 将在尝试克隆存储库之前创建存储库 例如 假设我想克隆 GStre
  • 如何在没有自定义代码的情况下从命令行通过 Scons 传递任意编译器 CFLAGS?

    有没有办法写这样的东西 scons CFLAGS fsanitize address fsanitize thread 这只适用于最小的脚本 env Environment env Program target main out sourc
  • SCons 库和子库

    我有一个基于 SCons 的分层构建系统 我有一个根 SConstruct 它调用一个构建共享库的 SConscript 然后调用另一个构建依赖于共享库的可执行文件的 SConscript 所以这是我的问题 我对linux上共享库的理解是
  • 需要帮助调试缓慢的 scons 运行时

    我正在使用 scons 构建两个项目 一个项目效果很好 而另一个 更复杂 项目则非常令人沮丧 这是我在为第二个项目运行 scons 时看到的内容 S time scons scons Reading SConscript files lt
  • 如何使用 Visual Studio 命令行 + SCons 构建 Windows XP 应用程序?

    使用 Visual Studio 2015 IDE 构建 Windows XP 应用程序一点也不难 您只需要使用正确的平台工具集 v120 xp 或 v140 xp 并确保在目标计算机上安装正确的可再发行 Visual Studio 运行时
  • vc90上的jsoncpp?

    任何人都有jsoncpp http jsoncpp sourceforge net 在vc90上工作 他们使用构建系统 Scons 我从未听说过 我安装了最新的Scons 找到了一个未记录的scons bat 在我的jsoncpp目录中启动

随机推荐

  • 将二进制字符串转换为字节数组

    我有一个由 1 和 0 组成的字符串 我想将其转换为字节数组 例如String b 0110100001101001 我怎样才能将其转换为byte 长度为2 将其解析为以 2 为基数的整数 然后转换为字节数组 事实上 既然你已经有了 16
  • Android 中的 xml 解析

    我是安卓新手 我想要示例如何在 android 中解析 xml 文件 有人可以为我提供一个程序吗 那里有很多例子 这是一个例子CLICK http d codepages com index php android coding advan
  • 从另一个活动中删除行

    我有一个由自定义数组适配器膨胀的列表视图 onclick 将其带到另一个具有与该行相关的数据的活动 单击删除后 它应该从列表中删除该项目并返回到列表 我为此使用下面的代码 int deleteposition CustomizedListV
  • Ken Burns 在 Twitter 上的 Bootstrap 轮播

    我怎样才能申请肯 伯恩斯效应 http en wikipedia org wiki Ken Burns effect在 Twitter Bootstrap 轮播上 carousel item img webkit transition al
  • 如何以线程安全的方式使用CXF客户端

    我已经使用以下服务创建了客户端存根apache cxf的 wsdl2java 命令 http wsf cdyne com WeatherWS Weather asmx WSDL http wsf cdyne com WeatherWS We
  • 核心数据和核心位置

    我有一个具有纬度和经度属性的核心数据数据库 有没有办法使用核心位置getDistanceFrom 找到离a最近的5个位置的方法CLLocation从 GPS 获取 我是否必须使用 Core Data 加载所有对象并使用它们解析它们getDi
  • LINQ - 如何为 select 语句中的子对象提供对其父对象的引用?

    我正在尝试做这样的事情 List
  • 何时使用 doOnTerminate 与 doOnUnsubscribe?

    当有人订阅我的可观察对象时 我需要收到通知 我还需要收到通知 可观察对象已出错或已完成 所以我想我应该使用doOnSubscribe 注册观察者订阅时要采取的操作 可观察的 and doOnTerminate 注册一个 Observable
  • 检测状态更新是否在 React Hooks 中批量进行?

    正如中所解释的这个问题 https stackoverflow com a 54496445 1804173 React 在 React 事件处理程序中批处理状态更新调用 如果状态更新是从基于 React 的事件 例如按钮单击或输入更改 中
  • JavaScript 导出/导入不起作用

    这可能是一个愚蠢的问题 但我无论如何也无法解决它 我有一个 JavaScript 文件 其中包含我想要导出的各种函数 export function AddNumbers numbers let value 0 for var i 0 i
  • 如何从 youtube/v3/channels API 获取 Youtube 频道的链接(网站)?

    查看文档 https developers google com youtube v3 docs channels list https developers google com youtube v3 docs channels list
  • 窗体上的所有控件都是不可见的

    我遇到了一个奇怪的问题 仅给出这段代码 我已将其缩减为最基本的部分 表单将出现 但其上的所有控件都是不可见的 即使它们各自的Visible属性为真 static class Program STAThread static void Mai
  • 此应用程序会出现在 Play 商店中吗?

    我在很多地方听说过 如果我的应用程序使用不适用于特定设备的权限 它就不会显示在该设备的 Play 商店中 现在 在我的代码中 我正在播放音频 每当有电话来电时 我都会通过执行以下操作将音频静音 private PhoneStateListe
  • 有没有办法调用重写方法的父版本? (C#.NET)

    在下面的代码中 我尝试了两种方法来访问methodTwo的父版本 但结果始终是2 有没有办法在不修改这两个类的情况下从ChildClass实例获取1结果 class ParentClass public int methodOne retu
  • Java选择音频设备并播放.mp3

    我的电脑有 3 个声卡 我可以使用此代码选择并播放 wav 文件 import javax sound sampled AudioInputStream audioIn AudioSystem getAudioInputStream url
  • PHP 的 sha1() 和 MySQL 的 SHA() 会给出相同的结果吗?

    如果不加盐 它们会一样吗 是的 sha1 算法对于相同的输入总是产生相同的值 这就是哈希算法的全部意义 默认情况下 它们都返回 40 个字符的小写十六进制转储
  • THttpApiServer - 示例

    有人有 THttpApiServer 的示例 在 Synopse 上找到 吗 我无法找到任何有关使用此类创建简单网络服务器的文档 你可以有使用我们的论坛 http synopse info forum viewtopic php id 26
  • 多个蓝牙连接

    我想通过蓝牙连接 3 个设备 我的 Droid 必须连接到 2 个蓝牙设备 我已使用蓝牙聊天将我的 Droid 连接到 1 台设备 我应该如何修改它以适应多个蓝牙设备 我正在寻找一种通过蓝牙连接 4 台设备的方法 我发现了以下内容 http
  • 选择并显示属于特定 ID 的所有行

    I have Table student 学生科目 and 主题 bsit student studentID FullName 1234 John 1235 Michael 1236 Bryce subject bsit subject
  • Scons:仅当目标发生更改时才生成版本文件

    我需要从 SCons 脚本生成 version cc 文件 仅当目标的任何源文件发生更改时才应生成此文件 假设 SCons 脚本有以下语句 python function which generates version cc in the