<div dir="ltr"><div>Thank you!</div><div>Here is some affected bots for the record:</div><a href="http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux-android/builds/30157/steps/bootstrap%20clang/logs/stdio" class="gmail-cremed cremed">http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux-android/builds/30157/steps/bootstrap%20clang/logs/stdio</a><br><div><a href="http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux/builds/26918/steps/check-msan%20in%20gcc%20build/logs/stdio" class="gmail-cremed cremed">http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux/builds/26918/steps/check-msan%20in%20gcc%20build/logs/stdio</a><br></div><div><a href="http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux-autoconf/builds/50110/steps/test%20tsan%20in%20debug%20compiler-rt%20build/logs/stdio" class="gmail-cremed cremed">http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux-autoconf/builds/50110/steps/test%20tsan%20in%20debug%20compiler-rt%20build/logs/stdio</a></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Tue, 28 Apr 2020 at 16:44, Eric Christopher via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr">Broke a number of things for me and a few other people I spoke with as well. I've gone ahead and temporarily reverted here:<div><br></div><div>commit 35edd704e0fda09e8e634515c0b451d4a8b6b914 (HEAD -> master, origin/master, origin/HEAD)<br>Author: Eric Christopher <<a href="mailto:echristo@gmail.com" target="_blank">echristo@gmail.com</a>><br>Date:   Tue Apr 28 16:41:22 2020 -0700<br><br>    Temporarily revert "build: use `find_package(Python3)` if available"<br>    as it seems to be causing multiple people problems with running tests<br>    and building.<br><br>    This reverts commit c4c3883b00d3a6aa657a5e3e515c90c9ea1f81c6.<br><br>and happy to work with Saleem to see what we can do to fix.</div><div><br></div><div>Some builds and tests weren't running (all of lldb's python tests were failing and something weird in libc++ as well for building).</div><div><br></div><div>Sorry, and let me know what I can do to help.</div><div><br></div><div>-eric</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Tue, Apr 28, 2020 at 10:26 AM Reid Kleckner via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr">This broke the gn build (which Saleem is of course not obligated to fix), and I applied a duct tape fix for it in cbaa74a0981833537e88a8eeac9c9df0f528833c. Feel free to improve on it.</div><div dir="ltr"><br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Tue, Apr 28, 2020 at 9:26 AM Saleem Abdulrasool via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><br>
Author: Saleem Abdulrasool<br>
Date: 2020-04-28T09:24:27-07:00<br>
New Revision: c4c3883b00d3a6aa657a5e3e515c90c9ea1f81c6<br>
<br>
URL: <a href="https://github.com/llvm/llvm-project/commit/c4c3883b00d3a6aa657a5e3e515c90c9ea1f81c6" rel="noreferrer" target="_blank">https://github.com/llvm/llvm-project/commit/c4c3883b00d3a6aa657a5e3e515c90c9ea1f81c6</a><br>
DIFF: <a href="https://github.com/llvm/llvm-project/commit/c4c3883b00d3a6aa657a5e3e515c90c9ea1f81c6.diff" rel="noreferrer" target="_blank">https://github.com/llvm/llvm-project/commit/c4c3883b00d3a6aa657a5e3e515c90c9ea1f81c6.diff</a><br>
<br>
LOG: build: use `find_package(Python3)` if available<br>
<br>
This is primarily motivated by the desire to move from Python2 to<br>
Python3.  `PYTHON_EXECUTABLE` is ambiguous.  This explicitly identifies<br>
the python interpreter in use.  Since the LLVM build seems to be able to<br>
completed successfully with python3, use that across the build.  The old<br>
path aliases `PYTHON_EXECUTABLE` to be treated as Python3.<br>
<br>
Added: <br>
<br>
<br>
Modified: <br>
    clang-tools-extra/test/<a href="http://lit.site.cfg.py.in" rel="noreferrer" target="_blank">lit.site.cfg.py.in</a><br>
    clang/CMakeLists.txt<br>
    clang/bindings/python/tests/CMakeLists.txt<br>
    clang/test/<a href="http://lit.site.cfg.py.in" rel="noreferrer" target="_blank">lit.site.cfg.py.in</a><br>
    clang/utils/perf-training/CMakeLists.txt<br>
    clang/utils/perf-training/<a href="http://lit.site.cfg.in" rel="noreferrer" target="_blank">lit.site.cfg.in</a><br>
    clang/utils/perf-training/<a href="http://order-files.lit.site.cfg.in" rel="noreferrer" target="_blank">order-files.lit.site.cfg.in</a><br>
    lld/CMakeLists.txt<br>
    lld/test/Unit/<a href="http://lit.site.cfg.py.in" rel="noreferrer" target="_blank">lit.site.cfg.py.in</a><br>
    lld/test/<a href="http://lit.site.cfg.py.in" rel="noreferrer" target="_blank">lit.site.cfg.py.in</a><br>
    llvm/CMakeLists.txt<br>
    llvm/cmake/config-ix.cmake<br>
    llvm/cmake/modules/AddLLVM.cmake<br>
    llvm/test/<a href="http://lit.site.cfg.py.in" rel="noreferrer" target="_blank">lit.site.cfg.py.in</a><br>
    llvm/tools/llvm-shlib/CMakeLists.txt<br>
