介子项目版本可以动态分配吗?

Posted

技术标签:

【中文标题】介子项目版本可以动态分配吗?【英文标题】:Can the meson project version be assigned dynamically? 【发布时间】:2019-12-05 18:24:41 【问题描述】:

我是 Meson 的新手,所以如果这是一个愚蠢的问题,请原谅我。

问题的简单版本:

我希望能够在构建时为介子项目版本分配一个动态版本号。基本上是meson.project_version()=my_dynamic_varproject( 'my_cool_project', 'c', version : my_dynamic_var')(当然不行)。

如果没有必要,我宁愿不预处理文件。

如果有人关心,请提供一些背景:

我的构建系统会动态地为项目提供一个版本号。就我而言,它使用的是 bash 脚本。我使用run_command 将该版本放入我的*** meson.build 文件并从那里刮取 stdout 没有问题。我已经读过以这种方式使用它是不好的形式,所以如果有另一种方法可以做到这一点..我全神贯注。

我还能够通过 add_global_arguments 创建和传递正确的 -DPRODUCT_VERSION="<my_dynamic_var>",所以我可以满足于此.. 但我希望介子项目本身能够为日志携带相同的版本,因此我可以使用 meson.project_version() 在子项目中获取非 c/c++ 语言的版本。

【问题讨论】:

我不明白。如果您可以使用run_command() 获得您的版本,(像这样,gitlab.freedesktop.org/spice/spice-gtk/commit/…,对吗?)那您的问题是什么?您是否正在寻找其他方法,因为您认为这是一种不好的方法? 不@Yasushi_Shoji,我可以忍受“黑客”.. 还不错.. 但是如果不能动态分配和使用介子项目版本有什么用?谁对版本号进行硬编码? 我愿意。让我问你这个问题。当你没有.git/ 时,你会怎么做? YYYY.MM.DD.(minutes_today 或 git_commit_count) 用于未在发布分支上完成的版本。没有人应该传递这些,所以模棱两可无关紧要。我永远不会发布不是来自构建服务器上发布分支的二进制文件。 感谢您的帮助 Yasushi。在我弄清楚介子的胆量之前,我会继续说“不可能”。 【参考方案1】:

如问题的 cmets 所述,简短的回答似乎是。在project 调用中没有直接方法来动态设置版本。

但是,有一些变通方法,第一个看起来很有希望用于简单的情况:

(1) 使用介子rewriting capability

$ meson rewrite kwargs set project / version 1.0.0

那么显然使用环境变量而不是1.0.0

(2) 编写一个包装脚本,该脚本从环境中读取版本并将其替换到project 调用中的meson.build 文件中。

(3) 采用 conan.io 并生成你的介子文件。

(4) 使用构建选项。此选项虽然不如 (1) 好,但可能适用于其他工作流程。

选项 (4) 的工作原理如下。

在介子根目录中创建一个meson_options.txt 文件

添加以下行:

option('version', type : 'string', value : '0.0.0', description : 'project version')

然后创建一个读取此选项的meson.build 文件。

project('my_proj', 'cpp')
version = get_option('version')
message(version)

conf_data = configuration_data()
conf_data.set('version', version)

当你去生成你的项目时,你有一个额外的步骤来设置选项。

$ meson build && cd build
$ meson configure -Dversion=$BUILD_VERSION

现在该版本可作为构建选项使用,然后我们使用 configuration_data 对象将其替换为头文件/源文件(您可能希望将其放入共享库或其他文件中)。

configure_file(
  input : 'config.hpp.in',
  output : 'config.hpp',
  configuration : conf_data
)

config.hpp.in 看起来像这样:

#pragma once
#include <string>

const static std::string VERSION = "@version@";

当我们调用configure_file 时,@version@ 将被替换为我们在meson configure 步骤中设置的版本字符串。

所以这种方式非常复杂,但就像我说的那样,你可能最终还是会做一些事情,例如打印版权信息等等。

【讨论】:

谢谢!我还实施了一个解决方法,但这和任何方法一样好。我希望它对未来的人有所帮助。 非常感谢;在介子 0.61.99 中,我们可以在初始介子配置上定义版本:meson -Dversion="$(git describe --abbrev=0)" build【参考方案2】:

0.60.3 开始,您可以直接从run_command 分配version,这意味着以下将在没有任何meson_options.txt 的情况下工作。

project('randomName', 'cpp',
 version : run_command('git', 'rev-parse',  '--short', 'HEAD').stdout().strip(),
  default_options : [])

特别是,还可以分配bash 脚本的结果,只需调用它而不是git

【讨论】:

以上是关于介子项目版本可以动态分配吗?的主要内容,如果未能解决你的问题,请参考以下文章

我们可以使用 realloc 来释放动态分配的内存吗?

我可以删除以前动态分配但使用不同指针的内存吗?

for 循环期间的动态分配会造成内存泄漏吗?

没有动态分配的哈希表/映射实现

可以在C ++中使用动态分配的参数数创建函数吗?

FreeRTOS是动态分配内存吗?