remove automagic command path fixing misfeature

Qmake tried to extract the actual executable part of an
extra compiler's commands and depend_command value and
then "fix" it by replacing the directory separators in
it with their local versions and calling QDir::cleanPath
on it.

This misfeature was implemented incompletely and led to
unexpected results (see the numerous attempts to fix
QTBUG-16372).

The user is responsible for passing a correct command by
calling the shell_quote or shell_escape functions if
necessary.

Change-Id: Ic4bfe9eeb697775cd99c865e7a9d335e63605dea
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@digia.com>
This commit is contained in:
Joerg Bornemann 2014-04-28 17:21:53 +02:00 committed by The Qt Project
parent 547627b212
commit 41ef1095b4

View File

@ -1749,23 +1749,7 @@ MakefileGenerator::verifyExtraCompiler(const ProString &comp, const QString &fil
QString tmp_out = project->values(ProKey(comp + ".output")).first().toQString();
if(tmp_out.isEmpty())
return false;
QString tmp_cmd;
const ProKey ckey(comp + ".commands");
if (!project->isEmpty(ckey)) {
int argv0 = -1;
ProStringList cmdline = project->values(ckey);
for(int i = 0; i < cmdline.count(); ++i) {
if(!cmdline.at(i).contains('=')) {
argv0 = i;
break;
}
}
if(argv0 != -1) {
cmdline[argv0] = Option::fixPathToTargetOS(cmdline.at(argv0).toQString(), false);
tmp_cmd = cmdline.join(' ');
}
}
const QString tmp_cmd = project->values(ProKey(comp + ".commands")).join(' ');
if (config.indexOf("combine") != -1) {
QString cmd = replaceExtraCompilerVariables(tmp_cmd, QString(), tmp_out);
if(system(cmd.toLatin1().constData()))
@ -1829,42 +1813,10 @@ MakefileGenerator::writeExtraCompilerTargets(QTextStream &t)
for (ProStringList::ConstIterator it = quc.begin(); it != quc.end(); ++it) {
QString tmp_out = fileFixify(project->first(ProKey(*it + ".output")).toQString(),
Option::output_dir, Option::output_dir);
QString tmp_cmd;
const ProKey ckey(*it + ".commands");
if (!project->isEmpty(ckey)) {
QStringList cmdline = project->values(ckey).toQStringList();
int argv0 = findExecutable(cmdline);
if(argv0 != -1) {
cmdline[argv0] = escapeFilePath(Option::fixPathToTargetOS(cmdline.at(argv0), false));
tmp_cmd = cmdline.join(' ');
}
}
QString tmp_dep_cmd;
const QString tmp_cmd = project->values(ProKey(*it + ".commands")).join(' ');
const QString tmp_dep_cmd = project->values(ProKey(*it + "depend_command")).join(' ');
QString dep_cd_cmd;
const ProKey dckey(*it + ".depend_command");
if (!project->isEmpty(dckey)) {
int argv0 = -1;
ProStringList cmdline = project->values(dckey);
for(int i = 0; i < cmdline.count(); ++i) {
if(!cmdline.at(i).contains('=')) {
argv0 = i;
break;
}
}
if(argv0 != -1) {
QString arg = cmdline.at(argv0).toQString();
const QString c = Option::fixPathToLocalOS(arg, true);
if(exists(c)) {
arg = escapeFilePath(Option::fixPathToLocalOS(arg, false));
} else {
arg = escapeFilePath(arg);
}
QFileInfo cmdFileInfo(arg);
if (!cmdFileInfo.isAbsolute() || cmdFileInfo.exists()) {
cmdline[argv0] = arg;
tmp_dep_cmd = cmdline.join(' ');
}
}
if (!tmp_dep_cmd.isEmpty()) {
dep_cd_cmd = QLatin1String("cd ")
+ escapeFilePath(Option::fixPathToLocalOS(Option::output_dir, false))
+ QLatin1String(" && ");