This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "CMake".

The branch, master has been updated
       via  22df62b58d8e2b9af5e754f4ed413d90088eb79e (commit)
       via  4f739a4e47d450406818804e45e5daaf452b39a8 (commit)
       via  5222400d9f574b5f953a2fe1d2c95a9754c683f3 (commit)
       via  cbd1c5b4ab16fa3e1086417f010e7bbad42cc50d (commit)
       via  79c6a573f4c6690914511e4e1894221a94f1b3e3 (commit)
       via  d1a570f18c47bb840fc19a9979d3970fbaa7e58a (commit)
       via  8ee6584a9975e766047fd73815a81a8d9c7db3f5 (commit)
       via  5b53cfda247f7d688a058f358628639a431313a8 (commit)
       via  9c576a88d95b302882bcb0a021dcf03982a40902 (commit)
       via  4b45a5d5c7f9266e5ca08f6d5676759b9aac4235 (commit)
       via  02c14b7fcd29a7dcedb930fe5d9138cb185493e1 (commit)
       via  24223ac84bd1610cef2ab0935233387227653dfd (commit)
       via  7e636fd8e0f10c8e0ba5eea529f4fedffd899ecf (commit)
       via  0fbf936b4630ca9db0d492d8c7e583f45d959b45 (commit)
       via  8517b549f44eb41c93eb1c448de176ad4172f083 (commit)
       via  9f205acefe256ac9707cd500ea1d421916f013cd (commit)
       via  26ea022c3bf081d9e1f7266e5ae52719cb59301b (commit)
      from  d7e70d01fe510b6f5760a88cc6f244cbc0ed5f32 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=22df62b58d8e2b9af5e754f4ed413d90088eb79e
commit 22df62b58d8e2b9af5e754f4ed413d90088eb79e
Merge: 4f739a4 24223ac
Author:     Brad King <brad.k...@kitware.com>
AuthorDate: Thu May 23 12:53:16 2019 +0000
Commit:     Kitware Robot <kwro...@kitware.com>
CommitDate: Thu May 23 09:02:55 2019 -0400

    Merge topic 'swift-flag-variables'
    
    24223ac84b Modules: add Swift MSVC_RUNTIME_LIBRARY flags
    7e636fd8e0 Modules: add `CMAKE_Swift_FRAMEWORK_SEARCH_FLAG`
    0fbf936b46 Modules: remove `CMAKE_INCLUDE_FLAG_SEP_Swift`
    
    Acked-by: Kitware Robot <kwro...@kitware.com>
    Merge-request: !3353


https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=4f739a4e47d450406818804e45e5daaf452b39a8
commit 4f739a4e47d450406818804e45e5daaf452b39a8
Merge: 5222400 8ee6584
Author:     Brad King <brad.k...@kitware.com>
AuthorDate: Thu May 23 12:53:57 2019 +0000
Commit:     Kitware Robot <kwro...@kitware.com>
CommitDate: Thu May 23 09:01:04 2019 -0400

    Merge topic 'compiler-launcher-shell-format'
    
    8ee6584a99 Ninja,Makefile: Fix <LANG>_COMPILER_LAUNCHER shell command syntax
    
    Acked-by: Kitware Robot <kwro...@kitware.com>
    Merge-request: !3361


https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=5222400d9f574b5f953a2fe1d2c95a9754c683f3
commit 5222400d9f574b5f953a2fe1d2c95a9754c683f3
Merge: cbd1c5b 8517b54
Author:     Brad King <brad.k...@kitware.com>
AuthorDate: Thu May 23 12:52:47 2019 +0000
Commit:     Kitware Robot <kwro...@kitware.com>
CommitDate: Thu May 23 08:59:25 2019 -0400

    Merge topic 'FindPython-find_strategy'
    
    8517b549f4 FindPython: Add policy to manage lookup stratgey default.
    9f205acefe FindPython: Implement lookup strategies.
    
    Acked-by: Kitware Robot <kwro...@kitware.com>
    Merge-request: !3354


https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=cbd1c5b4ab16fa3e1086417f010e7bbad42cc50d
commit cbd1c5b4ab16fa3e1086417f010e7bbad42cc50d
Merge: 79c6a57 26ea022
Author:     Brad King <brad.k...@kitware.com>
AuthorDate: Thu May 23 12:52:12 2019 +0000
Commit:     Kitware Robot <kwro...@kitware.com>
CommitDate: Thu May 23 08:57:36 2019 -0400

    Merge topic 'framework-var'
    
    26ea022c3b Add variable CMAKE_FRAMEWORK
    
    Acked-by: Kitware Robot <kwro...@kitware.com>
    Merge-request: !3347


https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=79c6a573f4c6690914511e4e1894221a94f1b3e3
commit 79c6a573f4c6690914511e4e1894221a94f1b3e3
Merge: d1a570f 02c14b7
Author:     Brad King <brad.k...@kitware.com>
AuthorDate: Thu May 23 12:53:24 2019 +0000
Commit:     Kitware Robot <kwro...@kitware.com>
CommitDate: Thu May 23 08:55:16 2019 -0400

    Merge topic 'swift-flags'
    
    02c14b7fcd Ninja,Swift: pass along DEFINES/FLAGS/INCLUDES
    
    Acked-by: Kitware Robot <kwro...@kitware.com>
    Merge-request: !3355


https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=d1a570f18c47bb840fc19a9979d3970fbaa7e58a
commit d1a570f18c47bb840fc19a9979d3970fbaa7e58a
Merge: d7e70d0 5b53cfd
Author:     Brad King <brad.k...@kitware.com>
AuthorDate: Thu May 23 12:51:39 2019 +0000
Commit:     Kitware Robot <kwro...@kitware.com>
CommitDate: Thu May 23 08:53:17 2019 -0400

    Merge topic 'cmFileTimes'
    
    5b53cfda24 cmSystemTools: Remove cmSystemToolsFileTime interface
    9c576a88d9 Use cmFileTimes instead of cmSystemToolsFileTime interface
    4b45a5d5c7 cmFileTimes: New RAII based cmFileTimes class
    
    Acked-by: Kitware Robot <kwro...@kitware.com>
    Merge-request: !3358


https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=8ee6584a9975e766047fd73815a81a8d9c7db3f5
commit 8ee6584a9975e766047fd73815a81a8d9c7db3f5
Author:     Brad King <brad.k...@kitware.com>
AuthorDate: Wed May 22 09:30:38 2019 -0400
Commit:     Brad King <brad.k...@kitware.com>
CommitDate: Wed May 22 10:47:15 2019 -0400

    Ninja,Makefile: Fix <LANG>_COMPILER_LAUNCHER shell command syntax
    
    The first entry in the compiler launcher command argument list is
    the command itself and should be converted to the shell's native
    command syntax (e.g. backslashes on Windows).
    
    Without this, the `RunCMake.CompilerLauncher` test fails on Windows
    when there are *no* spaces in the path to `cmake.exe`.

diff --git a/Source/cmMakefileTargetGenerator.cxx 
b/Source/cmMakefileTargetGenerator.cxx
index 3a89d75..d326ec5 100644
--- a/Source/cmMakefileTargetGenerator.cxx
+++ b/Source/cmMakefileTargetGenerator.cxx
@@ -788,8 +788,12 @@ void cmMakefileTargetGenerator::WriteObjectBuildFile(
     if (!compileCommands.empty() && !compilerLauncher.empty()) {
       std::vector<std::string> args;
       cmSystemTools::ExpandListArgument(compilerLauncher, args, true);
-      for (std::string& i : args) {
-        i = this->LocalGenerator->EscapeForShell(i);
+      if (!args.empty()) {
+        args[0] = this->LocalGenerator->ConvertToOutputFormat(
+          args[0], cmOutputConverter::SHELL);
+        for (std::string& i : cmMakeRange(args.begin() + 1, args.end())) {
+          i = this->LocalGenerator->EscapeForShell(i);
+        }
       }
       compileCommands.front().insert(0, cmJoin(args, " ") + " ");
     }
diff --git a/Source/cmNinjaTargetGenerator.cxx 
b/Source/cmNinjaTargetGenerator.cxx
index 9deaa13..e6a13bb 100644
--- a/Source/cmNinjaTargetGenerator.cxx
+++ b/Source/cmNinjaTargetGenerator.cxx
@@ -25,6 +25,7 @@
 #include "cmNinjaNormalTargetGenerator.h"
 #include "cmNinjaUtilityTargetGenerator.h"
 #include "cmOutputConverter.h"
+#include "cmRange.h"
 #include "cmRulePlaceholderExpander.h"
 #include "cmSourceFile.h"
 #include "cmState.h"
@@ -763,8 +764,12 @@ void cmNinjaTargetGenerator::WriteCompileRule(const 
std::string& lang)
   if (!compileCmds.empty() && !compilerLauncher.empty()) {
     std::vector<std::string> args;
     cmSystemTools::ExpandListArgument(compilerLauncher, args, true);
-    for (std::string& i : args) {
-      i = this->LocalGenerator->EscapeForShell(i);
+    if (!args.empty()) {
+      args[0] = this->LocalGenerator->ConvertToOutputFormat(
+        args[0], cmOutputConverter::SHELL);
+      for (std::string& i : cmMakeRange(args.begin() + 1, args.end())) {
+        i = this->LocalGenerator->EscapeForShell(i);
+      }
     }
     compileCmds.front().insert(0, cmJoin(args, " ") + " ");
   }

https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=5b53cfda247f7d688a058f358628639a431313a8
commit 5b53cfda247f7d688a058f358628639a431313a8
Author:     Sebastian Holtermann <sebh...@xwmw.org>
AuthorDate: Wed May 22 10:18:00 2019 +0200
Commit:     Sebastian Holtermann <sebh...@xwmw.org>
CommitDate: Wed May 22 10:57:10 2019 +0200

    cmSystemTools: Remove cmSystemToolsFileTime interface
    
    This removes the C style cmSystemToolsFileTime interface in cmSystemTools.
    It was replaced by the RAII based cmFileTimes class.

diff --git a/Source/cmSystemTools.cxx b/Source/cmSystemTools.cxx
index 545e6c5..9fdcfae 100644
--- a/Source/cmSystemTools.cxx
+++ b/Source/cmSystemTools.cxx
@@ -6,7 +6,6 @@
 #include "cmDuration.h"
 #include "cmProcessOutput.h"
 #include "cmRange.h"
-#include "cm_sys_stat.h"
 #include "cm_uv.h"
 
 #if defined(CMAKE_BUILD_WITH_CMAKE)
@@ -60,7 +59,6 @@
 #else
 #  include <sys/time.h>
 #  include <unistd.h>
-#  include <utime.h>
 #endif
 
 #if defined(_WIN32) &&                                                        \
@@ -90,18 +88,6 @@ static bool cm_isspace(char c)
   return ((c & 0x80) == 0) && isspace(c);
 }
 
-class cmSystemToolsFileTime
-{
-public:
-#if defined(_WIN32) && !defined(__CYGWIN__)
-  FILETIME timeCreation;
-  FILETIME timeLastAccess;
-  FILETIME timeLastWrite;
-#else
-  struct utimbuf timeBuf;
-#endif
-};
-
 #if !defined(HAVE_ENVIRON_NOT_REQUIRE_PROTOTYPE)
 // For GetEnvironmentVariables
 #  if defined(_WIN32)
@@ -134,29 +120,6 @@ static int cm_archive_read_open_file(struct archive* a, 
const char* file,
 #endif
 
 #ifdef _WIN32
-class cmSystemToolsWindowsHandle
-{
-public:
-  cmSystemToolsWindowsHandle(HANDLE h)
-    : handle_(h)
-  {
-  }
-  ~cmSystemToolsWindowsHandle()
-  {
-    if (this->handle_ != INVALID_HANDLE_VALUE) {
-      CloseHandle(this->handle_);
-    }
-  }
-  explicit operator bool() const
-  {
-    return this->handle_ != INVALID_HANDLE_VALUE;
-  }
-  bool operator!() const { return this->handle_ == INVALID_HANDLE_VALUE; }
-  operator HANDLE() const { return this->handle_; }
-
-private:
-  HANDLE handle_;
-};
 #elif defined(__APPLE__)
 #  include <crt_externs.h>
 
@@ -2098,91 +2061,6 @@ void cmSystemTools::DoNotInheritStdPipes()
 #endif
 }
 
-bool cmSystemTools::CopyFileTime(const std::string& fromFile,
-                                 const std::string& toFile)
-{
-#if defined(_WIN32) && !defined(__CYGWIN__)
-  cmSystemToolsWindowsHandle hFrom = CreateFileW(
-    SystemTools::ConvertToWindowsExtendedPath(fromFile).c_str(), GENERIC_READ,
-    FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0);
-  cmSystemToolsWindowsHandle hTo = CreateFileW(
-    SystemTools::ConvertToWindowsExtendedPath(toFile).c_str(),
-    FILE_WRITE_ATTRIBUTES, 0, 0, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0);
-  if (!hFrom || !hTo) {
-    return false;
-  }
-  FILETIME timeCreation;
-  FILETIME timeLastAccess;
-  FILETIME timeLastWrite;
-  if (!GetFileTime(hFrom, &timeCreation, &timeLastAccess, &timeLastWrite)) {
-    return false;
-  }
-  return SetFileTime(hTo, &timeCreation, &timeLastAccess, &timeLastWrite) != 0;
-#else
-  struct stat fromStat;
-  if (stat(fromFile.c_str(), &fromStat) < 0) {
-    return false;
-  }
-
-  struct utimbuf buf;
-  buf.actime = fromStat.st_atime;
-  buf.modtime = fromStat.st_mtime;
-  return utime(toFile.c_str(), &buf) >= 0;
-#endif
-}
-
-cmSystemToolsFileTime* cmSystemTools::FileTimeNew()
-{
-  return new cmSystemToolsFileTime;
-}
-
-void cmSystemTools::FileTimeDelete(cmSystemToolsFileTime* t)
-{
-  delete t;
-}
-
-bool cmSystemTools::FileTimeGet(const std::string& fname,
-                                cmSystemToolsFileTime* t)
-{
-#if defined(_WIN32) && !defined(__CYGWIN__)
-  cmSystemToolsWindowsHandle h = CreateFileW(
-    SystemTools::ConvertToWindowsExtendedPath(fname).c_str(), GENERIC_READ,
-    FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0);
-  if (!h) {
-    return false;
-  }
-  if (!GetFileTime(h, &t->timeCreation, &t->timeLastAccess,
-                   &t->timeLastWrite)) {
-    return false;
-  }
-#else
-  struct stat st;
-  if (stat(fname.c_str(), &st) < 0) {
-    return false;
-  }
-  t->timeBuf.actime = st.st_atime;
-  t->timeBuf.modtime = st.st_mtime;
-#endif
-  return true;
-}
-
-bool cmSystemTools::FileTimeSet(const std::string& fname,
-                                const cmSystemToolsFileTime* t)
-{
-#if defined(_WIN32) && !defined(__CYGWIN__)
-  cmSystemToolsWindowsHandle h = CreateFileW(
-    SystemTools::ConvertToWindowsExtendedPath(fname).c_str(),
-    FILE_WRITE_ATTRIBUTES, 0, 0, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0);
-  if (!h) {
-    return false;
-  }
-  return SetFileTime(h, &t->timeCreation, &t->timeLastAccess,
-                     &t->timeLastWrite) != 0;
-#else
-  return utime(fname.c_str(), &t->timeBuf) >= 0;
-#endif
-}
-
 #ifdef _WIN32
 #  ifndef CRYPT_SILENT
 #    define CRYPT_SILENT 0x40 /* Not defined by VS 6 version of header.  */
diff --git a/Source/cmSystemTools.h b/Source/cmSystemTools.h
index d145d47..fefa413 100644
--- a/Source/cmSystemTools.h
+++ b/Source/cmSystemTools.h
@@ -15,8 +15,6 @@
 #include <string>
 #include <vector>
 
-class cmSystemToolsFileTime;
-
 /** \class cmSystemTools
  * \brief A collection of useful functions for CMake.
  *
@@ -470,18 +468,6 @@ public:
 
   static void EnsureStdPipes();
 
-  /** Copy the file create/access/modify times from the file named by
-      the first argument to that named by the second.  */
-  static bool CopyFileTime(const std::string& fromFile,
-                           const std::string& toFile);
-
-  /** Save and restore file times.  */
-  static cmSystemToolsFileTime* FileTimeNew();
-  static void FileTimeDelete(cmSystemToolsFileTime*);
-  static bool FileTimeGet(const std::string& fname, cmSystemToolsFileTime* t);
-  static bool FileTimeSet(const std::string& fname,
-                          const cmSystemToolsFileTime* t);
-
   /** Random seed generation.  */
   static unsigned int RandomSeed();
 

https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=9c576a88d95b302882bcb0a021dcf03982a40902
commit 9c576a88d95b302882bcb0a021dcf03982a40902
Author:     Sebastian Holtermann <sebh...@xwmw.org>
AuthorDate: Wed May 22 10:14:46 2019 +0200
Commit:     Sebastian Holtermann <sebh...@xwmw.org>
CommitDate: Wed May 22 10:57:10 2019 +0200

    Use cmFileTimes instead of cmSystemToolsFileTime interface

diff --git a/Source/CPack/cmCPackGenerator.cxx 
b/Source/CPack/cmCPackGenerator.cxx
index 127bcf9..7e07ff4 100644
--- a/Source/CPack/cmCPackGenerator.cxx
+++ b/Source/CPack/cmCPackGenerator.cxx
@@ -15,6 +15,7 @@
 #include "cmCryptoHash.h"
 #include "cmDuration.h"
 #include "cmFSPermissions.h"
+#include "cmFileTimes.h"
 #include "cmGeneratedFileStream.h"
 #include "cmGlobalGenerator.h"
 #include "cmMakefile.h"
@@ -388,7 +389,7 @@ int cmCPackGenerator::InstallProjectViaInstalledDirectories(
         }
         /* If it is not a symlink then do a plain copy */
         else if (!(cmSystemTools::CopyFileIfDifferent(inFile, filePath) &&
-                   cmSystemTools::CopyFileTime(inFile, filePath))) {
+                   cmFileTimes::Copy(inFile, filePath))) {
           cmCPackLogger(cmCPackLog::LOG_ERROR,
                         "Problem copying file: " << inFile << " -> "
                                                  << filePath << std::endl);
diff --git a/Source/cmFileCommand.cxx b/Source/cmFileCommand.cxx
index aa8a919..f522d36 100644
--- a/Source/cmFileCommand.cxx
+++ b/Source/cmFileCommand.cxx
@@ -25,6 +25,7 @@
 #include "cmFileCopier.h"
 #include "cmFileInstaller.h"
 #include "cmFileLockPool.h"
+#include "cmFileTimes.h"
 #include "cmGeneratorExpression.h"
 #include "cmGlobalGenerator.h"
 #include "cmHexFileConverter.h"
@@ -52,8 +53,6 @@
 #  include <windows.h>
 #endif
 
-class cmSystemToolsFileTime;
-
 #if defined(_WIN32)
 // libcurl doesn't support file:// urls for unicode filenames on Windows.
 // Convert string from UTF-8 to ACP if this is a file:// URL.
@@ -1114,8 +1113,7 @@ bool cmFileCommand::HandleRPathChangeCommand(
     return false;
   }
   bool success = true;
-  cmSystemToolsFileTime* ft = cmSystemTools::FileTimeNew();
-  bool have_ft = cmSystemTools::FileTimeGet(file, ft);
+  cmFileTimes const ft(file);
   std::string emsg;
   bool changed;
   if (!cmSystemTools::ChangeRPath(file, oldRPath, newRPath, &emsg, &changed)) {
@@ -1139,11 +1137,8 @@ bool cmFileCommand::HandleRPathChangeCommand(
       message += "\"";
       this->Makefile->DisplayStatus(message, -1);
     }
-    if (have_ft) {
-      cmSystemTools::FileTimeSet(file, ft);
-    }
+    ft.Store(file);
   }
-  cmSystemTools::FileTimeDelete(ft);
   return success;
 }
 
@@ -1182,8 +1177,7 @@ bool cmFileCommand::HandleRPathRemoveCommand(
     return false;
   }
   bool success = true;
-  cmSystemToolsFileTime* ft = cmSystemTools::FileTimeNew();
-  bool have_ft = cmSystemTools::FileTimeGet(file, ft);
+  cmFileTimes const ft(file);
   std::string emsg;
   bool removed;
   if (!cmSystemTools::RemoveRPath(file, &emsg, &removed)) {
@@ -1203,11 +1197,8 @@ bool cmFileCommand::HandleRPathRemoveCommand(
       message += "\"";
       this->Makefile->DisplayStatus(message, -1);
     }
-    if (have_ft) {
-      cmSystemTools::FileTimeSet(file, ft);
-    }
+    ft.Store(file);
   }
-  cmSystemTools::FileTimeDelete(ft);
   return success;
 }
 
