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:仅当目标发生更改时才生成版本文件 的相关文章

  • 03 SCons 自动构建工具编译hello.c

    安装mingw 我的电脑已经安装过 xff0c 下面主要说下配置环境 我们将mingw的路径和scons的虚拟环境路径添加到临时的环境变量 这样做的好处是使用的时候添加 xff0c 不与其它版本的全局的环境变量冲突 后期我编译ARM程序时把
  • scons 实用说明(一)

    还在为写一个makefile发愁吗 还在为难记的make参数而苦恼吗 有了scons一切都边的简单了 最近研究了下scons 发现和makefile相比 soncs编译c和c 程序真的太方便了 搞程序什么做好 当然是简单实用最好下面大家就一
  • 在 scons 'Program' 命令中使用 'LIBS' 找不到静态库,为什么?

    我有一个 n c 作为主函数 o c 作为导入函数 如下所示 cat n c o c int f int main f return 0 include
  • 使用 SCons 管理 Python 3 代码

    在工作中 我的任务是将 Python 2 7 代码的大型库转换为 Python 3 x 该库包含许多使用 boost python for C 制作的脚本和扩展 所有这些都是用 SCons 构建的 它不能与 Python 3 x 解释器一起
  • 如何根据编译器类型在 C 编译器的 SConstruct 中设置选项?

    我需要为 C 编译器设置附加选项 例如添加标志以打开所有警告 具体取决于编译器的类型 例如 对于 MSVC 我应该使用 env Append CPPFLAGS Wall 但对于 mingw gcc 我需要使用 env Append CCFL
  • 如何为使用 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 运行目标

    我一直在寻找 寻找 但找不到我的问题的答案 我今晚刚刚开始学习 scons 看起来棒极了 不过我遇到了一点困惑 为了便于开发 我经常喜欢让我的 make 文件构建我的目标 然后运行它 以便我可以通过一次按键来测试更改 这在 make 文件中
  • SCons配置文件和默认值

    我有一个使用 SCons 构建的项目 以及 MinGW gcc 具体取决于平台 这个项目依赖于其他几个库 我们称它们为libfoo and libbar 可以为不同的用户安装在不同的地方 目前 我的SConstruct文件嵌入了这些库的硬编
  • scons 知道 SConscript 文件位于哪个目录吗?

    我们正在评估 scons 作为构建系统 但我在适应我们的旧系统时遇到了问题 在我们的一些源代码子目录中 我们有一个 sources lib 文件 其中列出了需要编译以组装该目录的目标库的 C 文件的名称 但是 同一目录中还有其他 C 文件
  • SCons 不会清除所有文件

    我有一个包含 builds 目录的文件系统 每个目录都包含一个名为 build info xml 的文件 然而 一些构建发生在构建脚本生成 build info xml 之前 因此在这种情况下 我有一个有点不平凡的 SCons SConst
  • 使用 scons 编译带有 -std=c++11 标志的 c++ 文件

    我正在尝试使用 scons 编译带有 std c 11 选项的 c 文件 文件 测试 cc include
  • 如何在 scons 中添加 --whole-archive 链接器选项?

    我有一个仅在静态范围内与应用程序交互的库 这需要我将库与 whole archive选项以避免链接器 优化 库 这样做是因为链接器实际上从未看到我的库正在被使用 问题是我还没有找到为 scons 中的特定库添加此链接器选项的方法 env A
  • Scons:仅当目标发生更改时才生成版本文件

    我需要从 SCons 脚本生成 version cc 文件 仅当目标的任何源文件发生更改时才应生成此文件 假设 SCons 脚本有以下语句 python function which generates version cc in the
  • 如何在没有自定义代码的情况下从命令行通过 Scons 传递任意编译器 CFLAGS?

    有没有办法写这样的东西 scons CFLAGS fsanitize address fsanitize thread 这只适用于最小的脚本 env Environment env Program target main out sourc
  • 如何解决 CheckLib 返回 false 的问题?

    Scons版本是2 3 3 这是构建脚本的相关部分 if not conf CheckLib portaudio raise Exception Did not find libportaudio a portaudio lib or th
  • 如何使用 Visual Studio 命令行 + SCons 构建 Windows XP 应用程序?

    使用 Visual Studio 2015 IDE 构建 Windows XP 应用程序一点也不难 您只需要使用正确的平台工具集 v120 xp 或 v140 xp 并确保在目标计算机上安装正确的可再发行 Visual Studio 运行时
  • 如何设置 scons 系统包含路径

    使用 scons 我可以轻松设置我的包含路径 env Append CPPPATH foo 这传递了标志 Ifoo to gcc 不过 我正在尝试在启用大量警告的情况下进行编译 特别是与 env Append CPPFLAGS Werror
  • vc90上的jsoncpp?

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

    通常 当我与其他人一起处理一个项目时 随着时间的推移 编译器在 Makefile 中获取的库路径和包含路径的数量会变得越来越多 此外 路径也可能会变得很长 这是一个例子 g c pipe O2 Wall W DQT BOOTSTRAPPED

随机推荐

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

    我有一个由 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