cmake格式化字符串输出

时间:2016-08-16 23:27:59

标签: c++ boost cmake

我正在使用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还没有格式化字符串输出的功能是有益的。

1 个答案:

答案 0 :(得分:1)

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

优化答案
滚动你自己。

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

REPLACE