2016-08-16 176 views
1

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

"1.57.0" 

到的东西,看起来像

"105700" 

(如果你还没有猜到转换,这是FindBoost.cmake这就需要BOOST_VERSION形式为“105700”)。

我只是意识到我不知道如何在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_MAJOR,Boost_FIND_VERSION_MINOR,Boost_FIND_VERSION_PATCHBoost_FIND_VERSION_TWEAK的变量。然后FindBoost.cmake从这些自身中构造出Boost_VERSION,并将它们与形式的版本号相比较,该版本号与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没有设置格式化字符串输出的功能还是很有意义的。

+3

反问:为什么你需要手动设置'Boost_VERSION'?这是FindBoost在运行'find_package(Boost 1.57.0)'时为你定义的变量之一。 –

+1

您说的与[文档]不符(https://cmake.org/cmake/help/v3.5/module/FindBoost.html)。 Boost_VERSION *由'find_package(Boost)'或'find_package(Boost 1.57.0)'设置*。在不知道完整的故事的情况下,这里似乎有意义的唯一转换是*从* 015700 *到* 1.57.0(反正这可能不是那么难,因为您可以使用'Boost_MAJOR_VERSION','Boost_MINOR_VERSION'等等) – Antonio

回答

1

悲观的答案
不,没有这样的功能在CMake中产生格式化输出。

优化答案
自己动手。

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

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

更简单的方法是string(REPLACE“。”“;”%{version} version_list)。但我真的很想知道cmake是否已经格式化了字符串输出,我猜测它没有。我将把这标记为答案 –