summaryrefslogtreecommitdiffstats
path: root/qmake/generators
diff options
context:
space:
mode:
authorTor Arne Vestbø <tor.arne.vestbo@nokia.com>2011-12-05 14:50:43 (GMT)
committerOswald Buddenhagen <oswald.buddenhagen@digia.com>2014-08-14 11:25:31 (GMT)
commit469dcfff3e39249b0a5eb98242fbe5f917587246 (patch)
treea01cbadd0f1178fbdc32708bfdfdcea07e2d09ec /qmake/generators
parentf5231b768e9986b9519af1a0d2eff1891adaeba2 (diff)
downloadQt-469dcfff3e39249b0a5eb98242fbe5f917587246.zip
Qt-469dcfff3e39249b0a5eb98242fbe5f917587246.tar.gz
Qt-469dcfff3e39249b0a5eb98242fbe5f917587246.tar.bz2
qmake: Add object_parallel_to_source config option
This solves the problem of two source files in the same project having the same name, which ends up with colliding object files. It also solves issues with moving files around in the source tree when the GNUmake option is used together with gcc_MD_depends, where the dependency file would end up with a dependency to the old source location. We already have object_with_source option, but that does not play nicely with shadow-builds. The new option tries to keep the same hirarcy in the output dir (while still respecting OBJECTS_DIR), as the sources. Any source with a path outside of the root project directory (absolute or relative, ../../foo.cpp), will be put inside the objects directory with the full path appended. Task-number: QTBUG-34871 (cherry picked from qtbase/47df12225918ba82abe35921af19e547717da58b) Change-Id: I3481b128ed72494a644fdbc55325661a23e868fa Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@digia.com>
Diffstat (limited to 'qmake/generators')
-rw-r--r--qmake/generators/makefile.cpp23
1 files changed, 23 insertions, 0 deletions
diff --git a/qmake/generators/makefile.cpp b/qmake/generators/makefile.cpp
index 5f5c5e6..045759b 100644
--- a/qmake/generators/makefile.cpp
+++ b/qmake/generators/makefile.cpp
@@ -1476,6 +1476,29 @@ MakefileGenerator::createObjectList(const QStringList &sources)
int dl = fName.lastIndexOf(Option::dir_sep);
if(dl != -1)
dir = fName.left(dl + 1);
+ } else if (project->isActiveConfig("object_parallel_to_source")) {
+ // The source paths are relative to the output dir, but we need source-relative paths
+ QString sourceRelativePath = fileFixify(*it, qmake_getpwd(), Option::output_dir);
+ sourceRelativePath = Option::fixPathToTargetOS(sourceRelativePath, false);
+
+ if (sourceRelativePath.startsWith(".." + Option::dir_sep))
+ sourceRelativePath = fileFixify(sourceRelativePath, FileFixifyAbsolute);
+
+ if (QDir::isAbsolutePath(sourceRelativePath))
+ sourceRelativePath.remove(0, sourceRelativePath.indexOf(Option::dir_sep) + 1);
+
+ dir = objdir; // We still respect OBJECTS_DIR
+
+ int lastDirSepPosition = sourceRelativePath.lastIndexOf(Option::dir_sep);
+ if (lastDirSepPosition != -1)
+ dir += sourceRelativePath.leftRef(lastDirSepPosition + 1);
+
+ if (!noIO()) {
+ // Ensure that the final output directory of each object exists
+ QString outRelativePath = fileFixify(dir, qmake_getpwd(), Option::output_dir);
+ if (!mkdir(outRelativePath))
+ warn_msg(WarnLogic, "Cannot create directory '%s'", outRelativePath.toLatin1().constData());
+ }
} else {
dir = objdir;
}