diff options
Diffstat (limited to 'qmake/generators')
26 files changed, 451 insertions, 467 deletions
diff --git a/qmake/generators/mac/pbuilder_pbx.cpp b/qmake/generators/mac/pbuilder_pbx.cpp index a0aea70dc5..5407ed6c69 100644 --- a/qmake/generators/mac/pbuilder_pbx.cpp +++ b/qmake/generators/mac/pbuilder_pbx.cpp @@ -542,6 +542,10 @@ ProjectBuilderMakefileGenerator::writeMakeParts(QTextStream &t) QTextStream mkt(&mkf); writeHeader(mkt); mkt << "QMAKE = " << var("QMAKE_QMAKE") << endl; + project->values("QMAKE_MAKE_QMAKE_EXTRA_COMMANDS") + << "@echo 'warning: Xcode project has been regenerated, custom settings have been lost. " \ + "Use CONFIG+=no_autoqmake to prevent this behavior in the future, " \ + "at the cost of requiring manual project change tracking.'"; writeMakeQmake(mkt); mkt.flush(); mkf.close(); @@ -825,7 +829,8 @@ ProjectBuilderMakefileGenerator::writeMakeParts(QTextStream &t) if(!project->isActiveConfig("staticlib")) { //DUMP LIBRARIES ProStringList &libdirs = project->values("QMAKE_PBX_LIBPATHS"), &frameworkdirs = project->values("QMAKE_FRAMEWORKPATH"); - static const char * const libs[] = { "QMAKE_LIBS", "QMAKE_LIBS_PRIVATE", 0 }; + static const char * const libs[] = { "LIBS", "LIBS_PRIVATE", + "QMAKE_LIBS", "QMAKE_LIBS_PRIVATE", nullptr }; for (int i = 0; libs[i]; i++) { tmp = project->values(libs[i]); for(int x = 0; x < tmp.count();) { @@ -848,7 +853,8 @@ ProjectBuilderMakefileGenerator::writeMakeParts(QTextStream &t) encode the version number in the Project file which might be a bad things in days to come? --Sam */ - QString lib_file = QMakeMetaInfo::findLib(Option::normalizePath((*lit) + Option::dir_sep + lib)); + QString lib_file = QMakeMetaInfo::checkLib(Option::normalizePath( + (*lit) + Option::dir_sep + lib + Option::prl_ext)); if (!lib_file.isEmpty()) { QMakeMetaInfo libinfo(project); if(libinfo.readLib(lib_file)) { @@ -1417,7 +1423,7 @@ ProjectBuilderMakefileGenerator::writeMakeParts(QTextStream &t) testHost.append("Contents/MacOS/"); testHost.append(targetName); - static const char * const configs[] = { "Debug", "Release", 0 }; + static const char * const configs[] = { "Debug", "Release", nullptr }; for (int i = 0; configs[i]; i++) { QString testBundleBuildConfig = keyFor(pbx_dir + "QMAKE_PBX_TEST_BUNDLE_BUILDCONFIG_" + configs[i]); t << "\t\t" << testBundleBuildConfig << " = {\n" @@ -1690,6 +1696,8 @@ ProjectBuilderMakefileGenerator::writeMakeParts(QTextStream &t) t << "\t\t\t\t" << writeSettings("OTHER_LDFLAGS", fixListForOutput("SUBLIBS") + fixListForOutput("QMAKE_LFLAGS") + + fixListForOutput(fixLibFlags("LIBS")) + + fixListForOutput(fixLibFlags("LIBS_PRIVATE")) + fixListForOutput(fixLibFlags("QMAKE_LIBS")) + fixListForOutput(fixLibFlags("QMAKE_LIBS_PRIVATE")), SettingsAsList, 6) << ";\n"; @@ -1782,6 +1790,7 @@ ProjectBuilderMakefileGenerator::writeMakeParts(QTextStream &t) schemeData.replace(QLatin1String("@QMAKE_ORIG_TARGET@"), target); schemeData.replace(QLatin1String("@TARGET_PBX_KEY@"), keyFor(pbx_dir + "QMAKE_PBX_TARGET")); schemeData.replace(QLatin1String("@TEST_BUNDLE_PBX_KEY@"), keyFor("QMAKE_TEST_BUNDLE_REFERENCE")); + schemeData.replace(QLatin1String("@QMAKE_RELATIVE_PBX_DIR@"), fileFixify(pbx_dir)); QTextStream outputSchemeStream(&outputSchemeFile); outputSchemeStream << schemeData; @@ -1876,33 +1885,28 @@ ProjectBuilderMakefileGenerator::keyFor(const QString &block) bool ProjectBuilderMakefileGenerator::openOutput(QFile &file, const QString &build) const { - if(QDir::isRelativePath(file.fileName())) - file.setFileName(Option::output_dir + "/" + file.fileName()); //pwd when qmake was run + Q_ASSERT_X(QDir::isRelativePath(file.fileName()), "ProjectBuilderMakefileGenerator", + "runQMake() should have normalized the filename and made it relative"); + QFileInfo fi(fileInfo(file.fileName())); - if(fi.suffix() != "pbxproj" || file.fileName().isEmpty()) { + if (fi.suffix() != "pbxproj") { QString output = file.fileName(); - if(fi.isDir()) - output += QDir::separator(); - if(!output.endsWith(projectSuffix())) { - if(file.fileName().isEmpty() || fi.isDir()) { - if(project->first("TEMPLATE") == "subdirs" || project->isEmpty("QMAKE_ORIG_TARGET")) + if (!output.endsWith(projectSuffix())) { + if (fi.fileName().isEmpty()) { + if (project->first("TEMPLATE") == "subdirs" || project->isEmpty("QMAKE_ORIG_TARGET")) output += fileInfo(project->projectFile()).baseName(); else output += project->first("QMAKE_ORIG_TARGET").toQString(); } output += projectSuffix() + QDir::separator(); - } else if(output[(int)output.length() - 1] != QDir::separator()) { + } else { output += QDir::separator(); } output += QString("project.pbxproj"); file.setFileName(output); - bool ret = UnixMakefileGenerator::openOutput(file, build); - ((ProjectBuilderMakefileGenerator*)this)->pbx_dir = Option::output_dir.section(Option::dir_sep, 0, -1); - Option::output_dir = pbx_dir.section(Option::dir_sep, 0, -2); - return ret; } - ((ProjectBuilderMakefileGenerator*)this)->pbx_dir = Option::output_dir; + pbx_dir = Option::output_dir + Option::dir_sep + file.fileName().section(Option::dir_sep, 0, 0); return UnixMakefileGenerator::openOutput(file, build); } diff --git a/qmake/generators/mac/pbuilder_pbx.h b/qmake/generators/mac/pbuilder_pbx.h index 1d5cbc538d..f15c814cb4 100644 --- a/qmake/generators/mac/pbuilder_pbx.h +++ b/qmake/generators/mac/pbuilder_pbx.h @@ -36,11 +36,11 @@ QT_BEGIN_NAMESPACE class ProjectBuilderMakefileGenerator : public UnixMakefileGenerator { bool writingUnixMakefileGenerator; - QString pbx_dir; + mutable QString pbx_dir; int pbuilderVersion() const; bool writeSubDirs(QTextStream &); bool writeMakeParts(QTextStream &); - bool writeMakefile(QTextStream &); + bool writeMakefile(QTextStream &) override; QString pbxbuild(); QHash<QString, QString> keys; @@ -64,11 +64,11 @@ public: ProjectBuilderMakefileGenerator(); ~ProjectBuilderMakefileGenerator(); - virtual bool supportsMetaBuild() { return false; } - virtual bool openOutput(QFile &, const QString &) const; + bool supportsMetaBuild() override { return false; } + bool openOutput(QFile &, const QString &) const override; protected: - bool doPrecompiledHeaders() const { return false; } - virtual bool doDepends() const { return writingUnixMakefileGenerator && UnixMakefileGenerator::doDepends(); } + bool doPrecompiledHeaders() const override { return false; } + bool doDepends() const override { return writingUnixMakefileGenerator && UnixMakefileGenerator::doDepends(); } }; inline ProjectBuilderMakefileGenerator::~ProjectBuilderMakefileGenerator() diff --git a/qmake/generators/makefile.cpp b/qmake/generators/makefile.cpp index 73e09a1025..e41e391cad 100644 --- a/qmake/generators/makefile.cpp +++ b/qmake/generators/makefile.cpp @@ -96,7 +96,7 @@ bool MakefileGenerator::mkdir(const QString &in_path) const // ** base makefile generator MakefileGenerator::MakefileGenerator() : - no_io(false), project(0) + no_io(false), project(nullptr) { } @@ -164,7 +164,7 @@ MakefileGenerator::initOutPaths() v["PRECOMPILED_DIR"] = v["OBJECTS_DIR"]; static const char * const dirs[] = { "OBJECTS_DIR", "DESTDIR", "SUBLIBS_DIR", "DLLDESTDIR", - "PRECOMPILED_DIR", 0 }; + "PRECOMPILED_DIR", nullptr }; for (int x = 0; dirs[x]; x++) { const ProKey dkey(dirs[x]); if (v[dkey].isEmpty()) @@ -424,7 +424,7 @@ MakefileGenerator::init() } incs.append(project->specDir()); - const char * const cacheKeys[] = { "_QMAKE_STASH_", "_QMAKE_SUPER_CACHE_", 0 }; + const char * const cacheKeys[] = { "_QMAKE_STASH_", "_QMAKE_SUPER_CACHE_", nullptr }; for (int i = 0; cacheKeys[i]; ++i) { if (v[cacheKeys[i]].isEmpty()) continue; @@ -614,7 +614,7 @@ MakefileGenerator::init() //build up a list of compilers QVector<Compiler> compilers; { - const char *builtins[] = { "OBJECTS", "SOURCES", "PRECOMPILED_HEADER", 0 }; + const char *builtins[] = { "OBJECTS", "SOURCES", "PRECOMPILED_HEADER", nullptr }; for(x = 0; builtins[x]; ++x) { Compiler compiler; compiler.variable_in = builtins[x]; @@ -829,7 +829,7 @@ MakefileGenerator::init() } //fix up the target deps - static const char * const fixpaths[] = { "PRE_TARGETDEPS", "POST_TARGETDEPS", 0 }; + static const char * const fixpaths[] = { "PRE_TARGETDEPS", "POST_TARGETDEPS", nullptr }; for (int path = 0; fixpaths[path]; path++) { ProStringList &l = v[fixpaths[path]]; for (ProStringList::Iterator val_it = l.begin(); val_it != l.end(); ++val_it) { @@ -876,20 +876,37 @@ MakefileGenerator::init() } bool -MakefileGenerator::processPrlFile(QString &file) +MakefileGenerator::processPrlFile(QString &file, bool baseOnly) { - bool try_replace_file = false; QString f = fileFixify(file, FileFixifyBackwards); - QString meta_file = QMakeMetaInfo::findLib(f); - if (!meta_file.isEmpty()) { - try_replace_file = true; - } else { - QString tmp = f; - int ext = tmp.lastIndexOf('.'); - if(ext != -1) - tmp = tmp.left(ext); - meta_file = QMakeMetaInfo::findLib(tmp); + // Explicitly given full .prl name + if (!baseOnly && f.endsWith(Option::prl_ext)) + return processPrlFileCore(file, QStringRef(), f); + // Explicitly given or derived (from -l) base name + if (processPrlFileCore(file, QStringRef(), f + Option::prl_ext)) + return true; + if (!baseOnly) { + // Explicitly given full library name + int off = qMax(f.lastIndexOf('/'), f.lastIndexOf('\\')) + 1; + int ext = f.midRef(off).lastIndexOf('.'); + if (ext != -1) + return processPrlFileBase(file, f.midRef(off), f.leftRef(off + ext), off); } + return false; +} + +bool +MakefileGenerator::processPrlFileBase(QString &origFile, const QStringRef &origName, + const QStringRef &fixedBase, int slashOff) +{ + return processPrlFileCore(origFile, origName, fixedBase + Option::prl_ext); +} + +bool +MakefileGenerator::processPrlFileCore(QString &origFile, const QStringRef &origName, + const QString &fixedFile) +{ + const QString meta_file = QMakeMetaInfo::checkLib(fixedFile); if (meta_file.isEmpty()) return false; QMakeMetaInfo libinfo(project); @@ -898,9 +915,33 @@ MakefileGenerator::processPrlFile(QString &file) fprintf(stderr, "Error processing meta file %s\n", meta_file.toLatin1().constData()); return false; } - if (project->isActiveConfig("no_read_prl_" + libinfo.type().toLower())) { - debug_msg(2, "Ignored meta file %s [%s]", - meta_file.toLatin1().constData(), libinfo.type().toLatin1().constData()); + if (project->isActiveConfig("no_read_prl_qmake")) { + debug_msg(2, "Ignored meta file %s", meta_file.toLatin1().constData()); + return false; + } + ProString tgt = libinfo.first("QMAKE_PRL_TARGET"); + if (tgt.isEmpty()) { + fprintf(stderr, "Error: %s does not define QMAKE_PRL_TARGET\n", + meta_file.toLatin1().constData()); + return false; + } + if (!tgt.contains('.') && !libinfo.values("QMAKE_PRL_CONFIG").contains("lib_bundle")) { + fprintf(stderr, "Error: %s defines QMAKE_PRL_TARGET without extension\n", + meta_file.toLatin1().constData()); + return false; + } + if (origName.isEmpty()) { + // We got a .prl file as input, replace it with an actual library. + int off = qMax(origFile.lastIndexOf('/'), origFile.lastIndexOf('\\')) + 1; + debug_msg(1, " Replacing library reference %s with %s", + origFile.mid(off).toLatin1().constData(), + tgt.toQString().toLatin1().constData()); + origFile.replace(off, 1000, tgt.toQString()); + } else if (tgt != origName) { + // We got an actual library as input, and found the wrong .prl for it. + debug_msg(2, "Mismatched meta file %s (want %s, got %s)", + meta_file.toLatin1().constData(), + origName.toLatin1().constData(), tgt.toLatin1().constData()); return false; } project->values("QMAKE_CURRENT_PRL_LIBS") = libinfo.values("QMAKE_PRL_LIBS"); @@ -909,23 +950,6 @@ MakefileGenerator::processPrlFile(QString &file) for (const ProString &def : libinfo.values("QMAKE_PRL_DEFINES")) if (!defs.contains(def) && prl_defs.contains(def)) defs.append(def); - if (try_replace_file) { - ProString tgt = libinfo.first("QMAKE_PRL_TARGET"); - if (tgt.isEmpty()) { - fprintf(stderr, "Error: %s does not define QMAKE_PRL_TARGET\n", - meta_file.toLatin1().constData()); - } else if (!tgt.contains('.') - && !libinfo.values("QMAKE_PRL_CONFIG").contains("lib_bundle")) { - fprintf(stderr, "Error: %s defines QMAKE_PRL_TARGET without extension\n", - meta_file.toLatin1().constData()); - } else { - int off = qMax(file.lastIndexOf('/'), file.lastIndexOf('\\')) + 1; - debug_msg(1, " Replacing library reference %s with %s", - file.mid(off).toLatin1().constData(), - tgt.toQString().toLatin1().constData()); - file.replace(off, 1000, tgt.toQString()); - } - } QString mf = fileFixify(meta_file); if (!project->values("QMAKE_PRL_INTERNAL_FILES").contains(mf)) project->values("QMAKE_PRL_INTERNAL_FILES").append(mf); @@ -988,12 +1012,10 @@ MakefileGenerator::writePrlFile(QTextStream &t) t << "QMAKE_PRL_VERSION = " << project->first("VERSION") << endl; if(project->isActiveConfig("staticlib") || project->isActiveConfig("explicitlib")) { ProStringList libs; - if(!project->isEmpty("QMAKE_INTERNAL_PRL_LIBS")) - libs = project->values("QMAKE_INTERNAL_PRL_LIBS"); + if (!project->isActiveConfig("staticlib")) + libs << "LIBS" << "QMAKE_LIBS"; else - libs << "QMAKE_LIBS"; //obvious one - if(project->isActiveConfig("staticlib")) - libs << "QMAKE_LIBS_PRIVATE"; + libs << "LIBS" << "LIBS_PRIVATE" << "QMAKE_LIBS" << "QMAKE_LIBS_PRIVATE"; t << "QMAKE_PRL_LIBS ="; for (ProStringList::Iterator it = libs.begin(); it != libs.end(); ++it) t << qv(project->values((*it).toKey())); @@ -1078,18 +1100,7 @@ MakefileGenerator::write() QString MakefileGenerator::prlFileName(bool fixify) { - QString ret = project->first("TARGET_PRL").toQString(); - if(ret.isEmpty()) - ret = project->first("TARGET").toQString(); - int slsh = ret.lastIndexOf(Option::dir_sep); - if(slsh != -1) - ret.remove(0, slsh); - if(!ret.endsWith(Option::prl_ext)) { - int dot = ret.indexOf('.'); - if(dot != -1) - ret.truncate(dot); - ret += Option::prl_ext; - } + QString ret = project->first("PRL_TARGET") + Option::prl_ext; if(!project->isEmpty("QMAKE_BUNDLE")) ret.prepend(project->first("QMAKE_BUNDLE") + Option::dir_sep); if(fixify) { @@ -1815,12 +1826,27 @@ MakefileGenerator::writeExtraTargets(QTextStream &t) } } +static QStringList splitDeps(const QString &indeps, bool lineMode) +{ + if (!lineMode) + return indeps.simplified().split(' '); + QStringList deps = indeps.split('\n', QString::SkipEmptyParts); +#ifdef Q_OS_WIN + for (auto &dep : deps) { + if (dep.endsWith(QLatin1Char('\r'))) + dep.chop(1); + } +#endif + return deps; +} + void MakefileGenerator::writeExtraCompilerTargets(QTextStream &t) { QString clean_targets; const ProStringList &quc = project->values("QMAKE_EXTRA_COMPILERS"); for (ProStringList::ConstIterator it = quc.begin(); it != quc.end(); ++it) { + const ProStringList &config = project->values(ProKey(*it + ".CONFIG")); QString tmp_out = fileFixify(project->first(ProKey(*it + ".output")).toQString(), FileFixifyFromOutdir); const QString tmp_cmd = project->values(ProKey(*it + ".commands")).join(' '); @@ -1831,6 +1857,7 @@ MakefileGenerator::writeExtraCompilerTargets(QTextStream &t) + IoUtils::shellQuote(Option::fixPathToLocalOS(Option::output_dir, false)) + QLatin1String(" && "); } + const bool dep_lines = (config.indexOf("dep_lines") != -1); const ProStringList &vars = project->values(ProKey(*it + ".variables")); if(tmp_out.isEmpty() || tmp_cmd.isEmpty()) continue; @@ -1847,7 +1874,6 @@ MakefileGenerator::writeExtraCompilerTargets(QTextStream &t) } t << "compiler_" << (*it) << "_make_all:"; - const ProStringList &config = project->values(ProKey(*it + ".CONFIG")); if (config.indexOf("combine") != -1) { // compilers with a combined input only have one output QString input = project->first(ProKey(*it + ".output")).toQString(); @@ -1954,12 +1980,13 @@ MakefileGenerator::writeExtraCompilerTargets(QTextStream &t) QT_PCLOSE(proc); if(!indeps.isEmpty()) { QDir outDir(Option::output_dir); - // ### This is basically fubar. Add 'lines' flag to CONFIG? - QStringList dep_cmd_deps = indeps.replace('\n', ' ').simplified().split(' '); + QStringList dep_cmd_deps = splitDeps(indeps, dep_lines); for(int i = 0; i < dep_cmd_deps.count(); ++i) { QString &file = dep_cmd_deps[i]; QString absFile = outDir.absoluteFilePath(file); - if (exists(absFile)) { + if (absFile == file) { + // already absolute; don't do any checks. + } else if (exists(absFile)) { file = absFile; } else { QString localFile; @@ -1978,7 +2005,7 @@ MakefileGenerator::writeExtraCompilerTargets(QTextStream &t) " prints paths relative to source directory", (*it).toLatin1().constData()); else - file.clear(); + file = absFile; // fallback for generated resources } else { file = localFile; } @@ -2048,12 +2075,13 @@ MakefileGenerator::writeExtraCompilerTargets(QTextStream &t) QT_PCLOSE(proc); if(!indeps.isEmpty()) { QDir outDir(Option::output_dir); - // ### This is basically fubar. Add 'lines' flag to CONFIG? - QStringList dep_cmd_deps = indeps.replace('\n', ' ').simplified().split(' '); + QStringList dep_cmd_deps = splitDeps(indeps, dep_lines); for(int i = 0; i < dep_cmd_deps.count(); ++i) { QString &file = dep_cmd_deps[i]; QString absFile = outDir.absoluteFilePath(file); - if (exists(absFile)) { + if (absFile == file) { + // already absolute; don't do any checks. + } else if (exists(absFile)) { file = absFile; } else { QString localFile; @@ -2072,7 +2100,7 @@ MakefileGenerator::writeExtraCompilerTargets(QTextStream &t) " prints paths relative to source directory", (*it).toLatin1().constData()); else - file.clear(); + file = absFile; // fallback for generated resources } else { file = localFile; } @@ -2730,6 +2758,9 @@ MakefileGenerator::writeMakeQmake(QTextStream &t, bool noDummyQmakeAll) const ProStringList &included = escapeDependencyPaths(project->values("QMAKE_INTERNAL_INCLUDED_FILES")); t << included.join(QString(" \\\n\t\t")) << "\n\t" << qmake << endl; + const ProStringList &extraCommands = project->values("QMAKE_MAKE_QMAKE_EXTRA_COMMANDS"); + if (!extraCommands.isEmpty()) + t << "\t" << extraCommands.join(QString("\n\t")) << endl; for(int include = 0; include < included.size(); ++include) { const ProString &i = included.at(include); if(!i.isEmpty()) @@ -2746,7 +2777,7 @@ MakefileGenerator::writeMakeQmake(QTextStream &t, bool noDummyQmakeAll) QFileInfo MakefileGenerator::fileInfo(QString file) const { - static QHash<FileInfoCacheKey, QFileInfo> *cache = 0; + static QHash<FileInfoCacheKey, QFileInfo> *cache = nullptr; static QFileInfo noInfo = QFileInfo(); if(!cache) { cache = new QHash<FileInfoCacheKey, QFileInfo>; @@ -3132,54 +3163,31 @@ MakefileGenerator::specdir() bool MakefileGenerator::openOutput(QFile &file, const QString &build) const { - { - QString outdir; - if(!file.fileName().isEmpty()) { - if(QDir::isRelativePath(file.fileName())) - file.setFileName(Option::output_dir + "/" + file.fileName()); //pwd when qmake was run - QFileInfo fi(fileInfo(file.fileName())); - if(fi.isDir()) - outdir = file.fileName() + '/'; - } - if(!outdir.isEmpty() || file.fileName().isEmpty()) { - QString fname = "Makefile"; - if(!project->isEmpty("MAKEFILE")) - fname = project->first("MAKEFILE").toQString(); - file.setFileName(outdir + fname); - } - } - if(QDir::isRelativePath(file.fileName())) { - QString fname = Option::output_dir; //pwd when qmake was run - if(!fname.endsWith("/")) - fname += "/"; - fname += file.fileName(); - file.setFileName(fname); - } - if(!build.isEmpty()) + debug_msg(3, "asked to open output file '%s' in %s", + qPrintable(file.fileName()), qPrintable(Option::output_dir)); + + if (file.fileName().isEmpty()) { + file.setFileName(!project->isEmpty("MAKEFILE") + ? project->first("MAKEFILE").toQString() : "Makefile"); + } + + file.setFileName(QDir(Option::output_dir).absoluteFilePath(file.fileName())); + + if (!build.isEmpty()) file.setFileName(file.fileName() + "." + build); - if(project->isEmpty("QMAKE_MAKEFILE")) + + if (project->isEmpty("QMAKE_MAKEFILE")) project->values("QMAKE_MAKEFILE").append(file.fileName()); + + // Make required directories. Note that we do this based on the + // filename, not Option::output_dir, as the filename may include + // generator specific directories not included in output_dir. int slsh = file.fileName().lastIndexOf('/'); - if(slsh != -1) + if (slsh != -1) mkdir(file.fileName().left(slsh)); - if(file.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Truncate)) { - QFileInfo fi(fileInfo(Option::output.fileName())); - QString od; - if(fi.isSymLink()) - od = fileInfo(fi.readLink()).absolutePath(); - else - od = fi.path(); - od = QDir::fromNativeSeparators(od); - if(QDir::isRelativePath(od)) { - QString dir = Option::output_dir; - if (!dir.endsWith('/') && !od.isEmpty()) - dir += '/'; - od.prepend(dir); - } - Option::output_dir = od; - return true; - } - return false; + + debug_msg(3, "opening output file %s", qPrintable(file.fileName())); + return file.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Truncate); } QString @@ -3315,10 +3323,8 @@ MakefileGenerator::writePkgConfigFile() t << "Libs: "; QString pkgConfiglibName; if (target_mode == TARG_MAC_MODE && project->isActiveConfig("lib_bundle")) { - if (libDir != QLatin1String("/System/Library/Frameworks") - && libDir != QLatin1String("/Library/Frameworks")) { + if (libDir != QLatin1String("/Library/Frameworks")) t << "-F${libdir} "; - } ProString bundle; if (!project->isEmpty("QMAKE_FRAMEWORK_BUNDLE_NAME")) bundle = project->first("QMAKE_FRAMEWORK_BUNDLE_NAME"); @@ -3340,10 +3346,9 @@ MakefileGenerator::writePkgConfigFile() if (project->isActiveConfig("staticlib")) { ProStringList libs; - if (!project->isEmpty("QMAKE_INTERNAL_PRL_LIBS")) - libs = project->values("QMAKE_INTERNAL_PRL_LIBS"); - else - libs << "QMAKE_LIBS"; //obvious one + libs << "LIBS"; // FIXME: this should not be conditional on staticlib + libs << "LIBS_PRIVATE"; + libs << "QMAKE_LIBS"; // FIXME: this should not be conditional on staticlib libs << "QMAKE_LIBS_PRIVATE"; libs << "QMAKE_LFLAGS_THREAD"; //not sure about this one, but what about things like -pthread? t << "Libs.private:"; @@ -3363,6 +3368,10 @@ MakefileGenerator::writePkgConfigFile() ; if (!project->values("QMAKE_DEFAULT_INCDIRS").contains(includeDir)) t << "-I${includedir}"; + if (target_mode == TARG_MAC_MODE && project->isActiveConfig("lib_bundle") + && libDir != QLatin1String("/Library/Frameworks")) { + t << " -F${libdir}"; + } t << endl; // requires diff --git a/qmake/generators/makefile.h b/qmake/generators/makefile.h index f32bec650e..b5c150e1cb 100644 --- a/qmake/generators/makefile.h +++ b/qmake/generators/makefile.h @@ -124,9 +124,9 @@ protected: { return replaceExtraCompilerVariables(val, QStringList(in), QStringList(out), forShell); } //interface to the source file info - QMakeLocalFileName fixPathForFile(const QMakeLocalFileName &, bool); - QMakeLocalFileName findFileForDep(const QMakeLocalFileName &, const QMakeLocalFileName &); - QFileInfo findFileInfo(const QMakeLocalFileName &); + QMakeLocalFileName fixPathForFile(const QMakeLocalFileName &, bool) override; + QMakeLocalFileName findFileForDep(const QMakeLocalFileName &, const QMakeLocalFileName &) override; + QFileInfo findFileInfo(const QMakeLocalFileName &) override; QMakeProject *project; //escape @@ -172,7 +172,7 @@ protected: { int ret; canExecute(cmdline, &ret); return ret; } bool canExecute(const QStringList &cmdline, int *argv0) const; inline bool canExecute(const QString &cmdline) const - { return canExecute(cmdline.split(' '), 0); } + { return canExecute(cmdline.split(' '), nullptr); } bool mkdir(const QString &dir) const; QString mkdir_p_asstring(const QString &dir, bool escape=true) const; @@ -198,7 +198,7 @@ protected: //for prl QString prlFileName(bool fixify=true); void writePrlFile(); - bool processPrlFile(QString &); + bool processPrlFile(QString &, bool baseOnly); virtual void writePrlFile(QTextStream &); //make sure libraries are found @@ -246,9 +246,14 @@ protected: QString installMetaFile(const ProKey &replace_rule, const QString &src, const QString &dst); + virtual bool processPrlFileBase(QString &origFile, const QStringRef &origName, + const QStringRef &fixedBase, int slashOff); + bool processPrlFileCore(QString &origFile, const QStringRef &origName, + const QString &fixedFile); + public: MakefileGenerator(); - virtual ~MakefileGenerator(); + ~MakefileGenerator(); QMakeProject *projectFile() const; void setProjectFile(QMakeProject *p); diff --git a/qmake/generators/makefiledeps.cpp b/qmake/generators/makefiledeps.cpp index ffccdefbe1..decc1d980c 100644 --- a/qmake/generators/makefiledeps.cpp +++ b/qmake/generators/makefiledeps.cpp @@ -81,7 +81,7 @@ const QString struct SourceDependChildren; struct SourceFile { - SourceFile() : deps(0), type(QMakeSourceFileInfo::TYPE_UNKNOWN), + SourceFile() : deps(nullptr), type(QMakeSourceFileInfo::TYPE_UNKNOWN), mocable(0), traversed(0), exists(1), moc_checked(0), dep_checked(0), included_count(0) { } ~SourceFile(); @@ -95,8 +95,8 @@ struct SourceFile { struct SourceDependChildren { SourceFile **children; int num_nodes, used_nodes; - SourceDependChildren() : children(0), num_nodes(0), used_nodes(0) { } - ~SourceDependChildren() { if(children) free(children); children = 0; } + SourceDependChildren() : children(nullptr), num_nodes(0), used_nodes(0) { } + ~SourceDependChildren() { if (children) free(children); children = nullptr; } void addChild(SourceFile *s) { if(num_nodes <= used_nodes) { num_nodes += 200; @@ -115,10 +115,10 @@ public: SourceFile *lookupFile(const char *); inline SourceFile *lookupFile(const QString &f) { return lookupFile(f.toLatin1().constData()); } inline SourceFile *lookupFile(const QMakeLocalFileName &f) { return lookupFile(f.local().toLatin1().constData()); } - void addFile(SourceFile *, const char *k=0, bool own=true); + void addFile(SourceFile *, const char *k = nullptr, bool own = true); struct SourceFileNode { - SourceFileNode() : key(0), next(0), file(0), own_file(1) { } + SourceFileNode() : key(nullptr), next(nullptr), file(nullptr), own_file(1) { } ~SourceFileNode() { delete [] key; if(own_file) @@ -135,7 +135,7 @@ SourceFiles::SourceFiles() { nodes = (SourceFileNode**)malloc(sizeof(SourceFileNode*)*(num_nodes=3037)); for(int n = 0; n < num_nodes; n++) - nodes[n] = 0; + nodes[n] = nullptr; } SourceFiles::~SourceFiles() @@ -170,7 +170,7 @@ SourceFile *SourceFiles::lookupFile(const char *file) if(!strcmp(p->key, file)) return p->file; } - return 0; + return nullptr; } void SourceFiles::addFile(SourceFile *p, const char *k, bool own_file) @@ -259,11 +259,11 @@ QMakeSourceFileInfo::QMakeSourceFileInfo(const QString &cf) dep_mode = Recursive; //quick project lookups - includes = files = 0; + includes = files = nullptr; files_changed = false; //buffer - spare_buffer = 0; + spare_buffer = nullptr; spare_buffer_size = 0; //cache @@ -281,7 +281,7 @@ QMakeSourceFileInfo::~QMakeSourceFileInfo() //buffer if(spare_buffer) { free(spare_buffer); - spare_buffer = 0; + spare_buffer = nullptr; spare_buffer_size = 0; } @@ -538,7 +538,7 @@ bool QMakeSourceFileInfo::findDeps(SourceFile *file) const QMakeLocalFileName sourceFile = fixPathForFile(file->file, true); struct stat fst; - char *buffer = 0; + char *buffer = nullptr; int buffer_len = 0; { int fd; @@ -588,7 +588,7 @@ bool QMakeSourceFileInfo::findDeps(SourceFile *file) } for (; x < buffer_len; ++x) { bool try_local = true; - char *inc = 0; + char *inc = nullptr; if(file->type == QMakeSourceFileInfo::TYPE_UI) { // skip whitespaces while (x < buffer_len && (buffer[x] == ' ' || buffer[x] == '\t')) @@ -802,7 +802,7 @@ bool QMakeSourceFileInfo::findDeps(SourceFile *file) if (cpp_state == WantName) buffer[clean] = '\0'; else // i.e. malformed - inc = 0; + inc = nullptr; cpp_state = InCode; // hereafter break; @@ -915,7 +915,7 @@ bool QMakeSourceFileInfo::findMocs(SourceFile *file) file->moc_checked = true; int buffer_len = 0; - char *buffer = 0; + char *buffer = nullptr; { struct stat fst; int fd; diff --git a/qmake/generators/metamakefile.cpp b/qmake/generators/metamakefile.cpp index 874b4286bc..8ebd0c61ce 100644 --- a/qmake/generators/metamakefile.cpp +++ b/qmake/generators/metamakefile.cpp @@ -62,11 +62,11 @@ private: public: BuildsMetaMakefileGenerator(QMakeProject *p, const QString &n, bool op) : MetaMakefileGenerator(p, n, op), init_flag(false) { } - virtual ~BuildsMetaMakefileGenerator() { clearBuilds(); } + ~BuildsMetaMakefileGenerator() { clearBuilds(); } - virtual bool init(); - virtual int type() const { return BUILDSMETATYPE; } - virtual bool write(); + bool init() override; + int type() const override { return BUILDSMETATYPE; } + bool write() override; }; void @@ -138,7 +138,7 @@ BuildsMetaMakefileGenerator::init() bool BuildsMetaMakefileGenerator::write() { - Build *glue = 0; + Build *glue = nullptr; if(!makefiles.isEmpty() && !makefiles.first()->build.isNull()) { glue = new Build; glue->name = name; @@ -228,7 +228,7 @@ MakefileGenerator if (build_proj->read(project->projectFile())) return createMakefileGenerator(build_proj); } - return 0; + return nullptr; } class SubdirsMetaMakefileGenerator : public MetaMakefileGenerator @@ -236,7 +236,7 @@ class SubdirsMetaMakefileGenerator : public MetaMakefileGenerator protected: bool init_flag; struct Subdir { - Subdir() : makefile(0), indent(0) { } + Subdir() : makefile(nullptr), indent(0) { } ~Subdir() { delete makefile; } QString input_dir; QString output_dir, output_file; @@ -248,11 +248,11 @@ protected: public: SubdirsMetaMakefileGenerator(QMakeProject *p, const QString &n, bool op) : MetaMakefileGenerator(p, n, op), init_flag(false) { } - virtual ~SubdirsMetaMakefileGenerator(); + ~SubdirsMetaMakefileGenerator(); - virtual bool init(); - virtual int type() const { return SUBDIRSMETATYPE; } - virtual bool write(); + bool init() override; + int type() const override { return SUBDIRSMETATYPE; } + bool write() override; }; bool @@ -336,7 +336,7 @@ SubdirsMetaMakefileGenerator::init() hasError |= !sub->makefile->write(); delete sub; qmakeClearCaches(); - sub = 0; + sub = nullptr; Option::output.setFileName(output_name); } Option::output_dir = old_output_dir; @@ -412,7 +412,7 @@ MetaMakefileGenerator::createMakefileGenerator(QMakeProject *proj, bool noIO) { Option::postProcessProject(proj); - MakefileGenerator *mkfile = NULL; + MakefileGenerator *mkfile = nullptr; if(Option::qmake_mode == Option::QMAKE_GENERATE_PROJECT) { mkfile = new ProjectGenerator; mkfile->setProjectFile(proj); @@ -459,7 +459,7 @@ MetaMakefileGenerator::createMetaGenerator(QMakeProject *proj, const QString &na { Option::postProcessProject(proj); - MetaMakefileGenerator *ret = 0; + MetaMakefileGenerator *ret = nullptr; if ((Option::qmake_mode == Option::QMAKE_GENERATE_MAKEFILE || Option::qmake_mode == Option::QMAKE_GENERATE_PRL)) { if (proj->first("TEMPLATE").endsWith("subdirs")) diff --git a/qmake/generators/metamakefile.h b/qmake/generators/metamakefile.h index 706bca3363..9337130143 100644 --- a/qmake/generators/metamakefile.h +++ b/qmake/generators/metamakefile.h @@ -49,7 +49,7 @@ public: virtual ~MetaMakefileGenerator(); - static MetaMakefileGenerator *createMetaGenerator(QMakeProject *proj, const QString &name, bool op=true, bool *success = 0); + static MetaMakefileGenerator *createMetaGenerator(QMakeProject *proj, const QString &name, bool op=true, bool *success = nullptr); static MakefileGenerator *createMakefileGenerator(QMakeProject *proj, bool noIO = false); inline QMakeProject *projectFile() const { return project; } diff --git a/qmake/generators/projectgenerator.cpp b/qmake/generators/projectgenerator.cpp index 073d315aab..f45a90b851 100644 --- a/qmake/generators/projectgenerator.cpp +++ b/qmake/generators/projectgenerator.cpp @@ -229,7 +229,7 @@ ProjectGenerator::init() ProStringList &h = v["HEADERS"]; bool no_qt_files = true; - static const char *srcs[] = { "SOURCES", "YACCSOURCES", "LEXSOURCES", "FORMS", 0 }; + static const char *srcs[] = { "SOURCES", "YACCSOURCES", "LEXSOURCES", "FORMS", nullptr }; for (int i = 0; srcs[i]; i++) { const ProStringList &l = v[srcs[i]]; QMakeSourceFileInfo::SourceFileType type = QMakeSourceFileInfo::TYPE_C; @@ -473,18 +473,11 @@ ProjectGenerator::getWritableVar(const char *vk, bool) bool ProjectGenerator::openOutput(QFile &file, const QString &build) const { - QString outdir; - if(!file.fileName().isEmpty()) { - QFileInfo fi(fileInfo(file.fileName())); - if(fi.isDir()) - outdir = fi.path() + QDir::separator(); - } - if(!outdir.isEmpty() || file.fileName().isEmpty()) { - QString dir = qmake_getpwd(); - int s = dir.lastIndexOf('/'); - if(s != -1) - dir = dir.right(dir.length() - (s + 1)); - file.setFileName(outdir + dir + Option::pro_ext); + ProString fileName = file.fileName(); + if (!fileName.endsWith(Option::pro_ext)) { + if (fileName.isEmpty()) + fileName = fileInfo(Option::output_dir).fileName(); + file.setFileName(fileName + Option::pro_ext); } return MakefileGenerator::openOutput(file, build); } diff --git a/qmake/generators/projectgenerator.h b/qmake/generators/projectgenerator.h index 89c66f1ec8..cbc9f371ab 100644 --- a/qmake/generators/projectgenerator.h +++ b/qmake/generators/projectgenerator.h @@ -40,16 +40,16 @@ class ProjectGenerator : public MakefileGenerator QString getWritableVar(const char *, bool fixPath=true); QString fixPathToQmake(const QString &file); protected: - virtual void init(); - virtual bool writeMakefile(QTextStream &); + void init() override; + bool writeMakefile(QTextStream &) override; - virtual QString escapeFilePath(const QString &path) const { Q_ASSERT(false); return QString(); } + QString escapeFilePath(const QString &path) const override { Q_ASSERT(false); return QString(); } public: ProjectGenerator(); ~ProjectGenerator(); - virtual bool supportsMetaBuild() { return false; } - virtual bool openOutput(QFile &, const QString &) const; + bool supportsMetaBuild() override { return false; } + bool openOutput(QFile &, const QString &) const override; }; inline ProjectGenerator::~ProjectGenerator() diff --git a/qmake/generators/unix/unixmake.cpp b/qmake/generators/unix/unixmake.cpp index 894020d2bd..50ec8db79e 100644 --- a/qmake/generators/unix/unixmake.cpp +++ b/qmake/generators/unix/unixmake.cpp @@ -37,6 +37,17 @@ QT_BEGIN_NAMESPACE +ProStringList UnixMakefileGenerator::libdirToFlags(const ProKey &key) +{ + ProStringList results; + for (const auto &libdir : qAsConst(project->values(key))) { + if (!project->isEmpty("QMAKE_LFLAGS_RPATH") && project->isActiveConfig("rpath_libdirs")) + project->values("QMAKE_LFLAGS") += var("QMAKE_LFLAGS_RPATH") + libdir; + results.append("-L" + escapeFilePath(libdir)); + } + return results; +} + void UnixMakefileGenerator::init() { @@ -80,8 +91,6 @@ UnixMakefileGenerator::init() } project->values("QMAKE_ORIG_DESTDIR") = project->values("DESTDIR"); - project->values("QMAKE_LIBS") += project->values("LIBS"); - project->values("QMAKE_LIBS_PRIVATE") += project->values("LIBS_PRIVATE"); if((!project->isEmpty("QMAKE_LIB_FLAG") && !project->isActiveConfig("staticlib")) || (project->isActiveConfig("qt") && project->isActiveConfig("plugin"))) { if(configs.indexOf("dll") == -1) configs.append("dll"); @@ -95,21 +104,13 @@ UnixMakefileGenerator::init() project->isActiveConfig("dll")) project->values("QMAKE_LFLAGS") += project->values("QMAKE_LFLAGS_PREBIND"); project->values("QMAKE_INCDIR") += project->values("QMAKE_INCDIR_POST"); - project->values("QMAKE_LIBDIR") += project->values("QMAKE_LIBDIR_POST"); project->values("QMAKE_RPATHDIR") += project->values("QMAKE_RPATHDIR_POST"); project->values("QMAKE_RPATHLINKDIR") += project->values("QMAKE_RPATHLINKDIR_POST"); if(!project->isEmpty("QMAKE_INCDIR")) project->values("INCLUDEPATH") += project->values("QMAKE_INCDIR"); - ProStringList ldadd; - if(!project->isEmpty("QMAKE_LIBDIR")) { - const ProStringList &libdirs = project->values("QMAKE_LIBDIR"); - for(int i = 0; i < libdirs.size(); ++i) { - if(!project->isEmpty("QMAKE_LFLAGS_RPATH") && project->isActiveConfig("rpath_libdirs")) - project->values("QMAKE_LFLAGS") += var("QMAKE_LFLAGS_RPATH") + libdirs[i]; - project->values("QMAKE_LIBDIR_FLAGS") += "-L" + escapeFilePath(libdirs[i]); - } - } - ldadd += project->values("QMAKE_LIBDIR_FLAGS"); + // The order of the next two lines is relevant due to side effect on QMAKE_LFLAGS. + ProStringList ldadd = project->values("QMAKE_LIBDIR_FLAGS") + libdirToFlags("QMAKE_LIBDIR"); + ProStringList ldaddpost = libdirToFlags("QMAKE_LIBDIR_POST"); if (project->isActiveConfig("mac")) { if (!project->isEmpty("QMAKE_FRAMEWORKPATH")) { const ProStringList &fwdirs = project->values("QMAKE_FRAMEWORKPATH"); @@ -118,8 +119,10 @@ UnixMakefileGenerator::init() } ldadd += project->values("QMAKE_FRAMEWORKPATH_FLAGS"); } - ProStringList &qmklibs = project->values("QMAKE_LIBS"); + ProStringList &qmklibs = project->values("LIBS"); qmklibs = ldadd + qmklibs; + ProStringList &qmklibspost = project->values("QMAKE_LIBS"); + qmklibspost = ldaddpost + qmklibspost; if (!project->isEmpty("QMAKE_RPATHDIR") && !project->isEmpty("QMAKE_LFLAGS_RPATH")) { const ProStringList &rpathdirs = project->values("QMAKE_RPATHDIR"); for (int i = 0; i < rpathdirs.size(); ++i) { @@ -300,35 +303,11 @@ UnixMakefileGenerator::init() } init2(); - project->values("QMAKE_INTERNAL_PRL_LIBS") << "QMAKE_LIBS"; ProString target = project->first("TARGET"); int slsh = target.lastIndexOf(Option::dir_sep); if (slsh != -1) target.chopFront(slsh + 1); project->values("LIB_TARGET").prepend(target); - if(!project->isEmpty("QMAKE_MAX_FILES_PER_AR")) { - bool ok; - int max_files = project->first("QMAKE_MAX_FILES_PER_AR").toInt(&ok); - ProStringList ar_sublibs, objs = project->values("OBJECTS"); - if(ok && max_files > 5 && max_files < (int)objs.count()) { - QString lib; - for(int i = 0, obj_cnt = 0, lib_cnt = 0; i != objs.size(); ++i) { - if((++obj_cnt) >= max_files) { - if(lib_cnt) { - lib.sprintf("lib%s-tmp%d.a", - project->first("QMAKE_ORIG_TARGET").toLatin1().constData(), lib_cnt); - ar_sublibs << lib; - obj_cnt = 0; - } - lib_cnt++; - } - } - } - if(!ar_sublibs.isEmpty()) { - project->values("QMAKE_AR_SUBLIBS") = ar_sublibs; - project->values("QMAKE_INTERNAL_PRL_LIBS") << "QMAKE_AR_SUBLIBS"; - } - } } QStringList @@ -420,7 +399,8 @@ UnixMakefileGenerator::findLibraries(bool linkPrl, bool mergeLflags) libdirs.append(QMakeLocalFileName(dlib.toQString())); frameworkdirs.append(QMakeLocalFileName("/System/Library/Frameworks")); frameworkdirs.append(QMakeLocalFileName("/Library/Frameworks")); - static const char * const lflags[] = { "QMAKE_LIBS", "QMAKE_LIBS_PRIVATE", 0 }; + static const char * const lflags[] = { "LIBS", "LIBS_PRIVATE", + "QMAKE_LIBS", "QMAKE_LIBS_PRIVATE", nullptr }; for (int i = 0; lflags[i]; i++) { ProStringList &l = project->values(lflags[i]); for (ProStringList::Iterator it = l.begin(); it != l.end(); ) { @@ -443,7 +423,7 @@ UnixMakefileGenerator::findLibraries(bool linkPrl, bool mergeLflags) dep_it != libdirs.end(); ++dep_it) { QString libBase = (*dep_it).local() + '/' + project->first("QMAKE_PREFIX_SHLIB") + lib; - if (linkPrl && processPrlFile(libBase)) + if (linkPrl && processPrlFile(libBase, true)) goto found; for (ProStringList::Iterator extit = extens.begin(); extit != extens.end(); ++extit) { if (exists(libBase + '.' + (*extit))) @@ -471,12 +451,12 @@ UnixMakefileGenerator::findLibraries(bool linkPrl, bool mergeLflags) } for (const QMakeLocalFileName &dir : qAsConst(frameworkdirs)) { QString frameworkDirectory = dir.local() + "/" + frameworkName + + ".framework/"; - QString suffixedPrl = frameworkDirectory + opt + Option::prl_ext; - if (processPrlFile(suffixedPrl)) + QString suffixedPrl = frameworkDirectory + opt; + if (processPrlFile(suffixedPrl, true)) break; if (hasSuffix) { - QString unsuffixedPrl = frameworkDirectory + frameworkName + Option::prl_ext; - if (processPrlFile(unsuffixedPrl)) + QString unsuffixedPrl = frameworkDirectory + frameworkName; + if (processPrlFile(unsuffixedPrl, true)) break; } } @@ -487,7 +467,7 @@ UnixMakefileGenerator::findLibraries(bool linkPrl, bool mergeLflags) } } } else if (linkPrl) { - processPrlFile(opt); + processPrlFile(opt, false); } ProStringList &prl_libs = project->values("QMAKE_CURRENT_PRL_LIBS"); diff --git a/qmake/generators/unix/unixmake.h b/qmake/generators/unix/unixmake.h index da5cdb320c..5b0766855b 100644 --- a/qmake/generators/unix/unixmake.h +++ b/qmake/generators/unix/unixmake.h @@ -38,7 +38,7 @@ class UnixMakefileGenerator : public MakefileGenerator bool include_deps; QString libtoolFileName(bool fixify=true); void writeLibtoolFile(); // for libtool - void writePrlFile(QTextStream &); + void writePrlFile(QTextStream &) override; public: UnixMakefileGenerator(); @@ -46,26 +46,27 @@ public: protected: virtual bool doPrecompiledHeaders() const { return project->isActiveConfig("precompile_header"); } - virtual bool doDepends() const { return !Option::mkfile::do_stub_makefile && MakefileGenerator::doDepends(); } + bool doDepends() const override { return !Option::mkfile::do_stub_makefile && MakefileGenerator::doDepends(); } #ifdef Q_OS_WIN // MinGW x-compiling for QNX - virtual QString installRoot() const; + QString installRoot() const override; #endif - virtual QString defaultInstall(const QString &); - virtual ProString fixLibFlag(const ProString &lib); + QString defaultInstall(const QString &) override; + ProString fixLibFlag(const ProString &lib) override; - virtual bool findLibraries(bool linkPrl, bool mergeLflags); - virtual QString escapeFilePath(const QString &path) const; + bool findLibraries(bool linkPrl, bool mergeLflags) override; + QString escapeFilePath(const QString &path) const override; ProString escapeFilePath(const ProString &path) const { return MakefileGenerator::escapeFilePath(path); } - virtual QStringList &findDependencies(const QString &); - virtual void init(); + QStringList &findDependencies(const QString &) override; + void init() override; - virtual void writeDefaultVariables(QTextStream &t); - virtual void writeSubTargets(QTextStream &t, QList<SubTarget*> subtargets, int flags); + void writeDefaultVariables(QTextStream &t) override; + void writeSubTargets(QTextStream &t, QList<SubTarget*> subtargets, int flags) override; void writeMakeParts(QTextStream &); - bool writeMakefile(QTextStream &); + bool writeMakefile(QTextStream &) override; private: void init2(); + ProStringList libdirToFlags(const ProKey &key); }; inline UnixMakefileGenerator::~UnixMakefileGenerator() diff --git a/qmake/generators/unix/unixmake2.cpp b/qmake/generators/unix/unixmake2.cpp index ecb0de3b52..976751b02c 100644 --- a/qmake/generators/unix/unixmake2.cpp +++ b/qmake/generators/unix/unixmake2.cpp @@ -213,7 +213,9 @@ UnixMakefileGenerator::writeMakeParts(QTextStream &t) if(!project->isActiveConfig("staticlib")) { t << "LINK = " << var("QMAKE_LINK") << endl; t << "LFLAGS = " << var("QMAKE_LFLAGS") << endl; - t << "LIBS = $(SUBLIBS) " << fixLibFlags("QMAKE_LIBS").join(' ') << ' ' + t << "LIBS = $(SUBLIBS) " << fixLibFlags("LIBS").join(' ') << ' ' + << fixLibFlags("LIBS_PRIVATE").join(' ') << ' ' + << fixLibFlags("QMAKE_LIBS").join(' ') << ' ' << fixLibFlags("QMAKE_LIBS_PRIVATE").join(' ') << endl; } @@ -280,11 +282,11 @@ UnixMakefileGenerator::writeMakeParts(QTextStream &t) if (destd.endsWith('\\')) destd += '\\'; t << "DESTDIR = " << destd << endl; - t << "TARGET = " << fileVar("TARGET") << endl; // ### mixed use! + t << "TARGET = " << fileVar("TARGET") << endl; if(project->isActiveConfig("plugin")) { t << "TARGETD = " << fileVar("TARGET") << endl; } else if(!project->isActiveConfig("staticlib") && project->values("QMAKE_APP_FLAG").isEmpty()) { - t << "TARGETA = " << fileVar("TARGETA") << endl; // ### mixed use! + t << "TARGETA = " << fileVar("TARGETA") << endl; if(!project->isEmpty("QMAKE_BUNDLE")) { t << "TARGETD = " << fileVar("TARGET_x.y") << endl; t << "TARGET0 = " << fileVar("TARGET_") << endl; @@ -346,7 +348,7 @@ UnixMakefileGenerator::writeMakeParts(QTextStream &t) t << mkdir_p_asstring("$(@D)", false) << "\n\t" << "@$(CC) " << cmd << " $< | sed \"s,^\\($(*F).o\\):," << odir << "\\1:,g\" >$@\n\n"; - static const char * const src[] = { "SOURCES", "GENERATED_SOURCES", 0 }; + static const char * const src[] = { "SOURCES", "GENERATED_SOURCES", nullptr }; for (int x = 0; src[x]; x++) { const ProStringList &l = project->values(src[x]); for (ProStringList::ConstIterator it = l.begin(); it != l.end(); ++it) { @@ -502,7 +504,7 @@ UnixMakefileGenerator::writeMakeParts(QTextStream &t) t << "\n\t" << var("QMAKE_POST_LINK"); t << endl << endl; } else { - t << "$(TARGET): " << depVar("PRE_TARGETDEPS") << " $(OBJECTS) " + t << depVar("TARGET") << ": " << depVar("PRE_TARGETDEPS") << " $(OBJECTS) " << target_deps << ' ' << depVar("POST_TARGETDEPS") << "\n\t"; if (project->first("TEMPLATE") != "aux") { if (!destdir.isEmpty()) @@ -515,7 +517,7 @@ UnixMakefileGenerator::writeMakeParts(QTextStream &t) } t << endl << endl; } - allDeps = " $(TARGET)"; + allDeps = ' ' + depVar("TARGET"); } else if(!project->isActiveConfig("staticlib")) { QString destdir_r = project->first("DESTDIR").toQString(), incr_deps; if(!project->isEmpty("QMAKE_BUNDLE")) { @@ -580,14 +582,14 @@ UnixMakefileGenerator::writeMakeParts(QTextStream &t) } //real target - t << destdir_d << "$(TARGET): " << depVar("PRE_TARGETDEPS") << ' ' + t << destdir_d << depVar("TARGET") << ": " << depVar("PRE_TARGETDEPS") << ' ' << incr_deps << " $(SUBLIBS) " << target_deps << ' ' << depVar("POST_TARGETDEPS"); } else { - t << destdir_d << "$(TARGET): " << depVar("PRE_TARGETDEPS") + t << destdir_d << depVar("TARGET") << ": " << depVar("PRE_TARGETDEPS") << " $(OBJECTS) $(SUBLIBS) $(OBJCOMP) " << target_deps << ' ' << depVar("POST_TARGETDEPS"); } - allDeps = ' ' + destdir_d + "$(TARGET)"; + allDeps = ' ' + destdir_d + depVar("TARGET"); if(!destdir.isEmpty()) t << "\n\t" << mkdir_p_asstring(destdir, false); if(!project->isEmpty("QMAKE_PRE_LINK")) @@ -604,7 +606,7 @@ UnixMakefileGenerator::writeMakeParts(QTextStream &t) t << "\n\t" << var("QMAKE_POST_LINK"); t << endl << endl; } else if(!project->isEmpty("QMAKE_BUNDLE")) { - bundledFiles << destdir_r + "$(TARGET)"; + bundledFiles << destdir_r + var("TARGET"); t << "\n\t" << "-$(DEL_FILE) $(TARGET) $(TARGET0) $(DESTDIR)$(TARGET0)\n\t" << var("QMAKE_LINK_SHLIB_CMD") << "\n\t" @@ -669,8 +671,8 @@ UnixMakefileGenerator::writeMakeParts(QTextStream &t) t << endl << endl; if (! project->isActiveConfig("plugin")) { - t << "staticlib: $(TARGETA)\n\n"; - t << "$(TARGETA): " << depVar("PRE_TARGETDEPS") << " $(OBJECTS) $(OBJCOMP)"; + t << "staticlib: " << depVar("TARGETA") << "\n\n"; + t << depVar("TARGETA") << ": " << depVar("PRE_TARGETDEPS") << " $(OBJECTS) $(OBJCOMP)"; if(do_incremental) t << " $(INCREMENTAL_OBJECTS)"; t << ' ' << depVar("POST_TARGETDEPS") << "\n\t"; @@ -690,56 +692,20 @@ UnixMakefileGenerator::writeMakeParts(QTextStream &t) QString destdir_r = project->first("DESTDIR").toQString(); QString destdir_d = escapeDependencyPath(destdir_r); QString destdir = escapeFilePath(destdir_r); - allDeps = ' ' + destdir_d + "$(TARGET)" - + varGlue("QMAKE_AR_SUBLIBS", ' ' + destdir_d, ' ' + destdir_d, ""); - t << "staticlib: " << destdir_d << "$(TARGET)\n\n"; - if(project->isEmpty("QMAKE_AR_SUBLIBS")) { - t << destdir_d << "$(TARGET): " << depVar("PRE_TARGETDEPS") - << " $(OBJECTS) $(OBJCOMP) " << depVar("POST_TARGETDEPS") << "\n\t"; - if(!destdir.isEmpty()) - t << mkdir_p_asstring(destdir, false) << "\n\t"; - if (!project->isEmpty("QMAKE_PRE_LINK")) - t << var("QMAKE_PRE_LINK") << "\n\t"; - t << "-$(DEL_FILE) " << destdir << "$(TARGET)\n\t" - << var("QMAKE_AR_CMD") << "\n"; - if(!project->isEmpty("QMAKE_POST_LINK")) - t << "\t" << var("QMAKE_POST_LINK") << "\n"; - if(!project->isEmpty("QMAKE_RANLIB")) - t << "\t$(RANLIB) " << destdir << "$(TARGET)\n"; - } else { - int max_files = project->first("QMAKE_MAX_FILES_PER_AR").toInt(); - ProStringList objs = project->values("OBJECTS") + project->values("OBJCOMP"), - libs = project->values("QMAKE_AR_SUBLIBS"); - libs.prepend("$(TARGET)"); - for (ProStringList::Iterator libit = libs.begin(), objit = objs.begin(); - libit != libs.end(); ++libit) { - ProStringList build; - for(int cnt = 0; cnt < max_files && objit != objs.end(); ++objit, cnt++) - build << (*objit); - QString ar; - ProString lib = destdir + escapeFilePath(*libit); - if((*libit) == "$(TARGET)") { - t << destdir_d << "$(TARGET): " << depVar("PRE_TARGETDEPS") - << ' ' << depVar("POST_TARGETDEPS") << valList(escapeDependencyPaths(build)) << "\n\t"; - ar = project->first("QMAKE_AR_CMD").toQString(); - ar.replace(QLatin1String("$(OBJECTS)"), escapeFilePaths(build).join(' ')); - } else { - t << destdir_d << escapeDependencyPath(*libit) << ": " - << valList(escapeDependencyPaths(build)) << "\n\t"; - ar = "$(AR) " + lib + ' ' + escapeFilePaths(build).join(' '); - } - if(!destdir.isEmpty()) - t << mkdir_p_asstring(destdir, false) << "\n\t"; - if (!project->isEmpty("QMAKE_PRE_LINK")) - t << var("QMAKE_PRE_LINK") << "\n\t"; - t << "-$(DEL_FILE) " << lib << "\n\t" - << ar << "\n"; - if(!project->isEmpty("QMAKE_POST_LINK")) - t << "\t" << var("QMAKE_POST_LINK") << "\n"; - if(!project->isEmpty("QMAKE_RANLIB")) - t << "\t$(RANLIB) " << lib << "\n"; - } - } + allDeps = ' ' + destdir_d + depVar("TARGET"); + t << "staticlib: " << destdir_d << "$(TARGET)\n\n" + << destdir_d << depVar("TARGET") << ": " << depVar("PRE_TARGETDEPS") + << " $(OBJECTS) $(OBJCOMP) " << depVar("POST_TARGETDEPS") << "\n\t"; + if (!destdir.isEmpty()) + t << mkdir_p_asstring(destdir, false) << "\n\t"; + if (!project->isEmpty("QMAKE_PRE_LINK")) + t << var("QMAKE_PRE_LINK") << "\n\t"; + t << "-$(DEL_FILE) " << destdir << "$(TARGET)\n\t" + << var("QMAKE_AR_CMD") << "\n"; + if (!project->isEmpty("QMAKE_POST_LINK")) + t << "\t" << var("QMAKE_POST_LINK") << "\n"; + if (!project->isEmpty("QMAKE_RANLIB")) + t << "\t$(RANLIB) " << destdir << "$(TARGET)\n"; t << endl << endl; } @@ -1244,7 +1210,8 @@ void UnixMakefileGenerator::init2() if(!project->isEmpty("TARGET")) project->values("TARGET").first().prepend(project->first("DESTDIR")); } else if (project->isActiveConfig("staticlib")) { - project->values("TARGET").first().prepend(project->first("QMAKE_PREFIX_STATICLIB")); + project->values("PRL_TARGET") = + project->values("TARGET").first().prepend(project->first("QMAKE_PREFIX_STATICLIB")); project->values("TARGET").first() += "." + project->first("QMAKE_EXTENSION_STATICLIB"); if(project->values("QMAKE_AR_CMD").isEmpty()) project->values("QMAKE_AR_CMD").append("$(AR) $(DESTDIR)$(TARGET) $(OBJECTS)"); @@ -1278,6 +1245,7 @@ void UnixMakefileGenerator::init2() QString prefix; if(!project->isActiveConfig("no_plugin_name_prefix")) prefix = "lib"; + project->values("PRL_TARGET").prepend(prefix + project->first("TARGET")); project->values("TARGET_x.y.z").append(prefix + project->first("TARGET") + "." + project->first("QMAKE_EXTENSION_PLUGIN")); @@ -1291,6 +1259,7 @@ void UnixMakefileGenerator::init2() "." + project->first("VER_MAJ")); project->values("TARGET") = project->values("TARGET_x.y.z"); } else if (!project->isEmpty("QMAKE_HPUX_SHLIB")) { + project->values("PRL_TARGET").prepend("lib" + project->first("TARGET")); project->values("TARGET_").append("lib" + project->first("TARGET") + ".sl"); if(project->isActiveConfig("lib_version_first")) project->values("TARGET_x").append("lib" + project->first("VER_MAJ") + "." + @@ -1300,6 +1269,7 @@ void UnixMakefileGenerator::init2() project->first("VER_MAJ")); project->values("TARGET") = project->values("TARGET_x"); } else if (!project->isEmpty("QMAKE_AIX_SHLIB")) { + project->values("PRL_TARGET").prepend("lib" + project->first("TARGET")); project->values("TARGET_").append(project->first("QMAKE_PREFIX_STATICLIB") + project->first("TARGET") + "." + project->first("QMAKE_EXTENSION_STATICLIB")); if(project->isActiveConfig("lib_version_first")) { @@ -1331,6 +1301,7 @@ void UnixMakefileGenerator::init2() } project->values("TARGET") = project->values("TARGET_x.y.z"); } else { + project->values("PRL_TARGET").prepend("lib" + project->first("TARGET")); project->values("TARGET_").append("lib" + project->first("TARGET") + "." + project->first("QMAKE_EXTENSION_SHLIB")); if(project->isActiveConfig("lib_version_first")) { @@ -1510,10 +1481,7 @@ UnixMakefileGenerator::writeLibtoolFile() t << "# Libraries that this one depends upon.\n"; ProStringList libs; - if(!project->isEmpty("QMAKE_INTERNAL_PRL_LIBS")) - libs = project->values("QMAKE_INTERNAL_PRL_LIBS"); - else - libs << "QMAKE_LIBS"; //obvious one + libs << "LIBS" << "QMAKE_LIBS"; t << "dependency_libs='"; for (ProStringList::ConstIterator it = libs.begin(); it != libs.end(); ++it) t << fixLibFlags((*it).toKey()).join(' ') << ' '; diff --git a/qmake/generators/win32/mingw_make.cpp b/qmake/generators/win32/mingw_make.cpp index 6fcfe96380..de7363e51b 100644 --- a/qmake/generators/win32/mingw_make.cpp +++ b/qmake/generators/win32/mingw_make.cpp @@ -73,6 +73,19 @@ MingwMakefileGenerator::parseLibFlag(const ProString &flag, ProString *arg) return MakefileGenerator::parseLibFlag(flag, arg); } +bool MingwMakefileGenerator::processPrlFileBase(QString &origFile, const QStringRef &origName, + const QStringRef &fixedBase, int slashOff) +{ + if (origName.startsWith("lib")) { + QString newFixedBase = fixedBase.left(slashOff) + fixedBase.mid(slashOff + 3); + if (Win32MakefileGenerator::processPrlFileBase(origFile, origName, + QStringRef(&newFixedBase), slashOff)) { + return true; + } + } + return Win32MakefileGenerator::processPrlFileBase(origFile, origName, fixedBase, slashOff); +} + bool MingwMakefileGenerator::writeMakefile(QTextStream &t) { writeHeader(t); @@ -118,22 +131,25 @@ QString MingwMakefileGenerator::installRoot() const return QStringLiteral("$(INSTALL_ROOT:@msyshack@%=%)"); } -void createLdObjectScriptFile(const QString &fileName, const ProStringList &objList) +void createLdResponseFile(const QString &fileName, const ProStringList &objList) { QString filePath = Option::output_dir + QDir::separator() + fileName; QFile file(filePath); if (file.open(QIODevice::WriteOnly | QIODevice::Text)) { QTextStream t(&file); - t << "INPUT(\n"; for (ProStringList::ConstIterator it = objList.constBegin(); it != objList.constEnd(); ++it) { QString path = (*it).toQString(); - // ### quoting? - if (QDir::isRelativePath(path)) - t << "./" << path << endl; - else - t << path << endl; + // In response files, whitespace and special characters are + // escaped with a backslash; backslashes themselves can either + // be escaped into double backslashes, or, as this is a list of + // path names, converted to forward slashes. + path.replace(QLatin1Char('\\'), QLatin1String("/")) + .replace(QLatin1Char(' '), QLatin1String("\\ ")) + .replace(QLatin1Char('\t'), QLatin1String("\\\t")) + .replace(QLatin1Char('"'), QLatin1String("\\\"")) + .replace(QLatin1Char('\''), QLatin1String("\\'")); + t << path << endl; } - t << ");\n"; t.flush(); file.close(); } @@ -191,11 +207,9 @@ void MingwMakefileGenerator::init() return; } - project->values("TARGET_PRL").append(project->first("TARGET")); - processVars(); - project->values("QMAKE_LIBS") += project->values("RES_FILE"); + project->values("LIBS") += project->values("RES_FILE"); if (project->isActiveConfig("dll")) { QString destDir = ""; @@ -271,6 +285,8 @@ void MingwMakefileGenerator::writeLibsPart(QTextStream &t) t << "LINKER = " << var("QMAKE_LINK") << endl; t << "LFLAGS = " << var("QMAKE_LFLAGS") << endl; t << "LIBS = " + << fixLibFlags("LIBS").join(' ') << ' ' + << fixLibFlags("LIBS_PRIVATE").join(' ') << ' ' << fixLibFlags("QMAKE_LIBS").join(' ') << ' ' << fixLibFlags("QMAKE_LIBS_PRIVATE").join(' ') << endl; } @@ -296,14 +312,13 @@ void MingwMakefileGenerator::writeObjectsPart(QTextStream &t) createArObjectScriptFile(ar_script_file, var("DEST_TARGET"), project->values("OBJECTS")); objectsLinkLine = ar_cmd + " -M < " + escapeFilePath(ar_script_file); } else { - QString ld_script_file = var("QMAKE_LINK_OBJECT_SCRIPT") + "." + var("TARGET"); - if (!var("BUILD_NAME").isEmpty()) { - ld_script_file += "." + var("BUILD_NAME"); - } + QString ld_response_file = var("QMAKE_LINK_OBJECT_SCRIPT") + "." + var("TARGET"); + if (!var("BUILD_NAME").isEmpty()) + ld_response_file += "." + var("BUILD_NAME"); if (!var("MAKEFILE").isEmpty()) - ld_script_file += "." + var("MAKEFILE"); - createLdObjectScriptFile(ld_script_file, project->values("OBJECTS")); - objectsLinkLine = escapeFilePath(ld_script_file); + ld_response_file += "." + var("MAKEFILE"); + createLdResponseFile(ld_response_file, project->values("OBJECTS")); + objectsLinkLine = "@" + escapeFilePath(ld_response_file); } Win32MakefileGenerator::writeObjectsPart(t); } @@ -312,8 +327,9 @@ void MingwMakefileGenerator::writeBuildRulesPart(QTextStream &t) { t << "first: all\n"; t << "all: " << escapeDependencyPath(fileFixify(Option::output.fileName())) - << ' ' << depVar("ALL_DEPS") << " $(DESTDIR_TARGET)\n\n"; - t << "$(DESTDIR_TARGET): " << depVar("PRE_TARGETDEPS") << " $(OBJECTS) " << depVar("POST_TARGETDEPS"); + << ' ' << depVar("ALL_DEPS") << ' ' << depVar("DEST_TARGET") << "\n\n"; + t << depVar("DEST_TARGET") << ": " + << depVar("PRE_TARGETDEPS") << " $(OBJECTS) " << depVar("POST_TARGETDEPS"); if (project->first("TEMPLATE") == "aux") { t << "\n\n"; return; diff --git a/qmake/generators/win32/mingw_make.h b/qmake/generators/win32/mingw_make.h index 6f041cfd4a..5da5b24088 100644 --- a/qmake/generators/win32/mingw_make.h +++ b/qmake/generators/win32/mingw_make.h @@ -40,25 +40,27 @@ public: ~MingwMakefileGenerator(); protected: using MakefileGenerator::escapeDependencyPath; - virtual QString escapeDependencyPath(const QString &path) const; - virtual ProString fixLibFlag(const ProString &lib); - virtual QString getManifestFileForRcFile() const; - bool writeMakefile(QTextStream &); - void init(); - virtual QString installRoot() const; + QString escapeDependencyPath(const QString &path) const override; + ProString fixLibFlag(const ProString &lib) override; + bool processPrlFileBase(QString &origFile, const QStringRef &origName, + const QStringRef &fixedBase, int slashOff) override; + QString getManifestFileForRcFile() const override; + bool writeMakefile(QTextStream &) override; + void init() override; + QString installRoot() const override; private: void writeMingwParts(QTextStream &); - void writeIncPart(QTextStream &t); - void writeLibsPart(QTextStream &t); - void writeObjectsPart(QTextStream &t); - void writeBuildRulesPart(QTextStream &t); - void writeRcFilePart(QTextStream &t); + void writeIncPart(QTextStream &t) override; + void writeLibsPart(QTextStream &t) override; + void writeObjectsPart(QTextStream &t) override; + void writeBuildRulesPart(QTextStream &t) override; + void writeRcFilePart(QTextStream &t) override; - QStringList &findDependencies(const QString &file); + QStringList &findDependencies(const QString &file) override; QString preCompHeaderOut; - virtual LibFlagType parseLibFlag(const ProString &flag, ProString *arg); + LibFlagType parseLibFlag(const ProString &flag, ProString *arg) override; QString objectsLinkLine; }; diff --git a/qmake/generators/win32/msbuild_objectmodel.cpp b/qmake/generators/win32/msbuild_objectmodel.cpp index 082f357d32..ad2976aa01 100644 --- a/qmake/generators/win32/msbuild_objectmodel.cpp +++ b/qmake/generators/win32/msbuild_objectmodel.cpp @@ -1207,7 +1207,7 @@ static inline QString toString(midlCharOption option) static inline QString toString(midlErrorCheckOption option) { switch (option) { - case midlAlignNotSet: + case midlEnableCustom: break; case midlDisableAll: return "None"; diff --git a/qmake/generators/win32/msbuild_objectmodel.h b/qmake/generators/win32/msbuild_objectmodel.h index 2e77537916..ce5711f2da 100644 --- a/qmake/generators/win32/msbuild_objectmodel.h +++ b/qmake/generators/win32/msbuild_objectmodel.h @@ -72,7 +72,7 @@ public: return Uindex; } - void addElement(const QString &filepath, const VCFilterFile &allInfo){ + void addElement(const QString &filepath, const VCFilterFile &allInfo) override { QString newNodeName(filepath); int index = pathIndex(filepath); @@ -89,7 +89,7 @@ public: n->addElement(filepath.mid(index+1), allInfo); } - void removeElements() { + void removeElements() override { ChildrenMap::ConstIterator it = children.constBegin(); ChildrenMap::ConstIterator end = children.constEnd(); for( ; it != end; it++) { @@ -100,8 +100,8 @@ public: } void generateXML(XmlOutput &xml, XmlOutput &xmlFilter, const QString &tagName, VCProject &tool, - const QString &filter); - bool hasElements() { + const QString &filter) override; + bool hasElements() override { return children.size() != 0; } }; @@ -124,7 +124,7 @@ public: return Uindex; } - void addElement(const QString &filepath, const VCFilterFile &allInfo){ + void addElement(const QString &filepath, const VCFilterFile &allInfo) override { QString newKey(filepath); int index = pathIndex(filepath); @@ -136,13 +136,13 @@ public: children.insert(newKey + "\0" + allInfo.file, allInfo); } - void removeElements() { + void removeElements() override { children.clear(); } void generateXML(XmlOutput &xml, XmlOutput &xmlFilter, const QString &tagName, VCProject &proj, - const QString &filter); - bool hasElements() { + const QString &filter) override; + bool hasElements() override { return children.size() != 0; } }; @@ -150,20 +150,20 @@ public: class VCXProjectWriter : public VCProjectWriter { public: - void write(XmlOutput &, VCProjectSingleConfig &); - void write(XmlOutput &, VCProject &); - - void write(XmlOutput &, const VCCLCompilerTool &); - void write(XmlOutput &, const VCLinkerTool &); - void write(XmlOutput &, const VCMIDLTool &); - void write(XmlOutput &, const VCCustomBuildTool &); - void write(XmlOutput &, const VCLibrarianTool &); - void write(XmlOutput &, const VCResourceCompilerTool &); - void write(XmlOutput &, const VCEventTool &); - void write(XmlOutput &, const VCDeploymentTool &); - void write(XmlOutput &, const VCWinDeployQtTool &); - void write(XmlOutput &, const VCConfiguration &); - void write(XmlOutput &, VCFilter &); + void write(XmlOutput &, VCProjectSingleConfig &) override; + void write(XmlOutput &, VCProject &) override; + + void write(XmlOutput &, const VCCLCompilerTool &) override; + void write(XmlOutput &, const VCLinkerTool &) override; + void write(XmlOutput &, const VCMIDLTool &) override; + void write(XmlOutput &, const VCCustomBuildTool &) override; + void write(XmlOutput &, const VCLibrarianTool &) override; + void write(XmlOutput &, const VCResourceCompilerTool &) override; + void write(XmlOutput &, const VCEventTool &) override; + void write(XmlOutput &, const VCDeploymentTool &) override; + void write(XmlOutput &, const VCWinDeployQtTool &) override; + void write(XmlOutput &, const VCConfiguration &) override; + void write(XmlOutput &, VCFilter &) override; private: struct OutputFilterData diff --git a/qmake/generators/win32/msvc_nmake.cpp b/qmake/generators/win32/msvc_nmake.cpp index 92b4eb5054..f2cd7c633b 100644 --- a/qmake/generators/win32/msvc_nmake.cpp +++ b/qmake/generators/win32/msvc_nmake.cpp @@ -383,7 +383,7 @@ void NmakeMakefileGenerator::init() processVars(); - project->values("QMAKE_LIBS") += project->values("RES_FILE"); + project->values("LIBS") += project->values("RES_FILE"); if (!project->values("DEF_FILE").isEmpty()) { QString defFileName = fileFixify(project->first("DEF_FILE").toQString()); @@ -499,7 +499,7 @@ void NmakeMakefileGenerator::writeImplicitRulesPart(QTextStream &t) QSet<QString> source_directories; if (useInferenceRules) { source_directories.insert("."); - static const char * const directories[] = { "UI_SOURCES_DIR", "UI_DIR", 0 }; + static const char * const directories[] = { "UI_SOURCES_DIR", "UI_DIR", nullptr }; for (int y = 0; directories[y]; y++) { QString dirTemp = project->first(directories[y]).toQString(); if (dirTemp.endsWith("\\")) @@ -507,7 +507,7 @@ void NmakeMakefileGenerator::writeImplicitRulesPart(QTextStream &t) if(!dirTemp.isEmpty()) source_directories.insert(dirTemp); } - static const char * const srcs[] = { "SOURCES", "GENERATED_SOURCES", 0 }; + static const char * const srcs[] = { "SOURCES", "GENERATED_SOURCES", nullptr }; for (int x = 0; srcs[x]; x++) { const ProStringList &l = project->values(srcs[x]); for (ProStringList::ConstIterator sit = l.begin(); sit != l.end(); ++sit) { @@ -584,8 +584,9 @@ void NmakeMakefileGenerator::writeBuildRulesPart(QTextStream &t) t << "first: all\n"; t << "all: " << escapeDependencyPath(fileFixify(Option::output.fileName())) - << ' ' << depVar("ALL_DEPS") << " $(DESTDIR_TARGET)\n\n"; - t << "$(DESTDIR_TARGET): " << depVar("PRE_TARGETDEPS") << " $(OBJECTS) " << depVar("POST_TARGETDEPS"); + << ' ' << depVar("ALL_DEPS") << ' ' << depVar("DEST_TARGET") << "\n\n"; + t << depVar("DEST_TARGET") << ": " + << depVar("PRE_TARGETDEPS") << " $(OBJECTS) " << depVar("POST_TARGETDEPS"); if (templateName == "aux") { t << "\n\n"; return; diff --git a/qmake/generators/win32/msvc_nmake.h b/qmake/generators/win32/msvc_nmake.h index 67b609d0a6..67a56c7813 100644 --- a/qmake/generators/win32/msvc_nmake.h +++ b/qmake/generators/win32/msvc_nmake.h @@ -36,21 +36,21 @@ QT_BEGIN_NAMESPACE class NmakeMakefileGenerator : public Win32MakefileGenerator { void writeNmakeParts(QTextStream &); - bool writeMakefile(QTextStream &); - void writeImplicitRulesPart(QTextStream &t); - void writeBuildRulesPart(QTextStream &t); + bool writeMakefile(QTextStream &) override; + void writeImplicitRulesPart(QTextStream &t) override; + void writeBuildRulesPart(QTextStream &t) override; void writeLinkCommand(QTextStream &t, const QString &extraFlags = QString(), const QString &extraInlineFileContent = QString()); void writeResponseFileFiles(QTextStream &t, const ProStringList &files); int msvcVersion() const; - void init(); + void init() override; static QStringList sourceFilesForImplicitRulesFilter(); protected: - virtual void writeSubMakeCall(QTextStream &t, const QString &callPrefix, - const QString &makeArguments); - virtual QString defaultInstall(const QString &t); - virtual QStringList &findDependencies(const QString &file); - QString var(const ProKey &value) const; + void writeSubMakeCall(QTextStream &t, const QString &callPrefix, + const QString &makeArguments) override; + QString defaultInstall(const QString &t) override; + QStringList &findDependencies(const QString &file) override; + QString var(const ProKey &value) const override; QString precompH, precompObj, precompPch; QString precompObjC, precompPchC; bool usePCH, usePCHC; diff --git a/qmake/generators/win32/msvc_objectmodel.cpp b/qmake/generators/win32/msvc_objectmodel.cpp index 452a215024..4f0cee65e1 100644 --- a/qmake/generators/win32/msvc_objectmodel.cpp +++ b/qmake/generators/win32/msvc_objectmodel.cpp @@ -2183,7 +2183,7 @@ VCConfiguration::VCConfiguration() // VCFilter --------------------------------------------------------- VCFilter::VCFilter() : ParseFiles(unset), - Config(0) + Config(nullptr) { useCustomBuildTool = false; useCompilerTool = false; diff --git a/qmake/generators/win32/msvc_objectmodel.h b/qmake/generators/win32/msvc_objectmodel.h index 10d44970ff..9d1a170489 100644 --- a/qmake/generators/win32/msvc_objectmodel.h +++ b/qmake/generators/win32/msvc_objectmodel.h @@ -484,7 +484,7 @@ public: // Functions VCCLCompilerTool(); - bool parseOption(const char* option); + bool parseOption(const char* option) override; // Variables QStringList AdditionalIncludeDirectories; @@ -581,7 +581,7 @@ public: // Functions VCLinkerTool(); - bool parseOption(const char* option); + bool parseOption(const char* option) override; // Variables QStringList AdditionalDependencies; @@ -676,7 +676,7 @@ class VCManifestTool : public VCToolBase public: VCManifestTool(); - bool parseOption(const char* option); + bool parseOption(const char* option) override; triState EmbedManifest; }; @@ -687,7 +687,7 @@ public: // Functions VCMIDLTool(); - bool parseOption(const char* option); + bool parseOption(const char* option) override; // Variables QStringList AdditionalIncludeDirectories; @@ -741,7 +741,7 @@ public: // Functions VCLibrarianTool(); - bool parseOption(const char*){ return false; } + bool parseOption(const char*) override { return false; } // Variables QStringList AdditionalDependencies; @@ -762,7 +762,7 @@ public: // Functions VCCustomBuildTool(); - bool parseOption(const char*){ return false; } + bool parseOption(const char*) override { return false; } // Variables QStringList AdditionalDependencies; @@ -781,7 +781,7 @@ public: // Functions VCResourceCompilerTool(); - bool parseOption(const char*){ return false; } + bool parseOption(const char*) override { return false; } // Variables QStringList AdditionalIncludeDirectories; @@ -815,7 +815,7 @@ protected: // Functions VCEventTool(const QString &eventName); - bool parseOption(const char*){ return false; } + bool parseOption(const char*) override { return false; } public: // Variables @@ -851,7 +851,7 @@ public: VCWinDeployQtTool() {} protected: - bool parseOption(const char *) { return false; } + bool parseOption(const char *) override { return false; } public: // Variables @@ -1037,7 +1037,7 @@ public: return Uindex; } - void addElement(const QString &filepath, const VCFilterFile &allInfo){ + void addElement(const QString &filepath, const VCFilterFile &allInfo) override { QString newNodeName(filepath); int index = pathIndex(filepath); @@ -1054,7 +1054,7 @@ public: n->addElement(filepath.mid(index+1), allInfo); } - void removeElements() { + void removeElements() override { ChildrenMap::ConstIterator it = children.constBegin(); ChildrenMap::ConstIterator end = children.constEnd(); for( ; it != end; it++) { @@ -1064,8 +1064,8 @@ public: children.clear(); } - void generateXML(XmlOutput &xml, const QString &tagName, VCProject &tool, const QString &filter); - bool hasElements() { + void generateXML(XmlOutput &xml, const QString &tagName, VCProject &tool, const QString &filter) override; + bool hasElements() override { return children.size() != 0; } }; @@ -1088,7 +1088,7 @@ public: return Uindex; } - void addElement(const QString &filepath, const VCFilterFile &allInfo){ + void addElement(const QString &filepath, const VCFilterFile &allInfo) override { QString newKey(filepath); int index = pathIndex(filepath); @@ -1100,12 +1100,12 @@ public: children.insert(newKey + "\0" + allInfo.file, allInfo); } - void removeElements() { + void removeElements() override { children.clear(); } - void generateXML(XmlOutput &xml, const QString &tagName, VCProject &proj, const QString &filter); - bool hasElements() { + void generateXML(XmlOutput &xml, const QString &tagName, VCProject &proj, const QString &filter) override; + bool hasElements() override { return children.size() != 0; } }; diff --git a/qmake/generators/win32/msvc_vcproj.cpp b/qmake/generators/win32/msvc_vcproj.cpp index 24d1657552..f7837fc1b4 100644 --- a/qmake/generators/win32/msvc_vcproj.cpp +++ b/qmake/generators/win32/msvc_vcproj.cpp @@ -112,7 +112,7 @@ VcprojGenerator::VcprojGenerator() : Win32MakefileGenerator(), is64Bit(false), customBuildToolFilterFileSuffix(QStringLiteral(".cbt")), - projectWriter(0) + projectWriter(nullptr) { } @@ -208,16 +208,6 @@ struct VcsolutionDepend { QStringList dependencies; }; -/* Disable optimization in getProjectUUID() due to a compiler - * bug in MSVC 2010 that causes ASSERT: "&other != this" in the QString - * copy constructor for non-empty file names at: - * filename.isEmpty()?project->first("QMAKE_MAKEFILE"):filename */ - -#ifdef Q_CC_MSVC -# pragma optimize( "g", off ) -# pragma warning ( disable : 4748 ) -#endif - QUuid VcprojGenerator::getProjectUUID(const QString &filename) { bool validUUID = true; @@ -249,10 +239,6 @@ QUuid VcprojGenerator::getProjectUUID(const QString &filename) return uuid; } -#ifdef Q_CC_MSVC -# pragma optimize( "g", on ) -#endif - QUuid VcprojGenerator::increaseUUID(const QUuid &id) { QUuid result(id); @@ -471,9 +457,8 @@ ProStringList VcprojGenerator::collectDependencies(QMakeProject *proj, QHash<QSt newDep->dependencies << "idc.exe"; // Add all unknown libs to the deps - QStringList where = QStringList() << "QMAKE_LIBS" << "QMAKE_LIBS_PRIVATE"; - if (!tmp_proj.isEmpty("QMAKE_INTERNAL_PRL_LIBS")) - where = tmp_proj.values("QMAKE_INTERNAL_PRL_LIBS").toQStringList(); + QStringList where = QStringList() << "LIBS" << "LIBS_PRIVATE" + << "QMAKE_LIBS" << "QMAKE_LIBS_PRIVATE"; for (QStringList::ConstIterator wit = where.begin(); wit != where.end(); ++wit) { const ProStringList &l = tmp_proj.values(ProKey(*wit)); @@ -764,7 +749,7 @@ void VcprojGenerator::init() projectTarget = Application; } else if(project->first("TEMPLATE") == "vclib") { if(project->isActiveConfig("staticlib")) { - project->values("QMAKE_LIBS") += project->values("RES_FILE"); + project->values("LIBS") += project->values("RES_FILE"); projectTarget = StaticLib; } else projectTarget = SharedLib; @@ -1100,7 +1085,8 @@ void VcprojGenerator::initLinkerTool() if (!project->values("DEF_FILE").isEmpty()) conf.linker.ModuleDefinitionFile = project->first("DEF_FILE").toQString(); - static const char * const lflags[] = { "QMAKE_LIBS", "QMAKE_LIBS_PRIVATE", 0 }; + static const char * const lflags[] = { "LIBS", "LIBS_PRIVATE", + "QMAKE_LIBS", "QMAKE_LIBS_PRIVATE", nullptr }; for (int i = 0; lflags[i]; i++) { const auto libs = fixLibFlags(lflags[i]); for (const ProString &lib : libs) { @@ -1195,7 +1181,8 @@ void VcprojGenerator::initDeploymentTool() if (!dllPaths.isEmpty() && !(conf.WinRT && project->first("MSVC_VER").toQString() == "14.0")) { // FIXME: This code should actually resolve the libraries from all Qt modules. - ProStringList arg = project->values("QMAKE_LIBS") + project->values("QMAKE_LIBS_PRIVATE"); + ProStringList arg = project->values("LIBS") + project->values("LIBS_PRIVATE") + + project->values("QMAKE_LIBS") + project->values("QMAKE_LIBS_PRIVATE"); bool qpaPluginDeployed = false; for (ProStringList::ConstIterator it = arg.constBegin(); it != arg.constEnd(); ++it) { QString dllName = (*it).toQString(); @@ -1617,20 +1604,15 @@ QString VcprojGenerator::replaceExtraCompilerVariables( bool VcprojGenerator::openOutput(QFile &file, const QString &/*build*/) const { - QString outdir; - if(!file.fileName().isEmpty()) { - QFileInfo fi(fileInfo(file.fileName())); - if(fi.isDir()) - outdir = file.fileName() + QDir::separator(); - } - if(!outdir.isEmpty() || file.fileName().isEmpty()) { - ProString ext = project->first("VCPROJ_EXTENSION"); - if(project->first("TEMPLATE") == "vcsubdirs") - ext = project->first("VCSOLUTION_EXTENSION"); - ProString outputName = project->first("TARGET"); - if (!project->first("MAKEFILE").isEmpty()) - outputName = project->first("MAKEFILE"); - file.setFileName(outdir + outputName + ext); + ProString fileName = file.fileName(); + ProString extension = project->first("TEMPLATE") == "vcsubdirs" + ? project->first("VCSOLUTION_EXTENSION") : project->first("VCPROJ_EXTENSION"); + if (!fileName.endsWith(extension)) { + if (fileName.isEmpty()) { + fileName = !project->first("MAKEFILE").isEmpty() + ? project->first("MAKEFILE") : project->first("TARGET"); + } + file.setFileName(fileName + extension); } return Win32MakefileGenerator::openOutput(file, QString()); } diff --git a/qmake/generators/win32/msvc_vcproj.h b/qmake/generators/win32/msvc_vcproj.h index 4882296b46..6af5ec7007 100644 --- a/qmake/generators/win32/msvc_vcproj.h +++ b/qmake/generators/win32/msvc_vcproj.h @@ -47,10 +47,10 @@ class VcprojGenerator : public Win32MakefileGenerator bool is64Bit; bool writeVcprojParts(QTextStream &); - bool writeMakefile(QTextStream &); - bool writeProjectMakefile(); + bool writeMakefile(QTextStream &) override; + bool writeProjectMakefile() override; - void init(); + void init() override; public: VcprojGenerator(); @@ -70,14 +70,14 @@ public: protected: virtual VCProjectWriter *createProjectWriter(); - virtual bool doDepends() const { return false; } //never necesary + bool doDepends() const override { return false; } // Never necessary using Win32MakefileGenerator::replaceExtraCompilerVariables; - virtual QString replaceExtraCompilerVariables(const QString &, const QStringList &, const QStringList &, ReplaceFor); - virtual bool supportsMetaBuild() { return true; } - virtual bool supportsMergedBuilds() { return true; } - virtual bool mergeBuildProject(MakefileGenerator *other); + QString replaceExtraCompilerVariables(const QString &, const QStringList &, const QStringList &, ReplaceFor) override; + bool supportsMetaBuild() override { return true; } + bool supportsMergedBuilds() override { return true; } + bool mergeBuildProject(MakefileGenerator *other) override; - virtual bool openOutput(QFile &file, const QString &build) const; + bool openOutput(QFile &file, const QString &build) const override; virtual void initProject(); void initConfiguration(); diff --git a/qmake/generators/win32/msvc_vcxproj.h b/qmake/generators/win32/msvc_vcxproj.h index 8f68348693..7e02b6c32f 100644 --- a/qmake/generators/win32/msvc_vcxproj.h +++ b/qmake/generators/win32/msvc_vcxproj.h @@ -39,7 +39,7 @@ public: VcxprojGenerator(); protected: - virtual VCProjectWriter *createProjectWriter(); + VCProjectWriter *createProjectWriter() override; }; QT_END_NAMESPACE diff --git a/qmake/generators/win32/registry.cpp b/qmake/generators/win32/registry.cpp index 7320cb0551..3391ab9512 100644 --- a/qmake/generators/win32/registry.cpp +++ b/qmake/generators/win32/registry.cpp @@ -77,7 +77,7 @@ QString qt_readRegistryKey(HKEY parentHandle, const QString &rSubkey, unsigned l QString rSubkeyName = keyName(rSubkey); QString rSubkeyPath = keyPath(rSubkey); - HKEY handle = 0; + HKEY handle = nullptr; LONG res = RegOpenKeyEx(parentHandle, (wchar_t*)rSubkeyPath.utf16(), 0, KEY_READ | options, &handle); @@ -87,7 +87,7 @@ QString qt_readRegistryKey(HKEY parentHandle, const QString &rSubkey, unsigned l // get the size and type of the value DWORD dataType; DWORD dataSize; - res = RegQueryValueEx(handle, (wchar_t*)rSubkeyName.utf16(), 0, &dataType, 0, &dataSize); + res = RegQueryValueEx(handle, (wchar_t*)rSubkeyName.utf16(), nullptr, &dataType, nullptr, &dataSize); if (res != ERROR_SUCCESS) { RegCloseKey(handle); return QString(); @@ -95,7 +95,7 @@ QString qt_readRegistryKey(HKEY parentHandle, const QString &rSubkey, unsigned l // get the value QByteArray data(dataSize, 0); - res = RegQueryValueEx(handle, (wchar_t*)rSubkeyName.utf16(), 0, 0, + res = RegQueryValueEx(handle, (wchar_t*)rSubkeyName.utf16(), nullptr, nullptr, reinterpret_cast<unsigned char*>(data.data()), &dataSize); if (res != ERROR_SUCCESS) { RegCloseKey(handle); diff --git a/qmake/generators/win32/winmakefile.cpp b/qmake/generators/win32/winmakefile.cpp index bca27b7044..e0d03ccc1c 100644 --- a/qmake/generators/win32/winmakefile.cpp +++ b/qmake/generators/win32/winmakefile.cpp @@ -84,7 +84,8 @@ Win32MakefileGenerator::findLibraries(bool linkPrl, bool mergeLflags) if (impexts.isEmpty()) impexts = project->values("QMAKE_EXTENSION_STATICLIB"); QList<QMakeLocalFileName> dirs; - static const char * const lflags[] = { "QMAKE_LIBS", "QMAKE_LIBS_PRIVATE", 0 }; + static const char * const lflags[] = { "LIBS", "LIBS_PRIVATE", + "QMAKE_LIBS", "QMAKE_LIBS_PRIVATE", nullptr }; for (int i = 0; lflags[i]; i++) { ProStringList &l = project->values(lflags[i]); for (ProStringList::Iterator it = l.begin(); it != l.end();) { @@ -106,7 +107,7 @@ Win32MakefileGenerator::findLibraries(bool linkPrl, bool mergeLflags) for (QList<QMakeLocalFileName>::Iterator dir_it = dirs.begin(); dir_it != dirs.end(); ++dir_it) { QString cand = (*dir_it).real() + Option::dir_sep + lib; - if (linkPrl && processPrlFile(cand)) { + if (linkPrl && processPrlFile(cand, true)) { (*it) = cand; goto found; } @@ -124,13 +125,13 @@ Win32MakefileGenerator::findLibraries(bool linkPrl, bool mergeLflags) } else if (linkPrl && type == LibFlagFile) { QString lib = opt.toQString(); if (fileInfo(lib).isAbsolute()) { - if (processPrlFile(lib)) + if (processPrlFile(lib, false)) (*it) = lib; } else { for (QList<QMakeLocalFileName>::Iterator dir_it = dirs.begin(); dir_it != dirs.end(); ++dir_it) { QString cand = (*dir_it).real() + Option::dir_sep + lib; - if (processPrlFile(cand)) { + if (processPrlFile(cand, false)) { (*it) = cand; break; } @@ -163,12 +164,30 @@ Win32MakefileGenerator::findLibraries(bool linkPrl, bool mergeLflags) return true; } +bool Win32MakefileGenerator::processPrlFileBase(QString &origFile, const QStringRef &origName, + const QStringRef &fixedBase, int slashOff) +{ + if (MakefileGenerator::processPrlFileBase(origFile, origName, fixedBase, slashOff)) + return true; + for (int off = fixedBase.length(); off > slashOff; off--) { + if (!fixedBase.at(off - 1).isDigit()) { + if (off != fixedBase.length()) { + return MakefileGenerator::processPrlFileBase( + origFile, origName, fixedBase.left(off), slashOff); + } + break; + } + } + return false; +} + void Win32MakefileGenerator::processVars() { if (project->first("TEMPLATE").endsWith("aux")) return; - project->values("QMAKE_ORIG_TARGET") = project->values("TARGET"); + project->values("PRL_TARGET") = + project->values("QMAKE_ORIG_TARGET") = project->values("TARGET"); if (project->isEmpty("QMAKE_PROJECT_NAME")) project->values("QMAKE_PROJECT_NAME") = project->values("QMAKE_ORIG_TARGET"); else if (project->first("TEMPLATE").startsWith("vc")) @@ -207,8 +226,8 @@ void Win32MakefileGenerator::processVars() libs << QLatin1String("-L") + lib; } } - project->values("QMAKE_LIBS") += libs + project->values("LIBS"); - project->values("QMAKE_LIBS_PRIVATE") += project->values("LIBS_PRIVATE"); + ProStringList &qmklibs = project->values("LIBS"); + qmklibs = libs + qmklibs; if (project->values("TEMPLATE").contains("app")) { project->values("QMAKE_CFLAGS") += project->values("QMAKE_CFLAGS_APP"); @@ -422,7 +441,7 @@ void Win32MakefileGenerator::writeCleanParts(QTextStream &t) { t << "clean: compiler_clean " << depVar("CLEAN_DEPS"); { - const char *clean_targets[] = { "OBJECTS", "QMAKE_CLEAN", "CLEAN_FILES", 0 }; + const char *clean_targets[] = { "OBJECTS", "QMAKE_CLEAN", "CLEAN_FILES", nullptr }; for(int i = 0; clean_targets[i]; ++i) { const ProStringList &list = project->values(clean_targets[i]); const QString del_statement("-$(DEL_FILE)"); @@ -451,7 +470,7 @@ void Win32MakefileGenerator::writeCleanParts(QTextStream &t) t << "distclean: clean " << depVar("DISTCLEAN_DEPS"); { - const char *clean_targets[] = { "QMAKE_DISTCLEAN", 0 }; + const char *clean_targets[] = { "QMAKE_DISTCLEAN", nullptr }; for(int i = 0; clean_targets[i]; ++i) { const ProStringList &list = project->values(clean_targets[i]); const QString del_statement("-$(DEL_FILE)"); @@ -563,7 +582,7 @@ void Win32MakefileGenerator::writeStandardParts(QTextStream &t) t << "DIST = " << fileVarList("DISTFILES") << ' ' << fileVarList("HEADERS") << ' ' << fileVarList("SOURCES") << endl; - t << "QMAKE_TARGET = " << fileVar("QMAKE_ORIG_TARGET") << endl; + t << "QMAKE_TARGET = " << fileVar("QMAKE_ORIG_TARGET") << endl; // unused // The comment is important to maintain variable compatibility with Unix // Makefiles, while not interpreting a trailing-slash as a linebreak t << "DESTDIR = " << escapeFilePath(destDir) << " #avoid trailing-slash linebreak\n"; @@ -633,7 +652,9 @@ void Win32MakefileGenerator::writeLibsPart(QTextStream &t) } else { t << "LINKER = " << var("QMAKE_LINK") << endl; t << "LFLAGS = " << var("QMAKE_LFLAGS") << endl; - t << "LIBS = " << fixLibFlags("QMAKE_LIBS").join(' ') << ' ' + t << "LIBS = " << fixLibFlags("LIBS").join(' ') << ' ' + << fixLibFlags("LIBS_PRIVATE").join(' ') << ' ' + << fixLibFlags("QMAKE_LIBS").join(' ') << ' ' << fixLibFlags("QMAKE_LIBS_PRIVATE").join(' ') << endl; } } diff --git a/qmake/generators/win32/winmakefile.h b/qmake/generators/win32/winmakefile.h index b85a6b67df..4416951a09 100644 --- a/qmake/generators/win32/winmakefile.h +++ b/qmake/generators/win32/winmakefile.h @@ -39,7 +39,7 @@ public: Win32MakefileGenerator(); ~Win32MakefileGenerator(); protected: - virtual QString defaultInstall(const QString &); + QString defaultInstall(const QString &) override; virtual void writeCleanParts(QTextStream &t); virtual void writeStandardParts(QTextStream &t); virtual void writeIncPart(QTextStream &t); @@ -48,16 +48,18 @@ protected: virtual void writeImplicitRulesPart(QTextStream &t); virtual void writeBuildRulesPart(QTextStream &); using MakefileGenerator::escapeFilePath; - virtual QString escapeFilePath(const QString &path) const; + QString escapeFilePath(const QString &path) const override; using MakefileGenerator::escapeDependencyPath; - virtual QString escapeDependencyPath(const QString &path) const; + QString escapeDependencyPath(const QString &path) const override; virtual void writeRcFilePart(QTextStream &t); - virtual bool findLibraries(bool linkPrl, bool mergeLflags); + bool findLibraries(bool linkPrl, bool mergeLflags) override; - virtual LibFlagType parseLibFlag(const ProString &flag, ProString *arg); - virtual ProString fixLibFlag(const ProString &lib); + LibFlagType parseLibFlag(const ProString &flag, ProString *arg) override; + ProString fixLibFlag(const ProString &lib) override; + bool processPrlFileBase(QString &origFile, const QStringRef &origName, + const QStringRef &fixedBase, int slashOff) override; void processVars(); void fixTargetExt(); |