介子项目版本可以动态分配吗?
Can the meson project version be assigned dynamically?
我是 Meson 的新手,所以如果这是一个愚蠢的问题,请原谅我。
问题的简单版本:
我希望能够在构建时为介子项目版本分配一个动态版本号。本质上是 meson.project_version()=my_dynamic_var
或 project( 'my_cool_project', 'c', version : my_dynamic_var')
(这当然行不通)。
如果不需要,我宁愿不预处理文件。
一些背景知识,如果有人关心的话:
我的构建系统动态地为项目提供了一个版本号。就我而言,它使用的是 bash 脚本。使用 run_command
并从那里抓取 stdout 将该版本放入我的顶级 meson.build 文件没有问题。我已经读到,以这种方式使用是不好的形式,所以如果有另一种方法可以做到这一点..我洗耳恭听。
我还可以通过 add_global_arguments 创建并传递正确的 -DPRODUCT_VERSION="<my_dynamic_var>"
所以我 可以 满足于此..但我希望介子项目本身为日志携带相同的版本,所以我可以使用 meson.project_version() 获取 c/c++ 以外语言的子项目版本。
如问题评论中所述,简短的回答似乎是否。在 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
对象使其可替换为 header/source 文件(您可能希望将其放入共享库或什么不是)。
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
。
我是 Meson 的新手,所以如果这是一个愚蠢的问题,请原谅我。
问题的简单版本:
我希望能够在构建时为介子项目版本分配一个动态版本号。本质上是 meson.project_version()=my_dynamic_var
或 project( 'my_cool_project', 'c', version : my_dynamic_var')
(这当然行不通)。
如果不需要,我宁愿不预处理文件。
一些背景知识,如果有人关心的话:
我的构建系统动态地为项目提供了一个版本号。就我而言,它使用的是 bash 脚本。使用 run_command
并从那里抓取 stdout 将该版本放入我的顶级 meson.build 文件没有问题。我已经读到,以这种方式使用是不好的形式,所以如果有另一种方法可以做到这一点..我洗耳恭听。
我还可以通过 add_global_arguments 创建并传递正确的 -DPRODUCT_VERSION="<my_dynamic_var>"
所以我 可以 满足于此..但我希望介子项目本身为日志携带相同的版本,所以我可以使用 meson.project_version() 获取 c/c++ 以外语言的子项目版本。
如问题评论中所述,简短的回答似乎是否。在 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
对象使其可替换为 header/source 文件(您可能希望将其放入共享库或什么不是)。
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
。