diff options
8 files changed, 260 insertions, 4 deletions
| diff --git a/modules/ECMSetupVersion.cmake b/modules/ECMSetupVersion.cmake index 2aff0ae0..83d7d798 100644 --- a/modules/ECMSetupVersion.cmake +++ b/modules/ECMSetupVersion.cmake @@ -10,7 +10,7 @@  #                     VARIABLE_PREFIX <prefix>  #                     [SOVERSION <soversion>]  #                     [VERSION_HEADER <filename>] -#                     [PACKAGE_VERSION_FILE <filename>] ) +#                     [PACKAGE_VERSION_FILE <filename> [COMPATIBILITY <compat>]] )  #  # This parses a version string and sets up a standard set of version variables.  # It can optionally also create a C version header file and a CMake package @@ -55,7 +55,9 @@  # file is created using the write_basic_package_version_file() macro provided by  # CMake. It should be installed in the same location as the Config.cmake file of  # the library so that it can be found by find_package().  If the filename is a -# relative path, it is interpreted as relative to CMAKE_CURRENT_BINARY_DIR. +# relative path, it is interpreted as relative to CMAKE_CURRENT_BINARY_DIR. The +# optional COMPATIBILITY option is forwarded to +# write_basic_package_version_file(), and defaults to AnyNewerVersion.  #  # If CMake policy CMP0048 is NEW, an alternative form of the command is  # available:: @@ -94,7 +96,7 @@ set(_ECM_SETUP_VERSION_HEADER_TEMPLATE "${CMAKE_CURRENT_LIST_DIR}/ECMVersionHead  function(ECM_SETUP_VERSION _version)    set(options ) -  set(oneValueArgs VARIABLE_PREFIX SOVERSION VERSION_HEADER PACKAGE_VERSION_FILE) +  set(oneValueArgs VARIABLE_PREFIX SOVERSION VERSION_HEADER PACKAGE_VERSION_FILE COMPATIBILITY)    set(multiValueArgs )    cmake_parse_arguments(ESV "${options}" "${oneValueArgs}" "${multiValueArgs}"  ${ARGN}) @@ -175,7 +177,10 @@ function(ECM_SETUP_VERSION _version)    endif()    if(ESV_PACKAGE_VERSION_FILE) -    write_basic_package_version_file("${ESV_PACKAGE_VERSION_FILE}" VERSION ${_version} COMPATIBILITY AnyNewerVersion) +    if(NOT ESV_COMPATIBILITY) +        set(ESV_COMPATIBILITY AnyNewerVersion) +    endif() +    write_basic_package_version_file("${ESV_PACKAGE_VERSION_FILE}" VERSION ${_version} COMPATIBILITY ${ESV_COMPATIBILITY})    endif()    if(should_set_prefixed_vars) diff --git a/tests/ECMSetupVersionTest/CMakeLists.txt b/tests/ECMSetupVersionTest/CMakeLists.txt index 2e7decfb..b0845e57 100644 --- a/tests/ECMSetupVersionTest/CMakeLists.txt +++ b/tests/ECMSetupVersionTest/CMakeLists.txt @@ -17,6 +17,9 @@ add_version_test(old_simple dummy)  add_version_test(old_soversion dummy)  add_version_test(old_version_file dummy)  add_version_test(old_version_file_abspath dummy) +add_version_test(old_version_file_anynewer dummy) +add_version_test(old_version_file_exact dummy) +add_version_test(old_version_file_samemajor dummy)  add_version_test(old_header check_header)  add_version_test(old_header_abspath check_header) diff --git a/tests/ECMSetupVersionTest/old_version_file_anynewer/CMakeLists.txt b/tests/ECMSetupVersionTest/old_version_file_anynewer/CMakeLists.txt new file mode 100644 index 00000000..c90f22b4 --- /dev/null +++ b/tests/ECMSetupVersionTest/old_version_file_anynewer/CMakeLists.txt @@ -0,0 +1,77 @@ +cmake_minimum_required(VERSION 2.8.12) + +project(old_version_file_anynewer) + +set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../../../modules) +include(ECMSetupVersion) + +ecm_setup_version(2.3.4 +    VARIABLE_PREFIX Foo +    PACKAGE_VERSION_FILE FooVersion.cmake COMPATIBILITY AnyNewerVersion +) + +macro(strcheck var val) +    if(NOT ${var} STREQUAL "${val}") +        message(FATAL_ERROR "${var} was ${${var}} instead of ${val}") +    endif() +endmacro() +macro(numcheck var val) +    if(NOT ${var} EQUAL "${val}") +        message(FATAL_ERROR "${var} was ${${var}} instead of ${val}") +    endif() +endmacro() +macro(boolcheck var val) +    if(${val} AND NOT ${var}) +        message(FATAL_ERROR "${var} was FALSE") +    elseif(${var} AND NOT ${val}) +        message(FATAL_ERROR "${var} was TRUE") +    endif() +endmacro() + +macro(find_foo major minor patch) +    unset(PACKAGE_VERSION) +    unset(PACKAGE_VERSION_COMPATIBLE) +    unset(PACKAGE_VERSION_EXACT) +    set(PACKAGE_FIND_VERSION "${major}.${minor}.${patch}") +    set(PACKAGE_FIND_VERSION_MAJOR "${major}") +    set(PACKAGE_FIND_VERSION_MINOR "${minor}") +    set(PACKAGE_FIND_VERSION_PATCH "${patch}") +    set(PACKAGE_FIND_VERSION_TWEAK) +    include("${CMAKE_CURRENT_BINARY_DIR}/FooVersion.cmake") +    strcheck(PACKAGE_VERSION "2.3.4") +endmacro() + +strcheck(PROJECT_VERSION "2.3.4") +strcheck(PROJECT_VERSION_STRING "2.3.4") +numcheck(PROJECT_VERSION_MAJOR 2) +numcheck(PROJECT_VERSION_MINOR 3) +numcheck(PROJECT_VERSION_PATCH 4) + +strcheck(Foo_VERSION "2.3.4") +strcheck(Foo_VERSION_STRING "2.3.4") +numcheck(Foo_VERSION_MAJOR 2) +numcheck(Foo_VERSION_MINOR 3) +numcheck(Foo_VERSION_PATCH 4) +numcheck(Foo_SOVERSION 2) + +# too old - fails +find_foo(3 1 1) +boolcheck(PACKAGE_VERSION_COMPATIBLE FALSE) +boolcheck(PACKAGE_VERSION_EXACT FALSE) + +# newer - succeeds +find_foo(1 1 1) +boolcheck(PACKAGE_VERSION_COMPATIBLE TRUE) +boolcheck(PACKAGE_VERSION_EXACT FALSE) + +# newer - succeeds +find_foo(2 1 1) +boolcheck(PACKAGE_VERSION_COMPATIBLE TRUE) +boolcheck(PACKAGE_VERSION_EXACT FALSE) + +# exact - succeeds +find_foo(2 3 4) +boolcheck(PACKAGE_VERSION_COMPATIBLE TRUE) +boolcheck(PACKAGE_VERSION_EXACT TRUE) + +add_executable(dummy main.c) diff --git a/tests/ECMSetupVersionTest/old_version_file_anynewer/main.c b/tests/ECMSetupVersionTest/old_version_file_anynewer/main.c new file mode 100644 index 00000000..c13815ce --- /dev/null +++ b/tests/ECMSetupVersionTest/old_version_file_anynewer/main.c @@ -0,0 +1,4 @@ +int main() +{ +   return 0; +} diff --git a/tests/ECMSetupVersionTest/old_version_file_exact/CMakeLists.txt b/tests/ECMSetupVersionTest/old_version_file_exact/CMakeLists.txt new file mode 100644 index 00000000..999a6cd8 --- /dev/null +++ b/tests/ECMSetupVersionTest/old_version_file_exact/CMakeLists.txt @@ -0,0 +1,82 @@ +cmake_minimum_required(VERSION 2.8.12) + +project(old_version_file_exact) + +set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../../../modules) +include(ECMSetupVersion) + +ecm_setup_version(2.3.4 +    VARIABLE_PREFIX Foo +    PACKAGE_VERSION_FILE FooVersion.cmake COMPATIBILITY ExactVersion +) + +macro(strcheck var val) +    if(NOT ${var} STREQUAL "${val}") +        message(FATAL_ERROR "${var} was ${${var}} instead of ${val}") +    endif() +endmacro() +macro(numcheck var val) +    if(NOT ${var} EQUAL "${val}") +        message(FATAL_ERROR "${var} was ${${var}} instead of ${val}") +    endif() +endmacro() +macro(boolcheck var val) +    if(${val} AND NOT ${var}) +        message(FATAL_ERROR "${var} was FALSE") +    elseif(${var} AND NOT ${val}) +        message(FATAL_ERROR "${var} was TRUE") +    endif() +endmacro() + +macro(find_foo major minor patch) +    unset(PACKAGE_VERSION) +    unset(PACKAGE_VERSION_COMPATIBLE) +    unset(PACKAGE_VERSION_EXACT) +    set(PACKAGE_FIND_VERSION "${major}.${minor}.${patch}") +    set(PACKAGE_FIND_VERSION_MAJOR "${major}") +    set(PACKAGE_FIND_VERSION_MINOR "${minor}") +    set(PACKAGE_FIND_VERSION_PATCH "${patch}") +    set(PACKAGE_FIND_VERSION_TWEAK) +    include("${CMAKE_CURRENT_BINARY_DIR}/FooVersion.cmake") +    strcheck(PACKAGE_VERSION "2.3.4") +endmacro() + +strcheck(PROJECT_VERSION "2.3.4") +strcheck(PROJECT_VERSION_STRING "2.3.4") +numcheck(PROJECT_VERSION_MAJOR 2) +numcheck(PROJECT_VERSION_MINOR 3) +numcheck(PROJECT_VERSION_PATCH 4) + +strcheck(Foo_VERSION "2.3.4") +strcheck(Foo_VERSION_STRING "2.3.4") +numcheck(Foo_VERSION_MAJOR 2) +numcheck(Foo_VERSION_MINOR 3) +numcheck(Foo_VERSION_PATCH 4) +numcheck(Foo_SOVERSION 2) + +# too old - fails +find_foo(3 1 1) +boolcheck(PACKAGE_VERSION_COMPATIBLE FALSE) +boolcheck(PACKAGE_VERSION_EXACT FALSE) + +# wrong major version - fails +find_foo(1 1 1) +boolcheck(PACKAGE_VERSION_COMPATIBLE FALSE) +boolcheck(PACKAGE_VERSION_EXACT FALSE) + +# wrong minor - fails +find_foo(2 1 1) +boolcheck(PACKAGE_VERSION_COMPATIBLE FALSE) +boolcheck(PACKAGE_VERSION_EXACT FALSE) + +# wrong patch - fails +find_foo(2 3 1) +boolcheck(PACKAGE_VERSION_COMPATIBLE FALSE) +boolcheck(PACKAGE_VERSION_EXACT FALSE) + +# exact - succeeds +find_foo(2 3 4) +boolcheck(PACKAGE_VERSION_COMPATIBLE TRUE) +boolcheck(PACKAGE_VERSION_EXACT TRUE) + +add_executable(dummy main.c) diff --git a/tests/ECMSetupVersionTest/old_version_file_exact/main.c b/tests/ECMSetupVersionTest/old_version_file_exact/main.c new file mode 100644 index 00000000..c13815ce --- /dev/null +++ b/tests/ECMSetupVersionTest/old_version_file_exact/main.c @@ -0,0 +1,4 @@ +int main() +{ +   return 0; +} diff --git a/tests/ECMSetupVersionTest/old_version_file_samemajor/CMakeLists.txt b/tests/ECMSetupVersionTest/old_version_file_samemajor/CMakeLists.txt new file mode 100644 index 00000000..569dcac3 --- /dev/null +++ b/tests/ECMSetupVersionTest/old_version_file_samemajor/CMakeLists.txt @@ -0,0 +1,77 @@ +cmake_minimum_required(VERSION 2.8.12) + +project(old_version_file_samemajor) + +set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../../../modules) +include(ECMSetupVersion) + +ecm_setup_version(2.3.4 +    VARIABLE_PREFIX Foo +    PACKAGE_VERSION_FILE FooVersion.cmake COMPATIBILITY SameMajorVersion +) + +macro(strcheck var val) +    if(NOT ${var} STREQUAL "${val}") +        message(FATAL_ERROR "${var} was ${${var}} instead of ${val}") +    endif() +endmacro() +macro(numcheck var val) +    if(NOT ${var} EQUAL "${val}") +        message(FATAL_ERROR "${var} was ${${var}} instead of ${val}") +    endif() +endmacro() +macro(boolcheck var val) +    if(${val} AND NOT ${var}) +        message(FATAL_ERROR "${var} was FALSE") +    elseif(${var} AND NOT ${val}) +        message(FATAL_ERROR "${var} was TRUE") +    endif() +endmacro() + +macro(find_foo major minor patch) +    unset(PACKAGE_VERSION) +    unset(PACKAGE_VERSION_COMPATIBLE) +    unset(PACKAGE_VERSION_EXACT) +    set(PACKAGE_FIND_VERSION "${major}.${minor}.${patch}") +    set(PACKAGE_FIND_VERSION_MAJOR "${major}") +    set(PACKAGE_FIND_VERSION_MINOR "${minor}") +    set(PACKAGE_FIND_VERSION_PATCH "${patch}") +    set(PACKAGE_FIND_VERSION_TWEAK) +    include("${CMAKE_CURRENT_BINARY_DIR}/FooVersion.cmake") +    strcheck(PACKAGE_VERSION "2.3.4") +endmacro() + +strcheck(PROJECT_VERSION "2.3.4") +strcheck(PROJECT_VERSION_STRING "2.3.4") +numcheck(PROJECT_VERSION_MAJOR 2) +numcheck(PROJECT_VERSION_MINOR 3) +numcheck(PROJECT_VERSION_PATCH 4) + +strcheck(Foo_VERSION "2.3.4") +strcheck(Foo_VERSION_STRING "2.3.4") +numcheck(Foo_VERSION_MAJOR 2) +numcheck(Foo_VERSION_MINOR 3) +numcheck(Foo_VERSION_PATCH 4) +numcheck(Foo_SOVERSION 2) + +# too old - fails +find_foo(3 1 1) +boolcheck(PACKAGE_VERSION_COMPATIBLE FALSE) +boolcheck(PACKAGE_VERSION_EXACT FALSE) + +# wrong major version - fails +find_foo(1 1 1) +boolcheck(PACKAGE_VERSION_COMPATIBLE FALSE) +boolcheck(PACKAGE_VERSION_EXACT FALSE) + +# correct major version, more recent - succeeds +find_foo(2 1 1) +boolcheck(PACKAGE_VERSION_COMPATIBLE TRUE) +boolcheck(PACKAGE_VERSION_EXACT FALSE) + +# exact - succeeds +find_foo(2 3 4) +boolcheck(PACKAGE_VERSION_COMPATIBLE TRUE) +boolcheck(PACKAGE_VERSION_EXACT TRUE) + +add_executable(dummy main.c) diff --git a/tests/ECMSetupVersionTest/old_version_file_samemajor/main.c b/tests/ECMSetupVersionTest/old_version_file_samemajor/main.c new file mode 100644 index 00000000..c13815ce --- /dev/null +++ b/tests/ECMSetupVersionTest/old_version_file_samemajor/main.c @@ -0,0 +1,4 @@ +int main() +{ +   return 0; +} | 
