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 (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...