Hello, CMake Team.
I hope that list(SORT) command can add support for SEMVER comparison.
Up to version v3.30, the list(SORT) command can use the following three comparison methods for sorting:
STRING: Sorts a list of strings alphabetically.FILE_BASENAME: Sorts a list of pathnames of files by their basenames.NATURAL: Sorts a list of strings using natural order (seestrverscmp(3)manual).
Although the NATURAL option seems to be able to sort a list of version numbers, I found that it encounters problems when handling the order of release between pre-release. Let’s take CMake’s own version numbering as an example:
- Before the releases of the new version
v3.29,v3.29.0-rc[n]tags should be released first. - After the release candidates are finished,
v3.29.xtags will be released next.
That means, v3.29.0 should be sorted after v3.29.0-rc[n].
However, after executing the following test code:
set(TAG_LIST
v3.29.6
v3.29.5
v3.29.4
v3.29.3
v3.29.2
v3.29.1
v3.29.0
v3.29.0-rc4
v3.29.0-rc3
v3.29.0-rc2
v3.29.0-rc1
)
set(BEFORE_TAG_LIST "${TAG_LIST}")
set(AFTER_TAG_LIST "${TAG_LIST}")
list(SORT AFTER_TAG_LIST COMPARE NATURAL ORDER DESCENDING)
message(STATUS "BEFORE_TAG_LIST = ${BEFORE_TAG_LIST}")
message(STATUS "AFTER_TAG_LIST = ${AFTER_TAG_LIST}")
if("${BEFORE_TAG_LIST}" STREQUAL "${AFTER_TAG_LIST}")
message(STATUS "BEFORE and AFTER are the same.")
else()
message(STATUS "BEFORE and AFTER are not the same.")
endif()
We can see that COMPARE NATURAL sorts v3.29.0 before v3.29.0-rc[n]:
-- BEFORE_TAG_LIST = v3.29.6;v3.29.5;v3.29.4;v3.29.3;v3.29.2;v3.29.1;v3.29.0;v3.29.0-rc4;v3.29.0-rc3;v3.29.0-rc2;v3.29.0-rc1
-- AFTER_TAG_LIST = v3.29.6;v3.29.5;v3.29.4;v3.29.3;v3.29.2;v3.29.1;v3.29.0-rc4;v3.29.0-rc3;v3.29.0-rc2;v3.29.0-rc1;v3.29.0
-- BEFORE and AFTER are not the same.
If possible, I hope CMake can provide a new comparison method for the list(SORT) command that can sort based on Semantic Versioning:
list(SORT TAG_LIST COMPARE SEMVER)
Of course, it would be best if this SEMVER comparison method could support other types of semantic versioning formats as much as possible, not just CMake.