diff --git a/configure.json b/configure.json
index 62b56bbb1ab5a63087a6271c3960a5453fcaf900..605807a365b40ccdd339d24dec35e92a1a38dd7a 100644
--- a/configure.json
+++ b/configure.json
@@ -58,6 +58,11 @@
     },
 
     "tests" : {
+        "python2": {
+            "label": "Python 2",
+            "type": "detectPython2",
+            "log": "location"
+        },
         "ninja": {
             "label": "system ninja",
             "type": "detectNinja"
@@ -73,6 +78,13 @@
     },
 
     "features": {
+        "python2": {
+            "label": "Python 2",
+            "condition": "tests.python2",
+            "output": [
+                { "type": "varAssign", "name": "QMAKE_PYTHON2", "value": "tests.python2.location" }
+            ]
+        },
         "embedded": {
             "label": "Embedded build",
             "condition": "config.unix",
@@ -157,6 +169,14 @@
         }
     },
 
+    "report": [
+        {
+            "type": "warning",
+            "condition": "!features.python2",
+            "message": "Python version 2 (2.7.5 or later) is required to build QtWebEngine."
+        }
+    ],
+
     "summary": [
         {
             "section": "Qt WebEngine",
diff --git a/configure.pri b/configure.pri
index 23f31686e8e88f61a2bf55acc4ac40707f5cf873..ce36642bbbf939c73e9e37e3a7e33079eb1431b6 100644
--- a/configure.pri
+++ b/configure.pri
@@ -1,5 +1,46 @@
 equals(QMAKE_HOST.os, Windows): EXE_SUFFIX = .exe
 
+defineTest(isPythonVersionSupported) {
+    python = $$system_quote($$system_path($$1))
+    python_version = $$system('$$python -c "import sys; print(sys.version_info[0:3])"')
+    python_version ~= s/[()]//g
+    python_version = $$split(python_version, ',')
+    python_major_version = $$first(python_version)
+    greaterThan(python_major_version, 2) {
+        qtLog("Python version 3 is not supported by Chromium.")
+        return(false)
+    }
+    python_minor_version = $$member(python_version, 1)
+    python_patch_version = $$member(python_version, 2)
+    greaterThan(python_major_version, 1): greaterThan(python_minor_version, 6): greaterThan(python_patch_version, 4): return(true)
+    qtLog("Unsupported python version: $${python_major_version}.$${python_minor_version}.$${python_patch_version}.")
+    return(false)
+}
+
+defineTest(qtConfTest_detectPython2) {
+    python = $$qtConfFindInPath("python2")
+    isEmpty(python) {
+        qtLog("'python2' not found in PATH. Checking for 'python'.")
+        python = $$qtConfFindInPath("python$$EXE_SUFFIX")
+    }
+    isEmpty(python) {
+        qtLog("'python$$EXE_SUFFIX' not found in PATH. Giving up.")
+        return(false)
+    }
+    !isPythonVersionSupported($$python) {
+        qtLog("A suitable Python 2 executable could not be located.")
+        return(false)
+    }
+
+    # Make tests.python2.location available in configure.json.
+    $${1}.location = $$clean_path($$python)
+    export($${1}.location)
+    $${1}.cache += location
+    export($${1}.cache)
+
+    return(true)
+}
+
 defineTest(qtConfTest_detectNinja) {
     ninja = $$qtConfFindInPath("ninja$$EXE_SUFFIX")
     !isEmpty(ninja) {
diff --git a/src/buildtools/gn.pro b/src/buildtools/gn.pro
index 092888e0e59f59d5e0a6479ab484848b431ce9ea..f8f8b20da3a3497fcac287e4702de01efdf797f2 100644
--- a/src/buildtools/gn.pro
+++ b/src/buildtools/gn.pro
@@ -14,7 +14,7 @@ defineReplace(buildGn) {
         gn_bootstrap = $$system_path($$absolute_path(chromium/tools/gn/bootstrap/bootstrap.py, $$src_3rd_party_dir))
         gn_args = $$system_quote($$gn_args)
         gn_configure = $$system_quote($$gn_bootstrap) --shadow --gn-gen-args=$$gn_args $$ninja_path
-        !system("cd $$system_quote($$system_path($$dirname(out))) && python $$gn_configure") {
+        !system("cd $$system_quote($$system_path($$dirname(out))) && $$pythonPathForSystem() $$gn_configure") {
             error("GN build error!")
         }
     }
diff --git a/src/buildtools/ninja.pro b/src/buildtools/ninja.pro
index c391d6e84f3c7697a2dbcf2da4bc7dbf21a8b805..0a01f1f4e81de0001d573a5b936b5216cd7c3f7a 100644
--- a/src/buildtools/ninja.pro
+++ b/src/buildtools/ninja.pro
@@ -8,7 +8,7 @@ defineReplace(buildNinja) {
        mkpath($$dirname(out))
        src_3rd_party_dir = $$absolute_path("$${getChromiumSrcDir()}/../", "$$QTWEBENGINE_ROOT")
        ninja_configure =  $$system_quote($$system_path($$absolute_path(ninja/configure.py, $$src_3rd_party_dir)))
-       !system("cd $$system_quote($$system_path($$dirname(out))) && python $$ninja_configure --bootstrap") {
+       !system("cd $$system_quote($$system_path($$dirname(out))) && $$pythonPathForSystem() $$ninja_configure --bootstrap") {
             error("NINJA build error!")
        }
    }
diff --git a/src/core/gn_run.pro b/src/core/gn_run.pro
index 07635d04c6d0c0749511c45a3d3054e7fab0fce9..b6966a51d04a2cb5efa3702808a4c00717ea9b0e 100644
--- a/src/core/gn_run.pro
+++ b/src/core/gn_run.pro
@@ -51,7 +51,8 @@ build_pass|!debug_and_release {
     gn_args = $$shell_quote($$gn_args)
     gn_src_root = $$shell_quote($$shell_path($$QTWEBENGINE_ROOT/$$getChromiumSrcDir()))
     gn_build_root = $$shell_quote($$shell_path($$OUT_PWD/$$getConfigDir()))
-    $$runGn($$gn_binary gen $$gn_build_root --args=$$gn_args --root=$$gn_src_root)
+    gn_python = "--script-executable=$$pythonPathForSystem()"
+    $$runGn($$gn_binary gen $$gn_build_root $$gn_python --args=$$gn_args --root=$$gn_src_root)
 
     runninja.commands = $$NINJA \$\(NINJAFLAGS\) -C $$gn_build_root QtWebEngineCore
     QMAKE_EXTRA_TARGETS += runninja
diff --git a/src/webengine/webengine.pro b/src/webengine/webengine.pro
index 27239225b6af709e713e403c6cc5e200e5e057bc..5ac93c9a7ee4e491c2d90922ad933954926b6172 100644
--- a/src/webengine/webengine.pro
+++ b/src/webengine/webengine.pro
@@ -71,9 +71,10 @@ use?(pdf) {
 }
 
 !build_pass {
+    python = $$pythonPathForShell()
     chromium_attributions.commands = \
         cd $$shell_quote($$shell_path($$PWD/../3rdparty)) && \
-        python chromium/tools/licenses.py \
+        $$python chromium/tools/licenses.py \
         --file-template ../../tools/about_credits.tmpl \
         --entry-template ../../tools/about_credits_entry.tmpl credits \
         > $$shell_quote($$shell_path($$OUT_PWD/chromium_attributions.qdoc))
diff --git a/tools/qmake/mkspecs/features/functions.prf b/tools/qmake/mkspecs/features/functions.prf
index ed113303783c386ce558b85b6f7988233be38993..eb421f8b5f92b426cc4b5f0caac9e999c2b8a6e9 100644
--- a/tools/qmake/mkspecs/features/functions.prf
+++ b/tools/qmake/mkspecs/features/functions.prf
@@ -86,7 +86,6 @@ defineTest(isPlatformSupported) {
     skipBuild("Static builds of QtWebEngine aren't supported.")
     return(false)
   }
-  !isPythonVersionSupported(): return(false)
   !isArchSupported(): return(false)
   isSanitizerEnabled():!isSanitizerSupported():!forceSanitizerBuild(): return(false)
   return(true)
@@ -101,25 +100,6 @@ defineTest(isArchSupported) {
     return(false)
 }
 
-defineTest(isPythonVersionSupported) {
-    python_error_msg = "Python version 2 (2.7.5 or later) is required to build Qt WebEngine."
-    python_version = $$system('python -c "import sys; print(sys.version_info[0:3])"')
-    python_version ~= s/[()]//g
-    python_version = $$split(python_version, ',')
-    python_major_version = $$first(python_version)
-    greaterThan(python_major_version, 2) {
-        skipBuild("Python version 3 is not supported by Chromium.")
-        skipBuild($$python_error_msg)
-        return(false)
-    }
-    python_minor_version = $$member(python_version, 1)
-    python_patch_version = $$member(python_version, 2)
-    greaterThan(python_major_version, 1): greaterThan(python_minor_version, 6): greaterThan(python_patch_version, 4): return(true)
-    skipBuild("Using Python version $${python_major_version}.$${python_minor_version}.$${python_patch_version}.")
-    skipBuild($$python_error_msg)
-    return(false)
-}
-
 defineTest(isSanitizerEnabled) {
   sanitize_address|sanitize_memory|sanitize_undefined|sanitize_thread: return(true)
   return(false)
@@ -358,6 +338,25 @@ defineTest(use?) {
     return(false)
 }
 
+# Returns the unquoted path to the python executable.
+defineReplace(pythonPath) {
+    isEmpty(QMAKE_PYTHON2) {
+        # Fallback for building QtWebEngine with Qt < 5.8
+        QMAKE_PYTHON2 = python
+    }
+    return($$QMAKE_PYTHON2)
+}
+
+# Returns the python executable for use with shell / make targets.
+defineReplace(pythonPathForShell) {
+    return($$shell_quote($$shell_path($$pythonPath())))
+}
+
+# Returns the python executable for use with $$system()
+defineReplace(pythonPathForSystem) {
+    return($$system_quote($$system_path($$pythonPath())))
+}
+
 defineReplace(ninjaPath) {
     src_3rd_party_dir = $$absolute_path("$${getChromiumSrcDir()}/../", "$$QTWEBENGINE_ROOT")
     out = $$shadowed($$absolute_path(ninja/ninja, $$src_3rd_party_dir))