【问题标题】:cmake formatted string outputcmake格式化字符串输出
【发布时间】:2016-08-16 23:27:59
【问题描述】:

我正在使用 cmake (3.1),我正在尝试将传递给 find_package() 函数的版本字符串转换为另一个 find_package() 函数使用的特殊格式的版本字符串。特别是,我正在尝试转换看起来像

"1.57.0"

变成看起来像的东西

"105700"

(如果您还没有猜到,这是针对 FindBoost.cmake 的,它需要“105700”形式的 Boost_VERSION)。

我只是意识到我不知道如何在 cmake 中执行此操作;似乎没有命令/宏扩展/函数来执行具有固定字段宽度和前导零的格式化输出?就像 printf 中的%d%03d%02d。或者有吗?

更新:我搞砸了版本号。更新以反映这一点。

Update2:FindBoost.cmake 中的版本逻辑对我来说似乎失败了,原因比我在这里所说的更微妙。

正如下面的@Torbjörn 和@Antonio 所指出的,Boost_VERSION 是 FindBoost.cmake 的 OUTPUT 变量,而不是用作输入的自动构造变量。相反,find_package(Boost 1.57.0) 将自动创建名为 Boost_FIND_VERSIONBoost_FIND_VERSION_MAJORBoost_FIND_VERSION_MINORBoost_FIND_VERSION_PATCHBoost_FIND_VERSION_TWEAK 的变量。 FindBoost.cmake 然后从这些本身构造Boost_VERSION,并将它们与105700 形式的版本号进行比较,类似于Boost 源中version.hpp 中出现的内容。我在这里感到困惑的原因是,当我调用find_package(Boost 1.57.0) 时,FindBoost.cmake 似乎在构造Boost_VERSION 时遇到了问题,并通过了它的版本检查。然后当我尝试find_package(Boost 105700) 时,它似乎不再未能通过检查。也许有逻辑可以检测到version.hpp 风格的版本(即整个版本在Boost_FIND_VERSION_MAJOR 中?)或者find_package(Boost 105700) 破坏了其他东西。

无论如何,知道 cmake 还没有格式化字符串输出的功能是很有启发性的。

【问题讨论】:

  • 反问:为什么要手动设置Boost_VERSION?它是 FindBoost 在运行 find_package(Boost 1.57.0) 时为您定义的变量之一。
  • 你说的和documentation不符。 Boost_VERSION find_package(Boost)find_package(Boost 1.57.0) 设置。在不知道完整故事的情况下,这里似乎唯一有意义的转换是 from 015700 to 1.57.0 (无论如何,这可能并不那么困难,因为您可以使用 @ 987654346@、Boost_MINOR_VERSION等)

标签: c++ boost cmake


【解决方案1】:

悲观的回答
不,在 CMake 中没有用于生成格式化输出的此类功能。

乐观的回答
自己动手。

我不知道用前导点和尾随点填充版本字符串的确切逻辑,但是,string command 提供了您可能需要的所有子命令(加上一个或另一个 if 块)。 例如,使用REPLACE 去除点:

string(REPLACE "." "" "${version}" version_wo_dots)

【讨论】:

  • 一个更简单的方法是 string(REPLACE "." ";" %{version} version_list)。但我真的很想知道 cmake 是否已经格式化了字符串输出,我猜它没有。我将把它标记为答案
猜你喜欢
  • 2012-03-01
  • 1970-01-01
  • 2014-11-06
  • 1970-01-01
  • 1970-01-01
  • 2012-01-04
  • 2010-10-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多