1
0
mirror of https://github.com/Kitware/CMake.git synced 2025-10-14 02:08:27 +08:00

CPack: Use project version as default for CPACK_PACKAGE_VERSION

* Introduce `CMAKE_PROJECT_VERSION` and the corresponsing components:
  `CMAKE_PROJECT_VERSION_MAJOR`, `CMAKE_PROJECT_VERSION_MINOR`,
  `CMAKE_PROJECT_VERSION_PATCH` and `CMAKE_PROJECT_VERSION_TWEAK`.

* `CPack` module use `CMAKE_PROJECT_VERSION_MAJOR`,
  `CMAKE_PROJECT_VERSION_MINOR` and `CMAKE_PROJECT_VERSION_PATCH`
  to initialize corresponsing CPack variables.
This commit is contained in:
Alex Turbov
2018-04-29 17:09:40 +03:00
committed by Craig Scott
parent 1925fe9fed
commit af1c48871c
15 changed files with 223 additions and 34 deletions

View File

@@ -76,8 +76,9 @@ call exists CMake will implicitly add one to the top that enables the
default languages (``C`` and ``CXX``). The name of the project set in
the top level ``CMakeLists.txt`` file is available from the
:variable:`CMAKE_PROJECT_NAME` variable, its description from
:variable:`CMAKE_PROJECT_DESCRIPTION` and its homepage URL from
:variable:`CMAKE_PROJECT_HOMEPAGE_URL`.
:variable:`CMAKE_PROJECT_DESCRIPTION`, its homepage URL from
:variable:`CMAKE_PROJECT_HOMEPAGE_URL` and its version from
:variable:`CMAKE_PROJECT_VERSION`.
.. note::
Call the :command:`cmake_minimum_required` command at the beginning

View File

@@ -69,6 +69,11 @@ Variables that Provide Information
/variable/CMAKE_PROJECT_DESCRIPTION
/variable/CMAKE_PROJECT_HOMEPAGE_URL
/variable/CMAKE_PROJECT_NAME
/variable/CMAKE_PROJECT_VERSION
/variable/CMAKE_PROJECT_VERSION_MAJOR
/variable/CMAKE_PROJECT_VERSION_MINOR
/variable/CMAKE_PROJECT_VERSION_PATCH
/variable/CMAKE_PROJECT_VERSION_TWEAK
/variable/CMAKE_RANLIB
/variable/CMAKE_ROOT
/variable/CMAKE_SCRIPT_MODE_FILE

View File

@@ -0,0 +1,10 @@
cpack-use-project-version
-------------------------
* Introduce :variable:`CMAKE_PROJECT_VERSION` and the corresponding components:
:variable:`CMAKE_PROJECT_VERSION_MAJOR`, :variable:`CMAKE_PROJECT_VERSION_MINOR`,
:variable:`CMAKE_PROJECT_VERSION_PATCH` and :variable:`CMAKE_PROJECT_VERSION_TWEAK`.
* :module:`CPack` module use :variable:`CMAKE_PROJECT_VERSION_MAJOR`,
:variable:`CMAKE_PROJECT_VERSION_MINOR` and :variable:`CMAKE_PROJECT_VERSION_PATCH`
to initialize corresponding CPack variables.

View File

@@ -0,0 +1,35 @@
CMAKE_PROJECT_VERSION
---------------------
The version of the top level project.
This variable holds the version of the project as specified in the top
level CMakeLists.txt file by a :command:`project` command. In the event that
the top level CMakeLists.txt contains multiple :command:`project` calls,
the most recently called one from that top level CMakeLists.txt will determine
the value that ``CMAKE_PROJECT_VERSION`` contains. For example, consider
the following top level CMakeLists.txt:
.. code-block:: cmake
cmake_minimum_required(VERSION 3.0)
project(First VERSION 1.2.3)
project(Second VERSION 3.4.5)
add_subdirectory(sub)
project(Third VERSION 6.7.8)
And ``sub/CMakeLists.txt`` with the following contents:
.. code-block:: cmake
project(SubProj VERSION 1)
message("CMAKE_PROJECT_VERSION = ${CMAKE_PROJECT_VERSION}")
The most recently seen :command:`project` command from the top level
CMakeLists.txt would be ``project(Second ...)``, so this will print::
CMAKE_PROJECT_VERSION = 3.4.5
To obtain the version from the most recent call to :command:`project` in
the current directory scope or above, see the :variable:`PROJECT_VERSION`
variable.

View File

@@ -0,0 +1,9 @@
CMAKE_PROJECT_VERSION_MAJOR
---------------------------
The major version of the top level project.
This variable holds the major version of the project as specified in the top
level CMakeLists.txt file by a :command:`project` command. Please see
:variable:`CMAKE_PROJECT_VERSION` documentation for the behavior when
multiple :command:`project` commands are used in the sources.