<br>
Removed: <br>
<br>
<br>
<br>
################################################################################<br>
diff  --git a/clang-tools-extra/test/<a href="http://lit.site.cfg.py.in" rel="noreferrer" target="_blank">lit.site.cfg.py.in</a> b/clang-tools-extra/test/<a href="http://lit.site.cfg.py.in" rel="noreferrer" target="_blank">lit.site.cfg.py.in</a><br>
index a970e7fafc1f..5dc112a56126 100644<br>
--- a/clang-tools-extra/test/<a href="http://lit.site.cfg.py.in" rel="noreferrer" target="_blank">lit.site.cfg.py.in</a><br>
+++ b/clang-tools-extra/test/<a href="http://lit.site.cfg.py.in" rel="noreferrer" target="_blank">lit.site.cfg.py.in</a><br>
@@ -8,7 +8,7 @@ config.lit_tools_dir = "@LLVM_LIT_TOOLS_DIR@"<br>
 config.clang_tools_binary_dir = "@CLANG_TOOLS_BINARY_DIR@"<br>
 config.clang_tools_dir = "@CLANG_TOOLS_DIR@"<br>
 config.clang_libs_dir = "@SHLIBDIR@"<br>
-config.python_executable = "@PYTHON_EXECUTABLE@"<br>
+config.python_executable = "@Python3_EXECUTABLE@"<br>
 config.target_triple = "@TARGET_TRIPLE@"<br>
 config.clang_staticanalyzer = @CLANG_ENABLE_STATIC_ANALYZER@<br>
<br>
<br>
diff  --git a/clang/CMakeLists.txt b/clang/CMakeLists.txt<br>
index 88e556fd88a0..7dadc5f6e917 100644<br>
--- a/clang/CMakeLists.txt<br>
+++ b/clang/CMakeLists.txt<br>
@@ -130,16 +130,38 @@ if( CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR )<br>
   set( CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib${LLVM_LIBDIR_SUFFIX} )<br>
<br>
   if(LLVM_INCLUDE_TESTS)<br>
