Browse Source

EXCLUDE_FROM_ALL: Don't warn if installing target excluded from all

The original warning pre-dates support for install components.
There are now legitimate scenarios where an install(TARGETS)
command may list a target that is excluded from all, e.g.
hierarchical projects that will never install the component such a
target belongs to.

Fixes: #18938
Craig Scott 7 years ago
parent
commit
d3b765d451

+ 10 - 2
Help/prop_tgt/EXCLUDE_FROM_ALL.rst

@@ -6,8 +6,16 @@ Exclude the target from the all target.
 A property on a target that indicates if the target is excluded from
 A property on a target that indicates if the target is excluded from
 the default build target.  If it is not, then with a Makefile for
 the default build target.  If it is not, then with a Makefile for
 example typing make will cause this target to be built.  The same
 example typing make will cause this target to be built.  The same
-concept applies to the default build of other generators.  Installing
-a target with EXCLUDE_FROM_ALL set to true has undefined behavior.
+concept applies to the default build of other generators.
+
+With ``EXCLUDE_FROM_ALL`` set to false or not set at all, the target
+will be brought up to date as part of doing a ``make install`` or its
+equivalent for the CMake generator being used.  If a target has
+``EXCLUDE_FROM_ALL`` set to true, then any attempt to install that
+target has undefined behavior.  Note that such a target can still safely
+be listed in an :command:`install(TARGETS)` command as long as the install
+components the target belongs to are not part of the set of components
+that anything tries to install.
 
 
 This property is enabled by default for targets that are created in
 This property is enabled by default for targets that are created in
 directories that have :prop_dir:`EXCLUDE_FROM_ALL` set to ``TRUE``.
 directories that have :prop_dir:`EXCLUDE_FROM_ALL` set to ``TRUE``.

+ 4 - 0
Help/release/3.14.rst

@@ -370,3 +370,7 @@ Other Changes
   :variable:`CPACK_DEBIAN_ARCHIVE_TYPE` variable, because ``dpkg`` has
   :variable:`CPACK_DEBIAN_ARCHIVE_TYPE` variable, because ``dpkg`` has
   never supported the PAX tar format. The ``paxr`` value will be mapped
   never supported the PAX tar format. The ``paxr`` value will be mapped
   to ``gnutar`` and a deprecation message emitted.
   to ``gnutar`` and a deprecation message emitted.
+
+* CMake no longer issues a warning if a target listed in an
+  :command:`install(TARGETS)` command has its :prop_tgt:`EXCLUDE_FROM_ALL`
+  property set to true.

+ 0 - 16
Source/cmInstallTargetGenerator.cxx

@@ -41,22 +41,6 @@ cmInstallTargetGenerator::cmInstallTargetGenerator(
 
 
 cmInstallTargetGenerator::~cmInstallTargetGenerator() = default;
 cmInstallTargetGenerator::~cmInstallTargetGenerator() = default;
 
 
-void cmInstallTargetGenerator::GenerateScript(std::ostream& os)
-{
-  // Warn if installing an exclude-from-all target.
-  if (this->Target->GetPropertyAsBool("EXCLUDE_FROM_ALL")) {
-    std::ostringstream msg;
-    msg << "WARNING: Target \"" << this->Target->GetName()
-        << "\" has EXCLUDE_FROM_ALL set and will not be built by default "
-        << "but an install rule has been provided for it.  CMake does "
-        << "not define behavior for this case.";
-    cmSystemTools::Message(msg.str(), "Warning");
-  }
-
-  // Perform the main install script generation.
-  this->cmInstallGenerator::GenerateScript(os);
-}
-
 void cmInstallTargetGenerator::GenerateScriptForConfig(
 void cmInstallTargetGenerator::GenerateScriptForConfig(
   std::ostream& os, const std::string& config, Indent indent)
   std::ostream& os, const std::string& config, Indent indent)
 {
 {

+ 0 - 1
Source/cmInstallTargetGenerator.h

@@ -69,7 +69,6 @@ public:
   cmListFileBacktrace const& GetBacktrace() const { return this->Backtrace; }
   cmListFileBacktrace const& GetBacktrace() const { return this->Backtrace; }
 
 
 protected:
 protected:
-  void GenerateScript(std::ostream& os) override;
   void GenerateScriptForConfig(std::ostream& os, const std::string& config,
   void GenerateScriptForConfig(std::ostream& os, const std::string& config,
                                Indent indent) override;
                                Indent indent) override;
   void GenerateScriptForConfigObjectLibrary(std::ostream& os,
   void GenerateScriptForConfigObjectLibrary(std::ostream& os,

+ 0 - 1
Tests/RunCMake/install/TARGETS-OPTIONAL-stderr.txt

@@ -1 +0,0 @@
-^WARNING: Target "notall" has EXCLUDE_FROM_ALL set and will not be built by default but an install rule has been provided for it\.  CMake does not define behavior for this case\.$