我正在使用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_VERSION
,Boost_FIND_VERSION_MAJOR
,Boost_FIND_VERSION_MINOR
,Boost_FIND_VERSION_PATCH
和Boost_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没有设置格式化字符串输出的功能还是很有意义的。
反问:为什么你需要手动设置'Boost_VERSION'?这是FindBoost在运行'find_package(Boost 1.57.0)'时为你定义的变量之一。 –
您说的与[文档]不符(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