set(min_ver 2.7.20090305) cmake_minimum_required(VERSION ${min_ver}) if("${CMAKE_VERSION}" VERSION_LESS "${min_ver}") message(FATAL_ERROR "CMAKE_VERSION=[${CMAKE_VERSION}] is less than [${min_ver}]") else() message("CMAKE_VERSION=[${CMAKE_VERSION}] is not less than [${min_ver}]") endif() set(EQUALV "1 1") list(APPEND EQUALV "1.0 1") list(APPEND EQUALV "1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0 1") list(APPEND EQUALV "1.2.3.4.5.6.7 1.2.3.4.5.6.7") list(APPEND EQUALV "1.2.3.4.5.6.7.8.9 1.2.3.4.5.6.7.8.9") foreach(v IN LISTS EQUALV) string(REGEX MATCH "(.*) (.*)" _dummy "${v}") # modify any of the operands to see the negative check also works if("${CMAKE_MATCH_1}.2" VERSION_EQUAL CMAKE_MATCH_2) message(FATAL_ERROR "${CMAKE_MATCH_1}.2 is equal ${CMAKE_MATCH_2}?") else() message(STATUS "${CMAKE_MATCH_1}.2 is not equal ${CMAKE_MATCH_2}") endif() if(CMAKE_MATCH_1 VERSION_EQUAL "${CMAKE_MATCH_2}.2") message(FATAL_ERROR "${CMAKE_MATCH_1} is equal ${CMAKE_MATCH_2}.2?") else() message(STATUS "${CMAKE_MATCH_1} is not equal ${CMAKE_MATCH_2}.2") endif() endforeach() # test the negative outcomes first, due to the implementation the positive # allow some additional strings to pass that would not fail for the negative # tests list(APPEND EQUALV "1a 1") list(APPEND EQUALV "1.1a 1.1") list(APPEND EQUALV "1.0a 1") list(APPEND EQUALV "1a 1.0") foreach(v IN LISTS EQUALV) # check equal versions string(REGEX MATCH "(.*) (.*)" _dummy "${v}") if(CMAKE_MATCH_1 VERSION_EQUAL CMAKE_MATCH_2) message(STATUS "${CMAKE_MATCH_1} is equal ${CMAKE_MATCH_2}") else() message(FATAL_ERROR "${CMAKE_MATCH_1} is not equal ${CMAKE_MATCH_2}?") endif() # still equal, but inverted order of operands string(REGEX MATCH "(.*) (.*)" _dummy "${v}") if(CMAKE_MATCH_2 VERSION_EQUAL CMAKE_MATCH_1) message(STATUS "${CMAKE_MATCH_2} is equal ${CMAKE_MATCH_1}") else() message(FATAL_ERROR "${CMAKE_MATCH_2} is not equal ${CMAKE_MATCH_1}?") endif() endforeach() set(LESSV "1.2.3.4.5.6.7.8 1.2.3.4.5.6.7.9") list(APPEND LESSV "1.2.3.4.5.6.7 1.2.3.4.5.6.7.9") list(APPEND LESSV "1 1.0.0.1") foreach(v IN LISTS LESSV) string(REGEX MATCH "(.*) (.*)" _dummy "${v}") # check less if(CMAKE_MATCH_1 VERSION_LESS CMAKE_MATCH_2) message(STATUS "${CMAKE_MATCH_1} is less than ${CMAKE_MATCH_2}") else() message(FATAL_ERROR "${CMAKE_MATCH_1} is not less than ${CMAKE_MATCH_2}?") endif() # check greater if(CMAKE_MATCH_2 VERSION_GREATER CMAKE_MATCH_1) message(STATUS "${CMAKE_MATCH_2} is greater than ${CMAKE_MATCH_1}") else() message(FATAL_ERROR "${CMAKE_MATCH_2} is not greater than ${CMAKE_MATCH_1}?") endif() # check less negative case if(NOT CMAKE_MATCH_2 VERSION_LESS CMAKE_MATCH_1) message(STATUS "${CMAKE_MATCH_2} is not less than ${CMAKE_MATCH_1}") else() message(FATAL_ERROR "${CMAKE_MATCH_2} is less than ${CMAKE_MATCH_1}?") endif() # check greater or equal (same as less negative) if(CMAKE_MATCH_2 VERSION_GREATER_EQUAL CMAKE_MATCH_1) message(STATUS "${CMAKE_MATCH_2} is not less than ${CMAKE_MATCH_1}") else() message(FATAL_ERROR "${CMAKE_MATCH_2} is less than ${CMAKE_MATCH_1}?") endif() # check greater negative case if(NOT CMAKE_MATCH_1 VERSION_GREATER CMAKE_MATCH_2) message(STATUS "${CMAKE_MATCH_1} is not greater than ${CMAKE_MATCH_2}") else() message(FATAL_ERROR "${CMAKE_MATCH_1} is greater than ${CMAKE_MATCH_2}?") endif() # check less or equal (same as greater negative) case if(CMAKE_MATCH_1 VERSION_LESS_EQUAL CMAKE_MATCH_2) message(STATUS "${CMAKE_MATCH_1} is not greater than ${CMAKE_MATCH_2}") else() message(FATAL_ERROR "${CMAKE_MATCH_1} is greater than ${CMAKE_MATCH_2}?") endif() endforeach()