https://public.kitware.com/Wiki/index.php?title=CMakeCompareVersionStrings&feed=atom&action=history
CMakeCompareVersionStrings - Revision history
2024-03-29T11:03:42Z
Revision history for this page on the wiki
MediaWiki 1.38.6
https://public.kitware.com/Wiki/index.php?title=CMakeCompareVersionStrings&diff=62737&oldid=prev
Kwrobot: Replace content with link to new CMake community wiki
2018-04-30T15:41:01Z
<p>Replace content with link to new CMake community wiki</p>
<a href="https://public.kitware.com/Wiki/index.php?title=CMakeCompareVersionStrings&diff=62737&oldid=62431">Show changes</a>
Kwrobot
https://public.kitware.com/Wiki/index.php?title=CMakeCompareVersionStrings&diff=62431&oldid=prev
Brad.king at 12:35, 24 April 2018
2018-04-24T12:35:43Z
<p></p>
<table style="background-color: #fff; color: #202122;" data-mw="interface">
<col class="diff-marker" />
<col class="diff-content" />
<col class="diff-marker" />
<col class="diff-content" />
<tr class="diff-title" lang="en">
<td colspan="2" style="background-color: #fff; color: #202122; text-align: center;">← Older revision</td>
<td colspan="2" style="background-color: #fff; color: #202122; text-align: center;">Revision as of 12:35, 24 April 2018</td>
</tr><tr><td colspan="2" class="diff-lineno" id="mw-diff-left-l188">Line 188:</td>
<td colspan="2" class="diff-lineno">Line 188:</td></tr>
<tr><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>10 > 1</div></td><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>10 > 1</div></td></tr>
<tr><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div></pre></div></td><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div></pre></div></td></tr>
<tr><td colspan="2" class="diff-side-deleted"></td><td class="diff-marker" data-marker="+"></td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;"></ins></div></td></tr>
<tr><td colspan="2" class="diff-side-deleted"></td><td class="diff-marker" data-marker="+"></td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;">{{CMake/Template/Footer}}</ins></div></td></tr>
<tr><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><br/></td><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><br/></td></tr>
<tr><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>[[Category:CMakeMacro]]</div></td><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>[[Category:CMakeMacro]]</div></td></tr>
</table>
Brad.king
https://public.kitware.com/Wiki/index.php?title=CMakeCompareVersionStrings&diff=14479&oldid=prev
Plowman at 07:06, 16 January 2009
2009-01-16T07:06:28Z
<p></p>
<table style="background-color: #fff; color: #202122;" data-mw="interface">
<col class="diff-marker" />
<col class="diff-content" />
<col class="diff-marker" />
<col class="diff-content" />
<tr class="diff-title" lang="en">
<td colspan="2" style="background-color: #fff; color: #202122; text-align: center;">← Older revision</td>
<td colspan="2" style="background-color: #fff; color: #202122; text-align: center;">Revision as of 07:06, 16 January 2009</td>
</tr><tr><td colspan="2" class="diff-lineno" id="mw-diff-left-l1">Line 1:</td>
<td colspan="2" class="diff-lineno">Line 1:</td></tr>
<tr><td colspan="2" class="diff-side-deleted"></td><td class="diff-marker" data-marker="+"></td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;">{{CMake/Template/Obsolete}}</ins></div></td></tr>
<tr><td colspan="2" class="diff-side-deleted"></td><td class="diff-marker" data-marker="+"></td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;"></ins></div></td></tr>
<tr><td colspan="2" class="diff-side-deleted"></td><td class="diff-marker" data-marker="+"></td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;">Please see the '''VERSION_LESS''', '''VERSION_EQUAL''', and '''VERSION_GREATER''' options to the IF() command.</ins></div></td></tr>
<tr><td colspan="2" class="diff-side-deleted"></td><td class="diff-marker" data-marker="+"></td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;"></ins></div></td></tr>
<tr><td colspan="2" class="diff-side-deleted"></td><td class="diff-marker" data-marker="+"></td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;">----</ins></div></td></tr>
<tr><td colspan="2" class="diff-side-deleted"></td><td class="diff-marker" data-marker="+"></td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;"></ins></div></td></tr>
<tr><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>I needed a way to compare two version strings to make sure that I had a version of a package that was sufficient for my needs. The first go around I used regular expressions to pull out all the dot versions, create a number, and finally compare the number.</div></td><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>I needed a way to compare two version strings to make sure that I had a version of a package that was sufficient for my needs. The first go around I used regular expressions to pull out all the dot versions, create a number, and finally compare the number.</div></td></tr>
<tr><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><br/></td><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><br/></td></tr>
<tr><td colspan="2" class="diff-lineno" id="mw-diff-left-l182">Line 182:</td>
<td colspan="2" class="diff-lineno">Line 188:</td></tr>
<tr><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>10 > 1</div></td><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>10 > 1</div></td></tr>
<tr><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div></pre></div></td><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div></pre></div></td></tr>
<tr><td colspan="2" class="diff-side-deleted"></td><td class="diff-marker" data-marker="+"></td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;"></ins></div></td></tr>
<tr><td colspan="2" class="diff-side-deleted"></td><td class="diff-marker" data-marker="+"></td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;">[[Category:CMakeMacro]]</ins></div></td></tr>
</table>
Plowman
https://public.kitware.com/Wiki/index.php?title=CMakeCompareVersionStrings&diff=10507&oldid=prev
Bigler: Added COMPARE_VERSION macro for the testing code.
2007-09-24T17:41:17Z
<p>Added COMPARE_VERSION macro for the testing code.</p>
<table style="background-color: #fff; color: #202122;" data-mw="interface">
<col class="diff-marker" />
<col class="diff-content" />
<col class="diff-marker" />
<col class="diff-content" />
<tr class="diff-title" lang="en">
<td colspan="2" style="background-color: #fff; color: #202122; text-align: center;">← Older revision</td>
<td colspan="2" style="background-color: #fff; color: #202122; text-align: center;">Revision as of 17:41, 24 September 2007</td>
</tr><tr><td colspan="2" class="diff-lineno" id="mw-diff-left-l104">Line 104:</td>
<td colspan="2" class="diff-lineno">Line 104:</td></tr>
<tr><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><br/></td><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><br/></td></tr>
<tr><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div><pre></div></td><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div><pre></div></td></tr>
<tr><td colspan="2" class="diff-side-deleted"></td><td class="diff-marker" data-marker="+"></td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;"># a and b need to be passed in by value</ins></div></td></tr>
<tr><td colspan="2" class="diff-side-deleted"></td><td class="diff-marker" data-marker="+"></td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;">MACRO(COMPARE_VERSION a b)</ins></div></td></tr>
<tr><td colspan="2" class="diff-side-deleted"></td><td class="diff-marker" data-marker="+"></td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;"> COMPARE_VERSION_STRINGS(${a} ${b} result)</ins></div></td></tr>
<tr><td colspan="2" class="diff-side-deleted"></td><td class="diff-marker" data-marker="+"></td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;"> IF(result LESS 0)</ins></div></td></tr>
<tr><td colspan="2" class="diff-side-deleted"></td><td class="diff-marker" data-marker="+"></td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;"> MESSAGE("${a} < ${b}")</ins></div></td></tr>
<tr><td colspan="2" class="diff-side-deleted"></td><td class="diff-marker" data-marker="+"></td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;"> ELSE(result LESS 0)</ins></div></td></tr>
<tr><td colspan="2" class="diff-side-deleted"></td><td class="diff-marker" data-marker="+"></td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;"> IF(result GREATER 0)</ins></div></td></tr>
<tr><td colspan="2" class="diff-side-deleted"></td><td class="diff-marker" data-marker="+"></td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;"> MESSAGE("${a} > ${b}")</ins></div></td></tr>
<tr><td colspan="2" class="diff-side-deleted"></td><td class="diff-marker" data-marker="+"></td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;"> ELSE(result GREATER 0)</ins></div></td></tr>
<tr><td colspan="2" class="diff-side-deleted"></td><td class="diff-marker" data-marker="+"></td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;"> MESSAGE("${a} == ${b}")</ins></div></td></tr>
<tr><td colspan="2" class="diff-side-deleted"></td><td class="diff-marker" data-marker="+"></td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;"> ENDIF(result GREATER 0)</ins></div></td></tr>
<tr><td colspan="2" class="diff-side-deleted"></td><td class="diff-marker" data-marker="+"></td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;"> ENDIF(result LESS 0)</ins></div></td></tr>
<tr><td colspan="2" class="diff-side-deleted"></td><td class="diff-marker" data-marker="+"></td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;">ENDMACRO(COMPARE_VERSION)</ins></div></td></tr>
<tr><td colspan="2" class="diff-side-deleted"></td><td class="diff-marker" data-marker="+"></td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;"></ins></div></td></tr>
<tr><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div> SET(version-string "1.3.31")</div></td><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div> SET(version-string "1.3.31")</div></td></tr>
<tr><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><br/></td><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><br/></td></tr>
</table>
Bigler
https://public.kitware.com/Wiki/index.php?title=CMakeCompareVersionStrings&diff=10504&oldid=prev
Bigler: Filled in text for COMAPRE_VERSION_STRING macro
2007-09-24T17:38:53Z
<p>Filled in text for COMAPRE_VERSION_STRING macro</p>
<p><b>New page</b></p><div>I needed a way to compare two version strings to make sure that I had a version of a package that was sufficient for my needs. The first go around I used regular expressions to pull out all the dot versions, create a number, and finally compare the number.<br />
<br />
<pre><br />
SET(THREE_PART_VERSION_REGEX "[0-9]+\\.[0-9]+\\.[0-9]+")<br />
<br />
# Breaks up a string in the form n1.n2.n3 into three parts and stores<br />
# them in major, minor, and patch. version should be a value, not a<br />
# variable, while major, minor and patch should be variables.<br />
MACRO(THREE_PART_VERSION_TO_VARS version major minor patch)<br />
IF(${version} MATCHES ${THREE_PART_VERSION_REGEX})<br />
STRING(REGEX REPLACE "^([0-9]+)\\.[0-9]+\\.[0-9]+" "\\1" ${major} "${version}")<br />
STRING(REGEX REPLACE "^[0-9]+\\.([0-9])+\\.[0-9]+" "\\1" ${minor} "${version}")<br />
STRING(REGEX REPLACE "^[0-9]+\\.[0-9]+\\.([0-9]+)" "\\1" ${patch} "${version}")<br />
ELSE(${version} MATCHES ${THREE_PART_VERSION_REGEX})<br />
MESSAGE("MACRO(THREE_PART_VERSION_TO_VARS ${version} ${major} ${minor} ${patch}")<br />
MESSAGE(FATAL_ERROR "Problem parsing version string, I can't parse it properly.")<br />
ENDIF(${version} MATCHES ${THREE_PART_VERSION_REGEX})<br />
ENDMACRO(THREE_PART_VERSION_TO_VARS)<br />
<br />
THREE_PART_VERSION_TO_VARS(${version-string} major_vers minor_vers patch_vers)<br />
MESSAGE("version = ${major_vers}.${minor_vers}.${patch_vers}")<br />
<br />
# Compute a version number<br />
MATH(EXPR version_number "${major_vers} * 1000000 + ${minor_vers} * 1000 + ${patch_vers}" )<br />
MESSAGE("version_number = ${version_number}")<br />
</pre><br />
<br />
This was somewhat cumbersome, and was hard coded for three dot versions (x.y.z). I wanted to be able to use a single macro for version strings with 1 to any number of dot versions. In addition I wanted to be able to compare version strings with different number of dot versions (i.e. 0.99.1 and 0.99.1.2).<br />
<br />
<pre><br />
# Computes the realtionship between two version strings. A version<br />
# string is a number delineated by '.'s such as 1.3.2 and 0.99.9.1.<br />
# You can feed version strings with different number of dot versions,<br />
# and the shorter version number will be padded with zeros: 9.2 <<br />
# 9.2.1 will actually compare 9.2.0 < 9.2.1.<br />
#<br />
# Input: a_in - value, not variable<br />
# b_in - value, not variable<br />
# result_out - variable with value:<br />
# -1 : a_in < b_in<br />
# 0 : a_in == b_in<br />
# 1 : a_in > b_in<br />
#<br />
# Written by James Bigler.<br />
MACRO(COMPARE_VERSION_STRINGS a_in b_in result_out)<br />
# Since SEPARATE_ARGUMENTS using ' ' as the separation token,<br />
# replace '.' with ' ' to allow easy tokenization of the string.<br />
STRING(REPLACE "." " " a ${a_in})<br />
STRING(REPLACE "." " " b ${b_in})<br />
SEPARATE_ARGUMENTS(a)<br />
SEPARATE_ARGUMENTS(b)<br />
<br />
# Check the size of each list to see if they are equal.<br />
LIST(LENGTH a a_length)<br />
LIST(LENGTH b b_length)<br />
<br />
# Pad the shorter list with zeros.<br />
<br />
# Note that range needs to be one less than the length as the for<br />
# loop is inclusive (silly CMake).<br />
IF(a_length LESS b_length)<br />
# a is shorter<br />
SET(shorter a)<br />
MATH(EXPR range "${b_length} - 1")<br />
MATH(EXPR pad_range "${b_length} - ${a_length} - 1")<br />
ELSE(a_length LESS b_length)<br />
# b is shorter<br />
SET(shorter b)<br />
MATH(EXPR range "${a_length} - 1")<br />
MATH(EXPR pad_range "${a_length} - ${b_length} - 1")<br />
ENDIF(a_length LESS b_length)<br />
<br />
# PAD out if we need to<br />
IF(NOT pad_range LESS 0)<br />
FOREACH(pad RANGE ${pad_range})<br />
# Since shorter is an alias for b, we need to get to it by by dereferencing shorter.<br />
LIST(APPEND ${shorter} 0)<br />
ENDFOREACH(pad RANGE ${pad_range})<br />
ENDIF(NOT pad_range LESS 0)<br />
<br />
SET(result 0)<br />
FOREACH(index RANGE ${range})<br />
IF(result EQUAL 0)<br />
# Only continue to compare things as long as they are equal<br />
LIST(GET a ${index} a_version)<br />
LIST(GET b ${index} b_version)<br />
# LESS<br />
IF(a_version LESS b_version)<br />
SET(result -1)<br />
ENDIF(a_version LESS b_version)<br />
# GREATER<br />
IF(a_version GREATER b_version)<br />
SET(result 1)<br />
ENDIF(a_version GREATER b_version)<br />
ENDIF(result EQUAL 0)<br />
ENDFOREACH(index)<br />
<br />
# Copy out the return result<br />
SET(${result_out} ${result})<br />
ENDMACRO(COMPARE_VERSION_STRINGS)<br />
</pre><br />
<br />
I tested it with the following input:<br />
<br />
<pre><br />
SET(version-string "1.3.31")<br />
<br />
COMPARE_VERSION(${version-string} "1.3.30")<br />
COMPARE_VERSION(${version-string} "1.3.31")<br />
COMPARE_VERSION(${version-string} "1.3.32")<br />
COMPARE_VERSION(${version-string} "1.2.32")<br />
COMPARE_VERSION(${version-string} "1.10.1")<br />
<br />
COMPARE_VERSION("9.2" "9.1")<br />
COMPARE_VERSION("9.2" "9.2")<br />
COMPARE_VERSION("9.2" "9.3")<br />
<br />
COMPARE_VERSION("9.1" "9.2")<br />
COMPARE_VERSION("9.2" "9.2")<br />
COMPARE_VERSION("9.3" "9.2")<br />
<br />
COMPARE_VERSION("9.10" "9.2")<br />
COMPARE_VERSION("9.2" "9.10")<br />
<br />
COMPARE_VERSION("0.92.1.0" "0.92.1.1")<br />
COMPARE_VERSION("0.92.1.1" "0.92.1.1")<br />
COMPARE_VERSION("0.92.1.2" "0.92.1.1")<br />
<br />
COMPARE_VERSION("0.92.1.2" "0.99.1.1")<br />
COMPARE_VERSION("0.99.1.2" "0.92.1.1")<br />
<br />
COMPARE_VERSION("0.92.1.2" "0.99.1")<br />
COMPARE_VERSION("0.99.1" "0.92.1.1")<br />
<br />
COMPARE_VERSION("0.99.1.2" "0.99.1")<br />
COMPARE_VERSION("0.99.1" "0.99.1.1")<br />
<br />
COMPARE_VERSION( "1" "10")<br />
COMPARE_VERSION("10" "1")<br />
</pre><br />
<br />
Here's the output:<br />
<br />
<pre><br />
1.3.31 > 1.3.30<br />
1.3.31 == 1.3.31<br />
1.3.31 < 1.3.32<br />
1.3.31 > 1.2.32 (note this is 1.2 not 1.3)<br />
1.3.31 < 1.10.1<br />
9.2 > 9.1<br />
9.2 == 9.2<br />
9.2 < 9.3<br />
9.1 < 9.2<br />
9.2 == 9.2<br />
9.3 > 9.2<br />
9.10 > 9.2<br />
9.2 < 9.10<br />
0.92.1.0 < 0.92.1.1<br />
0.92.1.1 == 0.92.1.1<br />
0.92.1.2 > 0.92.1.1<br />
0.92.1.2 < 0.99.1.1<br />
0.99.1.2 > 0.92.1.1<br />
0.92.1.2 < 0.99.1<br />
0.99.1 > 0.92.1.1<br />
0.99.1.2 > 0.99.1<br />
0.99.1 < 0.99.1.1<br />
1 < 10<br />
10 > 1<br />
</pre></div>
Bigler