aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Merry <alex.merry@kde.org>2014-12-27 15:28:39 +0000
committerAlex Merry <alex.merry@kde.org>2014-12-28 15:03:31 +0000
commitbd69cdeea9aef1f254b7d83dd137a4de955151b7 (patch)
treef31fa1f7730fa6cf5aa64b506d5aaa306d3c1891
parentfe771709d774402e4cdeb883c2783f64b6e62d65 (diff)
downloadextra-cmake-modules-bd69cdeea9aef1f254b7d83dd137a4de955151b7.tar.gz
extra-cmake-modules-bd69cdeea9aef1f254b7d83dd137a4de955151b7.tar.bz2
Add COMPATIBILITY argument to ecm_setup_version().
Lots of libraries will want to use SameMajorVersion to make sure searching for version 1 of a library doesn't give you version 2, for example. We may want to add another, custom compatibility mode for KDE Frameworks-style versioning, where version x.90.z to x.99.z are alpha/beta releases for version (x+1). REVIEW: 121696
-rw-r--r--modules/ECMSetupVersion.cmake13
-rw-r--r--tests/ECMSetupVersionTest/CMakeLists.txt3
-rw-r--r--tests/ECMSetupVersionTest/old_version_file_anynewer/CMakeLists.txt77
-rw-r--r--tests/ECMSetupVersionTest/old_version_file_anynewer/main.c4
-rw-r--r--tests/ECMSetupVersionTest/old_version_file_exact/CMakeLists.txt82
-rw-r--r--tests/ECMSetupVersionTest/old_version_file_exact/main.c4
-rw-r--r--tests/ECMSetupVersionTest/old_version_file_samemajor/CMakeLists.txt77
-rw-r--r--tests/ECMSetupVersionTest/old_version_file_samemajor/main.c4
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;
+}