微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

cmake find_package无法正确排序使用SemVer版本号配置的软件包

如何解决cmake find_package无法正确排序使用SemVer版本号配置的软件包

我们公司最近开始创建,使用利用语义版本控制(SemVer)2.0.0样式的NuGet软件包。 NuGet软件包也通过cmake被使用。使用cmake的CMAKE_FIND_PACKAGE_SORT_ORDER查找最新的软件包是基于自然排序算法,该算法与SemVer稍有不同。例如,给定以下软件包列表:

foopkg.1.0.0-rel.1
foopkg.1.0.0-rel.2
foopkg.1.0.1
foopkg.1.0.1-rel.1

自然排序模型(降序)导致:

foopkg.1.0.1-rel.1
foopkg.1.0.1
foopkg.1.0.0-rel.2
foopkg.1.0.0-rel.1

相比之下,SemVer 2.0.0结果比foopkg.1.0.0-rel.1更偏爱foopkg.1.0.1:

foopkg.1.0.1
foopkg.1.0.1-rel.1
foopkg.1.0.0-rel.2
foopkg.1.0.0-rel.1

我已经完成了自己的工作,以在CMakeLists.txt中完成此操作,但是需要一些工作。使用cmake的基本方法将使这个简单的序列变成

SET(CMAKE_FIND_PACKAGE_SORT_ORDER NATURAL)
SET(CMAKE_FIND_PACKAGE_SORT_DIRECTION DEC)

find_package(foopkg 1 required CONfig NO_DEFAULT_PATH PATHS ./packages)
target_link_libraries(ConsumerTest foopkg)

对此:

SET(X_VAR_PKG_NAME "foopkg")
execute_process (
   COMMAND bash -c "ls -d ./packages/${X_VAR_PKG_NAME}* | sed -r 's/([0-9]+\.[0-9]+\.[0-9]+$)/\\1\-\{FIX/' | sort -Vr | sed s/\-\{FIX$// | tr '\r\n' ';' "
       OUTPUT_VARIABLE PKG_DIR_LIST
)
# strip the last ; to prevent an extra blank list traversal
string(REGEX REPLACE ";$" "" PKG_DIR_LIST "${PKG_DIR_LIST}")
FOREACH( S_PKG_NAME IN LISTS PKG_DIR_LIST )
  find_package(${X_VAR_PKG_NAME} 1 CONfig NO_DEFAULT_PATH  QUIET PATHS ${S_PKG_NAME}/*)
  SET(PKG_FOUND ${X_VAR_PKG_NAME}_FOUND)
  IF (${PKG_FOUND})
    MESSAGE(DEBUG "Compatible package: " ${X_VAR_PKG_NAME} "." ${${X_VAR_PKG_NAME}_VERSION})
    target_link_libraries(${PROJECT_NAME} ${X_VAR_PKG_NAME})
    break()
  ELSE()
    MESSAGE(DEBUG "Incompatible package: ${S_PKG_NAME}")
  ENDIF (${PKG_FOUND})
ENDFOREACH( S_PKG_NAME IN LISTS PKG_DIR_LIST )

我希望有一种更清洁的方法,甚至可以扩展CMAKE_FIND_PACKAGE_SORT_ORDER以直接支持SEMVER?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。