如何解决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 举报,一经查实,本站将立刻删除。