我正在使用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还没有格式化字符串输出的功能是有益的。
答案 0 :(得分:1)
悲观回答
不,在CMake中没有生成格式化输出的功能。
优化答案
滚动你自己。
我不知道用前导点和尾随点填充版本字符串的确切逻辑,但string
command提供了您可能需要的所有子命令(加上一个或另一个{{1}块)。
例如,使用if
来消除点:
REPLACE