Browse Source

Merge topic 'enforce-explicit-use-of-project'

1527defbfe cmMakefile: Enforce explicit use of project() command

Acked-by: Kitware Robot <[email protected]>
Merge-request: !3245
Brad King 6 years ago
parent
commit
fa077acba5

+ 8 - 7
Help/command/project.rst

@@ -112,12 +112,13 @@ Usage
 The top-level ``CMakeLists.txt`` file for a project must contain a
 The top-level ``CMakeLists.txt`` file for a project must contain a
 literal, direct call to the :command:`project` command; loading one
 literal, direct call to the :command:`project` command; loading one
 through the :command:`include` command is not sufficient.  If no such
 through the :command:`include` command is not sufficient.  If no such
-call exists CMake will implicitly add one to the top that enables the
-default languages (``C`` and ``CXX``).
+call exists, CMake will issue a warning and pretend there is a
+``project(Project)`` at the top to enable the default languages
+(``C`` and ``CXX``).
 
 
 .. note::
 .. note::
-  Call the :command:`cmake_minimum_required` command at the beginning
-  of the top-level ``CMakeLists.txt`` file even before calling the
-  :command:`project()` command.  It is important to establish version and
-  policy settings before invoking other commands whose behavior they
-  may affect.  See also policy :policy:`CMP0000`.
+  Call the :command:`project()` command near the top of the top-level
+  ``CMakeLists.txt``, but *after* calling :command:`cmake_minimum_required`.
+  It is important to establish version and policy settings before invoking
+  other commands whose behavior they may affect.
+  See also policy :policy:`CMP0000`.

+ 10 - 0
Source/cmMakefile.cxx

@@ -1599,6 +1599,16 @@ void cmMakefile::Configure()
     }
     }
     // if no project command is found, add one
     // if no project command is found, add one
     if (!hasProject) {
     if (!hasProject) {
+      this->GetCMakeInstance()->IssueMessage(
+        MessageType::AUTHOR_WARNING,
+        "No project() command is present.  The top-level CMakeLists.txt "
+        "file must contain a literal, direct call to the project() command.  "
+        "Add a line of code such as\n"
+        "  project(ProjectName)\n"
+        "near the top of the file, but after cmake_minimum_required().\n"
+        "CMake is pretending there is a \"project(Project)\" command on "
+        "the first line.",
+        this->Backtrace);
       cmListFileFunction project;
       cmListFileFunction project;
       project.Name.Lower = "project";
       project.Name.Lower = "project";
       project.Arguments.emplace_back("Project", cmListFileArgument::Unquoted,
       project.Arguments.emplace_back("Project", cmListFileArgument::Unquoted,

+ 12 - 0
Tests/RunCMake/project_injected/CMP0048-WARN-stderr.txt

@@ -0,0 +1,12 @@
+^CMake Warning \(dev\) in CMakeLists.txt:
+  No project\(\) command is present.  The top-level CMakeLists.txt file must
+  contain a literal, direct call to the project\(\) command.  Add a line of
+  code such as
+
+    project\(ProjectName\)
+
+  near the top of the file, but after cmake_minimum_required\(\).
+
+  CMake is pretending there is a "project\(Project\)" command on the first
+  line.
+This warning is for project developers.  Use -Wno-dev to suppress it.$