View File

@@ -0,0 +1,9 @@
CMAKE_PROJECT_VERSION_MINOR
---------------------------
The minor version of the top level project.
This variable holds the minor version of the project as specified in the top
level CMakeLists.txt file by a :command:`project` command. Please see
:variable:`CMAKE_PROJECT_VERSION` documentation for the behavior when
multiple :command:`project` commands are used in the sources.

View File

@@ -0,0 +1,9 @@
CMAKE_PROJECT_VERSION_PATCH
---------------------------
The patch version of the top level project.
This variable holds the patch version of the project as specified in the top
level CMakeLists.txt file by a :command:`project` command. Please see
:variable:`CMAKE_PROJECT_VERSION` documentation for the behavior when
multiple :command:`project` commands are used in the sources.

View File

@@ -0,0 +1,9 @@
CMAKE_PROJECT_VERSION_TWEAK
---------------------------
The tweak version of the top level project.
This variable holds the tweak version of the project as specified in the top
level CMakeLists.txt file by a :command:`project` command. Please see
:variable:`CMAKE_PROJECT_VERSION` documentation for the behavior when
multiple :command:`project` commands are used in the sources.

View File

@@ -80,15 +80,35 @@
#
# .. variable:: CPACK_PACKAGE_VERSION_MAJOR
#
# Package major Version. Default value is 0.
# Package major version. This variable will always be set, but its default
# value depends on whether or not version details were given to the
# :command:`project` command in the top level CMakeLists.txt file. If version
# details were given, the default value will be
# :variable:`CMAKE_PROJECT_VERSION_MAJOR`. If no version details were given,
# a default version of 0.1.1 will be assumed, leading to
# ``CPACK_PACKAGE_VERSION_MAJOR`` having a default value of 0.
#
# .. variable:: CPACK_PACKAGE_VERSION_MINOR
#
# Package minor Version. Default value is 1.
# Package minor version. The default value is determined based on whether or
# not version details were given to the :command:`project` command in the top
# level CMakeLists.txt file. If version details were given, the default
# value will be :variable:`CMAKE_PROJECT_VERSION_MINOR`, but if no minor
# version component was specified then ``CPACK_PACKAGE_VERSION_MINOR`` will be
# left unset. If no project version was given at all, a default version of
# 0.1.1 will be assumed, leading to ``CPACK_PACKAGE_VERSION_MINOR`` having a
# default value of 1.
#
# .. variable:: CPACK_PACKAGE_VERSION_PATCH
#
# Package patch Version. Default value is 1.
# Package patch version. The default value is determined based on whether or
# not version details were given to the :command:`project` command in the top
# level CMakeLists.txt file. If version details were given, the default
# value will be :variable:`CMAKE_PROJECT_VERSION_PATCH`, but if no patch
# version component was specified then ``CPACK_PACKAGE_VERSION_PATCH`` will be
# left unset. If no project version was given at all, a default version of
# 0.1.1 will be assumed, leading to ``CPACK_PACKAGE_VERSION_PATCH`` having a
# default value of 1.
#
# .. variable:: CPACK_PACKAGE_DESCRIPTION_FILE
#
@@ -368,11 +388,28 @@ endfunction()
# Set the package name
_cpack_set_default(CPACK_PACKAGE_NAME "${CMAKE_PROJECT_NAME}")
_cpack_set_default(CPACK_PACKAGE_VERSION_MAJOR "0")
_cpack_set_default(CPACK_PACKAGE_VERSION_MINOR "1")
_cpack_set_default(CPACK_PACKAGE_VERSION_PATCH "1")
_cpack_set_default(CPACK_PACKAGE_VERSION
"${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH}")
if(CMAKE_PROJECT_VERSION_MAJOR)
_cpack_set_default(CPACK_PACKAGE_VERSION_MAJOR "${CMAKE_PROJECT_VERSION_MAJOR}")
if(CMAKE_PROJECT_VERSION_MINOR)
_cpack_set_default(CPACK_PACKAGE_VERSION_MINOR "${CMAKE_PROJECT_VERSION_MINOR}")
if(CMAKE_PROJECT_VERSION_PATCH)
_cpack_set_default(CPACK_PACKAGE_VERSION_PATCH "${CMAKE_PROJECT_VERSION_PATCH}")
_cpack_set_default(CPACK_PACKAGE_VERSION
"${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH}")
else()
_cpack_set_default(CPACK_PACKAGE_VERSION
"${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}")
endif()
else()
_cpack_set_default(CPACK_PACKAGE_VERSION "${CPACK_PACKAGE_VERSION_MAJOR}")
endif()
else()
_cpack_set_default(CPACK_PACKAGE_VERSION_MAJOR "0")
_cpack_set_default(CPACK_PACKAGE_VERSION_MINOR "1")
_cpack_set_default(CPACK_PACKAGE_VERSION_PATCH "1")
_cpack_set_default(CPACK_PACKAGE_VERSION
"${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH}")
endif()
_cpack_set_default(CPACK_PACKAGE_VENDOR "Humanity")
if(CMAKE_PROJECT_DESCRIPTION)
_cpack_set_default(CPACK_PACKAGE_DESCRIPTION_SUMMARY

View File

@@ -249,6 +249,12 @@ bool cmProjectCommand::InitialPass(std::vector<std::string> const& args,
vv = projectName + "_VERSION_TWEAK";
this->Makefile->AddDefinition("PROJECT_VERSION_TWEAK", vb[3]);
this->Makefile->AddDefinition(vv, vb[3]);
// Also, try set top level variables
TopLevelCMakeVarCondSet("CMAKE_PROJECT_VERSION", vs.c_str());
TopLevelCMakeVarCondSet("CMAKE_PROJECT_VERSION_MAJOR", vb[0]);
TopLevelCMakeVarCondSet("CMAKE_PROJECT_VERSION_MINOR", vb[1]);
TopLevelCMakeVarCondSet("CMAKE_PROJECT_VERSION_PATCH", vb[2]);
TopLevelCMakeVarCondSet("CMAKE_PROJECT_VERSION_TWEAK", vb[3]);
} else if (cmp0048 != cmPolicies::OLD) {
// Set project VERSION variables to empty
std::vector<std::string> vv;
@@ -262,6 +268,13 @@ bool cmProjectCommand::InitialPass(std::vector<std::string> const& args,
vv.push_back(projectName + "_VERSION_MINOR");
vv.push_back(projectName + "_VERSION_PATCH");
vv.push_back(projectName + "_VERSION_TWEAK");
if (this->Makefile->IsRootMakefile()) {
vv.push_back("CMAKE_PROJECT_VERSION");
vv.push_back("CMAKE_PROJECT_VERSION_MAJOR");
vv.push_back("CMAKE_PROJECT_VERSION_MINOR");
vv.push_back("CMAKE_PROJECT_VERSION_PATCH");
vv.push_back("CMAKE_PROJECT_VERSION_TWEAK");
}
std::string vw;
for (std::string const& i : vv) {
const char* v = this->Makefile->GetDefinition(i);
@@ -286,36 +299,14 @@ bool cmProjectCommand::InitialPass(std::vector<std::string> const& args,
this->Makefile->AddDefinition("PROJECT_DESCRIPTION", description.c_str());
this->Makefile->AddDefinition(projectName + "_DESCRIPTION",
description.c_str());
// Set the CMAKE_PROJECT_DESCRIPTION variable to be the highest-level
// project name in the tree. If there are two project commands
// in the same CMakeLists.txt file, and it is the top level
// CMakeLists.txt file, then go with the last one.
if (!this->Makefile->GetDefinition("CMAKE_PROJECT_DESCRIPTION") ||
(this->Makefile->IsRootMakefile())) {
this->Makefile->AddDefinition("CMAKE_PROJECT_DESCRIPTION",
description.c_str());
this->Makefile->AddCacheDefinition(
"CMAKE_PROJECT_DESCRIPTION", description.c_str(),
"Value Computed by CMake", cmStateEnums::STATIC);
}
TopLevelCMakeVarCondSet("CMAKE_PROJECT_DESCRIPTION", description.c_str());
}
if (haveHomepage) {
this->Makefile->AddDefinition("PROJECT_HOMEPAGE_URL", homepage.c_str());
this->Makefile->AddDefinition(projectName + "_HOMEPAGE_URL",
homepage.c_str());
// Set the CMAKE_PROJECT_HOMEPAGE_URL variable to be the highest-level
// project name in the tree. If there are two project commands
// in the same CMakeLists.txt file, and it is the top level
// CMakeLists.txt file, then go with the last one.
if (!this->Makefile->GetDefinition("CMAKE_PROJECT_HOMEPAGE_URL") ||
(this->Makefile->IsRootMakefile())) {
this->Makefile->AddDefinition("CMAKE_PROJECT_HOMEPAGE_URL",
homepage.c_str());
this->Makefile->AddCacheDefinition(
"CMAKE_PROJECT_HOMEPAGE_URL", homepage.c_str(),
"Value Computed by CMake", cmStateEnums::STATIC);
}
TopLevelCMakeVarCondSet("CMAKE_PROJECT_HOMEPAGE_URL", homepage.c_str());
}
if (languages.empty()) {
@@ -338,3 +329,18 @@ bool cmProjectCommand::InitialPass(std::vector<std::string> const& args,
}
return true;
}
void cmProjectCommand::TopLevelCMakeVarCondSet(const char* const name,
const char* const value)
{
// Set the CMAKE_PROJECT_XXX variable to be the highest-level
// project name in the tree. If there are two project commands
// in the same CMakeLists.txt file, and it is the top level
// CMakeLists.txt file, then go with the last one.
if (!this->Makefile->GetDefinition(name) ||
(this->Makefile->IsRootMakefile())) {
this->Makefile->AddDefinition(name, value);
this->Makefile->AddCacheDefinition(name, value, "Value Computed by CMake",
cmStateEnums::STATIC);
}
}

View File

@@ -34,6 +34,9 @@ public:
*/
bool InitialPass(std::vector<std::string> const& args,
cmExecutionStatus& status) override;
private:
void TopLevelCMakeVarCondSet(const char* name, const char* value);
};
#endif

View File

@@ -951,6 +951,44 @@ ${CMake_BINARY_DIR}/bin/cmake -DDIR=dev -P ${CMake_SOURCE_DIR}/Utilities/Release
endif()
endif()
if(CTEST_TEST_CPACK)
add_test(CPackUseDefaultVersion ${CMAKE_CTEST_COMMAND}
--build-and-test
"${CMake_SOURCE_DIR}/Tests/CPackUseDefaultVersion"
"${CMake_BINARY_DIR}/Tests/CPackUseDefaultVersion"
${build_generator_args}
--build-project CPackUseDefaultVersion
--build-two-config
--build-options ${build_options}
${CPackUseDefaultVersion_BUILD_OPTIONS})
set_tests_properties(CPackUseDefaultVersion PROPERTIES PASS_REGULAR_EXPRESSION "CPACK_PACKAGE_VERSION=0\\.1\\.1")
list(APPEND TEST_BUILD_DIRS "${CMake_BINARY_DIR}/Tests/CPackUseDefaultVersion")
add_test(CPackUseProjectVersion ${CMAKE_CTEST_COMMAND}
--build-and-test
"${CMake_SOURCE_DIR}/Tests/CPackUseProjectVersion"
"${CMake_BINARY_DIR}/Tests/CPackUseProjectVersion"
${build_generator_args}
--build-project CPackUseProjectVersion
--build-two-config
--build-options ${build_options}
${CPackUseProjectVersion_BUILD_OPTIONS})
set_tests_properties(CPackUseProjectVersion PROPERTIES PASS_REGULAR_EXPRESSION "CPACK_PACKAGE_VERSION=1\\.2\\.3")
list(APPEND TEST_BUILD_DIRS "${CMake_BINARY_DIR}/Tests/CPackUseProjectVersion")
add_test(CPackUseShortProjectVersion ${CMAKE_CTEST_COMMAND}
--build-and-test
"${CMake_SOURCE_DIR}/Tests/CPackUseShortProjectVersion"
"${CMake_BINARY_DIR}/Tests/CPackUseShortProjectVersion"
${build_generator_args}
--build-project CPackUseShortProjectVersion
--build-two-config
--build-options ${build_options}
${CPackUseProjectVersion_BUILD_OPTIONS})
set_tests_properties(CPackUseShortProjectVersion PROPERTIES PASS_REGULAR_EXPRESSION "CPACK_PACKAGE_VERSION=2")
list(APPEND TEST_BUILD_DIRS "${CMake_BINARY_DIR}/Tests/CPackUseShortProjectVersion")
endif()
if(CTEST_RUN_CPackComponents)
set(CPackComponents_BUILD_OPTIONS)
if(APPLE)

View File

@@ -0,0 +1,6 @@
cmake_minimum_required(VERSION 3.2)
project(CPackUseProjectVersion NONE)
include(CPack)
message("CPACK_PACKAGE_VERSION=${CPACK_PACKAGE_VERSION}")

View File

@@ -0,0 +1,6 @@
cmake_minimum_required(VERSION 3.2)
project(CPackUseProjectVersion VERSION 1.2.3 LANGUAGES NONE)
include(CPack)
message("CPACK_PACKAGE_VERSION=${CPACK_PACKAGE_VERSION}")

View File

@@ -0,0 +1,6 @@
cmake_minimum_required(VERSION 3.2)
project(CPackUseProjectVersion VERSION 2 LANGUAGES NONE)
include(CPack)
message("CPACK_PACKAGE_VERSION=${CPACK_PACKAGE_VERSION}")