我正在使用 cmake (3.1),并且尝试将传递给 find_package() 函数的版本字符串转换为另一个 find_package() 函数使用的特殊格式的版本字符串。特别是,我正在尝试转换看起来像的东西
"1.57.0"
变成看起来像的东西
"105700"
(如果您还没猜到,这是针对 FindBoost.cmake 的,它需要“105700”形式的 Boost_VERSION)。
我只是意识到我不知道如何在 cmake 中执行此操作;似乎没有命令/宏扩展/函数来执行具有固定字段宽度和前导零的格式化输出?就像 printf 中的 %d%03d%02d
一样。或者有吗?
更新:我弄乱了版本号。已更新以反射(reflect)这一点。
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
形式的版本号进行比较,类似于 version.hpp
中出现的内容在Boost源中。我感到困惑的根源在于,当我调用 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 还没有格式化字符串输出的功能是有启发性的。
最佳答案
悲观答案
不,CMake 中没有用于生成格式化输出的功能。
乐观的答案
自己动手。
我不知道用前导点和尾随点填充版本字符串的确切逻辑,但是 string
command提供您可能需要的所有子命令(加上一个或另一个 if
block )。
例如,使用 REPLACE
去掉点:
string(REPLACE "." "" "${version}" version_wo_dots)
关于c++ - cmake格式化字符串输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38985973/