[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