-    include(FindPythonInterp)<br>
-    if(NOT PYTHONINTERP_FOUND)<br>
-      message(FATAL_ERROR<br>
-"Unable to find Python interpreter, required for builds and testing.<br>
+    if(CMAKE_VERSION VERSION_LESS 3.12)<br>
+      include(FindPythonInterp)<br>
+      if(NOT PYTHONINTERP_FOUND)<br>
+        message(FATAL_ERROR<br>
+  "Unable to find Python interpreter, required for builds and testing.<br>
<br>
-Please install Python or specify the PYTHON_EXECUTABLE CMake variable.")<br>
-    endif()<br>
+  Please install Python or specify the PYTHON_EXECUTABLE CMake variable.")<br>
+      endif()<br>
+<br>
+      if( ${PYTHON_VERSION_STRING} VERSION_LESS 2.7 )<br>
+        message(FATAL_ERROR "Python 2.7 or newer is required")<br>
+      endif()<br>
<br>
-    if( ${PYTHON_VERSION_STRING} VERSION_LESS 2.7 )<br>
-      message(FATAL_ERROR "Python 2.7 or newer is required")<br>
+      add_executable(Python3::Interpreter IMPORTED)<br>
+      set_target_properties(Python3::Interpreter PROPERTIES<br>
+        IMPORTED_LOCATION ${PYTHON_EXECUTABLE})<br>
+      set(Python3_EXECUTABLE ${PYTHON_EXECUTABLE})<br>
+    else()<br>
+      find_package(Python3 COMPONENTS Interpreter)<br>
+      if(NOT Python3_Interpreter_FOUND)<br>
+        message(WARNING "Python3 not found, using python2 as a fallback")<br>
+        find_package(Python2 COMPONENTS Interpreter REQUIRED)<br>
+        if(Python2_VERSION VERSION_LESS 2.7)<br>
+          message(SEND_ERROR "Python 2.7 or newer is required")<br>
+        endif()<br>
+<br>
+        # Treat python2 as python3<br>
+        add_executable(Python3::Interpreter IMPORTED)<br>
+        set_target_properties(Python3::Interpreter PROPERTIES<br>
+          IMPORTED_LOCATION ${Python2_EXECUTABLE})<br>
+        set(Python3_EXECUTABLE ${Python2_EXECUTABLE})<br>
+      endif()<br>
     endif()<br>
<br>
     # Check prebuilt llvm/utils.<br>
<br>
diff  --git a/clang/bindings/python/tests/CMakeLists.txt b/clang/bindings/python/tests/CMakeLists.txt<br>
index 626256af9c1b..3f58c4bde8e7 100644<br>
--- a/clang/bindings/python/tests/CMakeLists.txt<br>
+++ b/clang/bindings/python/tests/CMakeLists.txt<br>
@@ -3,7 +3,7 @@<br>
 add_custom_target(check-clang-python<br>
     COMMAND ${CMAKE_COMMAND} -E env<br>
             CLANG_LIBRARY_PATH=$<TARGET_FILE_DIR:libclang><br>
-            ${PYTHON_EXECUTABLE} -m unittest discover<br>
+            "${Python3_EXECUTABLE}" -m unittest discover<br>
     DEPENDS libclang<br>
     WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/..)<br>
<br>
<br>
diff  --git a/clang/test/<a href="http://lit.site.cfg.py.in" rel="noreferrer" target="_blank">lit.site.cfg.py.in</a> b/clang/test/<a href="http://lit.site.cfg.py.in" rel="noreferrer" target="_blank">lit.site.cfg.py.in</a><br>
index daec694bd128..4527ccadbb4a 100644<br>
--- a/clang/test/<a href="http://lit.site.cfg.py.in" rel="noreferrer" target="_blank">lit.site.cfg.py.in</a><br>
+++ b/clang/test/<a href="http://lit.site.cfg.py.in" rel="noreferrer" target="_blank">lit.site.cfg.py.in</a><br>
@@ -27,7 +27,7 @@ config.enable_backtrace = @ENABLE_BACKTRACES@<br>
 config.enable_experimental_new_pass_manager = @ENABLE_EXPERIMENTAL_NEW_PASS_MANAGER@<br>
 config.enable_threads = @LLVM_ENABLE_THREADS@<br>
 config.host_arch = "@HOST_ARCH@"<br>
-config.python_executable = "@PYTHON_EXECUTABLE@"<br>
+config.python_executable = "@Python3_EXECUTABLE@"<br>
 config.use_z3_solver = lit_config.params.get('USE_Z3_SOLVER', "@USE_Z3_SOLVER@")<br>
 config.has_plugins = @LLVM_ENABLE_PLUGINS@<br>
<br>
<br>
diff  --git a/clang/utils/perf-training/CMakeLists.txt b/clang/utils/perf-training/CMakeLists.txt<br>
index 1f8612206b7a..172076fd0ce5 100644<br>
--- a/clang/utils/perf-training/CMakeLists.txt<br>
+++ b/clang/utils/perf-training/CMakeLists.txt<br>
@@ -23,7 +23,7 @@ if(LLVM_BUILD_INSTRUMENTED)<br>
     )<br>
<br>
   add_custom_target(clear-profraw<br>
-    COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/perf-helper.py clean ${CMAKE_CURRENT_BINARY_DIR} profraw<br>
+    COMMAND "${Python3_EXECUTABLE}" ${CMAKE_CURRENT_SOURCE_DIR}/perf-helper.py clean ${CMAKE_CURRENT_BINARY_DIR} profraw<br>
     COMMENT "Clearing old profraw data")<br>
<br>
   if(NOT LLVM_PROFDATA)<br>
@@ -34,7 +34,7 @@ if(LLVM_BUILD_INSTRUMENTED)<br>
     message(STATUS "To enable merging PGO data LLVM_PROFDATA has to point to llvm-profdata")<br>
   else()<br>
     add_custom_target(generate-profdata<br>
-      COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/perf-helper.py merge ${LLVM_PROFDATA} ${CMAKE_CURRENT_BINARY_DIR}/clang.profdata ${CMAKE_CURRENT_BINARY_DIR}<br>
+      COMMAND "${Python3_EXECUTABLE}" ${CMAKE_CURRENT_SOURCE_DIR}/perf-helper.py merge ${LLVM_PROFDATA} ${CMAKE_CURRENT_BINARY_DIR}/clang.profdata ${CMAKE_CURRENT_BINARY_DIR}<br>
       COMMENT "Merging profdata"<br>
       DEPENDS generate-profraw)<br>
   endif()<br>
@@ -55,7 +55,7 @@ if(APPLE AND DTRACE)<br>
     )<br>
