【问题标题】:Multiple targets with different configuration files in same meson.build?在同一个 meson.build 中具有不同配置文件的多个目标?
【发布时间】:2020-08-02 22:04:06
【问题描述】:

我的 C 应用程序可以使用不同的模式构建,这些模式的行为取决于config.h 的内容。 在我的 meson.build 文件中,我使用函数 configure_file() 生成此标头。

现在我想改进我的构建系统,以便在单个构建中为多个模式编译二进制文件。这意味着我必须同时管理不同版本的config.h

我的计划是创建不同版本的config.h 并将它们保存在不同的文件夹中。然后,为每个 Meson 目标自定义包含目录,以选择我正在构建的 mode 的标题。

不幸的是,我发现您无法在configure_file()output 选项中指定子文件夹。该文件将始终创建在与当前正在执行的 meson.build 相同的位置。

这意味着我总是必须包含'.' 并且无法区分不同的模式。注意:更改 C 源文件中的 #include 指令不是一种选择。

有没有办法在 Meson 中解决这个问题?

【问题讨论】:

  • 与其尝试将 config.h 保存到不同的目录,是否可以先更改目录?即: mkdir config1 && cd config1 && && mkdir ../config2 && cd ../config2 && 如果不是这样,那么可能运行一个循环: for i in (config1, config2);执行 mkdir $i; mv config.h $i;完成
  • 感谢您的评论,是否可以直接从介子文件中移动标题而不是使用 bash 脚本?
  • 不知道,抱歉。这不是我使用的工具,这些建议只是我过去遇到类似情况的想法。

标签: c meson-build


【解决方案1】:

让介子本地处理配置选项,而不是通过 config.h 解析选项来解决它。

meson_options.txt 文件中,您声明自定义配置选项,例如:

option('mode', type : 'combo', choices : ['one', 'two'], value : 'one')

然后,当您配置构建时,您可以通过调用创建单独的构建目录:

meson buildOne -Dmode=one
ninja -C buildOne

和,

meson buildTwo -Dmode=two
ninja -C buildTwo

但是,可能不需要上述方法?

另一种可能的方法是声明多个subproject()。如果您当前的meson.build 不是太具体,您可以尝试以下方法。

有一个新的主meson.build 处理打包,但也在子项目目录的一个子目录中复制一个模板 meson.build,每个模式一个。这可能只需要一些额外的../../ 来补偿不同的构建结构。

子项目声明的好处是,您可以覆盖该子项目的构建选项。 这实际上意味着,您再次拥有单独的构建目录,但只有一个主构建目录,并且只需要调用一次介子。

按照这种思路,您可能会重构您的应用程序,并仅在专用子项目/库中构建不同模式的部分。

【讨论】:

  • 感谢您的评论!我将审查这两个建议,看看哪些对我的项目更有意义。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-26
  • 2016-05-06
  • 1970-01-01
  • 2020-09-28
  • 1970-01-01
相关资源
最近更新 更多