merge MingwMakefileGenerator::findLibraries() into Win32MakefileGenerator

as a side effect, this makes the extensions used for searching libraries
configurable under windows (QMAKE_LIB_EXTENSIONS).

Change-Id: I3e64304fcadbfe74d601b50a70a73180c894503e
Reviewed-by: Joerg Bornemann <joerg.bornemann@theqtcompany.com>
This commit is contained in:
Oswald Buddenhagen 2015-09-23 14:57:05 +02:00
parent dd9ec15640
commit 4bb004de94
9 changed files with 87 additions and 115 deletions

View File

@ -91,6 +91,7 @@ QMAKE_PREFIX_SHLIB =
QMAKE_EXTENSION_SHLIB = dll QMAKE_EXTENSION_SHLIB = dll
QMAKE_PREFIX_STATICLIB = lib QMAKE_PREFIX_STATICLIB = lib
QMAKE_EXTENSION_STATICLIB = a QMAKE_EXTENSION_STATICLIB = a
QMAKE_LIB_EXTENSIONS = a dll.a
QMAKE_LIBS = QMAKE_LIBS =
QMAKE_LIBS_CORE = -lole32 -luuid -lws2_32 -ladvapi32 -lshell32 -luser32 -lkernel32 QMAKE_LIBS_CORE = -lole32 -luuid -lws2_32 -ladvapi32 -lshell32 -luser32 -lkernel32

View File

