问题描述
我们公司最近开始创建,使用利用语义版本控制(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 (将#修改为@)