浏览代码

BUG: Fix compatibility with CMake 2.4 for installation of MACOSX_BUNDLE targets

  - Add policy CMP0006 to decide whether to use compatibility
  - OLD behavior is to fall back to RUNTIME rules
  - NEW behavior is to produce an error
Brad King 17 年之前
父节点
当前提交
067717a56a
共有 4 个文件被更改,包括 67 次插入1 次删除
  1. 47 1
      Source/cmInstallCommand.cxx
  2. 1 0
      Source/cmInstallCommand.h
  3. 18 0
      Source/cmPolicies.cxx
  4. 1 0
      Source/cmPolicies.h

+ 47 - 1
Source/cmInstallCommand.cxx

@@ -536,7 +536,22 @@ bool cmInstallCommand::HandleTargetsMode(std::vector<std::string> const& args)
             bundleGenerator = CreateInstallTargetGenerator(target, bundleArgs, 
                                                            false);
             }
-          else
+          if(!runtimeArgs.GetDestination().empty())
+            {
+            bool failure = false;
+            if(this->CheckCMP0006(failure))
+              {
+              // For CMake 2.4 compatibility fallback to the RUNTIME
+              // properties.
+              bundleGenerator =
+                CreateInstallTargetGenerator(target, runtimeArgs, false);
+              }
+            else if(failure)
+              {
+              return false;
+              }
+            }
+          if(!bundleGenerator)
             {
             cmOStringStream e;
             e << "TARGETS given no BUNDLE DESTINATION for MACOSX_BUNDLE "
@@ -1284,3 +1299,34 @@ bool cmInstallCommand::MakeFilesFullPath(const char* modeName,
     }
   return true;
 }
+
+//----------------------------------------------------------------------------
+bool cmInstallCommand::CheckCMP0006(bool& failure)
+{
+  switch(this->Makefile->GetPolicyStatus(cmPolicies::CMP0006))
+    {
+    case cmPolicies::WARN:
+      {
+      this->Makefile->IssueMessage(
+        cmake::AUTHOR_WARNING,
+        this->Makefile->GetPolicies()->GetPolicyWarning(cmPolicies::CMP0006)
+        );
+      }
+    case cmPolicies::OLD:
+      // OLD behavior is to allow compatibility
+      return true;
+    case cmPolicies::NEW:
+      // NEW behavior is to disallow compatibility
+      break;
+    case cmPolicies::REQUIRED_IF_USED:
+    case cmPolicies::REQUIRED_ALWAYS:
+      failure = true;
+      this->Makefile->IssueMessage(
+        cmake::FATAL_ERROR,
+        this->Makefile->GetPolicies()
+        ->GetRequiredPolicyError(cmPolicies::CMP0006)
+        );
+      break;
+    }
+  return false;
+}

+ 1 - 0
Source/cmInstallCommand.h

@@ -346,6 +346,7 @@ private:
   bool MakeFilesFullPath(const char* modeName, 
                          const std::vector<std::string>& relFiles,
                          std::vector<std::string>& absFiles);
+  bool CheckCMP0006(bool& failure);
 };
 
 

+ 18 - 0
Source/cmPolicies.cxx

@@ -251,6 +251,24 @@ cmPolicies::cmPolicies()
     "See documentation of the COMPILE_DEFINITIONS target property for "
     "limitations of the escaping implementation.",
     2,6,0, cmPolicies::WARN);
+
+  this->DefinePolicy(
+    CMP0006, "CMP0006",
+    "Installing MACOSX_BUNDLE targets requires a BUNDLE DESTINATION.",
+    "This policy determines whether the install(TARGETS) command must be "
+    "given a BUNDLE DESTINATION when asked to install a target with the "
+    "MACOSX_BUNDLE property set.  "
+    "CMake 2.4 and below did not distinguish application bundles from "
+    "normal executables when installing targets.  "
+    "CMake 2.6 provides a BUNDLE option to the install(TARGETS) command "
+    "that specifies rules specific to application bundles on the Mac.  "
+    "Projects should use this option when installing a target with the "
+    "MACOSX_BUNDLE property set.\n"
+    "The OLD behavior for this policy is to fall back to the RUNTIME "
+    "DESTINATION if a BUNDLE DESTINATION is not given.  "
+    "The NEW behavior for this policy is to produce an error if a bundle "
+    "target is installed without a BUNDLE DESTINATION.",
+    2,6,0, cmPolicies::WARN);
 }
 
 cmPolicies::~cmPolicies()

+ 1 - 0
Source/cmPolicies.h

@@ -46,6 +46,7 @@ public:
     CMP0003, // Linking does not include extra -L paths
     CMP0004, // Libraries linked may not have leading or trailing whitespace
     CMP0005, // Definition value escaping
+    CMP0006, // BUNDLE install rules needed for MACOSX_BUNDLE targets
 
     // Always the last entry.  Useful mostly to avoid adding a comma
     // the last policy when adding a new one.