[Lldb-commits] [lldb] 2046d72 - build: improve python checks for Windows

Hans Wennborg via lldb-commits lldb-commits at lists.llvm.org
Tue Jan 28 06:13:29 PST 2020


Should https://llvm.org/docs/GettingStarted.html#requirements and
https://llvm.org/docs/CMake.html#quick-start be updated to reflect the
new requirement? And maybe a release note?

On Sun, Dec 22, 2019 at 2:01 PM Saleem Abdulrasool via lldb-commits
<lldb-commits at lists.llvm.org> wrote:
>
>
> Author: Saleem Abdulrasool
> Date: 2019-12-22T13:57:46-08:00
> New Revision: 2046d72e91670114625c87e122db6e013ba089d5
>
> URL: https://github.com/llvm/llvm-project/commit/2046d72e91670114625c87e122db6e013ba089d5
> DIFF: https://github.com/llvm/llvm-project/commit/2046d72e91670114625c87e122db6e013ba089d5.diff
>
> LOG: build: improve python checks for Windows
>
> Require a newer CMake on Windows to use the Python3 support that is
> packaged in CMake. This version is able to check both 32-bit and 64-bit
> versions and will setup everything properly without the user needing to
> specify PYTHON_HOME. This enables building lldb's python bindings on
> Windows under Azure's CI again.
>
> Added:
>
>
> Modified:
>     lldb/CMakeLists.txt
>     lldb/cmake/modules/LLDBConfig.cmake
>
> Removed:
>
>
>
> ################################################################################
> diff  --git a/lldb/CMakeLists.txt b/lldb/CMakeLists.txt
> index ff3d8ae70747..6170ab625c54 100644
> --- a/lldb/CMakeLists.txt
> +++ b/lldb/CMakeLists.txt
> @@ -1,4 +1,7 @@
>  cmake_minimum_required(VERSION 3.4.3)
> +if(CMAKE_SYSTEM_NAME STREQUAL Windows)
> +  cmake_minimum_required(VERSION 3.13)
> +endif()
>
>  if(POLICY CMP0075)
>    cmake_policy(SET CMP0075 NEW)
>
> diff  --git a/lldb/cmake/modules/LLDBConfig.cmake b/lldb/cmake/modules/LLDBConfig.cmake
> index c34ef76cb652..e1da76cf6249 100644
> --- a/lldb/cmake/modules/LLDBConfig.cmake
> +++ b/lldb/cmake/modules/LLDBConfig.cmake
> @@ -138,184 +138,39 @@ if (LLDB_ENABLE_LIBEDIT)
>    set(CMAKE_EXTRA_INCLUDE_FILES)
>  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
> diff erences 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_helper LOOKUP_DEBUG OUT_EXE_PATH_VARNAME OUT_LIB_PATH_VARNAME OUT_DLL_PATH_VARNAME OUT_VERSION_VARNAME)
> -  if(LOOKUP_DEBUG)
> -      set(POSTFIX "_d")
> -  else()
> -      set(POSTFIX "")
> -  endif()
> -
> -  file(TO_CMAKE_PATH "${PYTHON_HOME}/python${POSTFIX}.exe"                       PYTHON_EXE)
> -  file(TO_CMAKE_PATH "${PYTHON_HOME}/libs/${PYTHONLIBS_BASE_NAME}${POSTFIX}.lib" PYTHON_LIB)
> -  file(TO_CMAKE_PATH "${PYTHON_HOME}/${PYTHONLIBS_BASE_NAME}${POSTFIX}.dll"      PYTHON_DLL)
> -
> -  foreach(component PYTHON_EXE;PYTHON_LIB;PYTHON_DLL)
> -    if(NOT EXISTS ${${component}})
> -      message(WARNING "Unable to find ${component}")
> -      unset(${component})
> -    endif()
> -  endforeach()
> -
> -  if (NOT PYTHON_EXE OR NOT PYTHON_LIB OR NOT PYTHON_DLL)
> -    message(WARNING "Unable to find all Python components.  Python support will be disabled for this build.")
> -    set(LLDB_ENABLE_PYTHON 0 PARENT_SCOPE)
> -    return()
> -  endif()
> -
> -  # Find the version of the Python interpreter.
> -  execute_process(COMMAND "${PYTHON_EXE}" -c
> -                  "import sys; sys.stdout.write('.'.join([str(x) for x in sys.version_info[:3]]))"
> -                  OUTPUT_VARIABLE PYTHON_VERSION_OUTPUT
> -                  RESULT_VARIABLE PYTHON_VERSION_RESULT
> -                  ERROR_QUIET)
> -
> -  if(PYTHON_VERSION_RESULT)
> -    message(WARNING "Unable to retrieve Python executable version")
> -    set(PYTHON_VERSION_OUTPUT "")
> -  endif()
> -
> -  set(${OUT_EXE_PATH_VARNAME} ${PYTHON_EXE} PARENT_SCOPE)
> -  set(${OUT_LIB_PATH_VARNAME} ${PYTHON_LIB} PARENT_SCOPE)
> -  set(${OUT_DLL_PATH_VARNAME} ${PYTHON_DLL} PARENT_SCOPE)
> -  set(${OUT_VERSION_VARNAME}  ${PYTHON_VERSION_OUTPUT} PARENT_SCOPE)
> -endfunction()
> -
> -function(find_python_libs_windows)
> -  if ("${PYTHON_HOME}" STREQUAL "")
> -    message(WARNING "LLDB embedded Python on Windows requires specifying a value for PYTHON_HOME.  Python support disabled.")
> -    set(LLDB_ENABLE_PYTHON 0 PARENT_SCOPE)
> -    return()
> -  endif()
> -
> -  file(TO_CMAKE_PATH "${PYTHON_HOME}/Include" PYTHON_INCLUDE_DIR)
> -
> -  if(EXISTS "${PYTHON_INCLUDE_DIR}/patchlevel.h")
> -    file(STRINGS "${PYTHON_INCLUDE_DIR}/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(STATUS "Found Python library 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(WARNING "Unable to find ${PYTHON_INCLUDE_DIR}/patchlevel.h, Python installation is corrupt.")
> -    message(WARNING "Python support will be disabled for this build.")
> -    set(LLDB_ENABLE_PYTHON 0 PARENT_SCOPE)
> -    return()
> -  endif()
> -
> -  file(TO_CMAKE_PATH "${PYTHON_HOME}" PYTHON_HOME)
> -  # TODO(compnerd) when CMake Policy `CMP0091` is set to NEW, we should use
> -  # if(CMAKE_MSVC_RUNTIME_LIBRARY MATCHES MultiThreadedDebug)
> -  if(NOT DEFINED CMAKE_BUILD_TYPE)
> -    # Multi-target generator was selected (like Visual Studio or Xcode) where no concrete build type was passed
> -    # Lookup for both debug and release python installations
> -    find_python_libs_windows_helper(TRUE  PYTHON_DEBUG_EXE   PYTHON_DEBUG_LIB   PYTHON_DEBUG_DLL   PYTHON_DEBUG_VERSION_STRING)
> -    find_python_libs_windows_helper(FALSE PYTHON_RELEASE_EXE PYTHON_RELEASE_LIB PYTHON_RELEASE_DLL PYTHON_RELEASE_VERSION_STRING)
> -    if(NOT LLDB_ENABLE_PYTHON)
> -      set(LLDB_ENABLE_PYTHON 0 PARENT_SCOPE)
> -      return()
> -    endif()
> -
> -    # We should have been found both debug and release python here
> -    # Now check that their versions are equal
> -    if(NOT PYTHON_DEBUG_VERSION_STRING STREQUAL PYTHON_RELEASE_VERSION_STRING)
> -      message(FATAL_ERROR "Python versions for debug (${PYTHON_DEBUG_VERSION_STRING}) and release (${PYTHON_RELEASE_VERSION_STRING}) are
> diff erent."
> -                          "Python installation is corrupted")
> -    endif ()
> -
> -    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_VERSION_STRING ${PYTHON_RELEASE_VERSION_STRING})
> -  else()
> -    # Lookup for concrete python installation depending on build type
> -    if (CMAKE_BUILD_TYPE STREQUAL Debug)
> -      set(LOOKUP_DEBUG_PYTHON TRUE)
> -    else()
> -      set(LOOKUP_DEBUG_PYTHON FALSE)
> -    endif()
> -    find_python_libs_windows_helper(${LOOKUP_DEBUG_PYTHON} PYTHON_EXECUTABLE PYTHON_LIBRARY PYTHON_DLL PYTHON_VERSION_STRING)
> -    if(NOT LLDB_ENABLE_PYTHON)
> -      set(LLDB_ENABLE_PYTHON 0 PARENT_SCOPE)
> -      return()
> -    endif()
> -  endif()
> -
> -  if(PYTHON_VERSION_STRING)
> -    string(REPLACE "." ";" PYTHON_VERSION_PARTS "${PYTHON_VERSION_STRING}")
> -    list(GET PYTHON_VERSION_PARTS 0 PYTHON_VERSION_MAJOR)
> -    list(GET PYTHON_VERSION_PARTS 1 PYTHON_VERSION_MINOR)
> -    list(GET PYTHON_VERSION_PARTS 2 PYTHON_VERSION_PATCH)
> -  else()
> -    unset(PYTHON_VERSION_MAJOR)
> -    unset(PYTHON_VERSION_MINOR)
> -    unset(PYTHON_VERSION_PATCH)
> -  endif()
> -
> -  # Set the same variables as FindPythonInterp and FindPythonLibs.
> -  set(PYTHON_EXECUTABLE         "${PYTHON_EXECUTABLE}"          CACHE PATH "")
> -  set(PYTHON_LIBRARY            "${PYTHON_LIBRARY}"             CACHE PATH "")
> -  set(PYTHON_DLL                "${PYTHON_DLL}"                 CACHE PATH "")
> -  set(PYTHON_INCLUDE_DIR        "${PYTHON_INCLUDE_DIR}"         CACHE PATH "")
> -  set(PYTHONLIBS_VERSION_STRING "${PYTHONLIBS_VERSION_STRING}"  PARENT_SCOPE)
> -  set(PYTHON_VERSION_STRING     "${PYTHON_VERSION_STRING}"      PARENT_SCOPE)
> -  set(PYTHON_VERSION_MAJOR      "${PYTHON_VERSION_MAJOR}"       PARENT_SCOPE)
> -  set(PYTHON_VERSION_MINOR      "${PYTHON_VERSION_MINOR}"       PARENT_SCOPE)
> -  set(PYTHON_VERSION_PATCH      "${PYTHON_VERSION_PATCH}"       PARENT_SCOPE)
> -
> -  message(STATUS "LLDB Found PythonExecutable: ${PYTHON_EXECUTABLE} (${PYTHON_VERSION_STRING})")
> -  message(STATUS "LLDB Found PythonLibs: ${PYTHON_LIBRARY} (${PYTHONLIBS_VERSION_STRING})")
> -  message(STATUS "LLDB Found PythonDLL: ${PYTHON_DLL}")
> -  message(STATUS "LLDB Found PythonIncludeDirs: ${PYTHON_INCLUDE_DIR}")
> -endfunction(find_python_libs_windows)
> -
> -# Call find_python_libs_windows ahead of the rest of the python configuration.
> -# It's possible that it won't find a python installation and will then set
> -# LLDB_ENABLE_PYTHON to OFF.
> -if (LLDB_ENABLE_PYTHON AND "${CMAKE_SYSTEM_NAME}" STREQUAL "Windows")
> -  find_python_libs_windows()
> -endif()
> -
>  if (LLDB_ENABLE_PYTHON)
>    if ("${CMAKE_SYSTEM_NAME}" STREQUAL "Windows")
> +    find_package(Python3 COMPONENTS Interpreter Development REQUIRED)
> +    if(Python3_VERSION VERSION_LESS 3.5)
> +      message(SEND_ERROR "Python 3.5 or newer is required (found: ${Python3_VERSION}")
> +    endif()
> +    set(PYTHON_LIBRARY ${Python3_LIBRARIES})
> +    include_directories(${Python3_INCLUDE_DIRS})
> +
>      if (NOT LLDB_RELOCATABLE_PYTHON)
>        file(TO_CMAKE_PATH "${PYTHON_HOME}" LLDB_PYTHON_HOME)
>      endif()
>    else()
>      find_package(PythonInterp REQUIRED)
>      find_package(PythonLibs REQUIRED)
> -  endif()
>
> -  if (NOT CMAKE_CROSSCOMPILING)
> -    string(REPLACE "." ";" pythonlibs_version_list ${PYTHONLIBS_VERSION_STRING})
> -    list(GET pythonlibs_version_list 0 pythonlibs_major)
> -    list(GET pythonlibs_version_list 1 pythonlibs_minor)
> -
> -    # Ignore the patch version. Some versions of macOS report a
> diff erent patch
> -    # version for the system provided interpreter and libraries.
> -    if (NOT PYTHON_VERSION_MAJOR VERSION_EQUAL pythonlibs_major OR
> -        NOT PYTHON_VERSION_MINOR VERSION_EQUAL pythonlibs_minor)
> -      message(FATAL_ERROR "Found incompatible Python interpreter (${PYTHON_VERSION_MAJOR}.${PYTHON_VERSION_MINOR})"
> -                          " and Python libraries (${pythonlibs_major}.${pythonlibs_minor})")
> +    if (NOT CMAKE_CROSSCOMPILING)
> +      string(REPLACE "." ";" pythonlibs_version_list ${PYTHONLIBS_VERSION_STRING})
> +      list(GET pythonlibs_version_list 0 pythonlibs_major)
> +      list(GET pythonlibs_version_list 1 pythonlibs_minor)
> +
> +      # Ignore the patch version. Some versions of macOS report a
> diff erent patch
> +      # version for the system provided interpreter and libraries.
> +      if (NOT PYTHON_VERSION_MAJOR VERSION_EQUAL pythonlibs_major OR
> +          NOT PYTHON_VERSION_MINOR VERSION_EQUAL pythonlibs_minor)
> +        message(FATAL_ERROR "Found incompatible Python interpreter (${PYTHON_VERSION_MAJOR}.${PYTHON_VERSION_MINOR})"
> +                            " and Python libraries (${pythonlibs_major}.${pythonlibs_minor})")
> +      endif()
>      endif()
> -  endif()
>
> -  if (PYTHON_INCLUDE_DIR)
> -    include_directories(${PYTHON_INCLUDE_DIR})
> +    if (PYTHON_INCLUDE_DIR)
> +      include_directories(${PYTHON_INCLUDE_DIR})
> +    endif()
>    endif()
>  endif()
>
>
>
>
> _______________________________________________
> lldb-commits mailing list
> lldb-commits at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits


More information about the lldb-commits mailing list