[Lldb-commits] [lldb] r249466 - Teach CMake to find versions of Python != 2.7
Zachary Turner via lldb-commits
lldb-commits at lists.llvm.org
Tue Oct 6 14:11:15 PDT 2015
Author: zturner
Date: Tue Oct 6 16:11:15 2015
New Revision: 249466
URL: http://llvm.org/viewvc/llvm-project?rev=249466&view=rev
Log:
Teach CMake to find versions of Python != 2.7
Modified:
lldb/trunk/cmake/modules/LLDBConfig.cmake
lldb/trunk/cmake/modules/LLDBStandalone.cmake
Modified: lldb/trunk/cmake/modules/LLDBConfig.cmake
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/cmake/modules/LLDBConfig.cmake?rev=249466&r1=249465&r2=249466&view=diff
==============================================================================
--- lldb/trunk/cmake/modules/LLDBConfig.cmake (original)
+++ lldb/trunk/cmake/modules/LLDBConfig.cmake Tue Oct 6 16:11:15 2015
@@ -37,6 +37,88 @@ if (LLDB_DISABLE_CURSES)
add_definitions( -DLLDB_DISABLE_CURSES )
endif()
+# On Windows, we can't use the normal FindPythonLibs module that comes with CMake,
+# for a number of reasons.
+# 1) Prior to MSVC 2015, it is only possible to embed Python if python itself was
+# compiled with an identical version (and build configuration) of MSVC as LLDB.
+# The standard algorithm does not take into account the differences between
+# a binary release distribution of python and a custom built distribution.
+# 2) From MSVC 2015 and onwards, it is only possible to use Python 3.5 or later.
+# 3) FindPythonLibs queries the registry to locate Python, and when looking for a
+# 64-bit version of Python, since cmake.exe is a 32-bit executable, it will see
+# a 32-bit view of the registry. As such, it is impossible for FindPythonLibs to
+# locate 64-bit Python libraries.
+# This function is designed to address those limitations. Currently it only partially
+# addresses them, but it can be improved and extended on an as-needed basis.
+function(find_python_libs_windows)
+ if ("${PYTHON_HOME}" STREQUAL "")
+ message("LLDB embedded Python on Windows requires specifying a value for PYTHON_HOME. Python support disabled.")
+ set(LLDB_DISABLE_PYTHON 1 PARENT_SCOPE)
+ return()
+ endif()
+
+ file(TO_CMAKE_PATH "${PYTHON_HOME}/Include" PYTHON_INCLUDE_DIRS)
+
+ if(EXISTS "${PYTHON_INCLUDE_DIRS}/patchlevel.h")
+ file(STRINGS "${PYTHON_INCLUDE_DIRS}/patchlevel.h" python_version_str
+ REGEX "^#define[ \t]+PY_VERSION[ \t]+\"[^\"]+\"")
+ string(REGEX REPLACE "^#define[ \t]+PY_VERSION[ \t]+\"([^\"]+)\".*" "\\1"
+ PYTHONLIBS_VERSION_STRING "${python_version_str}")
+ message("-- Found Python version ${PYTHONLIBS_VERSION_STRING}")
+ string(REGEX REPLACE "([0-9]+)[.]([0-9]+)[.][0-9]+" "python\\1\\2" PYTHONLIBS_BASE_NAME "${PYTHONLIBS_VERSION_STRING}")
+ unset(python_version_str)
+ else()
+ message("Unable to find ${PYTHON_INCLUDE_DIRS}/patchlevel.h, Python installation is corrupt.")
+ message("Python support will be disabled for this build.")
+ set(LLDB_DISABLE_PYTHON 1 PARENT_SCOPE)
+ return()
+ endif()
+
+ file(TO_CMAKE_PATH "${PYTHON_HOME}" PYTHON_HOME)
+ file(TO_CMAKE_PATH "${PYTHON_HOME}/python_d.exe" PYTHON_DEBUG_EXE)
+ file(TO_CMAKE_PATH "${PYTHON_HOME}/libs/${PYTHONLIBS_BASE_NAME}_d.lib" PYTHON_DEBUG_LIB)
+ file(TO_CMAKE_PATH "${PYTHON_HOME}/${PYTHONLIBS_BASE_NAME}_d.dll" PYTHON_DEBUG_DLL)
+
+ file(TO_CMAKE_PATH "${PYTHON_HOME}/python.exe" PYTHON_RELEASE_EXE)
+ file(TO_CMAKE_PATH "${PYTHON_HOME}/libs/${PYTHONLIBS_BASE_NAME}.lib" PYTHON_RELEASE_LIB)
+ file(TO_CMAKE_PATH "${PYTHON_HOME}/${PYTHONLIBS_BASE_NAME}.dll" PYTHON_RELEASE_DLL)
+
+ # Generator expressions are evaluated in the context of each build configuration generated
+ # by CMake. Here we use the $<CONFIG:Debug>:VALUE logical generator expression to ensure
+ # that the debug Python library, DLL, and executable are used in the Debug build configuration.
+ #
+ # Generator expressions can be difficult to grok at first so here's a breakdown of the one
+ # used for PYTHON_LIBRARY:
+ #
+ # 1. $<CONFIG:Debug> evaluates to 1 when the Debug configuration is being generated,
+ # or 0 in all other cases.
+ # 2. $<$<CONFIG:Debug>:${PYTHON_DEBUG_LIB}> expands to ${PYTHON_DEBUG_LIB} when the Debug
+ # configuration is being generated, or nothing (literally) in all other cases.
+ # 3. $<$<NOT:$<CONFIG:Debug>>:${PYTHON_RELEASE_LIB}> expands to ${PYTHON_RELEASE_LIB} when
+ # any configuration other than Debug is being generated, or nothing in all other cases.
+ # 4. The conditionals in 2 & 3 are mutually exclusive.
+ # 5. A logical expression with a conditional that evaluates to 0 yields no value at all.
+ #
+ # Due to 4 & 5 it's possible to concatenate 2 & 3 to obtain a single value specific to each
+ # build configuration. In this example the value will be ${PYTHON_DEBUG_LIB} when generating the
+ # Debug configuration, or ${PYTHON_RELEASE_LIB} when generating any other configuration.
+ # Note that it's imperative that there is no whitespace between the two expressions, otherwise
+ # CMake will insert a semicolon between the two.
+ set (PYTHON_EXECUTABLE $<$<CONFIG:Debug>:${PYTHON_DEBUG_EXE}>$<$<NOT:$<CONFIG:Debug>>:${PYTHON_RELEASE_EXE}>)
+ set (PYTHON_LIBRARY $<$<CONFIG:Debug>:${PYTHON_DEBUG_LIB}>$<$<NOT:$<CONFIG:Debug>>:${PYTHON_RELEASE_LIB}>)
+ set (PYTHON_DLL $<$<CONFIG:Debug>:${PYTHON_DEBUG_DLL}>$<$<NOT:$<CONFIG:Debug>>:${PYTHON_RELEASE_DLL}>)
+
+ set (PYTHON_EXECUTABLE ${PYTHON_EXECUTABLE} PARENT_SCOPE)
+ set (PYTHON_LIBRARY ${PYTHON_LIBRARY} PARENT_SCOPE)
+ set (PYTHON_DLL ${PYTHON_DLL} PARENT_SCOPE)
+ set (PYTHON_INCLUDE_DIRS ${PYTHON_INCLUDE_DIRS} PARENT_SCOPE)
+
+ message("-- LLDB Found PythonExecutable: ${PYTHON_EXECUTABLE}")
+ message("-- LLDB Found PythonLibs: ${PYTHON_LIBRARY}")
+ message("-- LLDB Found PythonDLL: ${PYTHON_DLL}")
+ message("-- LLDB Found PythonIncludeDirs: ${PYTHON_INCLUDE_DIRS}")
+endfunction(find_python_libs_windows)
+
if (NOT LLDB_DISABLE_PYTHON)
if(UNIX)
# This is necessary for crosscompile on Ubuntu 14.04 64bit. Need a proper fix.
@@ -46,69 +128,22 @@ if (NOT LLDB_DISABLE_PYTHON)
endif()
if ("${CMAKE_SYSTEM_NAME}" STREQUAL "Windows")
- if (NOT "${PYTHON_HOME}" STREQUAL "")
- file(TO_CMAKE_PATH "${PYTHON_HOME}" PYTHON_HOME)
- file(TO_CMAKE_PATH "${PYTHON_HOME}/python_d.exe" PYTHON_DEBUG_EXE)
- file(TO_CMAKE_PATH "${PYTHON_HOME}/libs/python27_d.lib" PYTHON_DEBUG_LIB)
- file(TO_CMAKE_PATH "${PYTHON_HOME}/python27_d.dll" PYTHON_DEBUG_DLL)
-
- file(TO_CMAKE_PATH "${PYTHON_HOME}/python.exe" PYTHON_RELEASE_EXE)
- file(TO_CMAKE_PATH "${PYTHON_HOME}/libs/python27.lib" PYTHON_RELEASE_LIB)
- file(TO_CMAKE_PATH "${PYTHON_HOME}/python27.dll" PYTHON_RELEASE_DLL)
-
- # Generator expressions are evaluated in the context of each build configuration generated
- # by CMake. Here we use the $<CONFIG:Debug>:VALUE logical generator expression to ensure
- # that the debug Python library, DLL, and executable are used in the Debug build configuration.
- #
- # Generator expressions can be difficult to grok at first so here's a breakdown of the one
- # used for PYTHON_LIBRARY:
- #
- # 1. $<CONFIG:Debug> evaluates to 1 when the Debug configuration is being generated,
- # or 0 in all other cases.
- # 2. $<$<CONFIG:Debug>:${PYTHON_DEBUG_LIB}> expands to ${PYTHON_DEBUG_LIB} when the Debug
- # configuration is being generated, or nothing (literally) in all other cases.
- # 3. $<$<NOT:$<CONFIG:Debug>>:${PYTHON_RELEASE_LIB}> expands to ${PYTHON_RELEASE_LIB} when
- # any configuration other than Debug is being generated, or nothing in all other cases.
- # 4. The conditionals in 2 & 3 are mutually exclusive.
- # 5. A logical expression with a conditional that evaluates to 0 yields no value at all.
- #
- # Due to 4 & 5 it's possible to concatenate 2 & 3 to obtain a single value specific to each
- # build configuration. In this example the value will be ${PYTHON_DEBUG_LIB} when generating the
- # Debug configuration, or ${PYTHON_RELEASE_LIB} when generating any other configuration.
- # Note that it's imperative that there is no whitespace between the two expressions, otherwise
- # CMake will insert a semicolon between the two.
-
- set (PYTHON_EXECUTABLE $<$<CONFIG:Debug>:${PYTHON_DEBUG_EXE}>$<$<NOT:$<CONFIG:Debug>>:${PYTHON_RELEASE_EXE}>)
- set (PYTHON_LIBRARY $<$<CONFIG:Debug>:${PYTHON_DEBUG_LIB}>$<$<NOT:$<CONFIG:Debug>>:${PYTHON_RELEASE_LIB}>)
- set (PYTHON_DLL $<$<CONFIG:Debug>:${PYTHON_DEBUG_DLL}>$<$<NOT:$<CONFIG:Debug>>:${PYTHON_RELEASE_DLL}>)
-
- file(TO_CMAKE_PATH "${PYTHON_HOME}/Include" PYTHON_INCLUDE_DIR)
- if (NOT LLDB_RELOCATABLE_PYTHON)
- add_definitions( -DLLDB_PYTHON_HOME="${PYTHON_HOME}" )
- endif()
- else()
- message("Embedding Python on Windows without specifying a value for PYTHON_HOME is deprecated. Support for this will be dropped soon.")
-
- if ("${PYTHON_INCLUDE_DIR}" STREQUAL "" OR "${PYTHON_LIBRARY}" STREQUAL "")
- message("-- LLDB Embedded python disabled. Embedding python on Windows requires "
- "manually specifying PYTHON_INCLUDE_DIR *and* PYTHON_LIBRARY")
- set(LLDB_DISABLE_PYTHON 1)
- endif()
- endif()
+ find_python_libs_windows()
- if (PYTHON_LIBRARY)
- message("-- Found PythonLibs: ${PYTHON_LIBRARY}")
- include_directories(${PYTHON_INCLUDE_DIR})
+ if (NOT LLDB_RELOCATABLE_PYTHON)
+ add_definitions( -DLLDB_PYTHON_HOME="${PYTHON_HOME}" )
endif()
-
else()
find_package(PythonLibs REQUIRED)
+ endif()
+
+ if (PYTHON_INCLUDE_DIRS)
include_directories(${PYTHON_INCLUDE_DIRS})
endif()
endif()
if (LLDB_DISABLE_PYTHON)
- unset(PYTHON_INCLUDE_DIR)
+ unset(PYTHON_INCLUDE_DIRS)
unset(PYTHON_LIBRARY)
add_definitions( -DLLDB_DISABLE_PYTHON )
endif()
Modified: lldb/trunk/cmake/modules/LLDBStandalone.cmake
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/cmake/modules/LLDBStandalone.cmake?rev=249466&r1=249465&r2=249466&view=diff
==============================================================================
--- lldb/trunk/cmake/modules/LLDBStandalone.cmake (original)
+++ lldb/trunk/cmake/modules/LLDBStandalone.cmake Tue Oct 6 16:11:15 2015
@@ -48,9 +48,8 @@ if (CMAKE_SOURCE_DIR STREQUAL CMAKE_CURR
include(AddLLVM)
include(HandleLLVMOptions)
- # Verify that we can find a Python 2 interpreter. Python 3 is unsupported.
if (PYTHON_EXECUTABLE STREQUAL "")
- set(Python_ADDITIONAL_VERSIONS 2.7 2.6 2.5)
+ set(Python_ADDITIONAL_VERSIONS 3.5 3.4 3.3 3.2 3.1 3.0 2.7 2.6 2.5)
include(FindPythonInterp)
if( NOT PYTHONINTERP_FOUND )
message(FATAL_ERROR
More information about the lldb-commits
mailing list