@ -2729,6 +2729,22 @@ MakefileGenerator::fileInfo(QString file) const
return fi; return fi;
} }
MakefileGenerator::LibFlagType
MakefileGenerator::parseLibFlag(const ProString &flag, ProString *arg)
{
if (flag.startsWith("-L")) {
*arg = flag.mid(2);
return LibFlagPath;
}
if (flag.startsWith("-l")) {
*arg = flag.mid(2);
return LibFlagLib;
}
if (flag.startsWith('-'))
return LibFlagOther;
return LibFlagFile;
}
ProStringList ProStringList
MakefileGenerator::fixLibFlags(const ProKey &var) MakefileGenerator::fixLibFlags(const ProKey &var)
{ {

View File

@ -220,6 +220,8 @@ protected:
QString filePrefixRoot(const QString &, const QString &); QString filePrefixRoot(const QString &, const QString &);
enum LibFlagType { LibFlagLib, LibFlagPath, LibFlagFile, LibFlagOther };
virtual LibFlagType parseLibFlag(const ProString &flag, ProString *arg);
ProStringList fixLibFlags(const ProKey &var); ProStringList fixLibFlags(const ProKey &var);
virtual ProString fixLibFlag(const ProString &lib); virtual ProString fixLibFlag(const ProString &lib);

View File

@ -62,84 +62,21 @@ QString MingwMakefileGenerator::getManifestFileForRcFile() const
ProString MingwMakefileGenerator::fixLibFlag(const ProString &lib) ProString MingwMakefileGenerator::fixLibFlag(const ProString &lib)
{ {
if (lib.startsWith("lib")) if (lib.startsWith("-l")) // Fallback for unresolved -l libs.
return QStringLiteral("-l") + escapeFilePath(lib.mid(3)); return QLatin1String("-l") + escapeFilePath(lib.mid(2));
return escapeFilePath(lib); if (lib.startsWith("-L")) // Lib search path. Needed only by -l above.
return QLatin1String("-L")
+ escapeFilePath(Option::fixPathToTargetOS(lib.mid(2).toQString(), false));
if (lib.startsWith("lib")) // Fallback for unresolved MSVC-style libs.
return QLatin1String("-l") + escapeFilePath(lib.mid(3).toQString());
return escapeFilePath(Option::fixPathToTargetOS(lib.toQString(), false));
} }
bool MingwMakefileGenerator::findLibraries(bool linkPrl, bool mergeLflags) MakefileGenerator::LibFlagType
MingwMakefileGenerator::parseLibFlag(const ProString &flag, ProString *arg)
{ {
QList<QMakeLocalFileName> dirs; // Skip MSVC handling from Win32MakefileGenerator
static const char * const lflags[] = { "QMAKE_LIBS", "QMAKE_LIBS_PRIVATE", 0 }; return MakefileGenerator::parseLibFlag(flag, arg);
static const QLatin1String extens[] =
{ QLatin1String(".dll.a"), QLatin1String(".a"), QLatin1String(0) };
for (int i = 0; lflags[i]; i++) {
ProStringList &l = project->values(lflags[i]);
ProStringList::Iterator it = l.begin();
while (it != l.end()) {
if ((*it).startsWith("-l")) {
QString steam = (*it).mid(2).toQString();
ProString verovr =
project->first(ProKey("QMAKE_" + steam.toUpper() + "_VERSION_OVERRIDE"));
for (QList<QMakeLocalFileName>::Iterator dir_it = dirs.begin(); dir_it != dirs.end(); ++dir_it) {
QString cand = (*dir_it).real() + Option::dir_sep + steam;
if (linkPrl && processPrlFile(cand)) {
(*it) = cand;
goto found;
}
QString libBase = (*dir_it).local() + '/' + steam + verovr;
for (int e = 0; extens[e].data(); e++) {
if (exists(libBase + extens[e])) {
(*it) = cand + verovr + extens[e];
goto found;
}
}
}
// We assume if it never finds it that its correct
found: ;
} else if ((*it).startsWith("-L")) {
QMakeLocalFileName f((*it).mid(2).toQString());
dirs.append(f);
*it = "-L" + f.real();
} else if (linkPrl && !(*it).startsWith('-')) {
QString prl = (*it).toQString();
if (fileInfo(prl).isAbsolute()) {
if (processPrlFile(prl))
(*it) = prl;
} else {
for (QList<QMakeLocalFileName>::Iterator dir_it = dirs.begin(); dir_it != dirs.end(); ++dir_it) {
QString cand = (*dir_it).real() + Option::dir_sep + prl;
if (processPrlFile(cand)) {
(*it) = cand;
break;
}
}
}
}
ProStringList &prl_libs = project->values("QMAKE_CURRENT_PRL_LIBS");
for (int prl = 0; prl < prl_libs.size(); ++prl)
it = l.insert(++it, prl_libs.at(prl));
prl_libs.clear();
++it;
}
if (mergeLflags) {
ProStringList lopts;
for (int lit = 0; lit < l.size(); ++lit) {
ProString opt = l.at(lit);
if (opt.startsWith("-L")) {
if (!lopts.contains(opt))
lopts.append(opt);
} else {
// Make sure we keep the dependency order of libraries
lopts.removeAll(opt);
lopts.append(opt);
}
}
l = lopts;
}
}
return true;
} }
bool MingwMakefileGenerator::writeMakefile(QTextStream &t) bool MingwMakefileGenerator::writeMakefile(QTextStream &t)
@ -250,8 +187,6 @@ void MingwMakefileGenerator::init()
project->values("TARGET_PRL").append(project->first("TARGET")); project->values("TARGET_PRL").append(project->first("TARGET"));
project->values("QMAKE_L_FLAG") << "-L";
processVars(); processVars();
project->values("QMAKE_LIBS") += project->values("RES_FILE"); project->values("QMAKE_LIBS") += project->values("RES_FILE");

View File

@ -62,7 +62,7 @@ private:
QString preCompHeaderOut; QString preCompHeaderOut;
virtual bool findLibraries(bool linkPrl, bool mergeLflags); virtual LibFlagType parseLibFlag(const ProString &flag, ProString *arg);
QString objectsLinkLine; QString objectsLinkLine;
}; };

View File

@ -368,8 +368,6 @@ void NmakeMakefileGenerator::init()
return; return;
} }
project->values("QMAKE_L_FLAG") << "/LIBPATH:";
processVars(); processVars();
project->values("QMAKE_LIBS") += project->values("RES_FILE"); project->values("QMAKE_LIBS") += project->values("RES_FILE");

View File

@ -809,8 +809,6 @@ void VcprojGenerator::init()
else if (project->first("TEMPLATE") == "vclib") else if (project->first("TEMPLATE") == "vclib")
project->values("QMAKE_LIB_FLAG").append("1"); project->values("QMAKE_LIB_FLAG").append("1");
project->values("QMAKE_L_FLAG") << "/LIBPATH:";
processVars(); processVars();
// set /VERSION for EXE/DLL header // set /VERSION for EXE/DLL header

