diff options
author | Tor Arne Vestbø <tor.arne.vestbo@qt.io> | 2018-07-17 15:11:07 +0200 |
---|---|---|
committer | Tor Arne Vestbø <tor.arne.vestbo@qt.io> | 2018-07-31 10:13:31 +0000 |
commit | 8cea3ec8ce7f4110e849b53e3c97b690a8899dd9 (patch) | |
tree | ced62839aa69423773ea860dcb736e9a20930755 /qmake/generators/mac | |
parent | 3ed22c5efe538204a496d30b881f3999c020caa7 (diff) |
qmake: Harden logic for handling the -o option
We now treat -o foo/bar/baz as a request to generate the output in the
foo/bar directory with baz as the output name, or if foo/bar/baz is already
a directory, in the foo/bar/baz directory with the default output name.
We take care to handle generator specific directory structures, so
that the project directory does not get merged into OUT_PWD. This is
done in runQmake(), before parsing the project file, so that OUT_PWD
will be correct during project parsing. The individual generators are
then passed the filename relative to the final output directory.
Each generator now also makes sure to add the right project suffix
to the output file, so -o foo will result in foo.pro or foo.vcproj,
instead of just foo.
Task-number: QTBUG-44408
Change-Id: I26990cec0c0458bee2b88dbb86322617a85f54b5
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@qt.io>
Diffstat (limited to 'qmake/generators/mac')
-rw-r--r-- | qmake/generators/mac/pbuilder_pbx.cpp | 23 | ||||
-rw-r--r-- | qmake/generators/mac/pbuilder_pbx.h | 2 |
2 files changed, 10 insertions, 15 deletions
diff --git a/qmake/generators/mac/pbuilder_pbx.cpp b/qmake/generators/mac/pbuilder_pbx.cpp index d3ee8a24ea..13d707a881 100644 --- a/qmake/generators/mac/pbuilder_pbx.cpp +++ b/qmake/generators/mac/pbuilder_pbx.cpp @@ -1882,33 +1882,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..f92436c215 100644 --- a/qmake/generators/mac/pbuilder_pbx.h +++ b/qmake/generators/mac/pbuilder_pbx.h @@ -36,7 +36,7 @@ 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 &); |