如何解决如何在构建时在介子中运行自定义命令?
在我的项目中,我采用了遵循 semver 描述的标准的语义版本控制方案。我得到了这样的东西: product_v1.2.3-alpha-dirty.elf 。
我使用嵌入式系统和 make 我通常在编译时生成一个 version_autogen.h 文件,其中包含版本号的信息,例如 1.4.3.1 和当前的 git 存储库,例如 --dirty、--clean 和以此类推,使用 shell 命令。
我开始使用介子,它非常简单灵活,但自定义命令如
run_command('command','arg1','arg2','arg3')
仅在配置时可用,而我在编译时需要它们来检索 git status 等信息。
我该怎么做?
解决方法
经过深入研究后,我发现 custom_target()(如 nielsdg 所建议的)可以完成我的工作。我做了这样的事情:
# versioning
version_autogen_h = custom_target(
'version_autogen.h',output : 'version_autogen.h',input : 'version_creator.sh',command : ['@INPUT@','0','1','alpha.1','@OUTPUT@' ],)
其中 version_creator.sh
是我的 bash 脚本,它检索 git 信息并根据作为命令参数传递的版本号创建文件 version_autogen.h
。自定义目标是在编译时创建的,所以我的脚本也在编译时执行,正是我想要的时候。
我还发现在介子中有可能使用生成器来做类似的事情,但在这种情况下,它们转换一个或多个输出中的输入文件文件,因此它们不适合我不需要将文件作为输入而只需要版本号的情况。
,介子对这项工作有专门的命令 - vcs_tag
此命令在构建时检测修订控制提交信息 并将其放置在指定的输出文件中。该文件保证 在每个构建中保持最新。关键字类似于 custom_target。
,所以它看起来有点短,有可能避免生成脚本,而只是
git_version_h = vcs_tag(input : 'version.h.in',output : 'version.h')
您应该提供的 version.h.in 文件,其中包含将被替换的 @VCS_TAG@ 字符串,例如
#define MYPROJ_VERSION "@VCS_TAG@"
当然,您可以根据您的项目风格设置文件头和命名,也可以添加其他定义。也可以使用另一个替换字符串和自己的命令行来生成版本,例如
vcs_tag(command: [
'git','--git-dir',meson.build_root(),'describe','--tags','--long','--match','?.*.*','--always'
],...
)
我发现并改编自 here
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。