diff --git a/src/shared/proparser/qmakebuiltins.cpp b/src/shared/proparser/qmakebuiltins.cpp index 3a6931a1d785309d21ca4dfe86909f72cf946857..5d9f25606d07de50f275447c7a4f6eebb8a678bd 100644 --- a/src/shared/proparser/qmakebuiltins.cpp +++ b/src/shared/proparser/qmakebuiltins.cpp @@ -950,38 +950,46 @@ ProStringList QMakeEvaluator::evaluateExpandFunction( evalError(fL1S("shadowed(path) requires one argument.")); } else { QString val = resolvePath(args.at(0).toQString(m_tmp1)); + QString rstr; if (m_option->source_root.isEmpty()) { - ret += ProString(val); + rstr = val; } else if (val.startsWith(m_option->source_root) && (val.length() == m_option->source_root.length() || val.at(m_option->source_root.length()) == QLatin1Char('/'))) { - ret += ProString(m_option->build_root + val.mid(m_option->source_root.length())) - .setSource(args.at(0)); + rstr = m_option->build_root + val.mid(m_option->source_root.length()); + } else { + break; } + ret << (rstr.isSharedWith(m_tmp1) ? args.at(0) : ProString(rstr).setSource(args.at(0))); } break; case E_ABSOLUTE_PATH: - if (args.count() > 2) + if (args.count() > 2) { evalError(fL1S("absolute_path(path[, base]) requires one or two arguments.")); - else - ret << ProString(QDir::cleanPath( + } else { + QString rstr = QDir::cleanPath( QDir(args.count() > 1 ? args.at(1).toQString(m_tmp2) : currentDirectory()) - .absoluteFilePath(args.at(0).toQString(m_tmp1)))).setSource(args.at(0)); + .absoluteFilePath(args.at(0).toQString(m_tmp1))); + ret << (rstr.isSharedWith(m_tmp1) ? args.at(0) : ProString(rstr).setSource(args.at(0))); + } break; case E_RELATIVE_PATH: if (args.count() > 2) { evalError(fL1S("relative_path(path[, base]) requires one or two arguments.")); } else { QDir baseDir(args.count() > 1 ? args.at(1).toQString(m_tmp2) : currentDirectory()); - ret << ProString(baseDir.relativeFilePath(baseDir.absoluteFilePath( - args.at(0).toQString(m_tmp1)))).setSource(args.at(0)); + QString rstr = baseDir.relativeFilePath(baseDir.absoluteFilePath( + args.at(0).toQString(m_tmp1))); + ret << (rstr.isSharedWith(m_tmp1) ? args.at(0) : ProString(rstr).setSource(args.at(0))); } break; case E_CLEAN_PATH: - if (args.count() != 1) + if (args.count() != 1) { evalError(fL1S("clean_path(path) requires one argument.")); - else - ret << ProString(QDir::cleanPath(args.at(0).toQString(m_tmp1))).setSource(args.at(0)); + } else { + QString rstr = QDir::cleanPath(args.at(0).toQString(m_tmp1)); + ret << (rstr.isSharedWith(m_tmp1) ? args.at(0) : ProString(rstr).setSource(args.at(0))); + } break; case E_SYSTEM_PATH: if (args.count() != 1) { @@ -993,7 +1001,7 @@ ProStringList QMakeEvaluator::evaluateExpandFunction( #else rstr.replace(QLatin1Char('\\'), QLatin1Char('/')); #endif - ret << ProString(rstr).setSource(args.at(0)); + ret << (rstr.isSharedWith(m_tmp1) ? args.at(0) : ProString(rstr).setSource(args.at(0))); } break; case E_SHELL_PATH: @@ -1005,14 +1013,16 @@ ProStringList QMakeEvaluator::evaluateExpandFunction( rstr.replace(QLatin1Char('/'), QLatin1Char('\\')); else rstr.replace(QLatin1Char('\\'), QLatin1Char('/')); - ret << ProString(rstr).setSource(args.at(0)); + ret << (rstr.isSharedWith(m_tmp1) ? args.at(0) : ProString(rstr).setSource(args.at(0))); } break; case E_SYSTEM_QUOTE: - if (args.count() != 1) + if (args.count() != 1) { evalError(fL1S("system_quote(arg) requires one argument.")); - else - ret << ProString(IoUtils::shellQuote(args.at(0).toQString(m_tmp1))).setSource(args.at(0)); + } else { + QString rstr = IoUtils::shellQuote(args.at(0).toQString(m_tmp1)); + ret << (rstr.isSharedWith(m_tmp1) ? args.at(0) : ProString(rstr).setSource(args.at(0))); + } break; case E_SHELL_QUOTE: if (args.count() != 1) { @@ -1023,7 +1033,7 @@ ProStringList QMakeEvaluator::evaluateExpandFunction( rstr = IoUtils::shellQuoteWin(rstr); else rstr = IoUtils::shellQuoteUnix(rstr); - ret << ProString(rstr).setSource(args.at(0)); + ret << (rstr.isSharedWith(m_tmp1) ? args.at(0) : ProString(rstr).setSource(args.at(0))); } break; case E_INVALID: