diff options
author | Tor Arne Vestbø <tor.arne.vestbo@nokia.com> | 2011-12-05 14:50:43 (GMT) |
---|---|---|
committer | Oswald Buddenhagen <oswald.buddenhagen@digia.com> | 2014-08-14 11:25:31 (GMT) |
commit | 469dcfff3e39249b0a5eb98242fbe5f917587246 (patch) | |
tree | a01cbadd0f1178fbdc32708bfdfdcea07e2d09ec /qmake | |
parent | f5231b768e9986b9519af1a0d2eff1891adaeba2 (diff) | |
download | Qt-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')
-rw-r--r-- | qmake/generators/makefile.cpp | 23 |
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; } |