<br>
   add_custom_target(clear-dtrace-logs<br>
-    COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/perf-helper.py clean ${CMAKE_CURRENT_BINARY_DIR} dtrace<br>
+    COMMAND "${Python3_EXECUTABLE}" ${CMAKE_CURRENT_SOURCE_DIR}/perf-helper.py clean ${CMAKE_CURRENT_BINARY_DIR} dtrace<br>
     COMMENT "Clearing old dtrace data")<br>
<br>
   if(NOT CLANG_ORDER_FILE)<br>
@@ -63,7 +63,7 @@ if(APPLE AND DTRACE)<br>
   endif()<br>
<br>
   add_custom_target(generate-order-file<br>
-    COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/perf-helper.py gen-order-file --binary $<TARGET_FILE:clang> --output ${CLANG_ORDER_FILE} ${CMAKE_CURRENT_BINARY_DIR}<br>
+    COMMAND "${Python3_EXECUTABLE}" ${CMAKE_CURRENT_SOURCE_DIR}/perf-helper.py gen-order-file --binary $<TARGET_FILE:clang> --output ${CLANG_ORDER_FILE} ${CMAKE_CURRENT_BINARY_DIR}<br>
     COMMENT "Generating order file"<br>
     DEPENDS generate-dtrace-logs)<br>
 endif()<br>
<br>
diff  --git a/clang/utils/perf-training/<a href="http://lit.site.cfg.in" rel="noreferrer" target="_blank">lit.site.cfg.in</a> b/clang/utils/perf-training/<a href="http://lit.site.cfg.in" rel="noreferrer" target="_blank">lit.site.cfg.in</a><br>
index 340a0e909b10..a1c6d6bc663d 100644<br>
--- a/clang/utils/perf-training/<a href="http://lit.site.cfg.in" rel="noreferrer" target="_blank">lit.site.cfg.in</a><br>
+++ b/clang/utils/perf-training/<a href="http://lit.site.cfg.in" rel="noreferrer" target="_blank">lit.site.cfg.in</a><br>
@@ -7,7 +7,7 @@ config.perf_helper_dir = "@CMAKE_CURRENT_SOURCE_DIR@"<br>
 config.test_exec_root = "@CMAKE_CURRENT_BINARY_DIR@"<br>
 config.test_source_root = "@CLANG_PGO_TRAINING_DATA@"<br>
 config.target_triple = "@TARGET_TRIPLE@"<br>
-config.python_exe = "@PYTHON_EXECUTABLE@"<br>
+config.python_exe = "@Python3_EXECUTABLE@"<br>
<br>
 # Support substitution of the tools and libs dirs with user parameters. This is<br>
 # used when we can't determine the tool dir at configuration time.<br>
<br>
diff  --git a/clang/utils/perf-training/<a href="http://order-files.lit.site.cfg.in" rel="noreferrer" target="_blank">order-files.lit.site.cfg.in</a> b/clang/utils/perf-training/<a href="http://order-files.lit.site.cfg.in" rel="noreferrer" target="_blank">order-files.lit.site.cfg.in</a><br>
index 87406dbaf9a6..91f2b79d208d 100644<br>
--- a/clang/utils/perf-training/<a href="http://order-files.lit.site.cfg.in" rel="noreferrer" target="_blank">order-files.lit.site.cfg.in</a><br>
+++ b/clang/utils/perf-training/<a href="http://order-files.lit.site.cfg.in" rel="noreferrer" target="_blank">order-files.lit.site.cfg.in</a><br>
@@ -7,7 +7,7 @@ config.perf_helper_dir = "@CMAKE_CURRENT_SOURCE_DIR@"<br>
 config.test_exec_root = "@CMAKE_CURRENT_BINARY_DIR@"<br>
 config.test_source_root = "@CLANG_PGO_TRAINING_DATA@"<br>
 config.target_triple = "@TARGET_TRIPLE@"<br>