diff --git a/Source/cmFileCopier.cxx b/Source/cmFileCopier.cxx
index 972cd6e..49e8cd5 100644
--- a/Source/cmFileCopier.cxx
+++ b/Source/cmFileCopier.cxx
@@ -5,6 +5,7 @@
 
 #include "cmFSPermissions.h"
 #include "cmFileCommand.h"
+#include "cmFileTimes.h"
 #include "cmMakefile.h"
 #include "cmSystemTools.h"
 #include "cmsys/Directory.hxx"
@@ -75,20 +76,15 @@ bool cmFileCopier::SetPermissions(const std::string& toFile,
 
       // Writing to an NTFS alternate stream changes the modification
       // time, so we need to save and restore its original value.
-      cmSystemToolsFileTime* file_time_orig = cmSystemTools::FileTimeNew();
-      cmSystemTools::FileTimeGet(toFile, file_time_orig);
-
-      cmsys::ofstream permissionStream(mode_t_adt_filename.c_str());
-
-      if (permissionStream) {
-        permissionStream << std::oct << permissions << std::endl;
+      cmFileTimes file_time_orig(toFile);
+      {
+        cmsys::ofstream permissionStream(mode_t_adt_filename.c_str());
+        if (permissionStream) {
+          permissionStream << std::oct << permissions << std::endl;
+        }
+        permissionStream.close();
       }
-
-      permissionStream.close();
-
-      cmSystemTools::FileTimeSet(toFile, file_time_orig);
-
-      cmSystemTools::FileTimeDelete(file_time_orig);
+      file_time_orig.Store(toFile);
     }
 #endif
 
@@ -614,7 +610,7 @@ bool cmFileCopier::InstallFile(const std::string& fromFile,
     if (cmSystemTools::GetPermissions(toFile, perm)) {
       cmSystemTools::SetPermissions(toFile, perm | mode_owner_write);
     }
-    if (!cmSystemTools::CopyFileTime(fromFile, toFile)) {
+    if (!cmFileTimes::Copy(fromFile, toFile)) {
       std::ostringstream e;
       e << this->Name << " cannot set modification time on \"" << toFile
         << "\"";

https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=4b45a5d5c7f9266e5ca08f6d5676759b9aac4235
commit 4b45a5d5c7f9266e5ca08f6d5676759b9aac4235
Author:     Sebastian Holtermann <sebh...@xwmw.org>
AuthorDate: Tue May 21 23:36:40 2019 +0200
Commit:     Sebastian Holtermann <sebh...@xwmw.org>
CommitDate: Wed May 22 10:57:10 2019 +0200

    cmFileTimes: New RAII based cmFileTimes class
    
    This adds a new RAII based cmFileTimes class.
    It is supposed to replace the C style cmSystemToolsFileTime interface.

diff --git a/Source/CMakeLists.txt b/Source/CMakeLists.txt
index 42eed4d..8483f77 100644
--- a/Source/CMakeLists.txt
+++ b/Source/CMakeLists.txt
@@ -242,6 +242,8 @@ set(SRCS
   cmFileTime.h
   cmFileTimeCache.cxx
   cmFileTimeCache.h
+  cmFileTimes.cxx
+  cmFileTimes.h
   cmFortranParserImpl.cxx
   cmFSPermissions.cxx
   cmFSPermissions.h
diff --git a/Source/cmFileTimes.cxx b/Source/cmFileTimes.cxx
new file mode 100644
index 0000000..fd4f679
--- /dev/null
+++ b/Source/cmFileTimes.cxx
@@ -0,0 +1,127 @@
+/* Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
+   file Copyright.txt or https://cmake.org/licensing for details.  */
+#include "cmFileTimes.h"
+
+#include "cmAlgorithms.h"
+#include "cm_sys_stat.h"
+
+#include <utility>
+
+#if defined(_WIN32)
+#  include "cmSystemTools.h"
+#  include <windows.h>
+#else
+#  include <utime.h>
+#endif
+
+#if defined(_WIN32) &&                                                        \
+  (defined(_MSC_VER) || defined(__WATCOMC__) || defined(__MINGW32__))
+#  include <io.h>
+#endif
+
+#ifdef _WIN32
+class cmFileTimes::WindowsHandle
+{
+public:
+  WindowsHandle(HANDLE h)
+    : handle_(h)
+  {
+  }
+  ~WindowsHandle()
+  {
+    if (this->handle_ != INVALID_HANDLE_VALUE) {
+      CloseHandle(this->handle_);
+    }
+  }
+  explicit operator bool() const
+  {
+    return this->handle_ != INVALID_HANDLE_VALUE;
+  }
+  bool operator!() const { return this->handle_ == INVALID_HANDLE_VALUE; }
+  operator HANDLE() const { return this->handle_; }
+
+private:
+  HANDLE handle_;
+};
+#endif
+
+class cmFileTimes::Times
+{
+public:
+#if defined(_WIN32) && !defined(__CYGWIN__)
+  FILETIME timeCreation;
+  FILETIME timeLastAccess;
+  FILETIME timeLastWrite;
+#else
+  struct utimbuf timeBuf;
+#endif
+};
+
+cmFileTimes::cmFileTimes() = default;
+cmFileTimes::cmFileTimes(std::string const& fileName)
+{
+  Load(fileName);
+}
+cmFileTimes::~cmFileTimes() = default;
+
+bool cmFileTimes::Load(std::string const& fileName)
+{
+  std::unique_ptr<Times> ptr;
+  if (IsValid()) {
+    // Invalidate this and re-use times
+    ptr.swap(this->times);
+  } else {
+    ptr = cm::make_unique<Times>();
+  }
+
+#if defined(_WIN32) && !defined(__CYGWIN__)
+  cmFileTimes::WindowsHandle handle =
+    CreateFileW(cmSystemTools::ConvertToWindowsExtendedPath(fileName).c_str(),
+                GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING,
+                FILE_FLAG_BACKUP_SEMANTICS, 0);
+  if (!handle) {
+    return false;
+  }
+  if (!GetFileTime(handle, &ptr->timeCreation, &ptr->timeLastAccess,
+                   &ptr->timeLastWrite)) {
+    return false;
+  }
+#else
+  struct stat st;
+  if (stat(fileName.c_str(), &st) < 0) {
+    return false;
+  }
+  ptr->timeBuf.actime = st.st_atime;
+  ptr->timeBuf.modtime = st.st_mtime;
+#endif
+  // Accept times
+  this->times = std::move(ptr);
+  return true;
+}
+
+bool cmFileTimes::Store(std::string const& fileName) const
+{
+  if (!IsValid()) {
+    return false;
+  }
+
+#if defined(_WIN32) && !defined(__CYGWIN__)
+  cmFileTimes::WindowsHandle handle = CreateFileW(
+    cmSystemTools::ConvertToWindowsExtendedPath(fileName).c_str(),
+    FILE_WRITE_ATTRIBUTES, 0, 0, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0);
+  if (!handle) {
+    return false;
+  }
+  return SetFileTime(handle, &this->times->timeCreation,
+                     &this->times->timeLastAccess,
+                     &this->times->timeLastWrite) != 0;
+#else
+  return utime(fileName.c_str(), &this->times->timeBuf) >= 0;
+#endif
+}
+
+bool cmFileTimes::Copy(std::string const& fromFile, std::string const& toFile)
+{
+  cmFileTimes fileTimes;
+  return (fileTimes.Load(fromFile) && fileTimes.Store(toFile));
+}
diff --git a/Source/cmFileTimes.h b/Source/cmFileTimes.h
new file mode 100644
index 0000000..cbf0fe2
--- /dev/null
+++ b/Source/cmFileTimes.h
@@ -0,0 +1,40 @@
+/* Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
+   file Copyright.txt or https://cmake.org/licensing for details.  */
+#ifndef cmFileTimes_h
+#define cmFileTimes_h
+
+#include "cmConfigure.h" // IWYU pragma: keep
+
+#include <memory> // IWYU pragma: keep
+#include <string>
+
+/** \class cmFileTimes
+ * \brief Loads and stores file times.
+ */
+class cmFileTimes
+{
+public:
+  cmFileTimes();
+  //! Calls Load()
+  cmFileTimes(std::string const& fileName);
+  ~cmFileTimes();
+
+  //! @return true, if file times were loaded successfully
+  bool IsValid() const { return (times != nullptr); }
+  //! Try to load the file times from @a fileName and @return IsValid()
+  bool Load(std::string const& fileName);
+  //! Stores the file times at @a fileName (if IsValid())
+  bool Store(std::string const& fileName) const;
+
+  //! Copies the file times of @a fromFile to @a toFile
+  static bool Copy(std::string const& fromFile, std::string const& toFile);
+
+private:
+#ifdef _WIN32
+  class WindowsHandle;
+#endif
+  class Times;
+  std::unique_ptr<Times> times;
+};
+
+#endif
diff --git a/bootstrap b/bootstrap
index c5274ce..95d25b6 100755
--- a/bootstrap
+++ b/bootstrap
@@ -306,6 +306,7 @@ CMAKE_CXX_SOURCES="\
   cmFileInstaller \
   cmFileTime \
   cmFileTimeCache \
+  cmFileTimes \
   cmFindBase \
   cmFindCommon \
   cmFindFileCommand \

https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=02c14b7fcd29a7dcedb930fe5d9138cb185493e1
commit 02c14b7fcd29a7dcedb930fe5d9138cb185493e1
Author:     Saleem Abdulrasool <compn...@compnerd.org>
AuthorDate: Tue May 21 08:51:53 2019 -0700
Commit:     Saleem Abdulrasool <compn...@compnerd.org>
CommitDate: Tue May 21 08:53:50 2019 -0700

    Ninja,Swift: pass along DEFINES/FLAGS/INCLUDES
    
    Since the Swift model does a single compile/link phase, we would not
    get the compile definitions, includes, and options past along to the
    build of the module.  Compute these for the target when constructing
    the main command.

diff --git a/Modules/CMakeSwiftInformation.cmake 
b/Modules/CMakeSwiftInformation.cmake
index 64e7f99..1150498 100644
--- a/Modules/CMakeSwiftInformation.cmake
+++ b/Modules/CMakeSwiftInformation.cmake
@@ -35,9 +35,9 @@ endif()
 
 if(NOT CMAKE_Swift_CREATE_SHARED_LIBRARY)
   if(CMAKE_Swift_COMPILER_TARGET)
-    set(CMAKE_Swift_CREATE_SHARED_LIBRARY "${CMAKE_Swift_COMPILER} -target 
<CMAKE_Swift_COMPILER_TARGET> -output-file-map <SWIFT_OUTPUT_FILE_MAP> 
-incremental -emit-library -o <TARGET> -module-name <SWIFT_MODULE_NAME> 
-module-link-name <SWIFT_LIBRARY_NAME> -emit-module -emit-module-path 
<SWIFT_MODULE> -emit-dependencies <FLAGS> <SWIFT_SOURCES> <LINK_FLAGS> 
<LINK_LIBRARIES>")
+    set(CMAKE_Swift_CREATE_SHARED_LIBRARY "${CMAKE_Swift_COMPILER} -target 
<CMAKE_Swift_COMPILER_TARGET> -output-file-map <SWIFT_OUTPUT_FILE_MAP> 
-incremental -emit-library -o <TARGET> -module-name <SWIFT_MODULE_NAME> 
-module-link-name <SWIFT_LIBRARY_NAME> -emit-module -emit-module-path 
<SWIFT_MODULE> -emit-dependencies <DEFINES> <FLAGS> <INCLUDES> <SWIFT_SOURCES> 
<LINK_FLAGS> <LINK_LIBRARIES>")
   else()
-    set(CMAKE_Swift_CREATE_SHARED_LIBRARY "${CMAKE_Swift_COMPILER} 
-output-file-map <SWIFT_OUTPUT_FILE_MAP> -incremental -emit-library -o <TARGET> 
-module-name <SWIFT_MODULE_NAME> -module-link-name <SWIFT_LIBRARY_NAME> 
-emit-module -emit-module-path <SWIFT_MODULE> -emit-dependencies <FLAGS> 
<SWIFT_SOURCES> <LINK_FLAGS> <LINK_LIBRARIES>")
+    set(CMAKE_Swift_CREATE_SHARED_LIBRARY "${CMAKE_Swift_COMPILER} 
-output-file-map <SWIFT_OUTPUT_FILE_MAP> -incremental -emit-library -o <TARGET> 
-module-name <SWIFT_MODULE_NAME> -module-link-name <SWIFT_LIBRARY_NAME> 
-emit-module -emit-module-path <SWIFT_MODULE> -emit-dependencies <DEFINES> 
<FLAGS> <INCLUDES> <SWIFT_SOURCES> <LINK_FLAGS> <LINK_LIBRARIES>")
   endif()
 endif()
 
@@ -47,9 +47,9 @@ endif()
 
 if(NOT CMAKE_Swift_LINK_EXECUTABLE)
   if(CMAKE_Swift_COMPILER_TARGET)
-    set(CMAKE_Swift_LINK_EXECUTABLE "${CMAKE_Swift_COMPILER} -target 
<CMAKE_Swift_COMPILER_TARGET> -output-file-map <SWIFT_OUTPUT_FILE_MAP> 
-incremental -emit-executable -o <TARGET> -emit-module -emit-module-path 
<SWIFT_MODULE> -emit-dependencies <FLAGS> <SWIFT_SOURCES> <LINK_FLAGS> 
<LINK_LIBRARIES>")
+    set(CMAKE_Swift_LINK_EXECUTABLE "${CMAKE_Swift_COMPILER} -target 
<CMAKE_Swift_COMPILER_TARGET> -output-file-map <SWIFT_OUTPUT_FILE_MAP> 
-incremental -emit-executable -o <TARGET> -emit-module -emit-module-path 
<SWIFT_MODULE> -emit-dependencies <DEFINES> <FLAGS> <INCLUDES> <SWIFT_SOURCES> 
<LINK_FLAGS> <LINK_LIBRARIES>")
   else()
-    set(CMAKE_Swift_LINK_EXECUTABLE "${CMAKE_Swift_COMPILER} -output-file-map 
<SWIFT_OUTPUT_FILE_MAP> -incremental -emit-executable -o <TARGET> -emit-module 
-emit-module-path <SWIFT_MODULE> -emit-dependencies <FLAGS> <SWIFT_SOURCES> 
<LINK_FLAGS> <LINK_LIBRARIES>")
+    set(CMAKE_Swift_LINK_EXECUTABLE "${CMAKE_Swift_COMPILER} -output-file-map 
<SWIFT_OUTPUT_FILE_MAP> -incremental -emit-executable -o <TARGET> -emit-module 
-emit-module-path <SWIFT_MODULE> -emit-dependencies <DEFINES> <FLAGS> 
<INCLUDES> <SWIFT_SOURCES> <LINK_FLAGS> <LINK_LIBRARIES>")
   endif()
 endif()
 
diff --git a/Source/cmNinjaNormalTargetGenerator.cxx 
b/Source/cmNinjaNormalTargetGenerator.cxx
index 06063b2..59d0707 100644
--- a/Source/cmNinjaNormalTargetGenerator.cxx
+++ b/Source/cmNinjaNormalTargetGenerator.cxx
@@ -288,6 +288,10 @@ void cmNinjaNormalTargetGenerator::WriteLinkRule(bool 
useResponseFile)
       vars.SwiftModuleName = "$SWIFT_MODULE_NAME";
       vars.SwiftOutputFileMap = "$SWIFT_OUTPUT_FILE_MAP";
       vars.SwiftSources = "$SWIFT_SOURCES";
+
+      vars.Defines = "$DEFINES";
+      vars.Flags = "$FLAGS";
+      vars.Includes = "$INCLUDES";
     }
 
     std::string responseFlag;
@@ -865,6 +869,13 @@ void cmNinjaNormalTargetGenerator::WriteLinkStatement()
       }
       return oss.str();
     }();
+
+    // Since we do not perform object builds, compute the
+    // defines/flags/includes here so that they can be passed along
+    // appropriately.
+    vars["DEFINES"] = this->GetDefines("Swift");
+    vars["FLAGS"] = this->GetFlags("Swift");
+    vars["INCLUDES"] = this->GetIncludes("Swift");
   }
 
   // Compute specific libraries to link with.

https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=24223ac84bd1610cef2ab0935233387227653dfd
commit 24223ac84bd1610cef2ab0935233387227653dfd
Author:     Saleem Abdulrasool <compn...@compnerd.org>
AuthorDate: Tue May 21 08:36:54 2019 -0700
Commit:     Saleem Abdulrasool <compn...@compnerd.org>
CommitDate: Tue May 21 08:38:23 2019 -0700

    Modules: add Swift MSVC_RUNTIME_LIBRARY flags
    
    This adds support for the newly minted `-libc` flag to the Swift driver
    invocation.  These allow users to control the MSVC linkage properly on
    Windows targets.

diff --git a/Modules/CMakeSwiftInformation.cmake 
b/Modules/CMakeSwiftInformation.cmake
index 15b0a1a..8ec4891 100644
--- a/Modules/CMakeSwiftInformation.cmake
+++ b/Modules/CMakeSwiftInformation.cmake
@@ -23,6 +23,14 @@ set(CMAKE_Swift_COMPILE_OPTIONS_TARGET "-target ")
 set(CMAKE_Swift_COMPILER_ARG1 -frontend)
 set(CMAKE_Swift_FRAMEWORK_SEARCH_FLAG "-F ")
 
+# NOTE(compnerd) use the short form for convenience and ease of search.  They
+# are treated equivalent to their long form names as well as custom Swift
+# specific names.
+set(CMAKE_Swift_COMPILE_OPTIONS_MSVC_RUNTIME_LIBRARY_MultiThreaded -libc MT)
+set(CMAKE_Swift_COMPILE_OPTIONS_MSVC_RUNTIME_LIBRARY_MultiThreadedDLL -libc MD)
+set(CMAKE_Swift_COMPILE_OPTIONS_MSVC_RUNTIME_LIBRARY_MultiThreadedDebug -libc 
MTd)
+set(CMAKE_Swift_COMPILE_OPTIONS_MSVC_RUNTIME_LIBRARY_MultiThreadedDebugDLL 
-libc MDd)
+
 set(CMAKE_Swift_FLAGS_DEBUG_INIT "-g")
 set(CMAKE_Swift_FLAGS_RELEASE_INIT "-O")
 set(CMAKE_Swift_FLAGS_RELWITHDEBINFO_INIT "-O -g")

https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=7e636fd8e0f10c8e0ba5eea529f4fedffd899ecf
commit 7e636fd8e0f10c8e0ba5eea529f4fedffd899ecf
Author:     Saleem Abdulrasool <compn...@compnerd.org>
AuthorDate: Tue May 21 08:34:00 2019 -0700
Commit:     Saleem Abdulrasool <compn...@compnerd.org>
CommitDate: Tue May 21 08:38:23 2019 -0700

    Modules: add `CMAKE_Swift_FRAMEWORK_SEARCH_FLAG`
    
    Swift supports frameworks and uses them across all OSes.  They are added
    using the `-F` flag.  There must be a space following the flag and
    before the parameter.

diff --git a/Modules/CMakeSwiftInformation.cmake 
b/Modules/CMakeSwiftInformation.cmake
index aa5f260..15b0a1a 100644
--- a/Modules/CMakeSwiftInformation.cmake
+++ b/Modules/CMakeSwiftInformation.cmake
@@ -21,6 +21,7 @@ set(CMAKE_INCLUDE_FLAG_Swift "-I ")
 set(CMAKE_Swift_DEFINE_FLAG -D)
 set(CMAKE_Swift_COMPILE_OPTIONS_TARGET "-target ")
 set(CMAKE_Swift_COMPILER_ARG1 -frontend)
+set(CMAKE_Swift_FRAMEWORK_SEARCH_FLAG "-F ")
 
 set(CMAKE_Swift_FLAGS_DEBUG_INIT "-g")
 set(CMAKE_Swift_FLAGS_RELEASE_INIT "-O")

https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=0fbf936b4630ca9db0d492d8c7e583f45d959b45
commit 0fbf936b4630ca9db0d492d8c7e583f45d959b45
Author:     Saleem Abdulrasool <compn...@compnerd.org>
AuthorDate: Tue May 21 08:32:33 2019 -0700
Commit:     Saleem Abdulrasool <compn...@compnerd.org>
CommitDate: Tue May 21 08:38:23 2019 -0700

    Modules: remove `CMAKE_INCLUDE_FLAG_SEP_Swift`
    
    The include flag specifier should be specified multiply.  The separator
    was being misused for adding a space after the `-I` flag.  Correct this
    to get multiple include paths correct.

diff --git a/Modules/CMakeSwiftInformation.cmake 
b/Modules/CMakeSwiftInformation.cmake
index 64e7f99..aa5f260 100644
--- a/Modules/CMakeSwiftInformation.cmake
+++ b/Modules/CMakeSwiftInformation.cmake
@@ -17,8 +17,7 @@ if(CMAKE_Swift_COMPILER_ID)
   
include(Platform/${CMAKE_EFFECTIVE_SYSTEM_NAME}-${CMAKE_Swift_COMPILER_ID}-Swift
 OPTIONAL)
 endif()
 
-set(CMAKE_INCLUDE_FLAG_Swift "-I")
-set(CMAKE_INCLUDE_FLAG_SEP_Swift " ")
+set(CMAKE_INCLUDE_FLAG_Swift "-I ")
 set(CMAKE_Swift_DEFINE_FLAG -D)
 set(CMAKE_Swift_COMPILE_OPTIONS_TARGET "-target ")
 set(CMAKE_Swift_COMPILER_ARG1 -frontend)

https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=8517b549f44eb41c93eb1c448de176ad4172f083
commit 8517b549f44eb41c93eb1c448de176ad4172f083
Author:     Marc Chevrier <marc.chevr...@gmail.com>
AuthorDate: Tue May 21 16:10:43 2019 +0200
Commit:     Marc Chevrier <marc.chevr...@gmail.com>
CommitDate: Tue May 21 16:13:27 2019 +0200

    FindPython: Add policy to manage lookup stratgey default.

diff --git a/Help/manual/cmake-policies.7.rst b/Help/manual/cmake-policies.7.rst
index 8d35b86..1d023cb 100644
--- a/Help/manual/cmake-policies.7.rst
+++ b/Help/manual/cmake-policies.7.rst
@@ -57,6 +57,7 @@ Policies Introduced by CMake 3.15
 .. toctree::
    :maxdepth: 1
 
+   CMP0094: FindPython3, FindPython2 and FindPython use LOCATION for lookup 
strategy. </policy/CMP0094>
    CMP0093: FindBoost reports Boost_VERSION in x.y.z format. </policy/CMP0093>
    CMP0092: MSVC warning flags are not in CMAKE_{C,CXX}_FLAGS by default. 
</policy/CMP0092>
    CMP0091: MSVC runtime library flags are selected by an abstraction. 
</policy/CMP0091>
diff --git a/Help/policy/CMP0094.rst b/Help/policy/CMP0094.rst
new file mode 100644
index 0000000..836f30f
--- /dev/null
+++ b/Help/policy/CMP0094.rst
@@ -0,0 +1,22 @@
+CMP0094
+-------
+
+Modules :module:`FindPython3`, :module:`FindPython2` and :module:`FindPython`
+use ``LOCATION`` for lookup strategy.
+
+Starting with CMake 3.15, Modules :module:`FindPython3`, :module:`FindPython2`
+and :module:`FindPython` set value ``LOCATION`` for, respectively, variables
+``Python3_FIND_STRATEGY``, ``Python2_FIND_STRATEGY`` and
+``Python_FIND_STRATEGY``. This policy provides compatibility with projects that
+expect the legacy behavior.
+
+The ``OLD`` behavior for this policy set value ``VERSION`` for variables
+``Python3_FIND_STRATEGY``, ``Python2_FIND_STRATEGY`` and
+``Python_FIND_STRATEGY``.
+
+This policy was introduced in CMake version 3.15.  Use the
+:command:`cmake_policy` command to set it to ``OLD`` or ``NEW`` explicitly.
+Unlike many policies, CMake version |release| does *not* warn
+when this policy is not set and simply uses the ``OLD`` behavior.
+
+.. include:: DEPRECATED.txt
diff --git a/Help/release/dev/FindPython-CMP0094.rst 
b/Help/release/dev/FindPython-CMP0094.rst
new file mode 100644
index 0000000..43442fc
--- /dev/null
+++ b/Help/release/dev/FindPython-CMP0094.rst
@@ -0,0 +1,5 @@
+FindPython-CMP0094
+------------------
+
+* Modules :module:`FindPython3`, :module:`FindPython2` and :module:`FindPython`
+  have changed default strategy for lookup. See policy :policy:`CMP0094`.
diff --git a/Help/release/dev/FindPython-FIND_STRATEGY.rst 
b/Help/release/dev/FindPython-FIND_STRATEGY.rst
new file mode 100644
index 0000000..1d06e04
--- /dev/null
+++ b/Help/release/dev/FindPython-FIND_STRATEGY.rst
@@ -0,0 +1,5 @@
+FindPython-FIND_STRATEGY
+------------------------
+
+* Modules :module:`FindPython3`, :module:`FindPython2` and :module:`FindPython`
+  gain a new way to control lookup strategy.
diff --git a/Modules/FindPython.cmake b/Modules/FindPython.cmake
index d368ecc..59c286d 100644
--- a/Modules/FindPython.cmake
+++ b/Modules/FindPython.cmake
@@ -144,9 +144,11 @@ Hints
 
   * ``VERSION``: Try to find the most recent version in all specified
     locations.
-    This is the default.
+    This is the default if policy :policy:`CMP0094` is undefined or set to
+    ``OLD``.
   * ``LOCATION``: Stops lookup as soon as a version satisfying version
     constraints is founded.
+    This is the default if policy :policy:`CMP0094` is set to ``NEW``.
 
 ``Python_FIND_REGISTRY``
   On Windows the ``Python_FIND_REGISTRY`` variable determine the order
diff --git a/Modules/FindPython/Support.cmake b/Modules/FindPython/Support.cmake
index 4ba0b0f..bb2f60d 100644
--- a/Modules/FindPython/Support.cmake
+++ b/Modules/FindPython/Support.cmake
@@ -5,8 +5,14 @@
 # This file is a "template" file used by various FindPython modules.
 #
 
+cmake_policy (GET CMP0094 _${_PYTHON_PREFIX}_LOOKUP_POLICY)
+
 cmake_policy (VERSION 3.7)
 
+if (_${_PYTHON_PREFIX}_LOOKUP_POLICY)
+  cmake_policy (SET CMP0094 ${_${_PYTHON_PREFIX}_LOOKUP_POLICY})
+endif()
+
 #
 # Initial configuration
 #
@@ -316,13 +322,17 @@ if (${_PYTHON_PREFIX}_FIND_VERSION_COUNT GREATER 1)
 endif()
 
 # Define lookup strategy
-set (_${_PYTHON_PREFIX}_FIND_STRATEGY "VERSION")
+if (_${_PYTHON_PREFIX}_LOOKUP_POLICY STREQUAL "NEW")
+  set (_${_PYTHON_PREFIX}_FIND_STRATEGY "LOCATION")
+else()
+  set (_${_PYTHON_PREFIX}_FIND_STRATEGY "VERSION")
+endif()
 if (DEFINED ${_PYTHON_PREFIX}_FIND_STRATEGY)
   if (NOT ${_PYTHON_PREFIX}_FIND_STRATEGY MATCHES "^(VERSION|LOCATION)$")
     message (AUTHOR_WARNING "Find${_PYTHON_PREFIX}: 
${${_PYTHON_PREFIX}_FIND_STRATEGY}: invalid value for 
'${_PYTHON_PREFIX}_FIND_STRATEGY'. 'VERSION' or 'LOCATION' expected.")
     set (_${_PYTHON_PREFIX}_FIND_STRATEGY "VERSION")
   else()
-  set (_${_PYTHON_PREFIX}_FIND_STRATEGY "${${_PYTHON_PREFIX}_FIND_STRATEGY}")
+    set (_${_PYTHON_PREFIX}_FIND_STRATEGY "${${_PYTHON_PREFIX}_FIND_STRATEGY}")
   endif()
 endif()
 
diff --git a/Modules/FindPython2.cmake b/Modules/FindPython2.cmake
index eea4d29..8a633e0 100644
--- a/Modules/FindPython2.cmake
+++ b/Modules/FindPython2.cmake
@@ -145,9 +145,11 @@ Hints
 
   * ``VERSION``: Try to find the most recent version in all specified
     locations.
-    This is the default.
+    This is the default if policy :policy:`CMP0094` is undefined or set to
+    ``OLD``.
   * ``LOCATION``: Stops lookup as soon as a version satisfying version
     constraints is founded.
+    This is the default if policy :policy:`CMP0094` is set to ``NEW``.
 
 ``Python2_FIND_REGISTRY``
   On Windows the ``Python2_FIND_REGISTRY`` variable determine the order
diff --git a/Modules/FindPython3.cmake b/Modules/FindPython3.cmake
index 5e42732..2867326 100644
--- a/Modules/FindPython3.cmake
+++ b/Modules/FindPython3.cmake
@@ -145,9 +145,11 @@ Hints
 
   * ``VERSION``: Try to find the most recent version in all specified
     locations.
-    This is the default.
+    This is the default if policy :policy:`CMP0094` is undefined or set to
+    ``OLD``.
   * ``LOCATION``: Stops lookup as soon as a version satisfying version
     constraints is founded.
+    This is the default if policy :policy:`CMP0094` is set to ``NEW``.
 
 ``Python3_FIND_REGISTRY``
   On Windows the ``Python3_FIND_REGISTRY`` variable determine the order
diff --git a/Source/cmPolicies.h b/Source/cmPolicies.h
index 4bb4c53..b705119 100644
--- a/Source/cmPolicies.h
+++ b/Source/cmPolicies.h
@@ -275,6 +275,10 @@ class cmMakefile;
          "MSVC warning flags are not in CMAKE_<LANG>_FLAGS by default.", 3,   \
          15, 0, cmPolicies::WARN)                                             \
   SELECT(POLICY, CMP0093, "FindBoost reports Boost_VERSION in x.y.z format.", \
+         3, 15, 0, cmPolicies::WARN)                                          \
+  SELECT(POLICY, CMP0094,                                                     \
+         "FindPython3,  FindPython2 and FindPyton use "                       \
+         "LOCATION for lookup strategy.",                                     \
          3, 15, 0, cmPolicies::WARN)
 
 #define CM_SELECT_ID(F, A1, A2, A3, A4, A5, A6) F(A1)

https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=9f205acefe256ac9707cd500ea1d421916f013cd
commit 9f205acefe256ac9707cd500ea1d421916f013cd
Author:     Marc Chevrier <marc.chevr...@gmail.com>
AuthorDate: Wed May 15 17:35:49 2019 +0200
Commit:     Marc Chevrier <marc.chevr...@gmail.com>
CommitDate: Tue May 21 16:13:27 2019 +0200

    FindPython: Implement lookup strategies.
    
    Configration variable Python_FIND_STRATEGY controls the lookup startegy.
    Possible values are LOCATION and VERSION.
    
    Fixes: #19159

diff --git a/Modules/FindPython.cmake b/Modules/FindPython.cmake
index 36c0611..d368ecc 100644
--- a/Modules/FindPython.cmake
+++ b/Modules/FindPython.cmake
@@ -137,6 +137,17 @@ Hints
   * If set to TRUE, search **only** for static libraries.
   * If set to FALSE, search **only** for shared libraries.
 
+``Python_FIND_STRATEGY``
+  This variable defines how lookup will be done.
+  The ``Python_FIND_STRATEGY`` variable can be set to empty or one of the
+  following:
+
+  * ``VERSION``: Try to find the most recent version in all specified
+    locations.
+    This is the default.
+  * ``LOCATION``: Stops lookup as soon as a version satisfying version
+    constraints is founded.
+
 ``Python_FIND_REGISTRY``
   On Windows the ``Python_FIND_REGISTRY`` variable determine the order
   of preference between registry and environment variables.
diff --git a/Modules/FindPython/Support.cmake b/Modules/FindPython/Support.cmake
index 6d709e1..4ba0b0f 100644
--- a/Modules/FindPython/Support.cmake
+++ b/Modules/FindPython/Support.cmake
@@ -74,14 +74,78 @@ function (_PYTHON_GET_FRAMEWORKS 
_PYTHON_PGF_FRAMEWORK_PATHS _PYTHON_VERSION)
   set (${_PYTHON_PGF_FRAMEWORK_PATHS} ${_PYTHON_FRAMEWORK_PATHS} PARENT_SCOPE)
 endfunction()
 
+function (_PYTHON_GET_REGISTRIES _PYTHON_PGR_REGISTRY_PATHS _PYTHON_VERSION)
+  string (REPLACE "." "" _PYTHON_VERSION_NO_DOTS ${_PYTHON_VERSION})
+  set (${_PYTHON_PGR_REGISTRY_PATHS}
+       
[HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\${_PYTHON_VERSION}-${_${_PYTHON_PREFIX}_ARCH}\\InstallPath]
+       
[HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\${_PYTHON_VERSION}-${_${_PYTHON_PREFIX}_ARCH2}\\InstallPath]
+       
[HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\${_PYTHON_VERSION}\\InstallPath]
+       
[HKEY_CURRENT_USER\\SOFTWARE\\Python\\ContinuumAnalytics\\Anaconda${_PYTHON_VERSION_NO_DOTS}-${_${_PYTHON_PREFIX}_ARCH}\\InstallPath]
+       
[HKEY_CURRENT_USER\\SOFTWARE\\Python\\ContinuumAnalytics\\Anaconda${_PYTHON_VERSION_NO_DOTS}-${_${_PYTHON_PREFIX}_ARCH2}\\InstallPath]
+       
[HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\${_PYTHON_VERSION}-${_${_PYTHON_PREFIX}_ARCH}\\InstallPath]
+       
[HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\${_PYTHON_VERSION}-${_${_PYTHON_PREFIX}_ARCH2}\\InstallPath]
+       
[HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\${_PYTHON_VERSION}\\InstallPath]
+       
[HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\ContinuumAnalytics\\Anaconda${_PYTHON_VERSION_NO_DOTS}-${_${_PYTHON_PREFIX}_ARCH}\\InstallPath]
+       
[HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\ContinuumAnalytics\\Anaconda${_PYTHON_VERSION_NO_DOTS}-${_${_PYTHON_PREFIX}_ARCH2}\\InstallPath]
+       PARENT_SCOPE)
+endfunction()
+
+function (_PYTHON_GET_PATH_SUFFIXES _PYTHON_PGPS_PATH_SUFFIXES _PYTHON_VERSION 
_PYTHON_TYPE)
+  set (path_suffixes)
+
+  if (_PYTHON_TYPE STREQUAL "LIBRARY")
+    if (CMAKE_LIBRARY_ARCHITECTURE)
+      list (APPEND path_suffixes lib/${CMAKE_LIBRARY_ARCHITECTURE})
+    endif()
+    list (APPEND path_suffixes lib libs)
+
+    if (CMAKE_LIBRARY_ARCHITECTURE)
+      list (APPEND path_suffixes 
lib/python${_PYTHON_VERSION}/config-${_PYTHON_VERSION}mu-${CMAKE_LIBRARY_ARCHITECTURE}
+                                 
lib/python${_PYTHON_VERSION}/config-${_PYTHON_VERSION}m-${CMAKE_LIBRARY_ARCHITECTURE}
+                                 
lib/python${_PYTHON_VERSION}/config-${CMAKE_MATCH_1}u-${CMAKE_LIBRARY_ARCHITECTURE}
+                                 
lib/python${_PYTHON_VERSION}/config-${CMAKE_MATCH_1}-${CMAKE_LIBRARY_ARCHITECTURE})
+    endif()
+    list (APPEND path_suffixes 
lib/python${_PYTHON_VERSION}/config-${_PYTHON_VERSION}mu
+                               
lib/python${_PYTHON_VERSION}/config-${_PYTHON_VERSION}m
+                               
lib/python${_PYTHON_VERSION}/config-${_PYTHON_VERSION}u
+                               
lib/python${_PYTHON_VERSION}/config-${_PYTHON_VERSION}
+                               lib/python${_PYTHON_VERSION}/config)
+
+  elseif (_PYTHON_TYPE STREQUAL "INCLUDE")
+    list (APPEND path_suffixes include/python${_PYTHON_VERSION}mu
+                               include/python${_PYTHON_VERSION}m
+                               include/python${_PYTHON_VERSION}u
+                               include/python${_PYTHON_VERSION}
+                               include)
+  endif()
+
+  set (${_PYTHON_PGPS_PATH_SUFFIXES} ${path_suffixes} PARENT_SCOPE)
+endfunction()
+
+function (_PYTHON_GET_LIB_NAMES _PYTHON_PGLN_NAMES _PYTHON_VERSION)
+  string (REPLACE "." "" _PYTHON_VERSION_NO_DOTS ${_PYTHON_VERSION})
+
+  if (ARGC EQUAL 3 AND ARGV2 STREQUAL "DEBUG")
+    set (${_PYTHON_PGLN_NAMES} python${_PYTHON_VERSION_NO_DOTS}_d PARENT_SCOPE)
+  else()
+    set (${_PYTHON_PGLN_NAMES} python${_PYTHON_VERSION_NO_DOTS}
+                               python${_PYTHON_VERSION}mu
+                               python${_PYTHON_VERSION}m
+                               python${_PYTHON_VERSION}u
+                               python${_PYTHON_VERSION}
+         PARENT_SCOPE)
+  endif()
+endfunction()
+
 
 function (_PYTHON_VALIDATE_INTERPRETER)
   if (NOT ${_PYTHON_PREFIX}_EXECUTABLE)
     return()
   endif()
 
-  if (ARGC EQUAL 1)
-    set (expected_version ${ARGV0})
+  cmake_parse_arguments (_PVI "EXACT" "" "" ${ARGN})
+  if (_PVI_UNPARSED_ARGUMENTS)
+    set (expected_version ${_PVI_UNPARSED_ARGUMENTS})
   else()
     unset (expected_version)
   endif()
@@ -96,7 +160,7 @@ function (_PYTHON_VALIDATE_INTERPRETER)
                      OUTPUT_VARIABLE version
                      ERROR_QUIET
                      OUTPUT_STRIP_TRAILING_WHITESPACE)
-    if (result OR NOT version EQUAL expected_version)
+    if (result OR (_PVI_EXACT AND NOT version VERSION_EQUAL expected_version) 
OR (version VERSION_LESS expected_version))
       # interpreter not usable or has wrong major version
       set (${_PYTHON_PREFIX}_EXECUTABLE ${_PYTHON_PREFIX}_EXECUTABLE-NOTFOUND 
CACHE INTERNAL "" FORCE)
       return()
@@ -142,9 +206,24 @@ function (_PYTHON_VALIDATE_COMPILER expected_version)
     return()
   endif()
 
+  cmake_parse_arguments (_PVC "EXACT" "" "" ${ARGN})
+  if (_PVC_UNPARSED_ARGUMENTS)
+    set (major_version FALSE)
+    set (expected_version ${_PVC_UNPARSED_ARGUMENTS})
+  else()
+    set (major_version TRUE)
+    set (expected_version ${_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR})
+    set (_PVC_EXACT TRUE)
+  endif()
+
   # retrieve python environment version from compiler
   set (working_dir 
"${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/PythonCompilerVersion.dir")
-  file (WRITE "${working_dir}/version.py" "import sys; 
sys.stdout.write('.'.join([str(x) for x in sys.version_info[:2]]))\n")
+  if (major_version)
+    # check only major version
+    file (WRITE "${working_dir}/version.py" "import sys; 
sys.stdout.write(str(sys.version_info[0]))")
+  else()
+    file (WRITE "${working_dir}/version.py" "import sys; 
sys.stdout.write('.'.join([str(x) for x in sys.version_info[:2]]))\n")
+  endif()
   execute_process (COMMAND "${${_PYTHON_PREFIX}_COMPILER}" /target:exe /embed 
"${working_dir}/version.py"
                    WORKING_DIRECTORY "${working_dir}"
                    OUTPUT_QUIET
@@ -157,8 +236,8 @@ function (_PYTHON_VALIDATE_COMPILER expected_version)
                    ERROR_QUIET)
   file (REMOVE_RECURSE "${_${_PYTHON_PREFIX}_VERSION_DIR}")
 
-  if (result OR NOT version EQUAL expected_version)
-    # Compiler not usable or has wrong major version
+  if (result OR (_PVC_EXACT AND NOT version VERSION_EQUAL expected_version) OR 
(version VERSION_LESS expected_version))
+    # Compiler not usable or has wrong version
     set (${_PYTHON_PREFIX}_COMPILER ${_PYTHON_PREFIX}_COMPILER-NOTFOUND CACHE 
INTERNAL "" FORCE)
   endif()
 endfunction()
@@ -236,6 +315,17 @@ if (${_PYTHON_PREFIX}_FIND_VERSION_COUNT GREATER 1)
   endif()
 endif()
 
+# Define lookup strategy
+set (_${_PYTHON_PREFIX}_FIND_STRATEGY "VERSION")
+if (DEFINED ${_PYTHON_PREFIX}_FIND_STRATEGY)
+  if (NOT ${_PYTHON_PREFIX}_FIND_STRATEGY MATCHES "^(VERSION|LOCATION)$")
+    message (AUTHOR_WARNING "Find${_PYTHON_PREFIX}: 
${${_PYTHON_PREFIX}_FIND_STRATEGY}: invalid value for 
'${_PYTHON_PREFIX}_FIND_STRATEGY'. 'VERSION' or 'LOCATION' expected.")
+    set (_${_PYTHON_PREFIX}_FIND_STRATEGY "VERSION")
+  else()
+  set (_${_PYTHON_PREFIX}_FIND_STRATEGY "${${_PYTHON_PREFIX}_FIND_STRATEGY}")
+  endif()
+endif()
+
 # Python and Anaconda distributions: define which architectures can be used
 if (CMAKE_SIZEOF_VOID_P)
   # In this case, search only for 64bit or 32bit
@@ -328,166 +418,265 @@ if ("Interpreter" IN_LIST 
${_PYTHON_PREFIX}_FIND_COMPONENTS)
 
   set (_${_PYTHON_PREFIX}_HINTS "${${_PYTHON_PREFIX}_ROOT_DIR}" ENV 
${_PYTHON_PREFIX}_ROOT_DIR)
 
-  # look-up for various versions and locations
-  foreach (_${_PYTHON_PREFIX}_VERSION IN LISTS 
_${_PYTHON_PREFIX}_FIND_VERSIONS)
-    string (REPLACE "." "" _${_PYTHON_PREFIX}_VERSION_NO_DOTS 
${_${_PYTHON_PREFIX}_VERSION})
+  if (_${_PYTHON_PREFIX}_FIND_STRATEGY STREQUAL "LOCATION")
+    unset (_${_PYTHON_PREFIX}_NAMES)
+    unset (_${_PYTHON_PREFIX}_FRAMEWORK_PATHS)
+    unset (_${_PYTHON_PREFIX}_REGISTRY_PATHS)
+
+    foreach (_${_PYTHON_PREFIX}_VERSION IN LISTS 
_${_PYTHON_PREFIX}_FIND_VERSIONS)
+      # build all executable names
+      list (APPEND _${_PYTHON_PREFIX}_NAMES 
python${_${_PYTHON_PREFIX}_VERSION})
+
+      # Framework Paths
+      _python_get_frameworks (_${_PYTHON_PREFIX}_VERSION_PATHS 
${_${_PYTHON_PREFIX}_VERSION})
+      list (APPEND _${_PYTHON_PREFIX}_FRAMEWORK_PATHS 
${_${_PYTHON_PREFIX}_VERSION_PATHS})
+
+      # Registry Paths
+      _python_get_registries (_${_PYTHON_PREFIX}_VERSION_PATHS 
${_${_PYTHON_PREFIX}_VERSION})
+      list (APPEND _${_PYTHON_PREFIX}_REGISTRY_PATHS 
${_${_PYTHON_PREFIX}_VERSION_PATHS}
+                   
[HKEY_LOCAL_MACHINE\\SOFTWARE\\IronPython\\${_${_PYTHON_PREFIX}_VERSION}\\InstallPath])
+    endforeach()
+    list (APPEND _${_PYTHON_PREFIX}_NAMES 
python${_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR} python)
+
+    while (TRUE)
+      # Virtual environments handling
+      if (_${_PYTHON_PREFIX}_FIND_VIRTUALENV MATCHES "^(FIRST|ONLY)$")
+        find_program (${_PYTHON_PREFIX}_EXECUTABLE
+                      NAMES ${_${_PYTHON_PREFIX}_NAMES}
+                      NAMES_PER_DIR
+                      HINTS ${_${_PYTHON_PREFIX}_HINTS}
+                      PATHS ENV VIRTUAL_ENV
+                      PATH_SUFFIXES bin Scripts
+                      NO_CMAKE_PATH
+                      NO_CMAKE_ENVIRONMENT_PATH
+                      NO_SYSTEM_ENVIRONMENT_PATH
+                      NO_CMAKE_SYSTEM_PATH)
 
-    _python_get_frameworks (_${_PYTHON_PREFIX}_FRAMEWORK_PATHS 
${_${_PYTHON_PREFIX}_VERSION})
+        _python_validate_interpreter (${${_PYTHON_PREFIX}_FIND_VERSION})
+        if (${_PYTHON_PREFIX}_EXECUTABLE)
+          break()
+        endif()
+        if (NOT _${_PYTHON_PREFIX}_FIND_VIRTUALENV STREQUAL "ONLY")
+          break()
+        endif()
+      endif()
 
-    # Virtual environments handling
-    if (_${_PYTHON_PREFIX}_FIND_VIRTUALENV MATCHES "^(FIRST|ONLY)$")
+      # Apple frameworks handling
+      if (APPLE AND _${_PYTHON_PREFIX}_FIND_FRAMEWORK STREQUAL "FIRST")
+        find_program (${_PYTHON_PREFIX}_EXECUTABLE
+                      NAMES ${_${_PYTHON_PREFIX}_NAMES}
+                      NAMES_PER_DIR
+                      HINTS ${_${_PYTHON_PREFIX}_HINTS}
+                      PATHS ${_${_PYTHON_PREFIX}_FRAMEWORK_PATHS}
+                      PATH_SUFFIXES bin
+                      NO_CMAKE_PATH
+                      NO_CMAKE_ENVIRONMENT_PATH
+                      NO_SYSTEM_ENVIRONMENT_PATH
+                      NO_CMAKE_SYSTEM_PATH)
+        _python_validate_interpreter (${${_PYTHON_PREFIX}_FIND_VERSION})
+        if (${_PYTHON_PREFIX}_EXECUTABLE)
+          break()
+        endif()
+      endif()
+      # Windows registry
+      if (WIN32 AND _${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "FIRST")
+        find_program (${_PYTHON_PREFIX}_EXECUTABLE
+                      NAMES ${_${_PYTHON_PREFIX}_NAMES}
+                            ${_${_PYTHON_PREFIX}_IRON_PYTHON_NAMES}
+                      NAMES_PER_DIR
+                      HINTS ${_${_PYTHON_PREFIX}_HINTS}
+                      PATHS ${_${_PYTHON_PREFIX}_REGISTRY_PATHS}
+                      PATH_SUFFIXES bin 
${_${_PYTHON_PREFIX}_IRON_PYTHON_PATH_SUFFIXES}
+                      NO_SYSTEM_ENVIRONMENT_PATH
+                      NO_CMAKE_SYSTEM_PATH)
+        _python_validate_interpreter (${${_PYTHON_PREFIX}_FIND_VERSION})
+        if (${_PYTHON_PREFIX}_EXECUTABLE)
+          break()
+        endif()
+      endif()
+
+      # try using HINTS and standard paths
       find_program (${_PYTHON_PREFIX}_EXECUTABLE
-                    NAMES python${_${_PYTHON_PREFIX}_VERSION}
-                          python${_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR}
-                          python
+                    NAMES ${_${_PYTHON_PREFIX}_NAMES}
+                          ${_${_PYTHON_PREFIX}_IRON_PYTHON_NAMES}
                     NAMES_PER_DIR
                     HINTS ${_${_PYTHON_PREFIX}_HINTS}
-                    PATHS ENV VIRTUAL_ENV
-                    PATH_SUFFIXES bin Scripts
-                    NO_CMAKE_PATH
-                    NO_CMAKE_ENVIRONMENT_PATH
-                    NO_SYSTEM_ENVIRONMENT_PATH
-                    NO_CMAKE_SYSTEM_PATH)
-
-      _python_validate_interpreter (${_${_PYTHON_PREFIX}_VERSION})
+                    PATH_SUFFIXES bin 
${_${_PYTHON_PREFIX}_IRON_PYTHON_PATH_SUFFIXES})
+      _python_validate_interpreter (${${_PYTHON_PREFIX}_FIND_VERSION})
       if (${_PYTHON_PREFIX}_EXECUTABLE)
         break()
       endif()
-      if (_${_PYTHON_PREFIX}_FIND_VIRTUALENV STREQUAL "ONLY")
-        continue()
+
+      # Apple frameworks handling
+      if (APPLE AND _${_PYTHON_PREFIX}_FIND_FRAMEWORK STREQUAL "LAST")
+        find_program (${_PYTHON_PREFIX}_EXECUTABLE
+                      NAMES ${_${_PYTHON_PREFIX}_NAMES}
+                      NAMES_PER_DIR
+                      PATHS ${_${_PYTHON_PREFIX}_FRAMEWORK_PATHS}
+                      PATH_SUFFIXES bin
+                      NO_DEFAULT_PATH)
+        _python_validate_interpreter (${${_PYTHON_PREFIX}_FIND_VERSION})
+        if (${_PYTHON_PREFIX}_EXECUTABLE)
+          break()
+        endif()
+      endif()
+      # Windows registry
+      if (WIN32 AND _${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "LAST")
+        find_program (${_PYTHON_PREFIX}_EXECUTABLE
+                      NAMES ${_${_PYTHON_PREFIX}_NAMES}
+                            ${_${_PYTHON_PREFIX}_IRON_PYTHON_NAMES}
+                      NAMES_PER_DIR
+                      PATHS ${_${_PYTHON_PREFIX}_REGISTRY_PATHS}
+                      PATH_SUFFIXES bin 
${_${_PYTHON_PREFIX}_IRON_PYTHON_PATH_SUFFIXES}
+                      NO_DEFAULT_PATH)
+        _python_validate_interpreter (${${_PYTHON_PREFIX}_FIND_VERSION})
+        if (${_PYTHON_PREFIX}_EXECUTABLE)
+          break()
+        endif()
       endif()
-    endif()
 
-    # Apple frameworks handling
-    if (APPLE AND _${_PYTHON_PREFIX}_FIND_FRAMEWORK STREQUAL "FIRST")
-      find_program (${_PYTHON_PREFIX}_EXECUTABLE
-                    NAMES python${_${_PYTHON_PREFIX}_VERSION}
-                          python${_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR}
-                    NAMES_PER_DIR
-                    PATHS ${_${_PYTHON_PREFIX}_FRAMEWORK_PATHS}
-                    PATH_SUFFIXES bin
-                    NO_CMAKE_PATH
-                    NO_CMAKE_ENVIRONMENT_PATH
-                    NO_SYSTEM_ENVIRONMENT_PATH
-                    NO_CMAKE_SYSTEM_PATH)
-    endif()
+      break()
+    endwhile()
+  else()
+    # look-up for various versions and locations
+    foreach (_${_PYTHON_PREFIX}_VERSION IN LISTS 
_${_PYTHON_PREFIX}_FIND_VERSIONS)
+      set (_${_PYTHON_PREFIX}_NAMES python${_${_PYTHON_PREFIX}_VERSION}
+                                    
python${_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR}
+                                    python)
+
+      _python_get_frameworks (_${_PYTHON_PREFIX}_FRAMEWORK_PATHS 
${_${_PYTHON_PREFIX}_VERSION})
+      _python_get_registries (_${_PYTHON_PREFIX}_REGISTRY_PATHS 
${_${_PYTHON_PREFIX}_VERSION})
+
+      # Virtual environments handling
+      if (_${_PYTHON_PREFIX}_FIND_VIRTUALENV MATCHES "^(FIRST|ONLY)$")
+        find_program (${_PYTHON_PREFIX}_EXECUTABLE
+                      NAMES ${_${_PYTHON_PREFIX}_NAMES}
+                      NAMES_PER_DIR
+                      HINTS ${_${_PYTHON_PREFIX}_HINTS}
+                      PATHS ENV VIRTUAL_ENV
+                      PATH_SUFFIXES bin Scripts
+                      NO_CMAKE_PATH
+                      NO_CMAKE_ENVIRONMENT_PATH
+                      NO_SYSTEM_ENVIRONMENT_PATH
+                      NO_CMAKE_SYSTEM_PATH)
+
+        _python_validate_interpreter (${_${_PYTHON_PREFIX}_VERSION} EXACT)
+        if (${_PYTHON_PREFIX}_EXECUTABLE)
+          break()
+        endif()
+        if (_${_PYTHON_PREFIX}_FIND_VIRTUALENV STREQUAL "ONLY")
+          continue()
+        endif()
+      endif()
+
+      # Apple frameworks handling
+      if (APPLE AND _${_PYTHON_PREFIX}_FIND_FRAMEWORK STREQUAL "FIRST")
+        find_program (${_PYTHON_PREFIX}_EXECUTABLE
+                      NAMES ${_${_PYTHON_PREFIX}_NAMES}
+                      NAMES_PER_DIR
+                      HINTS ${_${_PYTHON_PREFIX}_HINTS}
+                      PATHS ${_${_PYTHON_PREFIX}_FRAMEWORK_PATHS}
+                      PATH_SUFFIXES bin
+                      NO_CMAKE_PATH
+                      NO_CMAKE_ENVIRONMENT_PATH
+                      NO_SYSTEM_ENVIRONMENT_PATH
+                      NO_CMAKE_SYSTEM_PATH)
+      endif()
 
-    # Windows registry
-    if (WIN32 AND _${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "FIRST")
+      # Windows registry
+      if (WIN32 AND _${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "FIRST")
+        find_program (${_PYTHON_PREFIX}_EXECUTABLE
+                      NAMES ${_${_PYTHON_PREFIX}_NAMES}
+                            ${_${_PYTHON_PREFIX}_IRON_PYTHON_NAMES}
+                      NAMES_PER_DIR
+                      HINTS ${_${_PYTHON_PREFIX}_HINTS}
+                      PATHS ${_${_PYTHON_PREFIX}_REGISTRY_PATHS}
+                            
[HKEY_LOCAL_MACHINE\\SOFTWARE\\IronPython\\${_${_PYTHON_PREFIX}_VERSION}\\InstallPath]
+                      PATH_SUFFIXES bin 
${_${_PYTHON_PREFIX}_IRON_PYTHON_PATH_SUFFIXES}
+                      NO_SYSTEM_ENVIRONMENT_PATH
+                      NO_CMAKE_SYSTEM_PATH)
+      endif()
+      _python_validate_interpreter (${_${_PYTHON_PREFIX}_VERSION} EXACT)
+      if (${_PYTHON_PREFIX}_EXECUTABLE)
+        break()
+      endif()
+
+      # try using HINTS
       find_program (${_PYTHON_PREFIX}_EXECUTABLE
-                    NAMES python${_${_PYTHON_PREFIX}_VERSION}
-                          python${_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR}
-                          python
+                    NAMES ${_${_PYTHON_PREFIX}_NAMES}
                           ${_${_PYTHON_PREFIX}_IRON_PYTHON_NAMES}
                     NAMES_PER_DIR
                     HINTS ${_${_PYTHON_PREFIX}_HINTS}
-                    PATHS 
[HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\${_${_PYTHON_PREFIX}_VERSION}-${_${_PYTHON_PREFIX}_ARCH}\\InstallPath]
-                          
[HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\${_${_PYTHON_PREFIX}_VERSION}-${_${_PYTHON_PREFIX}_ARCH2}\\InstallPath]
-                          
[HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\${_${_PYTHON_PREFIX}_VERSION}\\InstallPath]
-                          
[HKEY_CURRENT_USER\\SOFTWARE\\Python\\ContinuumAnalytics\\Anaconda${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}-${_${_PYTHON_PREFIX}_ARCH}\\InstallPath]
-                          
[HKEY_CURRENT_USER\\SOFTWARE\\Python\\ContinuumAnalytics\\Anaconda${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}-${_${_PYTHON_PREFIX}_ARCH2}\\InstallPath]
-                          
[HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\${_${_PYTHON_PREFIX}_VERSION}-${_${_PYTHON_PREFIX}_ARCH}\\InstallPath]
-                          
[HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\${_${_PYTHON_PREFIX}_VERSION}-${_${_PYTHON_PREFIX}_ARCH2}\\InstallPath]
-                          
[HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\${_${_PYTHON_PREFIX}_VERSION}\\InstallPath]
-                          
[HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\ContinuumAnalytics\\Anaconda${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}-${_${_PYTHON_PREFIX}_ARCH}\\InstallPath]
-                          
[HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\ContinuumAnalytics\\Anaconda${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}-${_${_PYTHON_PREFIX}_ARCH2}\\InstallPath]
-                          
[HKEY_LOCAL_MACHINE\\SOFTWARE\\IronPython\\${_${_PYTHON_PREFIX}_VERSION}\\InstallPath]
                     PATH_SUFFIXES bin 
${_${_PYTHON_PREFIX}_IRON_PYTHON_PATH_SUFFIXES}
                     NO_SYSTEM_ENVIRONMENT_PATH
                     NO_CMAKE_SYSTEM_PATH)
-    endif()
+      _python_validate_interpreter (${_${_PYTHON_PREFIX}_VERSION} EXACT)
+      if (${_PYTHON_PREFIX}_EXECUTABLE)
+        break()
+      endif()
+      # try using standard paths.
+      # NAMES_PER_DIR is not defined on purpose to have a chance to find
+      # expected version.
+      # For example, typical systems have 'python' for version 2.* and 
'python3'
+      # for version 3.*. So looking for names per dir will find, potentially,
+      # systematically 'python' (i.e. version 2) even if version 3 is searched.
+      if (WIN32)
+        find_program (${_PYTHON_PREFIX}_EXECUTABLE
+                      NAMES python${_${_PYTHON_PREFIX}_VERSION}
+                            python
+                            ${_${_PYTHON_PREFIX}_IRON_PYTHON_NAMES})
+      else()
+        find_program (${_PYTHON_PREFIX}_EXECUTABLE
+                      NAMES python${_${_PYTHON_PREFIX}_VERSION})
+      endif()
+      _python_validate_interpreter (${_${_PYTHON_PREFIX}_VERSION} EXACT)
+      if (${_PYTHON_PREFIX}_EXECUTABLE)
+        break()
+      endif()
 
-    # try using HINTS
-    find_program (${_PYTHON_PREFIX}_EXECUTABLE
-                  NAMES python${_${_PYTHON_PREFIX}_VERSION}
-                        python${_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR}
-                        python
-                        ${_${_PYTHON_PREFIX}_IRON_PYTHON_NAMES}
-                  NAMES_PER_DIR
-                  HINTS ${_${_PYTHON_PREFIX}_HINTS}
-                  PATH_SUFFIXES bin 
${_${_PYTHON_PREFIX}_IRON_PYTHON_PATH_SUFFIXES}
-                  NO_SYSTEM_ENVIRONMENT_PATH
-                  NO_CMAKE_SYSTEM_PATH)
-    # try using standard paths.
-    if (WIN32)
-      find_program (${_PYTHON_PREFIX}_EXECUTABLE
-                    NAMES python${_${_PYTHON_PREFIX}_VERSION}
-                          python${_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR}
-                          python
-                          ${_${_PYTHON_PREFIX}_IRON_PYTHON_NAMES}
-                    NAMES_PER_DIR)
-    else()
-      find_program (${_PYTHON_PREFIX}_EXECUTABLE
-                    NAMES python${_${_PYTHON_PREFIX}_VERSION}
-                          python${_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR}
-                    NAMES_PER_DIR)
-    endif()
+      # Apple frameworks handling
+      if (APPLE AND _${_PYTHON_PREFIX}_FIND_FRAMEWORK STREQUAL "LAST")
+        find_program (${_PYTHON_PREFIX}_EXECUTABLE
+                      NAMES ${_${_PYTHON_PREFIX}_NAMES}
+                      NAMES_PER_DIR
+                      PATHS ${_${_PYTHON_PREFIX}_FRAMEWORK_PATHS}
+                      PATH_SUFFIXES bin
+                      NO_DEFAULT_PATH)
+      endif()
 
-    # Apple frameworks handling
-    if (APPLE AND _${_PYTHON_PREFIX}_FIND_FRAMEWORK STREQUAL "LAST")
-      find_program (${_PYTHON_PREFIX}_EXECUTABLE
-                    NAMES python${_${_PYTHON_PREFIX}_VERSION}
-                          python${_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR}
-                    NAMES_PER_DIR
-                    PATHS ${_${_PYTHON_PREFIX}_FRAMEWORK_PATHS}
-                    PATH_SUFFIXES bin
-                    NO_DEFAULT_PATH)
-    endif()
+      # Windows registry
+      if (WIN32 AND _${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "LAST")
+        find_program (${_PYTHON_PREFIX}_EXECUTABLE
+                      NAMES ${_${_PYTHON_PREFIX}_NAMES}
+                            ${_${_PYTHON_PREFIX}_IRON_PYTHON_NAMES}
+                      NAMES_PER_DIR
+                      PATHS ${_${_PYTHON_PREFIX}_REGISTRY_PATHS}
+                            
[HKEY_LOCAL_MACHINE\\SOFTWARE\\IronPython\\${_${_PYTHON_PREFIX}_VERSION}\\InstallPath]
+                      PATH_SUFFIXES bin 
${_${_PYTHON_PREFIX}_IRON_PYTHON_PATH_SUFFIXES}
+                      NO_DEFAULT_PATH)
+      endif()
+
+      _python_validate_interpreter (${_${_PYTHON_PREFIX}_VERSION} EXACT)
+      if (${_PYTHON_PREFIX}_EXECUTABLE)
+        break()
+      endif()
+    endforeach()
 
-    # Windows registry
-    if (WIN32 AND _${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "LAST")
+    if (NOT ${_PYTHON_PREFIX}_EXECUTABLE AND
+        NOT _${_PYTHON_PREFIX}_FIND_VIRTUALENV STREQUAL "ONLY")
+      # No specific version found. Retry with generic names and standard paths.
+      # NAMES_PER_DIR is not defined on purpose to have a chance to find
+      # expected version.
+      # For example, typical systems have 'python' for version 2.* and 
'python3'
+      # for version 3.*. So looking for names per dir will find, potentially,
+      # systematically 'python' (i.e. version 2) even if version 3 is searched.
       find_program (${_PYTHON_PREFIX}_EXECUTABLE
-                    NAMES python${_${_PYTHON_PREFIX}_VERSION}
-                          python${_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR}
+                    NAMES python${_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR}
                           python
-                          ${_${_PYTHON_PREFIX}_IRON_PYTHON_NAMES}
-                    NAMES_PER_DIR
-                    PATHS 
[HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\${_${_PYTHON_PREFIX}_VERSION}-${_${_PYTHON_PREFIX}_ARCH}\\InstallPath]
-                          
[HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\${_${_PYTHON_PREFIX}_VERSION}-${_${_PYTHON_PREFIX}_ARCH2}\\InstallPath]
-                          
[HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\${_${_PYTHON_PREFIX}_VERSION}\\InstallPath]
-                          
[HKEY_CURRENT_USER\\SOFTWARE\\Python\\ContinuumAnalytics\\Anaconda${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}-${_${_PYTHON_PREFIX}_ARCH}\\InstallPath]
-                          
[HKEY_CURRENT_USER\\SOFTWARE\\Python\\ContinuumAnalytics\\Anaconda${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}-${_${_PYTHON_PREFIX}_ARCH2}\\InstallPath]
-                          
[HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\${_${_PYTHON_PREFIX}_VERSION}-${_${_PYTHON_PREFIX}_ARCH}\\InstallPath]
-                          
[HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\${_${_PYTHON_PREFIX}_VERSION}-${_${_PYTHON_PREFIX}_ARCH2}\\InstallPath]
-                          
[HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\${_${_PYTHON_PREFIX}_VERSION}\\InstallPath]
-                          
[HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\ContinuumAnalytics\\Anaconda${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}-${_${_PYTHON_PREFIX}_ARCH}\\InstallPath]
-                          
[HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\ContinuumAnalytics\\Anaconda${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}-${_${_PYTHON_PREFIX}_ARCH2}\\InstallPath]
-                          
[HKEY_LOCAL_MACHINE\\SOFTWARE\\IronPython\\${_${_PYTHON_PREFIX}_VERSION}\\InstallPath]
-                    PATH_SUFFIXES bin 
${_${_PYTHON_PREFIX}_IRON_PYTHON_PATH_SUFFIXES}
-                    NO_DEFAULT_PATH)
-    endif()
+                          ${_${_PYTHON_PREFIX}_IRON_PYTHON_NAMES})
 
-    _python_validate_interpreter (${_${_PYTHON_PREFIX}_VERSION})
-    if (${_PYTHON_PREFIX}_EXECUTABLE)
-      break()
+      _python_validate_interpreter ()
     endif()
-  endforeach()
-
-  if (NOT ${_PYTHON_PREFIX}_EXECUTABLE AND
-      NOT _${_PYTHON_PREFIX}_FIND_VIRTUALENV STREQUAL "ONLY")
-    # No specific version found. Retry with generic names
-    # try using HINTS
-    find_program (${_PYTHON_PREFIX}_EXECUTABLE
-                  NAMES python${_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR}
-                        python
-                        ${_${_PYTHON_PREFIX}_IRON_PYTHON_NAMES}
-                  NAMES_PER_DIR
-                  HINTS ${_${_PYTHON_PREFIX}_HINTS}
-                  PATH_SUFFIXES bin 
${_${_PYTHON_PREFIX}_IRON_PYTHON_PATH_SUFFIXES}
-                  NO_SYSTEM_ENVIRONMENT_PATH
-                  NO_CMAKE_SYSTEM_PATH)
-    # try using standard paths.
-    # NAMES_PER_DIR is not defined on purpose to have a chance to find
-    # expected version.
-    # For example, typical systems have 'python' for version 2.* and 'python3'
-    # for version 3.*. So looking for names per dir will find, potentially,
-    # systematically 'python' (i.e. version 2) even if version 3 is searched.
-    find_program (${_PYTHON_PREFIX}_EXECUTABLE
-                  NAMES python${_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR}
-                        python
-                        ${_${_PYTHON_PREFIX}_IRON_PYTHON_NAMES})
-
-    _python_validate_interpreter ()
   endif()
 
   # retrieve exact version of executable found
@@ -601,44 +790,98 @@ if ("Compiler" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS)
     get_filename_component (_${_PYTHON_PREFIX}_IRON_ROOT 
"${${_PYTHON_PREFIX}_EXECUTABLE}" DIRECTORY)
   endif()
 
-  # try using root dir and registry
-  foreach (_${_PYTHON_PREFIX}_VERSION IN LISTS 
_${_PYTHON_PREFIX}_FIND_VERSIONS)
-    if (_${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "FIRST")
+  if (_${_PYTHON_PREFIX}_FIND_STRATEGY STREQUAL "LOCATION")
+    set (_${_PYTHON_PREFIX}_REGISTRY_PATHS)
+
+    foreach (_${_PYTHON_PREFIX}_VERSION IN LISTS 
_${_PYTHON_PREFIX}_FIND_VERSIONS)
+      # Registry Paths
+      list (APPEND _${_PYTHON_PREFIX}_REGISTRY_PATHS
+                   
[HKEY_LOCAL_MACHINE\\SOFTWARE\\IronPython\\${_${_PYTHON_PREFIX}_VERSION}\\InstallPath])
+    endforeach()
+
+    while (TRUE)
+      if (_${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "FIRST")
+        find_program (${_PYTHON_PREFIX}_COMPILER
+                      NAMES ipyc
+                      HINTS ${_${_PYTHON_PREFIX}_IRON_ROOT} 
${_${_PYTHON_PREFIX}_HINTS}
+                      PATHS ${_${_PYTHON_PREFIX}_REGISTRY_PATHS}
+                      PATH_SUFFIXES 
${_${_PYTHON_PREFIX}_IRON_PYTHON_PATH_SUFFIXES}
+                      NO_SYSTEM_ENVIRONMENT_PATH
+                      NO_CMAKE_SYSTEM_PATH)
+        _python_validate_compiler (${${_PYTHON_PREFIX}_FIND_VERSION})
+        if (${_PYTHON_PREFIX}_COMPILER)
+          break()
+        endif()
+      endif()
+
       find_program (${_PYTHON_PREFIX}_COMPILER
                     NAMES ipyc
                     HINTS ${_${_PYTHON_PREFIX}_IRON_ROOT} 
${_${_PYTHON_PREFIX}_HINTS}
-                    PATHS 
[HKEY_LOCAL_MACHINE\\SOFTWARE\\IronPython\\${_${_PYTHON_PREFIX}_VERSION}\\InstallPath]
                     PATH_SUFFIXES 
${_${_PYTHON_PREFIX}_IRON_PYTHON_PATH_SUFFIXES}
                     NO_SYSTEM_ENVIRONMENT_PATH
                     NO_CMAKE_SYSTEM_PATH)
-    endif()
+      _python_validate_compiler (${${_PYTHON_PREFIX}_FIND_VERSION})
+      if (${_PYTHON_PREFIX}_COMPILER)
+        break()
+      endif()
 
-    find_program (${_PYTHON_PREFIX}_COMPILER
-                  NAMES ipyc
-                  HINTS ${_${_PYTHON_PREFIX}_IRON_ROOT} 
${_${_PYTHON_PREFIX}_HINTS}
-                  PATH_SUFFIXES ${_${_PYTHON_PREFIX}_IRON_PYTHON_PATH_SUFFIXES}
-                  NO_SYSTEM_ENVIRONMENT_PATH
-                  NO_CMAKE_SYSTEM_PATH)
+      if (_${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "LAST")
+        find_program (${_PYTHON_PREFIX}_COMPILER
+                      NAMES ipyc
+                      PATHS ${_${_PYTHON_PREFIX}_REGISTRY_PATHS}
+                      PATH_SUFFIXES 
${_${_PYTHON_PREFIX}_IRON_PYTHON_PATH_SUFFIXES}
+                      NO_DEFAULT_PATH)
+      endif()
+
+      break()
+    endwhile()
+  else()
+    # try using root dir and registry
+    foreach (_${_PYTHON_PREFIX}_VERSION IN LISTS 
_${_PYTHON_PREFIX}_FIND_VERSIONS)
+      if (_${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "FIRST")
+        find_program (${_PYTHON_PREFIX}_COMPILER
+                      NAMES ipyc
+                      HINTS ${_${_PYTHON_PREFIX}_IRON_ROOT} 
${_${_PYTHON_PREFIX}_HINTS}
+                      PATHS 
[HKEY_LOCAL_MACHINE\\SOFTWARE\\IronPython\\${_${_PYTHON_PREFIX}_VERSION}\\InstallPath]
+                      PATH_SUFFIXES 
${_${_PYTHON_PREFIX}_IRON_PYTHON_PATH_SUFFIXES}
+                      NO_SYSTEM_ENVIRONMENT_PATH
+                      NO_CMAKE_SYSTEM_PATH)
+        _python_validate_compiler (${_${_PYTHON_PREFIX}_VERSION} EXACT)
+        if (${_PYTHON_PREFIX}_COMPILER)
+          break()
+        endif()
+      endif()
 
-    if (_${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "LAST")
       find_program (${_PYTHON_PREFIX}_COMPILER
                     NAMES ipyc
-                    PATHS 
[HKEY_LOCAL_MACHINE\\SOFTWARE\\IronPython\\${_${_PYTHON_PREFIX}_VERSION}\\InstallPath]
+                    HINTS ${_${_PYTHON_PREFIX}_IRON_ROOT} 
${_${_PYTHON_PREFIX}_HINTS}
                     PATH_SUFFIXES 
${_${_PYTHON_PREFIX}_IRON_PYTHON_PATH_SUFFIXES}
-                    NO_DEFAULT_PATH)
-    endif()
+                    NO_SYSTEM_ENVIRONMENT_PATH
+                    NO_CMAKE_SYSTEM_PATH)
+      _python_validate_compiler (${_${_PYTHON_PREFIX}_VERSION} EXACT)
+      if (${_PYTHON_PREFIX}_COMPILER)
+        break()
+      endif()
 
-    _python_validate_compiler (${_${_PYTHON_PREFIX}_VERSION})
-    if (${_PYTHON_PREFIX}_COMPILER)
-      break()
-    endif()
-  endforeach()
+      if (_${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "LAST")
+        find_program (${_PYTHON_PREFIX}_COMPILER
+                      NAMES ipyc
+                      PATHS 
[HKEY_LOCAL_MACHINE\\SOFTWARE\\IronPython\\${_${_PYTHON_PREFIX}_VERSION}\\InstallPath]
+                      PATH_SUFFIXES 
${_${_PYTHON_PREFIX}_IRON_PYTHON_PATH_SUFFIXES}
+                      NO_DEFAULT_PATH)
+        _python_validate_compiler (${_${_PYTHON_PREFIX}_VERSION} EXACT)
+        if (${_PYTHON_PREFIX}_COMPILER)
+          break()
+        endif()
+      endif()
+    endforeach()
 
-  # no specific version found, re-try in standard paths
-  find_program (${_PYTHON_PREFIX}_COMPILER
-                NAMES ipyc
-                HINTS ${_${_PYTHON_PREFIX}_IRON_ROOT} 
${_${_PYTHON_PREFIX}_HINTS}
-                PATH_SUFFIXES ${_${_PYTHON_PREFIX}_IRON_PYTHON_PATH_SUFFIXES})
+    # no specific version found, re-try in standard paths
+    find_program (${_PYTHON_PREFIX}_COMPILER
+                  NAMES ipyc
+                  HINTS ${_${_PYTHON_PREFIX}_IRON_ROOT} 
${_${_PYTHON_PREFIX}_HINTS}
+                  PATH_SUFFIXES 
${_${_PYTHON_PREFIX}_IRON_PYTHON_PATH_SUFFIXES})
+  endif()
 
   if (${_PYTHON_PREFIX}_COMPILER)
     # retrieve python environment version from compiler
@@ -753,26 +996,23 @@ if ("Development" IN_LIST 
${_PYTHON_PREFIX}_FIND_COMPONENTS
   endif()
   set (_${_PYTHON_PREFIX}_HINTS "${_${_PYTHON_PREFIX}_EXEC_PREFIX}" 
"${_${_PYTHON_PREFIX}_BASE_EXEC_PREFIX}" "${${_PYTHON_PREFIX}_ROOT_DIR}" ENV 
${_PYTHON_PREFIX}_ROOT_DIR)
 
-  foreach (_${_PYTHON_PREFIX}_VERSION IN LISTS 
_${_PYTHON_PREFIX}_FIND_VERSIONS)
-    string (REPLACE "." "" _${_PYTHON_PREFIX}_VERSION_NO_DOTS 
${_${_PYTHON_PREFIX}_VERSION})
-
-    # try to use pythonX.Y-config tool
+  if (_${_PYTHON_PREFIX}_FIND_STRATEGY STREQUAL "LOCATION")
     set (_${_PYTHON_PREFIX}_CONFIG_NAMES)
-    if (DEFINED CMAKE_LIBRARY_ARCHITECTURE)
-      set (_${_PYTHON_PREFIX}_CONFIG_NAMES 
"${CMAKE_LIBRARY_ARCHITECTURE}-python${_${_PYTHON_PREFIX}_VERSION}-config")
-    endif()
-    list (APPEND _${_PYTHON_PREFIX}_CONFIG_NAMES 
"python${_${_PYTHON_PREFIX}_VERSION}-config")
+
+    foreach (_${_PYTHON_PREFIX}_VERSION IN LISTS 
_${_PYTHON_PREFIX}_FIND_VERSIONS)
+      if (DEFINED CMAKE_LIBRARY_ARCHITECTURE)
+        list (APPEND _${_PYTHON_PREFIX}_CONFIG_NAMES 
"${CMAKE_LIBRARY_ARCHITECTURE}-python${_${_PYTHON_PREFIX}_VERSION}-config")
+      endif()
+      list (APPEND _${_PYTHON_PREFIX}_CONFIG_NAMES 
"python${_${_PYTHON_PREFIX}_VERSION}-config")
+    endforeach()
+
     find_program (_${_PYTHON_PREFIX}_CONFIG
                   NAMES ${_${_PYTHON_PREFIX}_CONFIG_NAMES}
                   NAMES_PER_DIR
                   HINTS ${_${_PYTHON_PREFIX}_HINTS}
                   PATH_SUFFIXES bin)
-    unset (_${_PYTHON_PREFIX}_CONFIG_NAMES)
 
-    if (NOT _${_PYTHON_PREFIX}_CONFIG)
-      continue()
-    endif()
-    if (DEFINED CMAKE_LIBRARY_ARCHITECTURE)
+    if (_${_PYTHON_PREFIX}_CONFIG AND DEFINED CMAKE_LIBRARY_ARCHITECTURE)
       # check that config tool match library architecture
       execute_process (COMMAND "${_${_PYTHON_PREFIX}_CONFIG}" --configdir
                        RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT
@@ -781,15 +1021,56 @@ if ("Development" IN_LIST 
${_PYTHON_PREFIX}_FIND_COMPONENTS
                        OUTPUT_STRIP_TRAILING_WHITESPACE)
       if (_${_PYTHON_PREFIX}_RESULT)
         unset (_${_PYTHON_PREFIX}_CONFIG CACHE)
-        continue()
+      else()
+        string(FIND "${_${_PYTHON_PREFIX}_CONFIGDIR}" 
"${CMAKE_LIBRARY_ARCHITECTURE}" _${_PYTHON_PREFIX}_RESULT)
+        if (_${_PYTHON_PREFIX}_RESULT EQUAL -1)
+          unset (_${_PYTHON_PREFIX}_CONFIG CACHE)
+        endif()
       endif()
-      string(FIND "${_${_PYTHON_PREFIX}_CONFIGDIR}" 
"${CMAKE_LIBRARY_ARCHITECTURE}" _${_PYTHON_PREFIX}_RESULT)
-      if (_${_PYTHON_PREFIX}_RESULT EQUAL -1)
-        unset (_${_PYTHON_PREFIX}_CONFIG CACHE)
+    endif()
+  else()
+    foreach (_${_PYTHON_PREFIX}_VERSION IN LISTS 
_${_PYTHON_PREFIX}_FIND_VERSIONS)
+      # try to use pythonX.Y-config tool
+      set (_${_PYTHON_PREFIX}_CONFIG_NAMES)
+      if (DEFINED CMAKE_LIBRARY_ARCHITECTURE)
+        set (_${_PYTHON_PREFIX}_CONFIG_NAMES 
"${CMAKE_LIBRARY_ARCHITECTURE}-python${_${_PYTHON_PREFIX}_VERSION}-config")
+      endif()
+      list (APPEND _${_PYTHON_PREFIX}_CONFIG_NAMES 
"python${_${_PYTHON_PREFIX}_VERSION}-config")
+      find_program (_${_PYTHON_PREFIX}_CONFIG
+                    NAMES ${_${_PYTHON_PREFIX}_CONFIG_NAMES}
+                    NAMES_PER_DIR
+                    HINTS ${_${_PYTHON_PREFIX}_HINTS}
+                    PATH_SUFFIXES bin)
+      unset (_${_PYTHON_PREFIX}_CONFIG_NAMES)
+
+      if (NOT _${_PYTHON_PREFIX}_CONFIG)
         continue()
       endif()
-    endif()
+      if (DEFINED CMAKE_LIBRARY_ARCHITECTURE)
+        # check that config tool match library architecture
+        execute_process (COMMAND "${_${_PYTHON_PREFIX}_CONFIG}" --configdir
+                         RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT
+                         OUTPUT_VARIABLE _${_PYTHON_PREFIX}_CONFIGDIR
+                         ERROR_QUIET
+                         OUTPUT_STRIP_TRAILING_WHITESPACE)
+        if (_${_PYTHON_PREFIX}_RESULT)
+          unset (_${_PYTHON_PREFIX}_CONFIG CACHE)
+          continue()
+        endif()
+        string(FIND "${_${_PYTHON_PREFIX}_CONFIGDIR}" 
"${CMAKE_LIBRARY_ARCHITECTURE}" _${_PYTHON_PREFIX}_RESULT)
+        if (_${_PYTHON_PREFIX}_RESULT EQUAL -1)
+          unset (_${_PYTHON_PREFIX}_CONFIG CACHE)
+          continue()
+        endif()
+      endif()
+
+      if (_${_PYTHON_PREFIX}_CONFIG)
+        break()
+      endif()
+    endforeach()
+  endif()
 
+  if (_${_PYTHON_PREFIX}_CONFIG)
     # retrieve root install directory
     execute_process (COMMAND "${_${_PYTHON_PREFIX}_CONFIG}" --prefix
                      RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT
@@ -799,9 +1080,15 @@ if ("Development" IN_LIST 
${_PYTHON_PREFIX}_FIND_COMPONENTS
     if (_${_PYTHON_PREFIX}_RESULT)
       # python-config is not usable
       unset (_${_PYTHON_PREFIX}_CONFIG CACHE)
-      continue()
     endif()
-    set (_${_PYTHON_PREFIX}_HINTS "${_${_PYTHON_PREFIX}_PREFIX}" 
"${${_PYTHON_PREFIX}_ROOT_DIR}" ENV ${_PYTHON_PREFIX}_ROOT_DIR)
+  endif()
+
+  if (_${_PYTHON_PREFIX}_CONFIG)
+    set (_${_PYTHON_PREFIX}_HINTS "${_${_PYTHON_PREFIX}_PREFIX}")
+
+    unset (_${_PYTHON_PREFIX}_LIB_DIRS)
+    unset (_${_PYTHON_PREFIX}_PATH_SUFFIXES)
+    unset (_${_PYTHON_PREFIX}_LIB_NAMES)
 
     # retrieve library
     execute_process (COMMAND "${_${_PYTHON_PREFIX}_CONFIG}" --ldflags
@@ -813,33 +1100,58 @@ if ("Development" IN_LIST 
${_PYTHON_PREFIX}_FIND_COMPONENTS
       # retrieve library directory
       string (REGEX MATCHALL "-L[^ ]+" _${_PYTHON_PREFIX}_LIB_DIRS 
"${_${_PYTHON_PREFIX}_FLAGS}")
       string (REPLACE "-L" "" _${_PYTHON_PREFIX}_LIB_DIRS 
"${_${_PYTHON_PREFIX}_LIB_DIRS}")
-      list (REMOVE_DUPLICATES _${_PYTHON_PREFIX}_LIB_DIRS)
+      if (_${_PYTHON_PREFIX}_CONFIG MATCHES "python([0-9.]+)-config")
+        _python_get_path_suffixes (_${_PYTHON_PREFIX}_PATH_SUFFIXES 
${CMAKE_MATCH_1} LIBRARY)
+      endif()
+
       # retrieve library name
       string (REGEX MATCHALL "-lpython[^ ]+" _${_PYTHON_PREFIX}_LIB_NAMES 
"${_${_PYTHON_PREFIX}_FLAGS}")
       string (REPLACE "-l" "" _${_PYTHON_PREFIX}_LIB_NAMES 
"${_${_PYTHON_PREFIX}_LIB_NAMES}")
       list (REMOVE_DUPLICATES _${_PYTHON_PREFIX}_LIB_NAMES)
+    endif()
 
-      find_library (${_PYTHON_PREFIX}_LIBRARY_RELEASE
-                    NAMES ${_${_PYTHON_PREFIX}_LIB_NAMES}
-                    NAMES_PER_DIR
-                    HINTS ${_${_PYTHON_PREFIX}_HINTS} 
${_${_PYTHON_PREFIX}_LIB_DIRS}
-                    PATH_SUFFIXES lib
-                    NO_SYSTEM_ENVIRONMENT_PATH
-                    NO_CMAKE_SYSTEM_PATH)
-      # retrieve runtime library
-      if (${_PYTHON_PREFIX}_LIBRARY_RELEASE)
-        get_filename_component (_${_PYTHON_PREFIX}_PATH 
"${${_PYTHON_PREFIX}_LIBRARY_RELEASE}" DIRECTORY)
-        get_filename_component (_${_PYTHON_PREFIX}_PATH2 
"${_${_PYTHON_PREFIX}_PATH}" DIRECTORY)
-        _python_find_runtime_library (${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE
-                                      NAMES ${_${_PYTHON_PREFIX}_LIB_NAMES}
-                                      NAMES_PER_DIR
-                                      HINTS "${_${_PYTHON_PREFIX}_PATH}" 
"${_${_PYTHON_PREFIX}_PATH2}" ${_${_PYTHON_PREFIX}_HINTS}
-                                      PATH_SUFFIXES bin
-                                      NO_SYSTEM_ENVIRONMENT_PATH
-                                      NO_CMAKE_SYSTEM_PATH)
+    execute_process (COMMAND "${_${_PYTHON_PREFIX}_CONFIG}" --configdir
+                     RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT
+                     OUTPUT_VARIABLE _${_PYTHON_PREFIX}_CONFIGDIR
+                     ERROR_QUIET
+                     OUTPUT_STRIP_TRAILING_WHITESPACE)
+    if (NOT _${_PYTHON_PREFIX}_RESULT)
+      list (APPEND _${_PYTHON_PREFIX}_LIB_DIRS 
"${_${_PYTHON_PREFIX}_CONFIGDIR}")
+    endif()
+    list (REMOVE_DUPLICATES _${_PYTHON_PREFIX}_LIB_DIRS)
+    list (APPEND _${_PYTHON_PREFIX}_HINTS ${_${_PYTHON_PREFIX}_LIB_DIRS})
+
+    if (NOT _${_PYTHON_PREFIX}_LIB_NAMES)
+      # config tool do not specify "-l" option (it is the case starting with 
3.8)
+      # extract version from the config tool name and list all possible lib 
names
+      if (_${_PYTHON_PREFIX}_CONFIG MATCHES "python([0-9.]+)-config")
+        _python_get_lib_names (_${_PYTHON_PREFIX}_LIB_NAMES ${CMAKE_MATCH_1})
       endif()
     endif()
 
+    list (APPEND _${_PYTHON_PREFIX}_HINTS "${${_PYTHON_PREFIX}_ROOT_DIR}" ENV 
${_PYTHON_PREFIX}_ROOT_DIR)
+
+    find_library (${_PYTHON_PREFIX}_LIBRARY_RELEASE
+                  NAMES ${_${_PYTHON_PREFIX}_LIB_NAMES}
+                  NAMES_PER_DIR
+                  HINTS ${_${_PYTHON_PREFIX}_HINTS}
+                  PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
+                  NO_SYSTEM_ENVIRONMENT_PATH
+                  NO_CMAKE_SYSTEM_PATH)
+
+    # retrieve runtime library
+    if (${_PYTHON_PREFIX}_LIBRARY_RELEASE)
+      get_filename_component (_${_PYTHON_PREFIX}_PATH 
"${${_PYTHON_PREFIX}_LIBRARY_RELEASE}" DIRECTORY)
+      get_filename_component (_${_PYTHON_PREFIX}_PATH2 
"${_${_PYTHON_PREFIX}_PATH}" DIRECTORY)
+      _python_find_runtime_library (${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE
+                                    NAMES ${_${_PYTHON_PREFIX}_LIB_NAMES}
+                                    NAMES_PER_DIR
+                                    HINTS "${_${_PYTHON_PREFIX}_PATH}" 
"${_${_PYTHON_PREFIX}_PATH2}" ${_${_PYTHON_PREFIX}_HINTS}
+                                    PATH_SUFFIXES bin
+                                    NO_SYSTEM_ENVIRONMENT_PATH
+                                    NO_CMAKE_SYSTEM_PATH)
+    endif()
+
     # retrieve include directory
     execute_process (COMMAND "${_${_PYTHON_PREFIX}_CONFIG}" --includes
                      RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT
@@ -858,46 +1170,45 @@ if ("Development" IN_LIST 
${_PYTHON_PREFIX}_FIND_COMPONENTS
                  NO_SYSTEM_ENVIRONMENT_PATH
                  NO_CMAKE_SYSTEM_PATH)
     endif()
-
-    if (${_PYTHON_PREFIX}_LIBRARY_RELEASE AND ${_PYTHON_PREFIX}_INCLUDE_DIR)
-      break()
-    endif()
-  endforeach()
+  endif()
 
   # Rely on HINTS and standard paths if config tool failed to locate artifacts
-  if (NOT (${_PYTHON_PREFIX}_LIBRARY_RELEASE OR 
${_PYTHON_PREFIX}_LIBRARY_DEBUG) OR NOT ${_PYTHON_PREFIX}_INCLUDE_DIR)
-    foreach (_${_PYTHON_PREFIX}_VERSION IN LISTS 
_${_PYTHON_PREFIX}_FIND_VERSIONS)
-      string (REPLACE "." "" _${_PYTHON_PREFIX}_VERSION_NO_DOTS 
${_${_PYTHON_PREFIX}_VERSION})
-
-      _python_get_frameworks (_${_PYTHON_PREFIX}_FRAMEWORK_PATHS 
${_${_PYTHON_PREFIX}_VERSION})
-
-      set (_${_PYTHON_PREFIX}_REGISTRY_PATHS
-        
[HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\${_${_PYTHON_PREFIX}_VERSION}-${_${_PYTHON_PREFIX}_ARCH}\\InstallPath]
-        
[HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\${_${_PYTHON_PREFIX}_VERSION}-${_${_PYTHON_PREFIX}_ARCH2}\\InstallPath]
-        
[HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\${_${_PYTHON_PREFIX}_VERSION}\\InstallPath]
-        
[HKEY_CURRENT_USER\\SOFTWARE\\Python\\ContinuumAnalytics\\Anaconda${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}-${_${_PYTHON_PREFIX}_ARCH}\\InstallPath]
-        
[HKEY_CURRENT_USER\\SOFTWARE\\Python\\ContinuumAnalytics\\Anaconda${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}-${_${_PYTHON_PREFIX}_ARCH2}\\InstallPath]
-        
[HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\${_${_PYTHON_PREFIX}_VERSION}-${_${_PYTHON_PREFIX}_ARCH}\\InstallPath]
-        
[HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\${_${_PYTHON_PREFIX}_VERSION}-${_${_PYTHON_PREFIX}_ARCH2}\\InstallPath]
-        
[HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\${_${_PYTHON_PREFIX}_VERSION}\\InstallPath]
-        
[HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\ContinuumAnalytics\\Anaconda${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}-${_${_PYTHON_PREFIX}_ARCH}\\InstallPath]
-        
[HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\ContinuumAnalytics\\Anaconda${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}-${_${_PYTHON_PREFIX}_ARCH2}\\InstallPath])
+  if (NOT ${_PYTHON_PREFIX}_LIBRARY_RELEASE OR NOT 
${_PYTHON_PREFIX}_INCLUDE_DIR)
+    set (_${_PYTHON_PREFIX}_HINTS "${${_PYTHON_PREFIX}_ROOT_DIR}" ENV 
${_PYTHON_PREFIX}_ROOT_DIR)
+
+    if (_${_PYTHON_PREFIX}_FIND_STRATEGY STREQUAL "LOCATION")
+      unset (_${_PYTHON_PREFIX}_LIB_NAMES)
+      unset (_${_PYTHON_PREFIX}_LIB_NAMES_DEBUG)
+      unset (_${_PYTHON_PREFIX}_FRAMEWORK_PATHS)
+      unset (_${_PYTHON_PREFIX}_REGISTRY_PATHS)
+      unset (_${_PYTHON_PREFIX}_PATH_SUFFIXES)
+
+      foreach (_${_PYTHON_PREFIX}_LIB_VERSION IN LISTS 
_${_PYTHON_PREFIX}_FIND_VERSIONS)
+        # library names
+        _python_get_lib_names (_${_PYTHON_PREFIX}_VERSION_NAMES 
${_${_PYTHON_PREFIX}_LIB_VERSION})
+        list (APPEND _${_PYTHON_PREFIX}_LIB_NAMES 
${_${_PYTHON_PREFIX}_VERSION_NAMES})
+        _python_get_lib_names (_${_PYTHON_PREFIX}_VERSION_NAMES 
${_${_PYTHON_PREFIX}_LIB_VERSION} DEBUG)
+        list (APPEND _${_PYTHON_PREFIX}_LIB_NAMES_DEBUG 
${_${_PYTHON_PREFIX}_VERSION_NAMES})
+
+        # Framework Paths
+        _python_get_frameworks (_${_PYTHON_PREFIX}_VERSION_PATHS 
${_${_PYTHON_PREFIX}_LIB_VERSION})
+        list (APPEND _${_PYTHON_PREFIX}_FRAMEWORK_PATHS 
${_${_PYTHON_PREFIX}_VERSION_PATHS})
+
+        # Registry Paths
+        _python_get_registries (_${_PYTHON_PREFIX}_VERSION_PATHS 
${_${_PYTHON_PREFIX}_LIB_VERSION})
+        list (APPEND _${_PYTHON_PREFIX}_REGISTRY_PATHS 
${_${_PYTHON_PREFIX}_VERSION_PATHS})
+
+        # Paths suffixes
+        _python_get_path_suffixes (_${_PYTHON_PREFIX}_VERSION_PATHS 
${_${_PYTHON_PREFIX}_LIB_VERSION} LIBRARY)
+        list (APPEND _${_PYTHON_PREFIX}_PATH_SUFFIXES 
${_${_PYTHON_PREFIX}_VERSION_PATHS})
+      endforeach()
 
       if (APPLE AND _${_PYTHON_PREFIX}_FIND_FRAMEWORK STREQUAL "FIRST")
         find_library (${_PYTHON_PREFIX}_LIBRARY_RELEASE
-                      NAMES python${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}
-                            python${_${_PYTHON_PREFIX}_VERSION}mu
-                            python${_${_PYTHON_PREFIX}_VERSION}m
-                            python${_${_PYTHON_PREFIX}_VERSION}u
-                            python${_${_PYTHON_PREFIX}_VERSION}
+                      NAMES ${_${_PYTHON_PREFIX}_LIB_NAMES}
                       NAMES_PER_DIR
                       PATHS ${_${_PYTHON_PREFIX}_FRAMEWORK_PATHS}
-                      PATH_SUFFIXES lib/${CMAKE_LIBRARY_ARCHITECTURE} lib libs
-                                    
lib/python${_${_PYTHON_PREFIX}_VERSION}/config-${_${_PYTHON_PREFIX}_VERSION}mu
-                                    
lib/python${_${_PYTHON_PREFIX}_VERSION}/config-${_${_PYTHON_PREFIX}_VERSION}m
-                                    
lib/python${_${_PYTHON_PREFIX}_VERSION}/config-${_${_PYTHON_PREFIX}_VERSION}u
-                                    
lib/python${_${_PYTHON_PREFIX}_VERSION}/config-${_${_PYTHON_PREFIX}_VERSION}
-                                    
lib/python${_${_PYTHON_PREFIX}_VERSION}/config
+                      PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
                       NO_CMAKE_PATH
                       NO_CMAKE_ENVIRONMENT_PATH
                       NO_SYSTEM_ENVIRONMENT_PATH
@@ -906,39 +1217,21 @@ if ("Development" IN_LIST 
${_PYTHON_PREFIX}_FIND_COMPONENTS
 
       if (WIN32 AND _${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "FIRST")
         find_library (${_PYTHON_PREFIX}_LIBRARY_RELEASE
-                      NAMES python${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}
-                            python${_${_PYTHON_PREFIX}_VERSION}mu
-                            python${_${_PYTHON_PREFIX}_VERSION}m
-                            python${_${_PYTHON_PREFIX}_VERSION}u
-                            python${_${_PYTHON_PREFIX}_VERSION}
+                      NAMES ${_${_PYTHON_PREFIX}_LIB_NAMES}
                       NAMES_PER_DIR
                       HINTS ${_${_PYTHON_PREFIX}_HINTS}
                       PATHS ${_${_PYTHON_PREFIX}_REGISTRY_PATHS}
-                      PATH_SUFFIXES lib/${CMAKE_LIBRARY_ARCHITECTURE} lib libs
-                                    
lib/python${_${_PYTHON_PREFIX}_VERSION}/config-${_${_PYTHON_PREFIX}_VERSION}mu
-                                    
lib/python${_${_PYTHON_PREFIX}_VERSION}/config-${_${_PYTHON_PREFIX}_VERSION}m
-                                    
lib/python${_${_PYTHON_PREFIX}_VERSION}/config-${_${_PYTHON_PREFIX}_VERSION}u
-                                    
lib/python${_${_PYTHON_PREFIX}_VERSION}/config-${_${_PYTHON_PREFIX}_VERSION}
-                                    
lib/python${_${_PYTHON_PREFIX}_VERSION}/config
+                      PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
                       NO_SYSTEM_ENVIRONMENT_PATH
                       NO_CMAKE_SYSTEM_PATH)
       endif()
 
       # search in HINTS locations
       find_library (${_PYTHON_PREFIX}_LIBRARY_RELEASE
-                    NAMES python${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}
-                          python${_${_PYTHON_PREFIX}_VERSION}mu
-                          python${_${_PYTHON_PREFIX}_VERSION}m
-                          python${_${_PYTHON_PREFIX}_VERSION}u
-                          python${_${_PYTHON_PREFIX}_VERSION}
+                    NAMES ${_${_PYTHON_PREFIX}_LIB_NAMES}
                     NAMES_PER_DIR
                     HINTS ${_${_PYTHON_PREFIX}_HINTS}
-                    PATH_SUFFIXES lib/${CMAKE_LIBRARY_ARCHITECTURE} lib libs
-                                  
lib/python${_${_PYTHON_PREFIX}_VERSION}/config-${_${_PYTHON_PREFIX}_VERSION}mu
-                                  
lib/python${_${_PYTHON_PREFIX}_VERSION}/config-${_${_PYTHON_PREFIX}_VERSION}m
-                                  
lib/python${_${_PYTHON_PREFIX}_VERSION}/config-${_${_PYTHON_PREFIX}_VERSION}u
-                                  
lib/python${_${_PYTHON_PREFIX}_VERSION}/config-${_${_PYTHON_PREFIX}_VERSION}
-                                  
lib/python${_${_PYTHON_PREFIX}_VERSION}/config
+                    PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
                     NO_SYSTEM_ENVIRONMENT_PATH
                     NO_CMAKE_SYSTEM_PATH)
 
@@ -956,42 +1249,29 @@ if ("Development" IN_LIST 
${_PYTHON_PREFIX}_FIND_COMPONENTS
 
       # search in all default paths
       find_library (${_PYTHON_PREFIX}_LIBRARY_RELEASE
-                    NAMES python${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}
-                          python${_${_PYTHON_PREFIX}_VERSION}mu
-                          python${_${_PYTHON_PREFIX}_VERSION}m
-                          python${_${_PYTHON_PREFIX}_VERSION}u
-                          python${_${_PYTHON_PREFIX}_VERSION}
+                    NAMES ${_${_PYTHON_PREFIX}_LIB_NAMES}
                     NAMES_PER_DIR
                     PATHS ${__${_PYTHON_PREFIX}_FRAMEWORK_PATHS}
                           ${__${_PYTHON_PREFIX}_REGISTRY_PATHS}
-                    PATH_SUFFIXES lib/${CMAKE_LIBRARY_ARCHITECTURE} lib libs
-                                  
lib/python${_${_PYTHON_PREFIX}_VERSION}/config-${_${_PYTHON_PREFIX}_VERSION}mu
-                                  
lib/python${_${_PYTHON_PREFIX}_VERSION}/config-${_${_PYTHON_PREFIX}_VERSION}m
-                                  
lib/python${_${_PYTHON_PREFIX}_VERSION}/config-${_${_PYTHON_PREFIX}_VERSION}u
-                                  
lib/python${_${_PYTHON_PREFIX}_VERSION}/config-${_${_PYTHON_PREFIX}_VERSION}
-                                  
lib/python${_${_PYTHON_PREFIX}_VERSION}/config)
-      # retrieve runtime library
+                    PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES})
+
       if (${_PYTHON_PREFIX}_LIBRARY_RELEASE)
-        get_filename_component (_${_PYTHON_PREFIX}_PATH 
"${${_PYTHON_PREFIX}_LIBRARY_RELEASE}" DIRECTORY)
-        get_filename_component (_${_PYTHON_PREFIX}_PATH2 
"${_${_PYTHON_PREFIX}_PATH}" DIRECTORY)
-        _python_find_runtime_library (${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE
-                                      NAMES 
python${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}
-                                            
python${_${_PYTHON_PREFIX}_VERSION}mu
-                                            
python${_${_PYTHON_PREFIX}_VERSION}m
-                                            
python${_${_PYTHON_PREFIX}_VERSION}u
-                                            python${_${_PYTHON_PREFIX}_VERSION}
-                                      NAMES_PER_DIR
-                                      HINTS "${_${_PYTHON_PREFIX}_PATH}" 
"${_${_PYTHON_PREFIX}_PATH2}" ${_${_PYTHON_PREFIX}_HINTS}
-                                      PATH_SUFFIXES bin)
+        # extract version from library name
+        if (${_PYTHON_PREFIX}_LIBRARY_RELEASE MATCHES "python([23])([0-9]+)")
+          set (_${_PYTHON_PREFIX}_VERSION "${CMAKE_MATCH_1}.${CMAKE_MATCH_2}")
+        elseif (${_PYTHON_PREFIX}_LIBRARY_RELEASE MATCHES 
"python([23])\\.([0-9]+)")
+          set (_${_PYTHON_PREFIX}_VERSION "${CMAKE_MATCH_1}.${CMAKE_MATCH_2}")
+        endif()
       endif()
 
       if (WIN32)
         # search for debug library
         if (${_PYTHON_PREFIX}_LIBRARY_RELEASE)
           # use library location as a hint
+          _python_get_lib_names (_${_PYTHON_PREFIX}_LIB_NAMES_DEBUG 
${_${_PYTHON_PREFIX}_VERSION} DEBUG)
           get_filename_component (_${_PYTHON_PREFIX}_PATH 
"${${_PYTHON_PREFIX}_LIBRARY_RELEASE}" DIRECTORY)
           find_library (${_PYTHON_PREFIX}_LIBRARY_DEBUG
-                        NAMES python${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}_d
+                        NAMES ${_${_PYTHON_PREFIX}_LIB_NAMES_DEBUG}
                         NAMES_PER_DIR
                         HINTS "${_${_PYTHON_PREFIX}_PATH}" 
${_${_PYTHON_PREFIX}_HINTS}
                         NO_DEFAULT_PATH)
@@ -999,7 +1279,7 @@ if ("Development" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS
           # search first in known locations
           if (_${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "FIRST")
             find_library (${_PYTHON_PREFIX}_LIBRARY_DEBUG
-                          NAMES python${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}_d
+                          NAMES ${_${_PYTHON_PREFIX}_LIB_NAMES_DEBUG}
                           NAMES_PER_DIR
                           HINTS ${_${_PYTHON_PREFIX}_HINTS}
                           PATHS ${_${_PYTHON_PREFIX}_REGISTRY_PATHS}
@@ -1009,108 +1289,229 @@ if ("Development" IN_LIST 
${_PYTHON_PREFIX}_FIND_COMPONENTS
           endif()
           # search in all default paths
           find_library (${_PYTHON_PREFIX}_LIBRARY_DEBUG
-                        NAMES python${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}_d
+                        NAMES ${_${_PYTHON_PREFIX}_LIB_NAMES_DEBUG}
                         NAMES_PER_DIR
                         HINTS ${_${_PYTHON_PREFIX}_HINTS}
                         PATHS ${__${_PYTHON_PREFIX}_REGISTRY_PATHS}
                         PATH_SUFFIXES lib libs)
-        endif()
-        if (${_PYTHON_PREFIX}_LIBRARY_DEBUG)
-          get_filename_component (_${_PYTHON_PREFIX}_PATH 
"${${_PYTHON_PREFIX}_LIBRARY_DEBUG}" DIRECTORY)
-          get_filename_component (_${_PYTHON_PREFIX}_PATH2 
"${_${_PYTHON_PREFIX}_PATH}" DIRECTORY)
-          _python_find_runtime_library (${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DEBUG
-                                        NAMES 
python${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}_d
-                                        NAMES_PER_DIR
-                                        HINTS "${_${_PYTHON_PREFIX}_PATH}" 
"${_${_PYTHON_PREFIX}_PATH2}" ${_${_PYTHON_PREFIX}_HINTS}
-                                        PATH_SUFFIXES bin)
+                    endif()
+                          if (${_PYTHON_PREFIX}_LIBRARY_RELEASE)
+
+          # extract version from library name
+          if (${_PYTHON_PREFIX}_LIBRARY_DEBUG MATCHES "python([23])([0-9]+)")
+            set (_${_PYTHON_PREFIX}_VERSION 
"${CMAKE_MATCH_1}.${CMAKE_MATCH_2}")
+          elseif (${_PYTHON_PREFIX}_LIBRARY_DEBUG MATCHES 
"python([23])\\.([0-9]+)")
+            set (_${_PYTHON_PREFIX}_VERSION 
"${CMAKE_MATCH_1}.${CMAKE_MATCH_2}")
+          endif()
         endif()
       endif()
+    else()
+      foreach (_${_PYTHON_PREFIX}_LIB_VERSION IN LISTS 
_${_PYTHON_PREFIX}_FIND_VERSIONS)
+        _python_get_lib_names (_${_PYTHON_PREFIX}_LIB_NAMES 
${_${_PYTHON_PREFIX}_LIB_VERSION})
+        _python_get_lib_names (_${_PYTHON_PREFIX}_LIB_NAMES_DEBUG 
${_${_PYTHON_PREFIX}_LIB_VERSION} DEBUG)
 
-      # Don't search for include dir until library location is known
-      if (${_PYTHON_PREFIX}_LIBRARY_RELEASE OR ${_PYTHON_PREFIX}_LIBRARY_DEBUG)
-        unset (_${_PYTHON_PREFIX}_INCLUDE_HINTS)
+        _python_get_frameworks (_${_PYTHON_PREFIX}_FRAMEWORK_PATHS 
${_${_PYTHON_PREFIX}_LIB_VERSION})
+        _python_get_registries (_${_PYTHON_PREFIX}_REGISTRY_PATHS 
${_${_PYTHON_PREFIX}_LIB_VERSION})
 
-        if (${_PYTHON_PREFIX}_EXECUTABLE)
-          # pick up include directory from configuration
-          execute_process (COMMAND "${${_PYTHON_PREFIX}_EXECUTABLE}" -c
-                                   "import sys; import sysconfig; 
sys.stdout.write(sysconfig.get_path('include'))"
-                           RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT
-                           OUTPUT_VARIABLE _${_PYTHON_PREFIX}_PATH
-                           ERROR_QUIET
-                           OUTPUT_STRIP_TRAILING_WHITESPACE)
-           if (NOT _${_PYTHON_PREFIX}_RESULT)
-             file (TO_CMAKE_PATH "${_${_PYTHON_PREFIX}_PATH}" 
_${_PYTHON_PREFIX}_PATH)
-             list (APPEND _${_PYTHON_PREFIX}_INCLUDE_HINTS 
"${_${_PYTHON_PREFIX}_PATH}")
-           endif()
+        _python_get_path_suffixes (_${_PYTHON_PREFIX}_PATH_SUFFIXES 
${_${_PYTHON_PREFIX}_LIB_VERSION} LIBRARY)
+
+        if (APPLE AND _${_PYTHON_PREFIX}_FIND_FRAMEWORK STREQUAL "FIRST")
+          find_library (${_PYTHON_PREFIX}_LIBRARY_RELEASE
+                        NAMES ${_${_PYTHON_PREFIX}_LIB_NAMES}
+                        NAMES_PER_DIR
+                        PATHS ${_${_PYTHON_PREFIX}_FRAMEWORK_PATHS}
+                        PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
+                        NO_CMAKE_PATH
+                        NO_CMAKE_ENVIRONMENT_PATH
+                        NO_SYSTEM_ENVIRONMENT_PATH
+                        NO_CMAKE_SYSTEM_PATH)
         endif()
 
-        foreach (_${_PYTHON_PREFIX}_LIB IN ITEMS 
${_PYTHON_PREFIX}_LIBRARY_RELEASE ${_PYTHON_PREFIX}_LIBRARY_DEBUG)
-          if (${_${_PYTHON_PREFIX}_LIB})
-            # Use the library's install prefix as a hint
-            if (${_${_PYTHON_PREFIX}_LIB} MATCHES 
"^(.+/Frameworks/Python.framework/Versions/[0-9.]+)")
-              list (APPEND _${_PYTHON_PREFIX}_INCLUDE_HINTS "${CMAKE_MATCH_1}")
-            elseif (${_${_PYTHON_PREFIX}_LIB} MATCHES 
"^(.+)/lib(64|32)?/python[0-9.]+/config")
-              list (APPEND _${_PYTHON_PREFIX}_INCLUDE_HINTS "${CMAKE_MATCH_1}")
-            elseif (DEFINED CMAKE_LIBRARY_ARCHITECTURE AND 
${_${_PYTHON_PREFIX}_LIB} MATCHES "^(.+)/lib/${CMAKE_LIBRARY_ARCHITECTURE}")
-              list (APPEND _${_PYTHON_PREFIX}_INCLUDE_HINTS "${CMAKE_MATCH_1}")
-            else()
-              # assume library is in a directory under root
-              get_filename_component (_${_PYTHON_PREFIX}_PREFIX 
"${${_${_PYTHON_PREFIX}_LIB}}" DIRECTORY)
-              get_filename_component (_${_PYTHON_PREFIX}_PREFIX 
"${_${_PYTHON_PREFIX}_PREFIX}" DIRECTORY)
-              list (APPEND _${_PYTHON_PREFIX}_INCLUDE_HINTS 
"${_${_PYTHON_PREFIX}_PREFIX}")
+        if (WIN32 AND _${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "FIRST")
+          find_library (${_PYTHON_PREFIX}_LIBRARY_RELEASE
+                        NAMES ${_${_PYTHON_PREFIX}_LIB_NAMES}
+                        NAMES_PER_DIR
+                        HINTS ${_${_PYTHON_PREFIX}_HINTS}
+                        PATHS ${_${_PYTHON_PREFIX}_REGISTRY_PATHS}
+                        PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
+                        NO_SYSTEM_ENVIRONMENT_PATH
+                        NO_CMAKE_SYSTEM_PATH)
+        endif()
+
+        # search in HINTS locations
+        find_library (${_PYTHON_PREFIX}_LIBRARY_RELEASE
+                      NAMES ${_${_PYTHON_PREFIX}_LIB_NAMES}
+                      NAMES_PER_DIR
+                      HINTS ${_${_PYTHON_PREFIX}_HINTS}
+                      PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
+                      NO_SYSTEM_ENVIRONMENT_PATH
+                      NO_CMAKE_SYSTEM_PATH)
+
+       if (APPLE AND _${_PYTHON_PREFIX}_FIND_FRAMEWORK STREQUAL "LAST")
+         set (__${_PYTHON_PREFIX}_FRAMEWORK_PATHS 
${_${_PYTHON_PREFIX}_FRAMEWORK_PATHS})
+       else()
+         unset (__${_PYTHON_PREFIX}_FRAMEWORK_PATHS)
+       endif()
+
+       if (WIN32 AND _${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "LAST")
+         set (__${_PYTHON_PREFIX}_REGISTRY_PATHS 
${_${_PYTHON_PREFIX}_REGISTRY_PATHS})
+       else()
+         unset (__${_PYTHON_PREFIX}_REGISTRY_PATHS)
+       endif()
+
+       # search in all default paths
+       find_library (${_PYTHON_PREFIX}_LIBRARY_RELEASE
+                      NAMES ${_${_PYTHON_PREFIX}_LIB_NAMES}
+                      NAMES_PER_DIR
+                      PATHS ${__${_PYTHON_PREFIX}_FRAMEWORK_PATHS}
+                            ${__${_PYTHON_PREFIX}_REGISTRY_PATHS}
+                      PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES})
+
+        if (WIN32)
+          # search for debug library
+          if (${_PYTHON_PREFIX}_LIBRARY_RELEASE)
+            # use library location as a hint
+            get_filename_component (_${_PYTHON_PREFIX}_PATH 
"${${_PYTHON_PREFIX}_LIBRARY_RELEASE}" DIRECTORY)
+            find_library (${_PYTHON_PREFIX}_LIBRARY_DEBUG
+                          NAMES ${_${_PYTHON_PREFIX}_LIB_NAMES_DEBUG}
+                          NAMES_PER_DIR
+                          HINTS "${_${_PYTHON_PREFIX}_PATH}" 
${_${_PYTHON_PREFIX}_HINTS}
+                          NO_DEFAULT_PATH)
+          else()
+            # search first in known locations
+            if (_${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "FIRST")
+              find_library (${_PYTHON_PREFIX}_LIBRARY_DEBUG
+                            NAMES ${_${_PYTHON_PREFIX}_LIB_NAMES_DEBUG}
+                            NAMES_PER_DIR
+                            HINTS ${_${_PYTHON_PREFIX}_HINTS}
+                            PATHS ${_${_PYTHON_PREFIX}_REGISTRY_PATHS}
+                            PATH_SUFFIXES lib libs
+                            NO_SYSTEM_ENVIRONMENT_PATH
+                            NO_CMAKE_SYSTEM_PATH)
             endif()
+            # search in all default paths
+            find_library (${_PYTHON_PREFIX}_LIBRARY_DEBUG
+                          NAMES ${_${_PYTHON_PREFIX}_LIB_NAMES_DEBUG}
+                          NAMES_PER_DIR
+                          HINTS ${_${_PYTHON_PREFIX}_HINTS}
+                          PATHS ${__${_PYTHON_PREFIX}_REGISTRY_PATHS}
+                          PATH_SUFFIXES lib libs)
           endif()
-        endforeach()
-        list (REMOVE_DUPLICATES _${_PYTHON_PREFIX}_INCLUDE_HINTS)
+        endif()
 
-        if (APPLE AND _${_PYTHON_PREFIX}_FIND_FRAMEWORK STREQUAL "FIRST")
-          find_path (${_PYTHON_PREFIX}_INCLUDE_DIR
-                     NAMES Python.h
-                     HINTS ${_${_PYTHON_PREFIX}_HINTS}
-                     PATHS ${_${_PYTHON_PREFIX}_FRAMEWORK_PATHS}
-                     PATH_SUFFIXES 
include/python${_${_PYTHON_PREFIX}_VERSION}mu
-                                   include/python${_${_PYTHON_PREFIX}_VERSION}m
-                                   include/python${_${_PYTHON_PREFIX}_VERSION}u
-                                   include/python${_${_PYTHON_PREFIX}_VERSION}
-                                   include
-                     NO_CMAKE_PATH
-                     NO_CMAKE_ENVIRONMENT_PATH
-                     NO_SYSTEM_ENVIRONMENT_PATH
-                     NO_CMAKE_SYSTEM_PATH)
+        if (${_PYTHON_PREFIX}_LIBRARY_RELEASE OR 
${_PYTHON_PREFIX}_LIBRARY_DEBUG)
+          set (_${_PYTHON_PREFIX}_VERSION ${_${_PYTHON_PREFIX}_LIB_VERSION})
+          break()
         endif()
+      endforeach()
+    endif()
 
-        if (WIN32 AND _${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "FIRST")
-          find_path (${_PYTHON_PREFIX}_INCLUDE_DIR
-                     NAMES Python.h
-                     HINTS ${_${_PYTHON_PREFIX}_INCLUDE_HINTS} 
${_${_PYTHON_PREFIX}_HINTS}
-                     PATHS ${_${_PYTHON_PREFIX}_REGISTRY_PATHS}
-                     PATH_SUFFIXES 
include/python${_${_PYTHON_PREFIX}_VERSION}mu
-                                   include/python${_${_PYTHON_PREFIX}_VERSION}m
-                                   include/python${_${_PYTHON_PREFIX}_VERSION}u
-                                   include/python${_${_PYTHON_PREFIX}_VERSION}
-                                   include
-                     NO_SYSTEM_ENVIRONMENT_PATH
-                     NO_CMAKE_SYSTEM_PATH)
+    # retrieve runtime libraries
+    if (${_PYTHON_PREFIX}_LIBRARY_RELEASE)
+      _python_get_lib_names (_${_PYTHON_PREFIX}_LIB_NAMES 
${_${_PYTHON_PREFIX}_VERSION})
+      get_filename_component (_${_PYTHON_PREFIX}_PATH 
"${${_PYTHON_PREFIX}_LIBRARY_RELEASE}" DIRECTORY)
+      get_filename_component (_${_PYTHON_PREFIX}_PATH2 
"${_${_PYTHON_PREFIX}_PATH}" DIRECTORY)
+      _python_find_runtime_library (${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE
+                                    NAMES ${_${_PYTHON_PREFIX}_LIB_NAMES}
+                                    NAMES_PER_DIR
+                                    HINTS "${_${_PYTHON_PREFIX}_PATH}" 
"${_${_PYTHON_PREFIX}_PATH2}" ${_${_PYTHON_PREFIX}_HINTS}
+                                    PATH_SUFFIXES bin)
+    endif()
+    if (${_PYTHON_PREFIX}_LIBRARY_DEBUG)
+      _python_get_lib_names (_${_PYTHON_PREFIX}_LIB_NAMES_DEBUG 
${_${_PYTHON_PREFIX}_VERSION} DEBUG)
+      get_filename_component (_${_PYTHON_PREFIX}_PATH 
"${${_PYTHON_PREFIX}_LIBRARY_DEBUG}" DIRECTORY)
+      get_filename_component (_${_PYTHON_PREFIX}_PATH2 
"${_${_PYTHON_PREFIX}_PATH}" DIRECTORY)
+      _python_find_runtime_library (${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DEBUG
+                                    NAMES ${_${_PYTHON_PREFIX}_LIB_NAMES_DEBUG}
+                                    NAMES_PER_DIR
+                                    HINTS "${_${_PYTHON_PREFIX}_PATH}" 
"${_${_PYTHON_PREFIX}_PATH2}" ${_${_PYTHON_PREFIX}_HINTS}
+                                    PATH_SUFFIXES bin)
+    endif()
+
+    # Don't search for include dir if no library was founded
+    if (${_PYTHON_PREFIX}_LIBRARY_RELEASE OR ${_PYTHON_PREFIX}_LIBRARY_DEBUG)
+      unset (_${_PYTHON_PREFIX}_INCLUDE_HINTS)
+
+      if (${_PYTHON_PREFIX}_EXECUTABLE)
+        # pick up include directory from configuration
+        execute_process (COMMAND "${${_PYTHON_PREFIX}_EXECUTABLE}" -c
+                                 "import sys; import sysconfig; 
sys.stdout.write(sysconfig.get_path('include'))"
+                         RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT
+                         OUTPUT_VARIABLE _${_PYTHON_PREFIX}_PATH
+                         ERROR_QUIET
+                         OUTPUT_STRIP_TRAILING_WHITESPACE)
+        if (NOT _${_PYTHON_PREFIX}_RESULT)
+          file (TO_CMAKE_PATH "${_${_PYTHON_PREFIX}_PATH}" 
_${_PYTHON_PREFIX}_PATH)
+          list (APPEND _${_PYTHON_PREFIX}_INCLUDE_HINTS 
"${_${_PYTHON_PREFIX}_PATH}")
         endif()
+      endif()
+
+      foreach (_${_PYTHON_PREFIX}_LIB IN ITEMS 
${_PYTHON_PREFIX}_LIBRARY_RELEASE ${_PYTHON_PREFIX}_LIBRARY_DEBUG)
+        if (${_${_PYTHON_PREFIX}_LIB})
+          # Use the library's install prefix as a hint
+          if (${_${_PYTHON_PREFIX}_LIB} MATCHES 
"^(.+/Frameworks/Python.framework/Versions/[0-9.]+)")
+            list (APPEND _${_PYTHON_PREFIX}_INCLUDE_HINTS "${CMAKE_MATCH_1}")
+          elseif (${_${_PYTHON_PREFIX}_LIB} MATCHES 
"^(.+)/lib(64|32)?/python[0-9.]+/config")
+            list (APPEND _${_PYTHON_PREFIX}_INCLUDE_HINTS "${CMAKE_MATCH_1}")
+          elseif (DEFINED CMAKE_LIBRARY_ARCHITECTURE AND 
${_${_PYTHON_PREFIX}_LIB} MATCHES "^(.+)/lib/${CMAKE_LIBRARY_ARCHITECTURE}")
+            list (APPEND _${_PYTHON_PREFIX}_INCLUDE_HINTS "${CMAKE_MATCH_1}")
+          else()
+            # assume library is in a directory under root
+            get_filename_component (_${_PYTHON_PREFIX}_PREFIX 
"${${_${_PYTHON_PREFIX}_LIB}}" DIRECTORY)
+            get_filename_component (_${_PYTHON_PREFIX}_PREFIX 
"${_${_PYTHON_PREFIX}_PREFIX}" DIRECTORY)
+            list (APPEND _${_PYTHON_PREFIX}_INCLUDE_HINTS 
"${_${_PYTHON_PREFIX}_PREFIX}")
+          endif()
+        endif()
+      endforeach()
+      list (REMOVE_DUPLICATES _${_PYTHON_PREFIX}_INCLUDE_HINTS)
+
+      _python_get_frameworks (_${_PYTHON_PREFIX}_FRAMEWORK_PATHS 
${_${_PYTHON_PREFIX}_VERSION})
+      _python_get_registries (_${_PYTHON_PREFIX}_REGISTRY_PATHS 
${_${_PYTHON_PREFIX}_VERSION})
+      _python_get_path_suffixes (_${_PYTHON_PREFIX}_PATH_SUFFIXES 
${_${_PYTHON_PREFIX}_VERSION} INCLUDE)
 
+      if (APPLE AND _${_PYTHON_PREFIX}_FIND_FRAMEWORK STREQUAL "FIRST")
         find_path (${_PYTHON_PREFIX}_INCLUDE_DIR
                    NAMES Python.h
                    HINTS ${_${_PYTHON_PREFIX}_INCLUDE_HINTS} 
${_${_PYTHON_PREFIX}_HINTS}
-                   PATHS ${__${_PYTHON_PREFIX}_FRAMEWORK_PATHS}
-                         ${__${_PYTHON_PREFIX}_REGISTRY_PATHS}
-                   PATH_SUFFIXES include/python${_${_PYTHON_PREFIX}_VERSION}mu
-                                 include/python${_${_PYTHON_PREFIX}_VERSION}m
-                                 include/python${_${_PYTHON_PREFIX}_VERSION}u
-                                 include/python${_${_PYTHON_PREFIX}_VERSION}
-                                 include
+                   PATHS ${_${_PYTHON_PREFIX}_FRAMEWORK_PATHS}
+                   PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
+                   NO_CMAKE_PATH
+                   NO_CMAKE_ENVIRONMENT_PATH
                    NO_SYSTEM_ENVIRONMENT_PATH
                    NO_CMAKE_SYSTEM_PATH)
       endif()
 
-      if ((${_PYTHON_PREFIX}_LIBRARY_RELEASE OR 
${_PYTHON_PREFIX}_LIBRARY_DEBUG) AND ${_PYTHON_PREFIX}_INCLUDE_DIR)
-        break()
+      if (WIN32 AND _${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "FIRST")
+        find_path (${_PYTHON_PREFIX}_INCLUDE_DIR
+                   NAMES Python.h
+                   HINTS ${_${_PYTHON_PREFIX}_INCLUDE_HINTS} 
${_${_PYTHON_PREFIX}_HINTS}
+                   PATHS ${_${_PYTHON_PREFIX}_REGISTRY_PATHS}
+                   PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
+                   NO_SYSTEM_ENVIRONMENT_PATH
+                   NO_CMAKE_SYSTEM_PATH)
       endif()
-    endforeach()
+
+      if (APPLE AND _${_PYTHON_PREFIX}_FIND_FRAMEWORK STREQUAL "LAST")
+        set (__${_PYTHON_PREFIX}_FRAMEWORK_PATHS 
${_${_PYTHON_PREFIX}_FRAMEWORK_PATHS})
+      else()
+        unset (__${_PYTHON_PREFIX}_FRAMEWORK_PATHS)
+      endif()
+
+      if (WIN32 AND _${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "LAST")
+        set (__${_PYTHON_PREFIX}_REGISTRY_PATHS 
${_${_PYTHON_PREFIX}_REGISTRY_PATHS})
+      else()
+        unset (__${_PYTHON_PREFIX}_REGISTRY_PATHS)
+      endif()
+
+      find_path (${_PYTHON_PREFIX}_INCLUDE_DIR
+                 NAMES Python.h
+                 HINTS ${_${_PYTHON_PREFIX}_INCLUDE_HINTS} 
${_${_PYTHON_PREFIX}_HINTS}
+                 PATHS ${__${_PYTHON_PREFIX}_FRAMEWORK_PATHS}
+                       ${__${_PYTHON_PREFIX}_REGISTRY_PATHS}
+                 PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
+                 NO_SYSTEM_ENVIRONMENT_PATH
+                 NO_CMAKE_SYSTEM_PATH)
+    endif()
 
     # search header file in standard locations
     find_path (${_PYTHON_PREFIX}_INCLUDE_DIR
@@ -1386,7 +1787,7 @@ if(_${_PYTHON_PREFIX}_CMAKE_ROLE STREQUAL "PROJECT")
   endif()
 
   if ("NumPy" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS AND 
${_PYTHON_PREFIX}_NumPy_FOUND
-      AND NOT TARGET ${_PYTHON_PREFIX}::NumPy AND TARGET 
${_PYTHON_PREFIX}::Python)
+      AND NOT TARGET ${_PYTHON_PREFIX}::NumPy AND TARGET 
${_PYTHON_PREFIX}::Module)
     add_library (${_PYTHON_PREFIX}::NumPy INTERFACE IMPORTED)
     set_property (TARGET ${_PYTHON_PREFIX}::NumPy
                   PROPERTY INTERFACE_INCLUDE_DIRECTORIES 
"${${_PYTHON_PREFIX}_NumPy_INCLUDE_DIR}")
diff --git a/Modules/FindPython2.cmake b/Modules/FindPython2.cmake
index 67499d8..eea4d29 100644
--- a/Modules/FindPython2.cmake
+++ b/Modules/FindPython2.cmake
@@ -138,6 +138,17 @@ Hints
   * If set to TRUE, search **only** for static libraries.
   * If set to FALSE, search **only** for shared libraries.
 
+``Python2_FIND_STRATEGY``
+  This variable defines how lookup will be done.
+  The ``Python2_FIND_STRATEGY`` variable can be set to empty or one of the
+  following:
+
+  * ``VERSION``: Try to find the most recent version in all specified
+    locations.
+    This is the default.
+  * ``LOCATION``: Stops lookup as soon as a version satisfying version
+    constraints is founded.
+
 ``Python2_FIND_REGISTRY``
   On Windows the ``Python2_FIND_REGISTRY`` variable determine the order
   of preference between registry and environment variables.
diff --git a/Modules/FindPython3.cmake b/Modules/FindPython3.cmake
index fdb99a6..5e42732 100644
--- a/Modules/FindPython3.cmake
+++ b/Modules/FindPython3.cmake
@@ -138,6 +138,17 @@ Hints
   * If set to TRUE, search **only** for static libraries.
   * If set to FALSE, search **only** for shared libraries.
 
+``Python3_FIND_STRATEGY``
+  This variable defines how lookup will be done.
+  The ``Python3_FIND_STRATEGY`` variable can be set to empty or one of the
+  following:
+
+  * ``VERSION``: Try to find the most recent version in all specified
+    locations.
+    This is the default.
+  * ``LOCATION``: Stops lookup as soon as a version satisfying version
+    constraints is founded.
+
 ``Python3_FIND_REGISTRY``
   On Windows the ``Python3_FIND_REGISTRY`` variable determine the order
   of preference between registry and environment variables.
diff --git a/Tests/FindPython/CMakeLists.txt b/Tests/FindPython/CMakeLists.txt
index 8dfcf40..4be2f22 100644
--- a/Tests/FindPython/CMakeLists.txt
+++ b/Tests/FindPython/CMakeLists.txt
@@ -1,12 +1,22 @@
 if(CMake_TEST_FindPython)
-  add_test(NAME FindPython.Python2 COMMAND
+  add_test(NAME FindPython.Python2.LOCATION COMMAND
     ${CMAKE_CTEST_COMMAND} -C $<CONFIGURATION>
     --build-and-test
     "${CMake_SOURCE_DIR}/Tests/FindPython/Python2"
-    "${CMake_BINARY_DIR}/Tests/FindPython/Python2"
+    "${CMake_BINARY_DIR}/Tests/FindPython/Python2.LOCATION"
     ${build_generator_args}
     --build-project TestPython2
-    --build-options ${build_options}
+    --build-options ${build_options} -DPython2_FIND_STRATEGY=LOCATION
+    --test-command ${CMAKE_CTEST_COMMAND} -V -C $<CONFIGURATION>
+    )
+  add_test(NAME FindPython.Python2.VERSION COMMAND
+    ${CMAKE_CTEST_COMMAND} -C $<CONFIGURATION>
+    --build-and-test
+    "${CMake_SOURCE_DIR}/Tests/FindPython/Python2"
+    "${CMake_BINARY_DIR}/Tests/FindPython/Python2.VERSION"
+    ${build_generator_args}
+    --build-project TestPython2
+    --build-options ${build_options} -DPython2_FIND_STRATEGY=VERSION
     --test-command ${CMAKE_CTEST_COMMAND} -V -C $<CONFIGURATION>
     )
 
@@ -23,14 +33,24 @@ if(CMake_TEST_FindPython)
   set_tests_properties(FindPython.Python2Fail PROPERTIES
     PASS_REGULAR_EXPRESSION "Could NOT find Python2 \\(missing: foobar\\)")
 
-  add_test(NAME FindPython.Python3 COMMAND
+  add_test(NAME FindPython.Python3.LOCATION COMMAND
     ${CMAKE_CTEST_COMMAND} -C $<CONFIGURATION>
     --build-and-test
     "${CMake_SOURCE_DIR}/Tests/FindPython/Python3"
-    "${CMake_BINARY_DIR}/Tests/FindPython/Python3"
+    "${CMake_BINARY_DIR}/Tests/FindPython/Python3.LOCATION"
     ${build_generator_args}
     --build-project TestPython3
-    --build-options ${build_options}
+    --build-options ${build_options} -DPython3_FIND_STRATEGY=LOCATION
+    --test-command ${CMAKE_CTEST_COMMAND} -V -C $<CONFIGURATION>
+    )
+  add_test(NAME FindPython.Python3.VERSION COMMAND
+    ${CMAKE_CTEST_COMMAND} -C $<CONFIGURATION>
+    --build-and-test
+    "${CMake_SOURCE_DIR}/Tests/FindPython/Python3"
+    "${CMake_BINARY_DIR}/Tests/FindPython/Python3.VERSION"
+    ${build_generator_args}
+    --build-project TestPython3
+    --build-options ${build_options} -DPython3_FIND_STRATEGY=VERSION
     --test-command ${CMAKE_CTEST_COMMAND} -V -C $<CONFIGURATION>
     )
 

https://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=26ea022c3bf081d9e1f7266e5ae52719cb59301b
commit 26ea022c3bf081d9e1f7266e5ae52719cb59301b
Author:     Ruslan Baratov <ruslan_bara...@yahoo.com>
AuthorDate: Tue May 21 14:26:23 2019 +0300
Commit:     Ruslan Baratov <ruslan_bara...@yahoo.com>
CommitDate: Tue May 21 14:26:23 2019 +0300

    Add variable CMAKE_FRAMEWORK

diff --git a/Help/manual/cmake-variables.7.rst 
b/Help/manual/cmake-variables.7.rst
index fd5e28f..1117488 100644
--- a/Help/manual/cmake-variables.7.rst
+++ b/Help/manual/cmake-variables.7.rst
@@ -350,6 +350,7 @@ Variables that Control the Build
    /variable/CMAKE_EXE_LINKER_FLAGS_CONFIG_INIT
    /variable/CMAKE_EXE_LINKER_FLAGS_INIT
    /variable/CMAKE_FOLDER
+   /variable/CMAKE_FRAMEWORK
    /variable/CMAKE_Fortran_FORMAT
    /variable/CMAKE_Fortran_MODULE_DIRECTORY
    /variable/CMAKE_GHS_NO_SOURCE_GROUP_FILE
diff --git a/Help/release/dev/CMAKE_FRAMEWORK.rst 
b/Help/release/dev/CMAKE_FRAMEWORK.rst
new file mode 100644
index 0000000..0253e04
--- /dev/null
+++ b/Help/release/dev/CMAKE_FRAMEWORK.rst
@@ -0,0 +1,6 @@
+CMAKE_FRAMEWORK
+---------------
+
+* A :variable:`CMAKE_FRAMEWORK` variable was added to
+  initialize the :prop_tgt:`FRAMEWORK` property on all
+  targets.
diff --git a/Help/variable/CMAKE_FRAMEWORK.rst 
b/Help/variable/CMAKE_FRAMEWORK.rst
new file mode 100644
index 0000000..591041c
--- /dev/null
+++ b/Help/variable/CMAKE_FRAMEWORK.rst
@@ -0,0 +1,7 @@
+CMAKE_FRAMEWORK
+---------------
+
+Default value for :prop_tgt:`FRAMEWORK` of targets.
+
+This variable is used to initialize the :prop_tgt:`FRAMEWORK` property on
+all the targets.  See that target property for additional information.
diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx
index 2de8950..8b41e28 100644
--- a/Source/cmTarget.cxx
+++ b/Source/cmTarget.cxx
@@ -284,6 +284,7 @@ cmTarget::cmTarget(std::string const& name, 
cmStateEnums::TargetType type,
     InitProperty("RUNTIME_OUTPUT_DIRECTORY", nullptr);
     InitProperty("PDB_OUTPUT_DIRECTORY", nullptr);
     InitProperty("COMPILE_PDB_OUTPUT_DIRECTORY", nullptr);
+    InitProperty("FRAMEWORK", nullptr);
     InitProperty("Fortran_FORMAT", nullptr);
     InitProperty("Fortran_MODULE_DIRECTORY", nullptr);
     InitProperty("Fortran_COMPILER_LAUNCHER", nullptr);
diff --git a/Tests/RunCMake/Framework/FrameworkLayout.cmake 
b/Tests/RunCMake/Framework/FrameworkLayout.cmake
index 4f42459..84012aa 100644
--- a/Tests/RunCMake/Framework/FrameworkLayout.cmake
+++ b/Tests/RunCMake/Framework/FrameworkLayout.cmake
@@ -11,8 +11,11 @@ add_library(Framework ${FRAMEWORK_TYPE}
             flatresource.txt
             deepresource.txt
             some.txt)
+if("${CMAKE_FRAMEWORK}" STREQUAL "")
+  set_target_properties(Framework PROPERTIES
+                        FRAMEWORK TRUE)
+endif()
 set_target_properties(Framework PROPERTIES
-                      FRAMEWORK TRUE
                       PUBLIC_HEADER foo.h
                       RESOURCE "res.txt")
 set_source_files_properties(flatresource.txt PROPERTIES 
MACOSX_PACKAGE_LOCATION Resources)
diff --git a/Tests/RunCMake/Framework/RunCMakeTest.cmake 
b/Tests/RunCMake/Framework/RunCMakeTest.cmake
index e705a31..c7e1319 100644
--- a/Tests/RunCMake/Framework/RunCMakeTest.cmake
+++ b/Tests/RunCMake/Framework/RunCMakeTest.cmake
@@ -20,11 +20,14 @@ framework_layout_test(iOSFrameworkLayout-build ios STATIC)
 framework_layout_test(OSXFrameworkLayout-build osx SHARED)
 framework_layout_test(OSXFrameworkLayout-build osx STATIC)
 
-function(framework_type_test Toolchain Type)
+function(framework_type_test Toolchain Type UseProperty)
   set(RunCMake_TEST_BINARY_DIR 
${RunCMake_BINARY_DIR}/${Toolchain}${Type}FrameworkType-build)
   set(RunCMake_TEST_NO_CLEAN 1)
   set(RunCMake_TEST_OPTIONS 
"-DCMAKE_TOOLCHAIN_FILE=${RunCMake_SOURCE_DIR}/${Toolchain}.cmake")
   list(APPEND RunCMake_TEST_OPTIONS "-DFRAMEWORK_TYPE=${Type}")
+  if(NOT ${UseProperty})
+    list(APPEND RunCMake_TEST_OPTIONS "-DCMAKE_FRAMEWORK=YES")
+  endif()
 
   file(REMOVE_RECURSE "${RunCMake_TEST_BINARY_DIR}")
   file(MAKE_DIRECTORY "${RunCMake_TEST_BINARY_DIR}")
@@ -33,7 +36,12 @@ function(framework_type_test Toolchain Type)
   run_cmake_command(FrameworkType${Type}-build ${CMAKE_COMMAND} --build .)
 endfunction()
 
-framework_type_test(ios SHARED)
-framework_type_test(ios STATIC)
-framework_type_test(osx SHARED)
-framework_type_test(osx STATIC)
+framework_type_test(ios SHARED NO)
+framework_type_test(ios STATIC NO)
+framework_type_test(osx SHARED NO)
+framework_type_test(osx STATIC NO)
+
+framework_type_test(ios SHARED YES)
+framework_type_test(ios STATIC YES)
+framework_type_test(osx SHARED YES)
+framework_type_test(osx STATIC YES)

-----------------------------------------------------------------------

Summary of changes:
 Help/manual/cmake-policies.7.rst               |    1 +
 Help/manual/cmake-variables.7.rst              |    1 +
 Help/policy/CMP0094.rst                        |   22 +
 Help/release/dev/CMAKE_FRAMEWORK.rst           |    6 +
 Help/release/dev/FindPython-CMP0094.rst        |    5 +
 Help/release/dev/FindPython-FIND_STRATEGY.rst  |    5 +
 Help/variable/CMAKE_FRAMEWORK.rst              |    7 +
 Modules/CMakeSwiftInformation.cmake            |   20 +-
 Modules/FindPython.cmake                       |   13 +
 Modules/FindPython/Support.cmake               | 1137 ++++++++++++++++--------
 Modules/FindPython2.cmake                      |   13 +
 Modules/FindPython3.cmake                      |   13 +
 Source/CMakeLists.txt                          |    2 +
 Source/CPack/cmCPackGenerator.cxx              |    3 +-
 Source/cmFileCommand.cxx                       |   19 +-
 Source/cmFileCopier.cxx                        |   24 +-
 Source/cmFileTimes.cxx                         |  127 +++
 Source/cmFileTimes.h                           |   40 +
 Source/cmMakefileTargetGenerator.cxx           |    8 +-
 Source/cmNinjaNormalTargetGenerator.cxx        |   11 +
 Source/cmNinjaTargetGenerator.cxx              |    9 +-
 Source/cmPolicies.h                            |    4 +
 Source/cmSystemTools.cxx                       |  122 ---
 Source/cmSystemTools.h                         |   14 -
 Source/cmTarget.cxx                            |    1 +
 Tests/FindPython/CMakeLists.txt                |   32 +-
 Tests/RunCMake/Framework/FrameworkLayout.cmake |    5 +-
 Tests/RunCMake/Framework/RunCMakeTest.cmake    |   18 +-
 bootstrap                                      |    1 +
 29 files changed, 1133 insertions(+), 550 deletions(-)
 create mode 100644 Help/policy/CMP0094.rst
 create mode 100644 Help/release/dev/CMAKE_FRAMEWORK.rst
 create mode 100644 Help/release/dev/FindPython-CMP0094.rst
 create mode 100644 Help/release/dev/FindPython-FIND_STRATEGY.rst
 create mode 100644 Help/variable/CMAKE_FRAMEWORK.rst
 create mode 100644 Source/cmFileTimes.cxx
 create mode 100644 Source/cmFileTimes.h


hooks/post-receive
-- 
CMake
_______________________________________________
Cmake-commits mailing list
Cmake-commits@cmake.org
https://cmake.org/mailman/listinfo/cmake-commits

Reply via email to