[CMake] CMakeFindFrameworks.cmake and FindPythonLibs.cmake broken on Mac OS X

Michael Wild themiwi at gmail.com
Fri Nov 6 04:14:34 EST 2009


Hi all

while trying to compile some program which links agains the Python  
libraries on my Mac OS X 10.6 box for 10.5, I noticed that there's  
something wrong with both CMakeFindFrameworks.cmake and  
FindPythonLibs.cmake.

CMakeFindFrameworks.cmake does not search the SDK root in  
CMAKE_OS_SYSROOT, it should be patched as follows:

--- Modules/CMakeFindFrameworks.cmake.orig	2009-10-26  
12:58:16.000000000 +0100
+++ Modules/CMakeFindFrameworks.cmake	2009-10-26 12:58:24.000000000  
+0100
@@ -21,6 +21,8 @@
        FOREACH(dir
            ~/Library/Frameworks/${fwk}.framework
            /Library/Frameworks/${fwk}.framework
+          ${CMAKE_OSX_SYSROOT}/Library/Frameworks/${fwk}.framework
+          ${CMAKE_OSX_SYSROOT}/System/Library/Frameworks/$ 
{fwk}.framework
            /System/Library/Frameworks/${fwk}.framework
            /Network/Library/Frameworks/${fwk}.framework)
          IF(EXISTS ${dir})



FindPythonLibs.cmake is trickier. The problem is, that it does the  
following (in pseudo-code)

foreach version in [2.6 2.5 2.4 2.3 2.2 2.1 2.0 1.6 1.5]
   foreach dir in ${framework_dirs}
     include_dir = "${dir}/Versions/${version}/Headers"
     if exists(include_dir)
       break
     endif
   endforeach
endforeach

Now, what happens is the following:
- CMakeFindFrameworks.cmake finds
   * /Developer/SDKs/MacOSX10.5.sdk/System/Library/Frameworks/ 
Python.framework
   * /System/Library/Frameworks/Python.framework
- For each of those frameworks, FindPythonLibs.cmake cycles through  
the various Python version numbers and checks whether the sub- 
directory Versions/${version}/Headers exists. If such a directory  
exists in any of the found Python frameworks, the search is stopped.

Unfortunately, Python-2.6 is present on OS X 10.6, but NOT in the 10.5  
SDK. Since the search starts with version 2.6, it will find it in / 
System/Library/Frameworks, and not in the SDK which only contains the  
2.5 version as the newest Python library. This then results in an  
include path which is not consistent with the framework version that  
will be linked.

So, I think the search loops should be turned inside-out (in pseudo- 
code):

foreach dir in ${framework_dirs}
   foreach version in [2.6 2.5 2.4 2.3 2.2 2.1 2.0 1.6 1.5]
     include_dir = "${dir}/Versions/${version}/Headers"
     if exists(include_dir)
       break
     endif
   endforeach
endforeach

IMHO this can't be done with the current structure of the find-module  
and probably needs to be split into two sections conditional on APPLE.

Do you agree with this assessment?

Michael




More information about the CMake mailing list