From 4bb004de94380304d8950e860d1823975927ec59 Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Wed, 23 Sep 2015 14:57:05 +0200 Subject: 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 --- qmake/generators/makefile.cpp | 16 ++++++ qmake/generators/makefile.h | 2 + qmake/generators/win32/mingw_make.cpp | 89 +++++----------------------------- qmake/generators/win32/mingw_make.h | 2 +- qmake/generators/win32/msvc_nmake.cpp | 2 - qmake/generators/win32/msvc_vcproj.cpp | 2 - qmake/generators/win32/winmakefile.cpp | 87 ++++++++++++++++++++------------- qmake/generators/win32/winmakefile.h | 1 + 8 files changed, 86 insertions(+), 115 deletions(-) (limited to 'qmake/generators') diff --git a/qmake/generators/makefile.cpp b/qmake/generators/makefile.cpp index f5c3939eaf..7506678b0d 100644 --- a/qmake/generators/makefile.cpp +++ b/qmake/generators/makefile.cpp @@ -2729,6 +2729,22 @@ MakefileGenerator::fileInfo(QString file) const 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 MakefileGenerator::fixLibFlags(const ProKey &var) { diff --git a/qmake/generators/makefile.h b/qmake/generators/makefile.h index 8aec360147..61b8f9ac60 100644 --- a/qmake/generators/makefile.h +++ b/qmake/generators/makefile.h @@ -220,6 +220,8 @@ protected: 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); virtual ProString fixLibFlag(const ProString &lib); diff --git a/qmake/generators/win32/mingw_make.cpp b/qmake/generators/win32/mingw_make.cpp index fc21dd4dd2..97bfef88a4 100644 --- a/qmake/generators/win32/mingw_make.cpp +++ b/qmake/generators/win32/mingw_make.cpp @@ -62,84 +62,21 @@ QString MingwMakefileGenerator::getManifestFileForRcFile() const ProString MingwMakefileGenerator::fixLibFlag(const ProString &lib) { - if (lib.startsWith("lib")) - return QStringLiteral("-l") + escapeFilePath(lib.mid(3)); - return escapeFilePath(lib); + if (lib.startsWith("-l")) // Fallback for unresolved -l libs. + return QLatin1String("-l") + escapeFilePath(lib.mid(2)); + 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 dirs; - static const char * const lflags[] = { "QMAKE_LIBS", "QMAKE_LIBS_PRIVATE", 0 }; - 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::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::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; + // Skip MSVC handling from Win32MakefileGenerator + return MakefileGenerator::parseLibFlag(flag, arg); } bool MingwMakefileGenerator::writeMakefile(QTextStream &t) @@ -250,8 +187,6 @@ void MingwMakefileGenerator::init() project->values("TARGET_PRL").append(project->first("TARGET")); - project->values("QMAKE_L_FLAG") << "-L"; - processVars(); project->values("QMAKE_LIBS") += project->values("RES_FILE"); diff --git a/qmake/generators/win32/mingw_make.h b/qmake/generators/win32/mingw_make.h index 9a30bc8ea6..4e94a23ae2 100644 --- a/qmake/generators/win32/mingw_make.h +++ b/qmake/generators/win32/mingw_make.h @@ -62,7 +62,7 @@ private: QString preCompHeaderOut; - virtual bool findLibraries(bool linkPrl, bool mergeLflags); + virtual LibFlagType parseLibFlag(const ProString &flag, ProString *arg); QString objectsLinkLine; }; diff --git a/qmake/generators/win32/msvc_nmake.cpp b/qmake/generators/win32/msvc_nmake.cpp index 9c34b187bf..31a9c53c90 100644 --- a/qmake/generators/win32/msvc_nmake.cpp +++ b/qmake/generators/win32/msvc_nmake.cpp @@ -368,8 +368,6 @@ void NmakeMakefileGenerator::init() return; } - project->values("QMAKE_L_FLAG") << "/LIBPATH:"; - processVars(); project->values("QMAKE_LIBS") += project->values("RES_FILE"); diff --git a/qmake/generators/win32/msvc_vcproj.cpp b/qmake/generators/win32/msvc_vcproj.cpp index ae4fcfd482..f3155b467d 100644 --- a/qmake/generators/win32/msvc_vcproj.cpp +++ b/qmake/generators/win32/msvc_vcproj.cpp @@ -809,8 +809,6 @@ void VcprojGenerator::init() else if (project->first("TEMPLATE") == "vclib") project->values("QMAKE_LIB_FLAG").append("1"); - project->values("QMAKE_L_FLAG") << "/LIBPATH:"; - processVars(); // set /VERSION for EXE/DLL header diff --git a/qmake/generators/win32/winmakefile.cpp b/qmake/generators/win32/winmakefile.cpp index 45e967510c..e6bf3388fa 100644 --- a/qmake/generators/win32/winmakefile.cpp +++ b/qmake/generators/win32/winmakefile.cpp @@ -51,43 +51,61 @@ Win32MakefileGenerator::Win32MakefileGenerator() : MakefileGenerator() 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:") - + escapeFilePath(Option::fixPathToTargetOS(lib.mid(9).toQString(), false)); - - // This must be a fully resolved library path. + + escapeFilePath(Option::fixPathToTargetOS(lib.mid(2).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 Win32MakefileGenerator::findLibraries(bool linkPrl, bool mergeLflags) { + ProStringList impexts = project->values("QMAKE_LIB_EXTENSIONS"); + if (impexts.isEmpty()) + impexts = project->values("QMAKE_EXTENSION_STATICLIB"); QList dirs; static const char * const lflags[] = { "QMAKE_LIBS", "QMAKE_LIBS_PRIVATE", 0 }; for (int i = 0; lflags[i]; i++) { ProStringList &l = project->values(lflags[i]); for (ProStringList::Iterator it = l.begin(); it != l.end();) { - QString opt = (*it).toQString(); - if(opt.startsWith("/LIBPATH:")) { - QString libpath = opt.mid(9); - QMakeLocalFileName lp(libpath); + const ProString &opt = *it; + ProString arg; + LibFlagType type = parseLibFlag(opt, &arg); + if (type == LibFlagPath) { + QMakeLocalFileName lp(arg.toQString()); 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 libpath = Option::fixPathToTargetOS(opt.mid(2), false, false); - 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); + (*it) = "-L" + lp.real(); + } else if (type == LibFlagLib) { + QString lib = arg.toQString(); ProString verovr = project->first(ProKey("QMAKE_" + lib.toUpper() + "_VERSION_OVERRIDE")); for (QList::Iterator dir_it = dirs.begin(); @@ -97,22 +115,26 @@ Win32MakefileGenerator::findLibraries(bool linkPrl, bool mergeLflags) (*it) = cand; goto found; } - QString extension = verovr + ".lib"; - if (exists((*dir_it).local() + '/' + lib + extension)) { - (*it) = cand + extension; - goto found; + QString libBase = (*dir_it).local() + '/' + lib + verovr; + for (ProStringList::ConstIterator extit = impexts.begin(); + extit != impexts.end(); ++extit) { + 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: ; - } else if (linkPrl) { - if (fileInfo(opt).isAbsolute()) { - if (processPrlFile(opt)) - (*it) = opt; + } else if (linkPrl && type == LibFlagFile) { + QString lib = opt.toQString(); + if (fileInfo(lib).isAbsolute()) { + if (processPrlFile(lib)) + (*it) = lib; } else { for (QList::Iterator dir_it = dirs.begin(); 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)) { (*it) = cand; break; @@ -131,7 +153,7 @@ Win32MakefileGenerator::findLibraries(bool linkPrl, bool mergeLflags) ProStringList lopts; for (int lit = 0; lit < l.size(); ++lit) { ProString opt = l.at(lit); - if (opt.startsWith("/LIBPATH:")) { + if (opt.startsWith(QLatin1String("-L"))) { if (!lopts.contains(opt)) lopts.append(opt); } else { @@ -174,7 +196,6 @@ void Win32MakefileGenerator::processVars() fixTargetExt(); processRcFileVar(); - ProString libArg = project->first("QMAKE_L_FLAG"); ProStringList libs; ProStringList &libDir = project->values("QMAKE_LIBDIR"); 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.endsWith('\\')) lib.chop(1); - libs << libArg + Option::fixPathToTargetOS(lib, false, false); + libs << QLatin1String("-L") + lib; } } project->values("QMAKE_LIBS") += libs + project->values("LIBS"); diff --git a/qmake/generators/win32/winmakefile.h b/qmake/generators/win32/winmakefile.h index ba1821e819..54c4d3be53 100644 --- a/qmake/generators/win32/winmakefile.h +++ b/qmake/generators/win32/winmakefile.h @@ -59,6 +59,7 @@ protected: virtual bool findLibraries(bool linkPrl, bool mergeLflags); + virtual LibFlagType parseLibFlag(const ProString &flag, ProString *arg); virtual ProString fixLibFlag(const ProString &lib); void processVars(); -- cgit v1.2.3