diff --git a/Source/cmcmd.cxx b/Source/cmcmd.cxx
index b4772a9..69339b4 100644
--- a/Source/cmcmd.cxx
+++ b/Source/cmcmd.cxx
@@ -1576,9 +1576,11 @@
   stream.flags(flags);
   return stream;
 }
+
 static bool RunCommand(const char* comment, std::vector<std::string>& command,
                        bool verbose, NumberFormat exitFormat,
-                       int* retCodeOut = nullptr)
+                       int* retCodeOut = nullptr,
+                       bool (*retCodeOkay)(int) = nullptr)
 {
   if (verbose) {
     std::cout << comment << ":\n";
@@ -1588,18 +1590,17 @@
   int retCode = 0;
   bool commandResult = cmSystemTools::RunSingleCommand(
     command, &output, &output, &retCode, nullptr, cmSystemTools::OUTPUT_NONE);
-  bool returnValue;
+  bool const retCodeSuccess =
+    retCode == 0 || (retCodeOkay && retCodeOkay(retCode));
+  bool const success = commandResult && retCodeSuccess;
   if (retCodeOut) {
-    if (!commandResult) {
-      *retCodeOut = (retCode == 0) ? -1 : retCode;
-    } else {
+    if (commandResult || !retCodeSuccess) {
       *retCodeOut = retCode;
+    } else {
+      *retCodeOut = -1;
     }
-    returnValue = true; // always return true if retCodeOut is requested
-  } else {
-    returnValue = commandResult && (retCode == 0);
   }
-  if (!commandResult || retCode) {
+  if (!success) {
     std::cout << comment << ": command \"" << cmJoin(command, " ")
               << "\" failed (exit code "
               << NumberFormatter(exitFormat, retCode)
@@ -1612,7 +1613,7 @@
       std::cout << output;
     }
   }
-  return returnValue;
+  return success;
 }
 
 bool cmVSLink::Parse(std::vector<std::string>::const_iterator argBeg,
@@ -1710,6 +1711,13 @@
   return LinkNonIncremental();
 }
 
+static bool mtRetIsUpdate(int mtRet)
+{
+  // 'mt /notify_update' returns a special value (differing between
+  // Windows and POSIX hosts) when it updated the manifest file.
+  return mtRet == 0x41020001 || mtRet == 0xbb;
+}
+
 int cmVSLink::LinkIncremental()
 {
   // This follows the steps listed here:
@@ -1781,9 +1789,9 @@
   // Run the manifest tool to create the final manifest.
   int mtRet = this->RunMT("/out:" + this->ManifestFile, true);
 
-  // If mt returns 1090650113 (or 187 on a posix host) then it updated the
-  // manifest file so we need to embed it again.  Otherwise we are done.
-  if (mtRet != 1090650113 && mtRet != 187) {
+  // If mt returns a special value then it updated the manifest file so
+  // we need to embed it again.  Otherwise we are done.
+  if (!mtRetIsUpdate(mtRet)) {
     return mtRet;
   }
 
@@ -1836,7 +1844,8 @@
     mtCommand.push_back("/notify_update");
   }
   int mtRet = 0;
-  if (!RunCommand("MT", mtCommand, this->Verbose, FORMAT_HEX, &mtRet)) {
+  if (!RunCommand("MT", mtCommand, this->Verbose, FORMAT_HEX, &mtRet,
+                  mtRetIsUpdate)) {
     return -1;
   }
   return mtRet;