View File

@ -51,43 +51,61 @@ Win32MakefileGenerator::Win32MakefileGenerator() : MakefileGenerator()
ProString Win32MakefileGenerator::fixLibFlag(const ProString &lib) ProString Win32MakefileGenerator::fixLibFlag(const ProString &lib)
{ {
if (lib.startsWith("/LIBPATH:")) if (lib.startsWith("-l")) // Fallback for unresolved -l libs.
return escapeFilePath(lib.mid(2) + QLatin1String(".lib"));
if (lib.startsWith("-L")) // Lib search path. Needed only by -l above.
return QLatin1String("/LIBPATH:") return QLatin1String("/LIBPATH:")
+ escapeFilePath(Option::fixPathToTargetOS(lib.mid(9).toQString(), false)); + escapeFilePath(Option::fixPathToTargetOS(lib.mid(2).toQString(), false));
// This must be a fully resolved library path.
return escapeFilePath(Option::fixPathToTargetOS(lib.toQString(), false)); return escapeFilePath(Option::fixPathToTargetOS(lib.toQString(), false));
} }
MakefileGenerator::LibFlagType
Win32MakefileGenerator::parseLibFlag(const ProString &flag, ProString *arg)
{
LibFlagType ret = MakefileGenerator::parseLibFlag(flag, arg);
if (ret != LibFlagFile)
return ret;
// MSVC compatibility. This should be deprecated.
if (flag.startsWith("/LIBPATH:")) {
*arg = flag.mid(9);
return LibFlagPath;
}
// These are pure qmake inventions. They *really* should be deprecated.
if (flag.startsWith("/L")) {
*arg = flag.mid(2);
return LibFlagPath;
}
if (flag.startsWith("/l")) {
*arg = flag.mid(2);
return LibFlagLib;
}
return LibFlagFile;
}
bool bool
Win32MakefileGenerator::findLibraries(bool linkPrl, bool mergeLflags) Win32MakefileGenerator::findLibraries(bool linkPrl, bool mergeLflags)
{ {
ProStringList impexts = project->values("QMAKE_LIB_EXTENSIONS");
if (impexts.isEmpty())
impexts = project->values("QMAKE_EXTENSION_STATICLIB");
QList<QMakeLocalFileName> dirs; QList<QMakeLocalFileName> dirs;
static const char * const lflags[] = { "QMAKE_LIBS", "QMAKE_LIBS_PRIVATE", 0 }; static const char * const lflags[] = { "QMAKE_LIBS", "QMAKE_LIBS_PRIVATE", 0 };
for (int i = 0; lflags[i]; i++) { for (int i = 0; lflags[i]; i++) {
ProStringList &l = project->values(lflags[i]); ProStringList &l = project->values(lflags[i]);
for (ProStringList::Iterator it = l.begin(); it != l.end();) { for (ProStringList::Iterator it = l.begin(); it != l.end();) {
QString opt = (*it).toQString(); const ProString &opt = *it;
if(opt.startsWith("/LIBPATH:")) { ProString arg;
QString libpath = opt.mid(9); LibFlagType type = parseLibFlag(opt, &arg);
QMakeLocalFileName lp(libpath); if (type == LibFlagPath) {
QMakeLocalFileName lp(arg.toQString());
if (dirs.contains(lp)) { if (dirs.contains(lp)) {
it = l.erase(it); it = l.erase(it);
continue; continue;
} }
dirs.append(lp); dirs.append(lp);
(*it) = "/LIBPATH:" + lp.real(); (*it) = "-L" + lp.real();
} else if(opt.startsWith("-L") || opt.startsWith("/L")) { } else if (type == LibFlagLib) {
QString libpath = Option::fixPathToTargetOS(opt.mid(2), false, false); QString lib = arg.toQString();
QMakeLocalFileName lp(libpath);
if (dirs.contains(lp)) {
it = l.erase(it);
continue;
}
dirs.append(lp);
(*it) = "/LIBPATH:" + lp.real();
} else if(opt.startsWith("-l") || opt.startsWith("/l")) {
QString lib = opt.mid(2);
ProString verovr = ProString verovr =
project->first(ProKey("QMAKE_" + lib.toUpper() + "_VERSION_OVERRIDE")); project->first(ProKey("QMAKE_" + lib.toUpper() + "_VERSION_OVERRIDE"));
for (QList<QMakeLocalFileName>::Iterator dir_it = dirs.begin(); for (QList<QMakeLocalFileName>::Iterator dir_it = dirs.begin();
@ -97,22 +115,26 @@ Win32MakefileGenerator::findLibraries(bool linkPrl, bool mergeLflags)
(*it) = cand; (*it) = cand;
goto found; goto found;
} }
QString extension = verovr + ".lib"; QString libBase = (*dir_it).local() + '/' + lib + verovr;
if (exists((*dir_it).local() + '/' + lib + extension)) { for (ProStringList::ConstIterator extit = impexts.begin();
(*it) = cand + extension; extit != impexts.end(); ++extit) {
goto found; if (exists(libBase + '.' + *extit)) {
(*it) = cand + verovr + '.' + *extit;
goto found;
}
} }
} }
(*it) = lib + ".lib"; // We assume if it never finds it that it's correct
found: ; found: ;
} else if (linkPrl) { } else if (linkPrl && type == LibFlagFile) {
if (fileInfo(opt).isAbsolute()) { QString lib = opt.toQString();
if (processPrlFile(opt)) if (fileInfo(lib).isAbsolute()) {
(*it) = opt; if (processPrlFile(lib))
(*it) = lib;
} else { } else {
for (QList<QMakeLocalFileName>::Iterator dir_it = dirs.begin(); for (QList<QMakeLocalFileName>::Iterator dir_it = dirs.begin();
dir_it != dirs.end(); ++dir_it) { dir_it != dirs.end(); ++dir_it) {
QString cand = (*dir_it).real() + Option::dir_sep + opt; QString cand = (*dir_it).real() + Option::dir_sep + lib;
if (processPrlFile(cand)) { if (processPrlFile(cand)) {
(*it) = cand; (*it) = cand;
break; break;
@ -131,7 +153,7 @@ Win32MakefileGenerator::findLibraries(bool linkPrl, bool mergeLflags)
ProStringList lopts; ProStringList lopts;
for (int lit = 0; lit < l.size(); ++lit) { for (int lit = 0; lit < l.size(); ++lit) {
ProString opt = l.at(lit); ProString opt = l.at(lit);
if (opt.startsWith("/LIBPATH:")) { if (opt.startsWith(QLatin1String("-L"))) {
if (!lopts.contains(opt)) if (!lopts.contains(opt))
lopts.append(opt); lopts.append(opt);
} else { } else {
@ -174,7 +196,6 @@ void Win32MakefileGenerator::processVars()
fixTargetExt(); fixTargetExt();
processRcFileVar(); processRcFileVar();
ProString libArg = project->first("QMAKE_L_FLAG");
ProStringList libs; ProStringList libs;
ProStringList &libDir = project->values("QMAKE_LIBDIR"); ProStringList &libDir = project->values("QMAKE_LIBDIR");
for (ProStringList::Iterator libDir_it = libDir.begin(); libDir_it != libDir.end(); ++libDir_it) { for (ProStringList::Iterator libDir_it = libDir.begin(); libDir_it != libDir.end(); ++libDir_it) {
@ -182,7 +203,7 @@ void Win32MakefileGenerator::processVars()
if (!lib.isEmpty()) { if (!lib.isEmpty()) {
if (lib.endsWith('\\')) if (lib.endsWith('\\'))
lib.chop(1); lib.chop(1);
libs << libArg + Option::fixPathToTargetOS(lib, false, false); libs << QLatin1String("-L") + lib;
} }
} }
project->values("QMAKE_LIBS") += libs + project->values("LIBS"); project->values("QMAKE_LIBS") += libs + project->values("LIBS");

View File

@ -59,6 +59,7 @@ protected:
virtual bool findLibraries(bool linkPrl, bool mergeLflags); virtual bool findLibraries(bool linkPrl, bool mergeLflags);
virtual LibFlagType parseLibFlag(const ProString &flag, ProString *arg);
virtual ProString fixLibFlag(const ProString &lib); virtual ProString fixLibFlag(const ProString &lib);
void processVars(); void processVars();