From 8fd262f1022990abb29b1523b612048fb13822b9 Mon Sep 17 00:00:00 2001
From: Pierre Rossi <pierre.rossi@digia.com>
Date: Fri, 14 Jun 2013 16:42:39 +0200
Subject: [PATCH] Make ninja detection a bit more robust

Having ninja in the PATH should be good enough.
If that didn't work, we try to find it in the most logical location
relative to CHROMIUM_SRC_DIR and bail out otherwise.
Since it seems unlikely to vary, and can be convenient to keep persistent,
we put it in .qmake.cache if qmake uses a cache.
---
 build/build.pro                            |  2 +-
 build/qmake/mkspecs/features/functions.prf | 13 ++++++++++++-
 qtwebengine.pro                            |  7 +++++--
 3 files changed, 18 insertions(+), 4 deletions(-)

diff --git a/build/build.pro b/build/build.pro
index a2fa634e6..cd8384edd 100644
--- a/build/build.pro
+++ b/build/build.pro
@@ -9,7 +9,7 @@ GYP_OUTPUT = $$system(./gyp_qtwebengine)
 message($$GYP_OUTPUT)
 
 ninja.target = ninja
-ninja.commands = $$CHROMIUM_SRC_DIR/../depot_tools/ninja -C $$getOutDir()/$$getConfigDir()
+ninja.commands = $$findNinja() -C $$getOutDir()/$$getConfigDir()
 ninja.depends: qmake
 QMAKE_EXTRA_TARGETS += ninja
 
diff --git a/build/qmake/mkspecs/features/functions.prf b/build/qmake/mkspecs/features/functions.prf
index 0f65c77ae..40a125f14 100644
--- a/build/qmake/mkspecs/features/functions.prf
+++ b/build/qmake/mkspecs/features/functions.prf
@@ -32,5 +32,16 @@ defineReplace(mocOutput) {
   # The order is important, since the output of the second replace would end up accidentaly transformed by the first one
   out = $$replace(out, ^(.*)($$join(QMAKE_EXT_CPP,|)), $${QMAKE_CPP_MOD_MOC}\\1$${QMAKE_EXT_CPP_MOC})
   out = $$replace(out, ^(.*)($$join(QMAKE_EXT_H,|)), $${QMAKE_H_MOD_MOC}\\1$${first(QMAKE_EXT_CPP)})
-  return ($$out)
+  return($$out)
+}
+
+defineReplace(findNinja) {
+  !isEmpty(CACHED_NINJA_EXECUTABLE):exists($$CACHED_NINJA_EXECUTABLE): return($$CACHED_NINJA_EXECUTABLE)
+  out = $$system("which ninja 2>/dev/null")
+  # Try to be smart about it if we know where the chromium sources are located
+  isEmpty(CHROMIUM_SRC_DIR): message(foobar)
+  !exists($$out):!isEmpty(CHROMIUM_SRC_DIR): out = $$absolute_path("../depot_tools/ninja", $$CHROMIUM_SRC_DIR)
+  !exists($$out): error("Ninja executable can't be found.")
+  cache(CACHED_NINJA_EXECUTABLE, set, out)
+  return($$out)
 }
diff --git a/qtwebengine.pro b/qtwebengine.pro
index 69bac5798..c08945a44 100644
--- a/qtwebengine.pro
+++ b/qtwebengine.pro
@@ -10,13 +10,16 @@ SUBDIRS = shared \
           build \ # This is where we use the generated qt_generated.gypi and run gyp
           example \
 
+# Ninja executable location needs to be determined early for extra targets. Should be fetched from cache most of the time anyway.
+NINJA_EXECUTABLE = $$findNinja()
+
 # Extra targets that invoke ninja on the desired configuration added for convenience
 release.target = release
-release.commands = $$CHROMIUM_SRC_DIR/../depot_tools/ninja -C $$getOutDir()/Release
+release.commands = $$NINJA_EXECUTABLE -C $$getOutDir()/Release
 release.depends: qmake
 
 debug.target = debug
-debug.commands = $$CHROMIUM_SRC_DIR/../depot_tools/ninja -C $$getOutDir()/Debug
+debug.commands = $$NINJA_EXECUTABLE -C $$getOutDir()/Debug
 debug.depends: qmake
 
 QMAKE_EXTRA_TARGETS += release \
-- 
GitLab