-config.python_exe = "@PYTHON_EXECUTABLE@"<br>
+config.python_exe = "@Python3_EXECUTABLE@"<br>
<br>
 # Support substitution of the tools and libs dirs with user parameters. This is<br>
 # used when we can't determine the tool dir at configuration time.<br>
<br>
diff  --git a/lld/CMakeLists.txt b/lld/CMakeLists.txt<br>
index 3bd9e9556a85..7bbc59c7a811 100644<br>
--- a/lld/CMakeLists.txt<br>
+++ b/lld/CMakeLists.txt<br>
@@ -56,16 +56,38 @@ if(CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR)<br>
   include(HandleLLVMOptions)<br>
<br>
   if(LLVM_INCLUDE_TESTS)<br>
-    include(FindPythonInterp)<br>
-    if(NOT PYTHONINTERP_FOUND)<br>
-      message(FATAL_ERROR<br>
-"Unable to find Python interpreter, required for testing.<br>
+    if(CMAKE_VERSION VERSION_LESS 3.12)<br>
+      include(FindPythonInterp)<br>
+      if(NOT PYTHONINTERP_FOUND)<br>
+        message(FATAL_ERROR<br>
+  "Unable to find Python interpreter, required for testing.<br>
<br>
-Please install Python or specify the PYTHON_EXECUTABLE CMake variable.")<br>
-    endif()<br>
+  Please install Python or specify the PYTHON_EXECUTABLE CMake variable.")<br>
+      endif()<br>
+<br>
+      if(${PYTHON_VERSION_STRING} VERSION_LESS 2.7)<br>
+        message(FATAL_ERROR "Python 2.7 or newer is required")<br>
+      endif()<br>
<br>
-    if(${PYTHON_VERSION_STRING} VERSION_LESS 2.7)<br>
-      message(FATAL_ERROR "Python 2.7 or newer is required")<br>
+      add_executable(Python3::Interpeter IMPORTED)<br>
+      set_target_properties(Python3::Interpreter PROPERTIES<br>
+        IMPORTED_LOCATION ${PYTHON_EXECUTABLE})<br>
+      set(Python3_EXECUTABLE ${PYTHON_EXECUTABLE})<br>
+    else()<br>
+      find_package(Python3 COMPONENTS Interpreter)<br>
+      if(NOT Python3_Interpreter_FOUND)<br>
+        message(WARNING "Python3 not found, using python2 as a fallback")<br>
+        find_package(Python2 COMPONENTS Interpreter REQUIRED)<br>
+        if(Python2_VERSION VERSION_LESS 2.7)<br>
+          message(SEND_ERROR "Python 2.7 or newer is required")<br>
+        endif()<br>
+<br>
+        # Treat python2 as python3<br>
+        add_executable(Python3::Interpreter IMPORTED)<br>
+        set_target_properties(Python3::Interpreter PROPERTIES<br>
+          IMPORTED_LOCATION ${Python2_EXECUTABLE})<br>
+        set(Python3_EXECUTABLE ${Python2_EXECUTABLE})<br>
+      endif()<br>
     endif()<br>
<br>
     # Check prebuilt llvm/utils.<br>
<br>
diff  --git a/lld/test/Unit/<a href="http://lit.site.cfg.py.in" rel="noreferrer" target="_blank">lit.site.cfg.py.in</a> b/lld/test/Unit/<a href="http://lit.site.cfg.py.in" rel="noreferrer" target="_blank">lit.site.cfg.py.in</a><br>
index cc12117ad0bf..d96e20f11d0a 100644<br>
--- a/lld/test/Unit/<a href="http://lit.site.cfg.py.in" rel="noreferrer" target="_blank">lit.site.cfg.py.in</a><br>
+++ b/lld/test/Unit/<a href="http://lit.site.cfg.py.in" rel="noreferrer" target="_blank">lit.site.cfg.py.in</a><br>
@@ -11,7 +11,7 @@ config.lld_src_root = "@LLD_SOURCE_DIR@"<br>
 config.lld_libs_dir = "@LLVM_LIBRARY_OUTPUT_INTDIR@"<br>
 config.lld_tools_dir = "@LLVM_RUNTIME_OUTPUT_INTDIR@"<br>
 config.target_triple = "@TARGET_TRIPLE@"<br>
-config.python_executable = "@PYTHON_EXECUTABLE@"<br>
+config.python_executable = "@Python3_EXECUTABLE@"<br>
<br>
 # Support substitution of the tools and libs dirs with user parameters. This is<br>
 # used when we can't determine the tool dir at configuration time.<br>
<br>
diff  --git a/lld/test/<a href="http://lit.site.cfg.py.in" rel="noreferrer" target="_blank">lit.site.cfg.py.in</a> b/lld/test/<a href="http://lit.site.cfg.py.in" rel="noreferrer" target="_blank">lit.site.cfg.py.in</a><br>
index 02840f8d6a30..4aa2fcda73bb 100644<br>
--- a/lld/test/<a href="http://lit.site.cfg.py.in" rel="noreferrer" target="_blank">lit.site.cfg.py.in</a><br>
+++ b/lld/test/<a href="http://lit.site.cfg.py.in" rel="noreferrer" target="_blank">lit.site.cfg.py.in</a><br>
@@ -13,7 +13,7 @@ config.lld_obj_root = "@LLD_BINARY_DIR@"<br>
 config.lld_libs_dir = "@LLVM_LIBRARY_OUTPUT_INTDIR@"<br>
 config.lld_tools_dir = "@LLVM_RUNTIME_OUTPUT_INTDIR@"<br>
 config.target_triple = "@TARGET_TRIPLE@"<br>
-config.python_executable = "@PYTHON_EXECUTABLE@"<br>
+config.python_executable = "@Python3_EXECUTABLE@"<br>
 config.have_zlib = @HAVE_LIBZ@<br>
 config.sizeof_void_p = @CMAKE_SIZEOF_VOID_P@<br>
<br>
<br>
diff  --git a/llvm/CMakeLists.txt b/llvm/CMakeLists.txt<br>
index 8bc5a9f052f9..cc86e5ac3856 100644<br>
--- a/llvm/CMakeLists.txt<br>
+++ b/llvm/CMakeLists.txt<br>
@@ -671,16 +671,38 @@ option(LLVM_ENABLE_PLUGINS "Enable plugin support" ${LLVM_ENABLE_PLUGINS_default<br>
<br>
 include(HandleLLVMOptions)<br>
<br>
-include(FindPythonInterp)<br>
-if( NOT PYTHONINTERP_FOUND )<br>
-  message(FATAL_ERROR<br>
-"Unable to find Python interpreter, required for builds and testing.<br>
+if(CMAKE_VERSION VERSION_LESS 3.12)<br>
+  include(FindPythonInterp)<br>
+  if( NOT PYTHONINTERP_FOUND )<br>
+    message(FATAL_ERROR<br>
+  "Unable to find Python interpreter, required for builds and testing.<br>
<br>
-Please install Python or specify the PYTHON_EXECUTABLE CMake variable.")<br>
-endif()<br>
+  Please install Python or specify the PYTHON_EXECUTABLE CMake variable.")<br>
+  endif()<br>
+<br>
+  if( ${PYTHON_VERSION_STRING} VERSION_LESS 2.7 )<br>
+    message(FATAL_ERROR "Python 2.7 or newer is required")<br>
+  endif()<br>
<br>
-if( ${PYTHON_VERSION_STRING} VERSION_LESS 2.7 )<br>
-  message(FATAL_ERROR "Python 2.7 or newer is required")<br>
+  add_executable(Python3::Interpreter IMPORTED)<br>
+  set_target_properties(Python3::Interpreter PROPERTIES<br>
+    IMPORTED_LOCATION ${PYTHON_EXECUTABLE})<br>
+  set(Python3_EXECUTABLE ${PYTHON_EXECUTABLE})<br>
+else()<br>
+  find_package(Python3 COMPONENTS Interpreter)<br>
+  if(NOT Python3_Interpreter_FOUND)<br>
+    message(WARNING "Python3 not found, using python2 as a fallback")<br>
+    find_package(Python2 COMPONENTS Interpreter REQUIRED)<br>
+    if(Python2_VERSION VERSION_LESS 2.7)<br>
+      message(SEND_ERROR "Python 2.7 or newer is required")<br>
+    endif()<br>
+<br>
+    # Treat python2 as python3<br>
+    add_executable(Python3::Interpreter IMPORTED)<br>
+    set_target_properties(Python3::Interpreter PROPERTIES<br>
+      IMPORTED_LOCATION ${Python2_EXECUTABLE})<br>
+    set(Python3_EXECUTABLE ${Python2_EXECUTABLE})<br>
+  endif()<br>
 endif()<br>
<br>
 ######<br>
@@ -716,7 +738,7 @@ endif (LLVM_USE_PERF)<br>
<br>
 message(STATUS "Constructing LLVMBuild project information")<br>
 execute_process(<br>
-  COMMAND ${PYTHON_EXECUTABLE} -B ${LLVMBUILDTOOL}<br>
+  COMMAND "${Python3_EXECUTABLE}" -B ${LLVMBUILDTOOL}<br>
             --native-target "${LLVM_NATIVE_ARCH}"<br>
             --enable-targets "${LLVM_TARGETS_TO_BUILD}"<br>
             --enable-optional-components "${LLVMOPTIONALCOMPONENTS}"<br>
<br>
diff  --git a/llvm/cmake/config-ix.cmake b/llvm/cmake/config-ix.cmake<br>
index d9624c42da66..777cfd628a84 100644<br>
--- a/llvm/cmake/config-ix.cmake<br>
+++ b/llvm/cmake/config-ix.cmake<br>
@@ -639,7 +639,7 @@ function(find_python_module module)<br>
     return()<br>
   endif()<br>
<br>
-  execute_process(COMMAND "${PYTHON_EXECUTABLE}" "-c" "import ${module}"<br>
+  execute_process(COMMAND "${Python3_EXECUTABLE}" "-c" "import ${module}"<br>
     RESULT_VARIABLE status<br>
     ERROR_QUIET)<br>
<br>
<br>
diff  --git a/llvm/cmake/modules/AddLLVM.cmake b/llvm/cmake/modules/AddLLVM.cmake<br>
index b77b59240eb1..cc1c122dce3d 100644<br>
--- a/llvm/cmake/modules/AddLLVM.cmake<br>
+++ b/llvm/cmake/modules/AddLLVM.cmake<br>
@@ -117,7 +117,7 @@ function(add_llvm_symbol_exports target_name export_file)<br>
     set(native_export_file "${target_name}.def")<br>
<br>
     add_custom_command(OUTPUT ${native_export_file}<br>
-      COMMAND ${PYTHON_EXECUTABLE} -c "import sys;print(''.join(['EXPORTS\\n']+sys.stdin.readlines(),))"<br>
+      COMMAND "${Python3_EXECUTABLE}" -c "import sys;print(''.join(['EXPORTS\\n']+sys.stdin.readlines(),))"<br>
         < ${export_file} > ${native_export_file}<br>
       DEPENDS ${export_file}<br>
       VERBATIM<br>
@@ -1052,7 +1052,7 @@ function(export_executable_symbols target)<br>
       set(mangling itanium)<br>
     endif()<br>
     add_custom_command(OUTPUT ${exported_symbol_file}<br>
-                       COMMAND ${PYTHON_EXECUTABLE} ${LLVM_MAIN_SRC_DIR}/utils/extract_symbols.py --mangling=${mangling} ${static_libs} -o ${exported_symbol_file}<br>
+                       COMMAND "${Python3_EXECUTABLE}" ${LLVM_MAIN_SRC_DIR}/utils/extract_symbols.py --mangling=${mangling} ${static_libs} -o ${exported_symbol_file}<br>
                        WORKING_DIRECTORY ${LLVM_LIBRARY_OUTPUT_INTDIR}<br>
                        DEPENDS ${LLVM_MAIN_SRC_DIR}/utils/extract_symbols.py ${static_libs}<br>
                        VERBATIM<br>
@@ -1453,7 +1453,7 @@ function(make_paths_relative out_pathlist basedir pathlist)<br>
   # empty list entries. So escape the ;s in the list and do the splitting<br>
   # ourselves. cmake has no relpath function, so use Python for that.<br>
   string(REPLACE ";" "\\;" pathlist_escaped "${pathlist}")<br>
-  execute_process(COMMAND "${PYTHON_EXECUTABLE}" "-c" "\n<br>
+  execute_process(COMMAND "${Python3_EXECUTABLE}" "-c" "\n<br>
 import os, sys\n<br>
 base = sys.argv[1]<br>
 def haslink(p):\n<br>
@@ -1528,7 +1528,6 @@ function(configure_lit_site_cfg site_in site_out)<br>
   # SHLIBDIR points the build tree.<br>
   string(REPLACE "${CMAKE_CFG_INTDIR}" "${LLVM_BUILD_MODE}" SHLIBDIR "${LLVM_SHLIB_OUTPUT_INTDIR}")<br>
<br>
-  set(PYTHON_EXECUTABLE ${PYTHON_EXECUTABLE})<br>
   # FIXME: "ENABLE_SHARED" doesn't make sense, since it is used just for<br>
   # plugins. We may rename it.<br>
   if(LLVM_ENABLE_PLUGINS)<br>
@@ -1686,7 +1685,7 @@ function(add_lit_target target comment)<br>
     ALLOW_EXTERNAL<br>
     )<br>
<br>
-  set(LIT_COMMAND "${PYTHON_EXECUTABLE};${lit_base_dir}/${lit_file_name}")<br>
+  set(LIT_COMMAND "${Python3_EXECUTABLE};${lit_base_dir}/${lit_file_name}")<br>
   list(APPEND LIT_COMMAND ${LIT_ARGS})<br>
   foreach(param ${ARG_PARAMS})<br>
     list(APPEND LIT_COMMAND --param ${param})<br>
<br>
diff  --git a/llvm/test/<a href="http://lit.site.cfg.py.in" rel="noreferrer" target="_blank">lit.site.cfg.py.in</a> b/llvm/test/<a href="http://lit.site.cfg.py.in" rel="noreferrer" target="_blank">lit.site.cfg.py.in</a><br>
index ee9e5941a39e..3797830862f7 100644<br>
--- a/llvm/test/<a href="http://lit.site.cfg.py.in" rel="noreferrer" target="_blank">lit.site.cfg.py.in</a><br>
+++ b/llvm/test/<a href="http://lit.site.cfg.py.in" rel="noreferrer" target="_blank">lit.site.cfg.py.in</a><br>
@@ -12,7 +12,7 @@ config.llvm_shlib_dir = path(r"@SHLIBDIR@")<br>
 config.llvm_shlib_ext = "@SHLIBEXT@"<br>
 config.llvm_exe_ext = "@EXEEXT@"<br>
 config.lit_tools_dir = path(r"@LLVM_LIT_TOOLS_DIR@")<br>
-config.python_executable = "@PYTHON_EXECUTABLE@"<br>
+config.python_executable = "@Python3_EXECUTABLE@"<br>
 config.gold_executable = "@GOLD_EXECUTABLE@"<br>
 config.ld64_executable = "@LD64_EXECUTABLE@"<br>
 config.ocamlfind_executable = "@OCAMLFIND@"<br>
<br>
diff  --git a/llvm/tools/llvm-shlib/CMakeLists.txt b/llvm/tools/llvm-shlib/CMakeLists.txt<br>
index eb42abfc1d40..563e4a100dc4 100644<br>
--- a/llvm/tools/llvm-shlib/CMakeLists.txt<br>
+++ b/llvm/tools/llvm-shlib/CMakeLists.txt<br>
@@ -164,7 +164,7 @@ if(LLVM_BUILD_LLVM_C_DYLIB AND MSVC)<br>
   endif()<br>
<br>
   add_custom_command(OUTPUT ${LLVM_EXPORTED_SYMBOL_FILE}<br>
-    COMMAND ${PYTHON_EXECUTABLE} ${GEN_SCRIPT} --libsfile ${LIBSFILE} ${GEN_UNDERSCORE} --nm "${llvm_nm}" -o ${LLVM_EXPORTED_SYMBOL_FILE}<br>
+    COMMAND "${Python3_EXECUTABLE}" ${GEN_SCRIPT} --libsfile ${LIBSFILE} ${GEN_UNDERSCORE} --nm "${llvm_nm}" -o ${LLVM_EXPORTED_SYMBOL_FILE}<br>
     DEPENDS ${LIB_NAMES} ${llvm_nm_target}<br>
     COMMENT "Generating export list for LLVM-C"<br>
     VERBATIM )<br>
<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a><br>
<a href="https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
</blockquote></div>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a><br>
<a href="https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
</blockquote></div>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a><br>
<a href="https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
</blockquote></div>