diff options
author | Frederik Gladhorn <frederik.gladhorn@theqtcompany.com> | 2016-01-14 13:01:39 +0100 |
---|---|---|
committer | Oswald Buddenhagen <oswald.buddenhagen@theqtcompany.com> | 2016-01-21 19:23:40 +0000 |
commit | f33c6f37a8226c67a199181a8721f09983089448 (patch) | |
tree | 538cbb0a894aca00bc7f0b3eb559ef3f14dc8ad3 | |
parent | 2bb473c19a6926a0691219776109dee37a1a276b (diff) |
Work around MinGW-make's magic prefixing of paths.
When building QNX on MS-Windows, make magically adds the Msys root as
prefix to variables whose values look like paths; this applies to both
environment variables and variables given values on the command-line.
When we don't actually want to install under the Msys root, this is
unwelcome "help". So (for MinGW's make) support a magic prefix of our
own, @msyshack@, that'll make a path value for INSTALL_ROOT not look
like a path to make; we can then strip it off when we come to use it.
Change-Id: I951ad3c8fe3e5cfb49e6e361d7fff779f3a9d716
Reviewed-by: Jędrzej Nowacki <jedrzej.nowacki@theqtcompany.com>
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@theqtcompany.com>
Reviewed-by: Frederik Gladhorn <frederik.gladhorn@theqtcompany.com>
-rw-r--r-- | qmake/generators/makefile.cpp | 2 | ||||
-rw-r--r-- | qmake/generators/makefile.h | 4 | ||||
-rw-r--r-- | qmake/generators/unix/unixmake.cpp | 16 | ||||
-rw-r--r-- | qmake/generators/unix/unixmake.h | 3 | ||||
-rw-r--r-- | qmake/generators/win32/mingw_make.cpp | 12 | ||||
-rw-r--r-- | qmake/generators/win32/mingw_make.h | 1 | ||||
-rw-r--r-- | qmake/generators/win32/msvc_nmake.cpp | 2 | ||||
-rw-r--r-- | qmake/generators/win32/winmakefile.cpp | 2 |
8 files changed, 38 insertions, 4 deletions
diff --git a/qmake/generators/makefile.cpp b/qmake/generators/makefile.cpp index a54083c04d..4dfe69fbde 100644 --- a/qmake/generators/makefile.cpp +++ b/qmake/generators/makefile.cpp @@ -1212,7 +1212,7 @@ MakefileGenerator::writeInstalls(QTextStream &t, bool noBuild) } bool do_default = true; - const QString root = "$(INSTALL_ROOT)"; + const QString root = installRoot(); QString dst; if (installConfigValues.indexOf("no_path") == -1 && installConfigValues.indexOf("dummy_install") == -1) { diff --git a/qmake/generators/makefile.h b/qmake/generators/makefile.h index 97159eaef4..19ff5d57a3 100644 --- a/qmake/generators/makefile.h +++ b/qmake/generators/makefile.h @@ -192,6 +192,7 @@ protected: //for installs virtual QString defaultInstall(const QString &); + virtual QString installRoot() const; //for prl QString prlFileName(bool fixify=true); @@ -277,6 +278,9 @@ inline bool MakefileGenerator::noIO() const inline QString MakefileGenerator::defaultInstall(const QString &) { return QString(""); } +inline QString MakefileGenerator::installRoot() const +{ return QStringLiteral("$(INSTALL_ROOT)"); } + inline bool MakefileGenerator::findLibraries(bool, bool) { return true; } diff --git a/qmake/generators/unix/unixmake.cpp b/qmake/generators/unix/unixmake.cpp index 57c0a97228..12b9f09edd 100644 --- a/qmake/generators/unix/unixmake.cpp +++ b/qmake/generators/unix/unixmake.cpp @@ -514,6 +514,20 @@ UnixMakefileGenerator::findLibraries(bool linkPrl, bool mergeLflags) return false; } +#ifdef Q_OS_WIN // MinGW x-compiling for QNX +QString UnixMakefileGenerator::installRoot() const +{ + /* + We include a magic prefix on the path to bypass mingw-make's "helpful" + intervention in the environment, recognising variables that look like + paths and adding the msys system root as prefix, which we don't want. + Once this hack has smuggled INSTALL_ROOT into make's variable space, we + can trivially strip the magic prefix back off to get the path we meant. + */ + return QStringLiteral("$(INSTALL_ROOT:@msyshack@%=%)"); +} +#endif + QString UnixMakefileGenerator::defaultInstall(const QString &t) { @@ -522,7 +536,7 @@ UnixMakefileGenerator::defaultInstall(const QString &t) enum { NoBundle, SolidBundle, SlicedBundle } bundle = NoBundle; bool isAux = (project->first("TEMPLATE") == "aux"); - const QString root = "$(INSTALL_ROOT)"; + const QString root = installRoot(); ProStringList &uninst = project->values(ProKey(t + ".uninstall")); QString ret, destdir = project->first("DESTDIR").toQString(); if(!destdir.isEmpty() && destdir.right(1) != Option::dir_sep) diff --git a/qmake/generators/unix/unixmake.h b/qmake/generators/unix/unixmake.h index db3f59f517..17270ffce9 100644 --- a/qmake/generators/unix/unixmake.h +++ b/qmake/generators/unix/unixmake.h @@ -52,6 +52,9 @@ public: protected: virtual bool doPrecompiledHeaders() const { return project->isActiveConfig("precompile_header"); } virtual bool doDepends() const { return !Option::mkfile::do_stub_makefile && MakefileGenerator::doDepends(); } +#ifdef Q_OS_WIN // MinGW x-compiling for QNX + virtual QString installRoot() const; +#endif virtual QString defaultInstall(const QString &); virtual ProString fixLibFlag(const ProString &lib); diff --git a/qmake/generators/win32/mingw_make.cpp b/qmake/generators/win32/mingw_make.cpp index 97bfef88a4..1837c6c0cf 100644 --- a/qmake/generators/win32/mingw_make.cpp +++ b/qmake/generators/win32/mingw_make.cpp @@ -112,6 +112,18 @@ bool MingwMakefileGenerator::writeMakefile(QTextStream &t) return false; } +QString MingwMakefileGenerator::installRoot() const +{ + /* + We include a magic prefix on the path to bypass mingw-make's "helpful" + intervention in the environment, recognising variables that look like + paths and adding the msys system root as prefix, which we don't want. + Once this hack has smuggled INSTALL_ROOT into make's variable space, we + can trivially strip the magic prefix back off to get the path we meant. + */ + return QStringLiteral("$(INSTALL_ROOT:@msyshack@%=%)"); +} + void createLdObjectScriptFile(const QString &fileName, const ProStringList &objList) { QString filePath = Option::output_dir + QDir::separator() + fileName; diff --git a/qmake/generators/win32/mingw_make.h b/qmake/generators/win32/mingw_make.h index 4e94a23ae2..1525f04955 100644 --- a/qmake/generators/win32/mingw_make.h +++ b/qmake/generators/win32/mingw_make.h @@ -50,6 +50,7 @@ protected: virtual QString getManifestFileForRcFile() const; bool writeMakefile(QTextStream &); void init(); + virtual QString installRoot() const; private: void writeMingwParts(QTextStream &); void writeIncPart(QTextStream &t); diff --git a/qmake/generators/win32/msvc_nmake.cpp b/qmake/generators/win32/msvc_nmake.cpp index 7499d76e75..27427db68b 100644 --- a/qmake/generators/win32/msvc_nmake.cpp +++ b/qmake/generators/win32/msvc_nmake.cpp @@ -268,7 +268,7 @@ QString NmakeMakefileGenerator::defaultInstall(const QString &t) QString ret = Win32MakefileGenerator::defaultInstall(t); - const QString root = "$(INSTALL_ROOT)"; + const QString root = installRoot(); ProStringList &uninst = project->values(ProKey(t + ".uninstall")); QString targetdir = fileFixify(project->first(ProKey(t + ".path")).toQString(), FileFixifyAbsolute); if(targetdir.right(1) != Option::dir_sep) diff --git a/qmake/generators/win32/winmakefile.cpp b/qmake/generators/win32/winmakefile.cpp index 1fba7057ab..a042cb0d4b 100644 --- a/qmake/generators/win32/winmakefile.cpp +++ b/qmake/generators/win32/winmakefile.cpp @@ -689,7 +689,7 @@ QString Win32MakefileGenerator::defaultInstall(const QString &t) project->first("TEMPLATE") == "subdirs" || project->first("TEMPLATE") == "aux") return QString(); - const QString root = "$(INSTALL_ROOT)"; + const QString root = installRoot(); ProStringList &uninst = project->values(ProKey(t + ".uninstall")); QString ret; QString targetdir = fileFixify(project->first(ProKey(t + ".path")).toQString(), FileFixifyAbsolute); |