summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Help/command/project.rst24
-rw-r--r--Help/release/3.30.rst22
-rw-r--r--Source/CMakeVersion.cmake2
-rw-r--r--Source/cmProjectCommand.cxx6
-rw-r--r--Tests/CudaOnly/OptixIR/main.cu1
-rw-r--r--Tests/RunCMake/project/RunCMakeTest.cmake7
6 files changed, 50 insertions, 12 deletions
diff --git a/Help/command/project.rst b/Help/command/project.rst
index 08694fd..d220b83 100644
--- a/Help/command/project.rst
+++ b/Help/command/project.rst
@@ -44,11 +44,27 @@ Projects should not rely on ``<PROJECT-NAME>_SOURCE_DIR`` or
``<PROJECT-NAME>_BINARY_DIR`` holding a particular value outside of the scope
of the call to ``project()`` or one of its child scopes.
+.. versionchanged:: 3.30.3
+ ``<PROJECT-NAME>_SOURCE_DIR``, ``<PROJECT-NAME>_BINARY_DIR``, and
+ ``<PROJECT-NAME>_IS_TOP_LEVEL`` are always set as non-cache variables by
+ ``project(<PROJECT-NAME> ...)``.
+
.. versionchanged:: 3.30.4
- If the variables ``<PROJECT-NAME>_SOURCE_DIR``,
- ``<PROJECT-NAME>_BINARY_DIR``, or ``<PROJECT-NAME>_IS_TOP_LEVEL`` are
- already set as non-cache variables when ``project(<PROJECT-NAME> ...)``
- is called, the ``project()`` command will overwrite the previous values.
+ The variables ``<PROJECT-NAME>_SOURCE_DIR``, ``<PROJECT-NAME>_BINARY_DIR``,
+ and ``<PROJECT-NAME>_IS_TOP_LEVEL`` are only set as non-cache variables if
+ they are already set as cache or non-cache variables when
+ ``project(<PROJECT-NAME> ...)`` is called.
+ Note that this logic is flawed, as it can result in different behavior
+ between the first and subsequent runs because cache variables won't exist
+ on the first run, but they will on subsequent runs.
+
+.. versionchanged:: 3.30.5
+ The variables ``<PROJECT-NAME>_SOURCE_DIR``, ``<PROJECT-NAME>_BINARY_DIR``,
+ and ``<PROJECT-NAME>_IS_TOP_LEVEL`` are only set as non-cache variables if
+ they are already set as non-cache variables when
+ ``project(<PROJECT-NAME> ...)`` is called.
+ Unlike the flawed behavior of 3.30.4, non-cache variables will not be set
+ if only cache variables of the same name are set.
Options
^^^^^^^
diff --git a/Help/release/3.30.rst b/Help/release/3.30.rst
index 4cd2b44..5dc964d 100644
--- a/Help/release/3.30.rst
+++ b/Help/release/3.30.rst
@@ -277,7 +277,23 @@ Changes made since CMake 3.30.0 include the following.
* The :command:`project(<PROJECT-NAME>)` command now sets
:variable:`<PROJECT-NAME>_SOURCE_DIR`, :variable:`<PROJECT-NAME>_BINARY_DIR`,
and :variable:`<PROJECT-NAME>_IS_TOP_LEVEL` as normal variables only if they
- are already set as normal variables when :command:`project` is invoked.
- Cache entries by the same names are always set as before.
+ are already set as cache or non-cache variables when :command:`project` is
+ invoked. Cache entries by the same names are always set as before.
This refines 3.30.3's behavior change to restore behavior of nested
- directories that call :command:`project` with the same project name.
+ directories that call :command:`project` with the same project name,
+ but the implementation in this release is flawed (this release note has
+ been retoractively updated). It can result in different behavior between
+ the first and subsequent runs. Do not use CMake 3.30.4 if your project
+ contains nested calls to :command:`project` with the same project name
+ and you use these variables.
+
+.. 3.30.5 (unreleased)
+
+ * The :command:`project(<PROJECT-NAME>)` command now sets
+ :variable:`<PROJECT-NAME>_SOURCE_DIR`, :variable:`<PROJECT-NAME>_BINARY_DIR`,
+ and :variable:`<PROJECT-NAME>_IS_TOP_LEVEL` as non-cache variables only if
+ they are already set as non-cache variables when :command:`project` is
+ invoked. Cache entries by the same names are always set as before.
+ This refines 3.30.3's behavior change to restore behavior of nested
+ directories that call :command:`project` with the same project name,
+ and it addresses the bug in the implementation introduced in 3.30.4.
diff --git a/Source/CMakeVersion.cmake b/Source/CMakeVersion.cmake
index c440f9e..eaee533 100644
--- a/Source/CMakeVersion.cmake
+++ b/Source/CMakeVersion.cmake
@@ -1,7 +1,7 @@
# CMake version number components.
set(CMake_VERSION_MAJOR 3)
set(CMake_VERSION_MINOR 30)
-set(CMake_VERSION_PATCH 20241007)
+set(CMake_VERSION_PATCH 20241008)
#set(CMake_VERSION_RC 0)
set(CMake_VERSION_IS_DIRTY 0)
diff --git a/Source/cmProjectCommand.cxx b/Source/cmProjectCommand.cxx
index da92ea6..90c1042 100644
--- a/Source/cmProjectCommand.cxx
+++ b/Source/cmProjectCommand.cxx
@@ -59,7 +59,7 @@ bool cmProjectCommand(std::vector<std::string> const& args,
mf.SetProjectName(projectName);
std::string varName = cmStrCat(projectName, "_BINARY_DIR"_s);
- bool nonCacheVarAlreadySet = mf.IsDefinitionSet(varName);
+ bool nonCacheVarAlreadySet = mf.IsNormalDefinitionSet(varName);
mf.AddCacheDefinition(varName, mf.GetCurrentBinaryDirectory(),
"Value Computed by CMake", cmStateEnums::STATIC);
if (nonCacheVarAlreadySet) {
@@ -67,7 +67,7 @@ bool cmProjectCommand(std::vector<std::string> const& args,
}
varName = cmStrCat(projectName, "_SOURCE_DIR"_s);
- nonCacheVarAlreadySet = mf.IsDefinitionSet(varName);
+ nonCacheVarAlreadySet = mf.IsNormalDefinitionSet(varName);
mf.AddCacheDefinition(varName, mf.GetCurrentSourceDirectory(),
"Value Computed by CMake", cmStateEnums::STATIC);
if (nonCacheVarAlreadySet) {
@@ -82,7 +82,7 @@ bool cmProjectCommand(std::vector<std::string> const& args,
mf.AddDefinitionBool("PROJECT_IS_TOP_LEVEL", mf.IsRootMakefile());
varName = cmStrCat(projectName, "_IS_TOP_LEVEL"_s);
- nonCacheVarAlreadySet = mf.IsDefinitionSet(varName);
+ nonCacheVarAlreadySet = mf.IsNormalDefinitionSet(varName);
mf.AddCacheDefinition(varName, mf.IsRootMakefile() ? "ON" : "OFF",
"Value Computed by CMake", cmStateEnums::STATIC);
if (nonCacheVarAlreadySet) {
diff --git a/Tests/CudaOnly/OptixIR/main.cu b/Tests/CudaOnly/OptixIR/main.cu
index c79829b..1238cbe 100644
--- a/Tests/CudaOnly/OptixIR/main.cu
+++ b/Tests/CudaOnly/OptixIR/main.cu
@@ -1,3 +1,4 @@
+#include <cstdint>
#include <fstream>
#include <iostream>
#include <string>
diff --git a/Tests/RunCMake/project/RunCMakeTest.cmake b/Tests/RunCMake/project/RunCMakeTest.cmake
index e6e1bdb..ed4b8ba 100644
--- a/Tests/RunCMake/project/RunCMakeTest.cmake
+++ b/Tests/RunCMake/project/RunCMakeTest.cmake
@@ -45,7 +45,6 @@ run_cmake(ProjectIsTopLevel)
run_cmake(ProjectIsTopLevelMultiple)
run_cmake(ProjectIsTopLevelSubdirectory)
run_cmake(ProjectTwice)
-run_cmake(SameProjectVarsSubdir)
run_cmake(VersionAndLanguagesEmpty)
run_cmake(VersionEmpty)
run_cmake(VersionInvalid)
@@ -63,4 +62,10 @@ run_cmake(CMP0096-WARN)
run_cmake(CMP0096-OLD)
run_cmake(CMP0096-NEW)
+# We deliberately run these twice to verify behavior of the second CMake run
+run_cmake(SameProjectVarsSubdir)
+set(RunCMake_TEST_NO_CLEAN 1)
+run_cmake(SameProjectVarsSubdir)
+set(RunCMake_TEST_NO_CLEAN 0)
+
run_cmake(NoMinimumRequired)