From bb6f394ecec387b2c322706bddeb25c20497c198 Mon Sep 17 00:00:00 2001
From: David Gobbi <david.gobbi@gmail.com>
Date: Mon, 14 Sep 2015 22:48:49 -0600
Subject: [PATCH 3/3] Match python include dir to library version.

The first change in this commit is that FindPythonLibs doesn't look
for the include directory until it has found the library, and then
it looks for the include dir that matches the library.

The second change is the way that framework libs and includes are
found on OS X.  Previously, the version info wasn't used correctly
when searching for either the framework libs or the framework includes.

Note that the code doesn't yet try to match the suffixes "m" and "u"
between the executable, library, and include directory.
---
 Modules/FindPythonLibs.cmake | 59 ++++++++++++++++++++++++++++++--------------
 1 file changed, 40 insertions(+), 19 deletions(-)

diff --git a/Modules/FindPythonLibs.cmake b/Modules/FindPythonLibs.cmake
index da45c46..b82d01a 100644
--- a/Modules/FindPythonLibs.cmake
+++ b/Modules/FindPythonLibs.cmake
@@ -100,6 +100,12 @@ unset(_PYTHON3_VERSIONS)
 
 foreach(_CURRENT_VERSION ${_Python_VERSIONS})
   string(REPLACE "." "" _CURRENT_VERSION_NO_DOTS ${_CURRENT_VERSION})
+
+  set(_FRAMEWORK_LIB_DIRS)
+  foreach(dir ${Python_FRAMEWORKS})
+    list(APPEND _FRAMEWORK_LIB_DIRS ${dir}/Versions/${_CURRENT_VERSION}/lib)
+  endforeach()
+
   if(WIN32)
     find_library(PYTHON_DEBUG_LIBRARY
       NAMES python${_CURRENT_VERSION_NO_DOTS}_d python
@@ -119,11 +125,13 @@ foreach(_CURRENT_VERSION ${_Python_VERSIONS})
     python${_CURRENT_VERSION}u
     python${_CURRENT_VERSION}
     PATHS
+      ${_FRAMEWORK_LIB_DIRS}
       [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\${_CURRENT_VERSION}\\InstallPath]/libs
       [HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\${_CURRENT_VERSION}\\InstallPath]/libs
     # Avoid finding the .dll in the PATH.  We want the .lib.
     NO_SYSTEM_ENVIRONMENT_PATH
   )
+
   # Look for the static library in the Python config directory
   find_library(PYTHON_LIBRARY
     NAMES python${_CURRENT_VERSION_NO_DOTS} python${_CURRENT_VERSION}
@@ -133,26 +141,39 @@ foreach(_CURRENT_VERSION ${_Python_VERSIONS})
     PATH_SUFFIXES python${_CURRENT_VERSION}/config
   )
 
-  set(PYTHON_FRAMEWORK_INCLUDES)
-  if(Python_FRAMEWORKS AND NOT PYTHON_INCLUDE_DIR)
-    foreach(dir ${Python_FRAMEWORKS})
-      set(PYTHON_FRAMEWORK_INCLUDES ${PYTHON_FRAMEWORK_INCLUDES}
-        ${dir}/Versions/${_CURRENT_VERSION}/include/python${_CURRENT_VERSION})
-    endforeach()
-  endif()
+  # Only look for include directory if library was found, this ensures
+  # that version will be matched between include dir and library
+  if(PYTHON_LIBRARY)
+    set(PYTHON_FRAMEWORK_INCLUDES)
+    if(Python_FRAMEWORKS AND NOT PYTHON_INCLUDE_DIR)
+      set(PYTHON_INCLUDE_DIR)
+      foreach(dir ${Python_FRAMEWORKS})
+        set(PYTHON_FRAMEWORK_INCLUDES ${PYTHON_FRAMEWORK_INCLUDES}
+          ${dir}/Versions/${_CURRENT_VERSION}/include)
+      endforeach()
+    endif()
 
-  find_path(PYTHON_INCLUDE_DIR
-    NAMES Python.h
-    PATHS
-      ${PYTHON_FRAMEWORK_INCLUDES}
-      [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\${_CURRENT_VERSION}\\InstallPath]/include
-      [HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\${_CURRENT_VERSION}\\InstallPath]/include
-    PATH_SUFFIXES
-      python${_CURRENT_VERSION}mu
-      python${_CURRENT_VERSION}m
-      python${_CURRENT_VERSION}u
-      python${_CURRENT_VERSION}
-  )
+    find_path(PYTHON_INCLUDE_DIR
+      NAMES Python.h
+      PATHS
+        ${PYTHON_FRAMEWORK_INCLUDES}
+        [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\${_CURRENT_VERSION}\\InstallPath]/include
+        [HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\${_CURRENT_VERSION}\\InstallPath]/include
+      PATH_SUFFIXES
+        python${_CURRENT_VERSION}mu
+        python${_CURRENT_VERSION}m
+        python${_CURRENT_VERSION}u
+        python${_CURRENT_VERSION}
+      NO_DEFAULT_PATH
+    )
+
+    # Broaden to default paths as a second step (mainly for UNIX)
+    find_path(PYTHON_INCLUDE_DIR
+      NAMES Python.h
+      PATH_SUFFIXES
+        python${_CURRENT_VERSION}
+    )
+  endif()
 
   # For backward compatibility, set PYTHON_INCLUDE_PATH.
   set(PYTHON_INCLUDE_PATH "${PYTHON_INCLUDE_DIR}")
-- 
1.9.5 (Apple Git-50.3)

