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

Señ*_*Mas 6 versioning meson-build

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

问题的简单版本:

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

如果不需要,我宁愿不预处理文件。

如果有人关心,请了解一些背景:

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

我也能够创造和传递正确的-DPRODUCT_VERSION="<my_dynamic_var>"通过add_global_arguments所以我COULD只是解决的..但我想介子项目本身进行的同一版本的日志,这样我就可以使用meson.project_version()来获得c/c++ 以外的语言的子项目中的版本。

pax*_*977 4

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

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

(1)利用介子重写能力

$ meson rewrite kwargs set project / version 1.0.0
Run Code Online (Sandbox Code Playgroud)

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

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

(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)
    
    Run Code Online (Sandbox Code Playgroud)

当您生成项目时,您需要设置选项的额外步骤。

$ meson build && cd build
$ meson configure -Dversion=$BUILD_VERSION
Run Code Online (Sandbox Code Playgroud)

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

configure_file(
  input : 'config.hpp.in',
  output : 'config.hpp',
  configuration : conf_data
)
Run Code Online (Sandbox Code Playgroud)

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

#pragma once
#include <string>

const static std::string VERSION = "@version@";
Run Code Online (Sandbox Code Playgroud)

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

所以这种方式相当复杂,但就像我说的,你可能仍然会做一些事情,例如打印版权信息等等。