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



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

问题的简单版本:

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

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

如果有人关心一些背景:

我的构建系统动态地为项目提供一个版本号。 就我而言,它使用的是 bash 脚本。 我可以使用run_command将该版本放入我的顶级meson.build文件中,并从那里抓取标准输出。 我已经读到使用这种方式是不好的形式,所以如果有另一种方法可以做到这一点......我全是耳朵。

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

正如对该问题的评论中所指出的,简短的答案似乎是否定的。没有直接的方法可以在project调用中动态设置版本。

但是,有一些解决方法,对于简单的情况,第一个看起来很有希望:

(1(使用介子重写功能

$ 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.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

相关内容

  • 没有找到相关文章

最新更新