【发布时间】: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_VERSION、Boost_FIND_VERSION_MAJOR、Boost_FIND_VERSION_MINOR、Boost_FIND_VERSION_PATCH 和 Boost_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等)