Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux cmake find_软件包未正确排序使用SemVer版本号配置的软件包_Linux_Cmake_Nuget_Semantic Versioning - Fatal编程技术网

Linux cmake find_软件包未正确排序使用SemVer版本号配置的软件包

Linux cmake find_软件包未正确排序使用SemVer版本号配置的软件包,linux,cmake,nuget,semantic-versioning,Linux,Cmake,Nuget,Semantic Versioning,我们公司最近开始创建、使用利用语义版本控制(SemVer)2.0.0风格的NuGet软件包。NuGet软件包也通过cmake消费。使用cmake的cmake_FIND_package_SORT_顺序查找最新的包是基于自然排序算法,与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 foo

我们公司最近开始创建、使用利用语义版本控制(SemVer)2.0.0风格的NuGet软件包。NuGet软件包也通过cmake消费。使用cmake的cmake_FIND_package_SORT_顺序查找最新的包是基于自然排序算法,与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.1而非foopkg.1.0.0-rel.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\u FIND\u PACKAGE\u SORT\u ORDER以直接支持SEMVER?

请参阅。