Warning, /frameworks/extra-cmake-modules/modules/ECMSetupVersion.cmake is written in an unsupported language. File is not indexed.

0001 # SPDX-FileCopyrightText: 2014 Alex Merry <alex.merry@kde.org>
0002 # SPDX-FileCopyrightText: 2012 Alexander Neundorf <neundorf@kde.org>
0003 #
0004 # SPDX-License-Identifier: BSD-3-Clause
0005 
0006 #[=======================================================================[.rst:
0007 ECMSetupVersion
0008 ---------------
0009 
0010 Handle library version information.
0011 
0012 ::
0013 
0014   ecm_setup_version(<version>
0015                     VARIABLE_PREFIX <prefix>
0016                     [SOVERSION <soversion>]
0017                     [VERSION_HEADER <filename>]
0018                     [PACKAGE_VERSION_FILE <filename> [COMPATIBILITY <compat>]] )
0019 
0020 This parses a version string and sets up a standard set of version variables.
0021 It can optionally also create a C version header file and a CMake package
0022 version file to install along with the library.
0023 
0024 If the ``<version>`` argument is of the form ``<major>.<minor>.<patch>``
0025 (or ``<major>.<minor>.<patch>.<tweak>``), The following CMake variables are
0026 set::
0027 
0028   <prefix>_VERSION_MAJOR  - <major>
0029   <prefix>_VERSION_MINOR  - <minor>
0030   <prefix>_VERSION_PATCH  - <patch>
0031   <prefix>_VERSION        - <version>
0032   <prefix>_SOVERSION      - <soversion>, or <major> if SOVERSION was not given
0033 
0034 For backward-compatibility also this variable is set (only if the minimum required
0035 version of ECM is < 5.83)::
0036 
0037   <prefix>_VERSION_STRING - <version> (use <prefix>_VERSION instead)
0038 
0039 If CMake policy CMP0048 is not ``NEW``, the following CMake variables will also
0040 be set::
0041 
0042   PROJECT_VERSION_MAJOR   - <major>
0043   PROJECT_VERSION_MINOR   - <minor>
0044   PROJECT_VERSION_PATCH   - <patch>
0045   PROJECT_VERSION         - <version>
0046 
0047 For backward-compatibility, if CMake policy CMP0048 is not ``NEW``, also this variable is set
0048 (only if the minimum required version of ECM is < 5.83)::
0049 
0050   PROJECT_VERSION_STRING  - <version> (use PROJECT_VERSION instead)
0051 
0052 If the ``VERSION_HEADER`` option is used, a simple C header is generated with the
0053 given filename. If filename is a relative path, it is interpreted as relative
0054 to ``CMAKE_CURRENT_BINARY_DIR``.  The generated header contains the following
0055 macros::
0056 
0057    <prefix>_VERSION_MAJOR  - <major> as an integer
0058    <prefix>_VERSION_MINOR  - <minor> as an integer
0059    <prefix>_VERSION_PATCH  - <patch> as an integer
0060    <prefix>_VERSION_STRING - <version> as a C string
0061    <prefix>_VERSION        - the version as an integer
0062 
0063 ``<prefix>_VERSION`` has ``<patch>`` in the bottom 8 bits, ``<minor>`` in the
0064 next 8 bits and ``<major>`` in the remaining bits.  Note that ``<patch>`` and
0065 ``<minor>`` must be less than 256.
0066 
0067 If the ``PACKAGE_VERSION_FILE`` option is used, a simple CMake package version
0068 file is created using the ``write_basic_package_version_file()`` macro provided by
0069 CMake. It should be installed in the same location as the Config.cmake file of
0070 the library so that it can be found by ``find_package()``.  If the filename is a
0071 relative path, it is interpreted as relative to ``CMAKE_CURRENT_BINARY_DIR``. The
0072 optional ``COMPATIBILITY`` option is forwarded to
0073 ``write_basic_package_version_file()``, and defaults to ``AnyNewerVersion``.
0074 
0075 If CMake policy CMP0048 is ``NEW``, an alternative form of the command is
0076 available::
0077 
0078   ecm_setup_version(PROJECT
0079                     [VARIABLE_PREFIX <prefix>]
0080                     [SOVERSION <soversion>]
0081                     [VERSION_HEADER <filename>]
0082                     [PACKAGE_VERSION_FILE <filename>] )
0083 
0084 This will use the version information set by the ``project()`` command.
0085 ``VARIABLE_PREFIX`` defaults to the project name.  Note that ``PROJECT`` must be the
0086 first argument.  In all other respects, it behaves like the other form of the
0087 command.
0088 
0089 Since pre-1.0.0.
0090 
0091 ``COMPATIBILITY`` option available since 1.6.0.
0092 #]=======================================================================]
0093 
0094 include(CMakePackageConfigHelpers)
0095 
0096 # save the location of the header template while CMAKE_CURRENT_LIST_DIR
0097 # has the value we want
0098 set(_ECM_SETUP_VERSION_HEADER_TEMPLATE "${CMAKE_CURRENT_LIST_DIR}/ECMVersionHeader.h.in")
0099 
0100 function(ecm_setup_version _version)
0101     set(options )
0102     set(oneValueArgs VARIABLE_PREFIX SOVERSION VERSION_HEADER PACKAGE_VERSION_FILE COMPATIBILITY)
0103     set(multiValueArgs )
0104 
0105     cmake_parse_arguments(ESV "${options}" "${oneValueArgs}" "${multiValueArgs}"  ${ARGN})
0106 
0107     if(ESV_UNPARSED_ARGUMENTS)
0108         message(FATAL_ERROR "Unknown keywords given to ECM_SETUP_VERSION(): \"${ESV_UNPARSED_ARGUMENTS}\"")
0109     endif()
0110 
0111     set(project_manages_version FALSE)
0112     set(use_project_version FALSE)
0113     cmake_policy(GET CMP0048 project_version_policy)
0114     if(project_version_policy STREQUAL "NEW")
0115         set(project_manages_version TRUE)
0116         if(_version STREQUAL "PROJECT")
0117             set(use_project_version TRUE)
0118         endif()
0119     elseif(_version STREQUAL "PROJECT")
0120         message(FATAL_ERROR "ecm_setup_version given PROJECT argument, but CMP0048 is not NEW")
0121     endif()
0122 
0123     set(should_set_prefixed_vars TRUE)
0124     if(NOT ESV_VARIABLE_PREFIX)
0125         if(use_project_version)
0126             set(ESV_VARIABLE_PREFIX "${PROJECT_NAME}")
0127             set(should_set_prefixed_vars FALSE)
0128         else()
0129             message(FATAL_ERROR "Required argument PREFIX missing in ECM_SETUP_VERSION() call")
0130         endif()
0131     endif()
0132 
0133     if(use_project_version)
0134         set(_version "${PROJECT_VERSION}")
0135         # drop leading 0 from values to avoid bogus octal values in c/C++ e.g. with 08 or 09
0136         string(REGEX REPLACE "0*([0-9]+)" "\\1" _major "${PROJECT_VERSION_MAJOR}")
0137         string(REGEX REPLACE "0*([0-9]+)" "\\1" _minor "${PROJECT_VERSION_MINOR}")
0138         string(REGEX REPLACE "0*([0-9]+)" "\\1" _patch "${PROJECT_VERSION_PATCH}")
0139     else()
0140         string(REGEX REPLACE "^0*([0-9]+)\\.[0-9]+\\.[0-9]+.*" "\\1" _major "${_version}")
0141         string(REGEX REPLACE "^[0-9]+\\.0*([0-9]+)\\.[0-9]+.*" "\\1" _minor "${_version}")
0142         string(REGEX REPLACE "^[0-9]+\\.[0-9]+\\.0*([0-9]+).*" "\\1" _patch "${_version}")
0143     endif()
0144 
0145     if(NOT DEFINED ESV_SOVERSION) # use DEFINED, so "0" as valid SO version is not evaluated to FALSE
0146         set(ESV_SOVERSION ${_major})
0147     endif()
0148 
0149     if(ECM_GLOBAL_FIND_VERSION VERSION_LESS 5.83.0)
0150         set(_set_backward_compat_version_string_vars TRUE)
0151     else()
0152         set(_set_backward_compat_version_string_vars FALSE)
0153     endif()
0154 
0155     if(should_set_prefixed_vars)
0156         set(${ESV_VARIABLE_PREFIX}_VERSION "${_version}")
0157         set(${ESV_VARIABLE_PREFIX}_VERSION_MAJOR ${_major})
0158         set(${ESV_VARIABLE_PREFIX}_VERSION_MINOR ${_minor})
0159         set(${ESV_VARIABLE_PREFIX}_VERSION_PATCH ${_patch})
0160     endif()
0161 
0162     set(${ESV_VARIABLE_PREFIX}_SOVERSION ${ESV_SOVERSION})
0163 
0164     if(NOT project_manages_version)
0165         set(PROJECT_VERSION "${_version}")
0166         set(PROJECT_VERSION_MAJOR "${_major}")
0167         set(PROJECT_VERSION_MINOR "${_minor}")
0168         set(PROJECT_VERSION_PATCH "${_patch}")
0169     endif()
0170 
0171     if(_set_backward_compat_version_string_vars)
0172         set(PROJECT_VERSION_STRING "${PROJECT_VERSION}")
0173         set(${ESV_VARIABLE_PREFIX}_VERSION_STRING "${${ESV_VARIABLE_PREFIX}_VERSION}")
0174     endif()
0175 
0176     if(ESV_VERSION_HEADER)
0177         set(HEADER_PREFIX "${ESV_VARIABLE_PREFIX}")
0178         set(HEADER_VERSION "${_version}")
0179         set(HEADER_VERSION_MAJOR "${_major}")
0180         set(HEADER_VERSION_MINOR "${_minor}")
0181         set(HEADER_VERSION_PATCH "${_patch}")
0182         configure_file("${_ECM_SETUP_VERSION_HEADER_TEMPLATE}" "${ESV_VERSION_HEADER}")
0183     endif()
0184 
0185     if(ESV_PACKAGE_VERSION_FILE)
0186         if(NOT ESV_COMPATIBILITY)
0187             set(ESV_COMPATIBILITY AnyNewerVersion)
0188         endif()
0189         write_basic_package_version_file("${ESV_PACKAGE_VERSION_FILE}" VERSION ${_version} COMPATIBILITY ${ESV_COMPATIBILITY})
0190     endif()
0191 
0192     if(should_set_prefixed_vars)
0193         set(${ESV_VARIABLE_PREFIX}_VERSION_MAJOR "${${ESV_VARIABLE_PREFIX}_VERSION_MAJOR}" PARENT_SCOPE)
0194         set(${ESV_VARIABLE_PREFIX}_VERSION_MINOR "${${ESV_VARIABLE_PREFIX}_VERSION_MINOR}" PARENT_SCOPE)
0195         set(${ESV_VARIABLE_PREFIX}_VERSION_PATCH "${${ESV_VARIABLE_PREFIX}_VERSION_PATCH}" PARENT_SCOPE)
0196         set(${ESV_VARIABLE_PREFIX}_VERSION       "${${ESV_VARIABLE_PREFIX}_VERSION}"       PARENT_SCOPE)
0197     endif()
0198 
0199     # always set the soversion
0200     set(${ESV_VARIABLE_PREFIX}_SOVERSION "${${ESV_VARIABLE_PREFIX}_SOVERSION}" PARENT_SCOPE)
0201 
0202     if(NOT project_manages_version)
0203         set(PROJECT_VERSION       "${PROJECT_VERSION}"       PARENT_SCOPE)
0204         set(PROJECT_VERSION_MAJOR "${PROJECT_VERSION_MAJOR}" PARENT_SCOPE)
0205         set(PROJECT_VERSION_MINOR "${PROJECT_VERSION_MINOR}" PARENT_SCOPE)
0206         set(PROJECT_VERSION_PATCH "${PROJECT_VERSION_PATCH}" PARENT_SCOPE)
0207     endif()
0208 
0209     if(_set_backward_compat_version_string_vars)
0210         set(PROJECT_VERSION_STRING "${PROJECT_VERSION_STRING}" PARENT_SCOPE)
0211         set(${ESV_VARIABLE_PREFIX}_VERSION_STRING "${${ESV_VARIABLE_PREFIX}_VERSION}" PARENT_SCOPE)
0212     endif()
0213 endfunction()