summaryrefslogtreecommitdiffstats
path: root/qmake/generators/makefile.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'qmake/generators/makefile.cpp')
-rw-r--r--qmake/generators/makefile.cpp310
1 files changed, 169 insertions, 141 deletions
diff --git a/qmake/generators/makefile.cpp b/qmake/generators/makefile.cpp
index eebd0e1be5..f2decd71a5 100644
--- a/qmake/generators/makefile.cpp
+++ b/qmake/generators/makefile.cpp
@@ -61,6 +61,8 @@
QT_BEGIN_NAMESPACE
+using namespace QMakeInternal;
+
bool MakefileGenerator::canExecute(const QStringList &cmdline, int *a) const
{
int argv0 = -1;
@@ -73,7 +75,7 @@ bool MakefileGenerator::canExecute(const QStringList &cmdline, int *a) const
if(a)
*a = argv0;
if(argv0 != -1) {
- const QString c = Option::fixPathToLocalOS(cmdline.at(argv0), true);
+ const QString c = Option::normalizePath(cmdline.at(argv0));
if(exists(c))
return true;
}
@@ -88,7 +90,7 @@ QString MakefileGenerator::mkdir_p_asstring(const QString &dir, bool escape) con
bool MakefileGenerator::mkdir(const QString &in_path) const
{
- QString path = Option::fixPathToLocalOS(in_path);
+ QString path = Option::normalizePath(in_path);
if(QFile::exists(path))
return true;
@@ -210,9 +212,9 @@ MakefileGenerator::initOutPaths()
for (ProStringList::Iterator input = inputs.begin(); input != inputs.end(); ++input) {
QString finp = fileFixify((*input).toQString(), Option::output_dir, Option::output_dir);
*input = ProString(finp);
- QString path = unescapeFilePath(replaceExtraCompilerVariables(tmp_out, finp, QString()));
- path = Option::fixPathToTargetOS(path);
- int slash = path.lastIndexOf(Option::dir_sep);
+ QString path = replaceExtraCompilerVariables(tmp_out, finp, QString(), NoShell);
+ path = Option::normalizePath(path);
+ int slash = path.lastIndexOf('/');
if(slash != -1) {
path = path.left(slash);
// Make out path only if it does not contain makefile variables
@@ -228,7 +230,7 @@ MakefileGenerator::initOutPaths()
if(!v["DESTDIR"].isEmpty()) {
QDir d(v["DESTDIR"].first().toQString());
- if(Option::fixPathToLocalOS(d.absolutePath()) == Option::fixPathToLocalOS(Option::output_dir))
+ if (Option::normalizePath(d.absolutePath()) == Option::normalizePath(Option::output_dir))
v.remove("DESTDIR");
}
}
@@ -275,8 +277,6 @@ MakefileGenerator::findFilesInVPATH(ProStringList l, uchar flags, const QString
}
if(!(flags & VPATH_NoFixify))
file = fileFixify(file, qmake_getpwd(), Option::output_dir);
- if (file.at(0) == '\"' && file.at(file.length() - 1) == '\"')
- file = file.mid(1, file.length() - 2);
if(exists(file)) {
++val_it;
@@ -293,8 +293,8 @@ MakefileGenerator::findFilesInVPATH(ProStringList l, uchar flags, const QString
}
for (ProStringList::Iterator vpath_it = vpath.begin();
vpath_it != vpath.end(); ++vpath_it) {
- QString real_dir = Option::fixPathToLocalOS((*vpath_it).toQString());
- if(exists(real_dir + QDir::separator() + val)) {
+ QString real_dir = Option::normalizePath((*vpath_it).toQString());
+ if (exists(real_dir + '/' + val)) {
ProString dir = (*vpath_it);
if(!dir.endsWith(Option::dir_sep))
dir += Option::dir_sep;
@@ -725,10 +725,9 @@ MakefileGenerator::init()
if((*input).isEmpty())
continue;
QString inpf = (*input).toQString();
- QString in = Option::fixPathToTargetOS(inpf, false);
- if (!verifyExtraCompiler((*it).toQString(), in)) //verify
+ if (!verifyExtraCompiler((*it).toQString(), inpf)) //verify
continue;
- QString out = replaceExtraCompilerVariables(tmp_out.toQString(), inpf, QString());
+ QString out = replaceExtraCompilerVariables(tmp_out.toQString(), inpf, QString(), NoShell);
out = fileFixify(out, Option::output_dir, Option::output_dir);
bool pre_dep = (config.indexOf("target_predeps") != -1);
if (v.contains(vokey)) {
@@ -772,7 +771,7 @@ MakefileGenerator::init()
incDirs += v["INCLUDEPATH"];
QList<QMakeLocalFileName> deplist;
for (ProStringList::Iterator it = incDirs.begin(); it != incDirs.end(); ++it)
- deplist.append(QMakeLocalFileName(unescapeFilePath((*it).toQString())));
+ deplist.append(QMakeLocalFileName((*it).toQString()));
QMakeSourceFileInfo::setDependencyPaths(deplist);
debug_msg(1, "Dependency Directories: %s", incDirs.join(" :: ").toLatin1().constData());
//cache info
@@ -818,7 +817,7 @@ MakefileGenerator::init()
if(!project->isEmpty("TRANSLATIONS")) {
ProStringList &trf = project->values("TRANSLATIONS");
for (ProStringList::Iterator it = trf.begin(); it != trf.end(); ++it)
- (*it) = Option::fixPathToLocalOS((*it).toQString());
+ (*it) = Option::fixPathToTargetOS((*it).toQString());
}
//fix up the target deps
@@ -827,7 +826,7 @@ MakefileGenerator::init()
ProStringList &l = v[fixpaths[path]];
for (ProStringList::Iterator val_it = l.begin(); val_it != l.end(); ++val_it) {
if(!(*val_it).isEmpty())
- (*val_it) = escapeDependencyPath(Option::fixPathToTargetOS((*val_it).toQString(), false, false));
+ (*val_it) = Option::fixPathToTargetOS((*val_it).toQString(), false, false);
}
}
@@ -844,9 +843,9 @@ MakefileGenerator::init()
if (exists(dep)) {
out_deps.append(dep);
} else {
- QString dir, regex = Option::fixPathToLocalOS(dep);
- if(regex.lastIndexOf(Option::dir_sep) != -1) {
- dir = regex.left(regex.lastIndexOf(Option::dir_sep) + 1);
+ QString dir, regex = Option::normalizePath(dep);
+ if (regex.lastIndexOf('/') != -1) {
+ dir = regex.left(regex.lastIndexOf('/') + 1);
regex.remove(0, dir.length());
}
QStringList files = QDir(dir).entryList(QStringList(regex));
@@ -885,7 +884,7 @@ MakefileGenerator::processPrlFile(QString &file)
meta_file = tmp;
}
// meta_file = fileFixify(meta_file);
- QString real_meta_file = Option::fixPathToLocalOS(meta_file);
+ QString real_meta_file = Option::normalizePath(meta_file);
if(!meta_file.isEmpty()) {
QString f = fileFixify(real_meta_file, qmake_getpwd(), Option::output_dir);
if(QMakeMetaInfo::libExists(f)) {
@@ -905,7 +904,7 @@ MakefileGenerator::processPrlFile(QString &file)
defs.append(def);
if(try_replace_file && !libinfo.isEmpty("QMAKE_PRL_TARGET")) {
QString dir;
- int slsh = real_meta_file.lastIndexOf(Option::dir_sep);
+ int slsh = real_meta_file.lastIndexOf('/');
if(slsh != -1)
dir = real_meta_file.left(slsh+1);
file = libinfo.first("QMAKE_PRL_TARGET").toQString();
@@ -1052,9 +1051,9 @@ MakefileGenerator::writeProjectMakefile()
writeSubTargets(t, targets, SubTargetsNoFlags);
if(!project->isActiveConfig("no_autoqmake")) {
+ QString mkf = escapeDependencyPath(fileFixify(Option::output.fileName()));
for(QList<SubTarget*>::Iterator it = targets.begin(); it != targets.end(); ++it)
- t << (*it)->makefile << ": " <<
- Option::fixPathToTargetOS(fileFixify(Option::output.fileName())) << endl;
+ t << escapeDependencyPath((*it)->makefile) << ": " << mkf << endl;
}
qDeleteAll(targets);
return true;
@@ -1102,7 +1101,7 @@ MakefileGenerator::prlFileName(bool fixify)
if(fixify) {
if(!project->isEmpty("DESTDIR"))
ret.prepend(project->first("DESTDIR").toQString());
- ret = Option::fixPathToLocalOS(fileFixify(ret, qmake_getpwd(), Option::output_dir));
+ ret = fileFixify(ret, qmake_getpwd(), Option::output_dir);
}
return ret;
}
@@ -1206,7 +1205,7 @@ MakefileGenerator::writeInstalls(QTextStream &t, bool noBuild)
QString dst;
if (installConfigValues.indexOf("no_path") == -1 &&
installConfigValues.indexOf("dummy_install") == -1) {
- dst = fileFixify(unescapeFilePath(project->first(pvar).toQString()), FileFixifyAbsolute, false);
+ dst = fileFixify(project->first(pvar).toQString(), FileFixifyAbsolute, false);
if(!dst.endsWith(Option::dir_sep))
dst += Option::dir_sep;
}
@@ -1294,7 +1293,7 @@ MakefileGenerator::writeInstalls(QTextStream &t, bool noBuild)
uninst.append(rm_dir_contents + " " + escapeFilePath(filePrefixRoot(root, fileFixify(dst_dir + filestr, FileFixifyAbsolute, false))));
continue;
}
- QString local_dirstr = Option::fixPathToLocalOS(dirstr, true);
+ QString local_dirstr = Option::normalizePath(dirstr);
QStringList files = QDir(local_dirstr).entryList(QStringList(filestr),
QDir::NoDotAndDotDot | QDir::AllEntries);
if (installConfigValues.contains("no_check_exist") && files.isEmpty()) {
@@ -1373,7 +1372,7 @@ MakefileGenerator::writeInstalls(QTextStream &t, bool noBuild)
t << "uninstall_" << (*it) << ": FORCE";
for (int i = uninst.size(); --i >= 0; )
t << "\n\t" << uninst.at(i);
- t << "\n\t-$(DEL_DIR) " << filePrefixRoot(root, dst) << " \n\n";
+ t << "\n\t-$(DEL_DIR) " << escapeFilePath(filePrefixRoot(root, dst)) << " \n\n";
}
t << endl;
@@ -1386,8 +1385,8 @@ MakefileGenerator::writeInstalls(QTextStream &t, bool noBuild)
debug_msg(1, "no definition for install %s: install target not created",(*it).toLatin1().constData());
}
}
- t << "install: " << var("INSTALLDEPS") << " " << all_installs
- << " FORCE\n\nuninstall: " << all_uninstalls << " " << var("UNINSTALLDEPS")
+ t << "install:" << depVar("INSTALLDEPS") << ' ' << all_installs
+ << " FORCE\n\nuninstall: " << all_uninstalls << depVar("UNINSTALLDEPS")
<< " FORCE\n\n";
}
@@ -1398,6 +1397,24 @@ MakefileGenerator::var(const ProKey &var) const
}
QString
+MakefileGenerator::fileVar(const ProKey &var) const
+{
+ return val(escapeFilePaths(project->values(var)));
+}
+
+QString
+MakefileGenerator::fileVarList(const ProKey &var) const
+{
+ return valList(escapeFilePaths(project->values(var)));
+}
+
+QString
+MakefileGenerator::depVar(const ProKey &var) const
+{
+ return val(escapeDependencyPaths(project->values(var)));
+}
+
+QString
MakefileGenerator::val(const ProStringList &varList) const
{
return valGlue(varList, "", " ", "");
@@ -1416,6 +1433,12 @@ MakefileGenerator::varGlue(const ProKey &var, const QString &before, const QStri
}
QString
+MakefileGenerator::fileVarGlue(const ProKey &var, const QString &before, const QString &glue, const QString &after) const
+{
+ return valGlue(escapeFilePaths(project->values(var)), before, glue, after);
+}
+
+QString
MakefileGenerator::fixFileVarGlue(const ProKey &var, const QString &before, const QString &glue, const QString &after) const
{
ProStringList varList;
@@ -1480,12 +1503,11 @@ MakefileGenerator::createObjectList(const ProStringList &sources)
objdir = project->first("OBJECTS_DIR").toQString();
for (ProStringList::ConstIterator it = sources.begin(); it != sources.end(); ++it) {
QString sfn = (*it).toQString();
- QFileInfo fi(fileInfo(Option::fixPathToLocalOS(sfn)));
+ QFileInfo fi(fileInfo(Option::normalizePath(sfn)));
QString dir;
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(sfn, qmake_getpwd(), Option::output_dir);
- sourceRelativePath = Option::fixPathToTargetOS(sourceRelativePath, false);
if (sourceRelativePath.startsWith(".." + Option::dir_sep))
sourceRelativePath = fileFixify(sourceRelativePath, FileFixifyAbsolute);
@@ -1513,7 +1535,8 @@ MakefileGenerator::createObjectList(const ProStringList &sources)
return ret;
}
-ReplaceExtraCompilerCacheKey::ReplaceExtraCompilerCacheKey(const QString &v, const QStringList &i, const QStringList &o)
+ReplaceExtraCompilerCacheKey::ReplaceExtraCompilerCacheKey(
+ const QString &v, const QStringList &i, const QStringList &o, MakefileGenerator::ReplaceFor s)
{
static QString doubleColon = QLatin1String("::");
@@ -1530,11 +1553,13 @@ ReplaceExtraCompilerCacheKey::ReplaceExtraCompilerCacheKey(const QString &v, con
ol.sort();
out = ol.join(doubleColon);
}
+ forShell = s;
}
bool ReplaceExtraCompilerCacheKey::operator==(const ReplaceExtraCompilerCacheKey &f) const
{
return (hashCode() == f.hashCode() &&
+ f.forShell == forShell &&
f.in == in &&
f.out == out &&
f.var == var &&
@@ -1543,10 +1568,11 @@ bool ReplaceExtraCompilerCacheKey::operator==(const ReplaceExtraCompilerCacheKey
QString
-MakefileGenerator::replaceExtraCompilerVariables(const QString &orig_var, const QStringList &in, const QStringList &out)
+MakefileGenerator::replaceExtraCompilerVariables(
+ const QString &orig_var, const QStringList &in, const QStringList &out, ReplaceFor forShell)
{
//lazy cache
- ReplaceExtraCompilerCacheKey cacheKey(orig_var, in, out);
+ ReplaceExtraCompilerCacheKey cacheKey(orig_var, in, out, forShell);
QString cacheVal = extraCompilerVariablesCache.value(cacheKey);
if(!cacheVal.isNull())
return cacheVal;
@@ -1576,7 +1602,7 @@ MakefileGenerator::replaceExtraCompilerVariables(const QString &orig_var, const
} else if(var == QLatin1String("QMAKE_FILE_BASE") || var == QLatin1String("QMAKE_FILE_IN_BASE")) {
//filePath = true;
for(int i = 0; i < in.size(); ++i) {
- QFileInfo fi(fileInfo(Option::fixPathToLocalOS(in.at(i))));
+ QFileInfo fi(fileInfo(Option::normalizePath(in.at(i))));
QString base = fi.completeBaseName();
if(base.isNull())
base = fi.fileName();
@@ -1585,7 +1611,7 @@ MakefileGenerator::replaceExtraCompilerVariables(const QString &orig_var, const
} else if(var == QLatin1String("QMAKE_FILE_EXT")) {
filePath = true;
for(int i = 0; i < in.size(); ++i) {
- QFileInfo fi(fileInfo(Option::fixPathToLocalOS(in.at(i))));
+ QFileInfo fi(fileInfo(Option::normalizePath(in.at(i))));
QString ext;
// Ensure complementarity with QMAKE_FILE_BASE
int baseLen = fi.completeBaseName().length();
@@ -1598,11 +1624,11 @@ MakefileGenerator::replaceExtraCompilerVariables(const QString &orig_var, const
} else if(var == QLatin1String("QMAKE_FILE_PATH") || var == QLatin1String("QMAKE_FILE_IN_PATH")) {
filePath = true;
for(int i = 0; i < in.size(); ++i)
- val += fileInfo(Option::fixPathToLocalOS(in.at(i))).path();
+ val += fileInfo(Option::normalizePath(in.at(i))).path();
} else if(var == QLatin1String("QMAKE_FILE_NAME") || var == QLatin1String("QMAKE_FILE_IN")) {
filePath = true;
for(int i = 0; i < in.size(); ++i)
- val += fileInfo(Option::fixPathToLocalOS(in.at(i))).filePath();
+ val += fileInfo(Option::normalizePath(in.at(i))).filePath();
}
}
@@ -1614,11 +1640,11 @@ MakefileGenerator::replaceExtraCompilerVariables(const QString &orig_var, const
} else if(var == QLatin1String("QMAKE_FILE_OUT")) {
filePath = true;
for(int i = 0; i < out.size(); ++i)
- val += fileInfo(Option::fixPathToLocalOS(out.at(i))).filePath();
+ val += fileInfo(Option::normalizePath(out.at(i))).filePath();
} else if(var == QLatin1String("QMAKE_FILE_OUT_BASE")) {
//filePath = true;
for(int i = 0; i < out.size(); ++i) {
- QFileInfo fi(fileInfo(Option::fixPathToLocalOS(out.at(i))));
+ QFileInfo fi(fileInfo(Option::normalizePath(out.at(i))));
QString base = fi.completeBaseName();
if(base.isNull())
base = fi.fileName();
@@ -1633,12 +1659,14 @@ MakefileGenerator::replaceExtraCompilerVariables(const QString &orig_var, const
if(!val.isEmpty()) {
QString fullVal;
- if(filePath) {
+ if (filePath && forShell != NoShell) {
for(int i = 0; i < val.size(); ++i) {
- const QString file = Option::fixPathToTargetOS(unescapeFilePath(val.at(i)), false);
if(!fullVal.isEmpty())
fullVal += " ";
- fullVal += escapeFilePath(file);
+ if (forShell == LocalShell)
+ fullVal += IoUtils::shellQuote(Option::fixPathToLocalOS(val.at(i), false));
+ else
+ fullVal += escapeFilePath(Option::fixPathToTargetOS(val.at(i), false));
}
} else {
fullVal = val.join(' ');
@@ -1660,7 +1688,7 @@ MakefileGenerator::verifyExtraCompiler(const ProString &comp, const QString &fil
{
if(noIO())
return false;
- const QString file = Option::fixPathToLocalOS(file_unfixed);
+ const QString file = Option::normalizePath(file_unfixed);
const ProStringList &config = project->values(ProKey(comp + ".CONFIG"));
if (config.indexOf("moc_verify") != -1) {
@@ -1702,10 +1730,10 @@ MakefileGenerator::verifyExtraCompiler(const ProString &comp, const QString &fil
if((*input).isEmpty())
continue;
QString inpf = (*input).toQString();
- QString in = fileFixify(Option::fixPathToTargetOS(inpf, false));
+ QString in = fileFixify(inpf);
if(in == file) {
bool pass = project->test(verify.toKey(),
- QList<ProStringList>() << ProStringList(replaceExtraCompilerVariables(tmp_out.toQString(), inpf, QString())) <<
+ QList<ProStringList>() << ProStringList(replaceExtraCompilerVariables(tmp_out.toQString(), inpf, QString(), NoShell)) <<
ProStringList(file));
if(invert)
pass = !pass;
@@ -1723,7 +1751,7 @@ MakefileGenerator::verifyExtraCompiler(const ProString &comp, const QString &fil
return false;
const QString tmp_cmd = project->values(ProKey(comp + ".commands")).join(' ');
if (config.indexOf("combine") != -1) {
- QString cmd = replaceExtraCompilerVariables(tmp_cmd, QString(), tmp_out);
+ QString cmd = replaceExtraCompilerVariables(tmp_cmd, QString(), tmp_out, LocalShell);
if(system(cmd.toLatin1().constData()))
return false;
} else {
@@ -1734,10 +1762,10 @@ MakefileGenerator::verifyExtraCompiler(const ProString &comp, const QString &fil
if((*input).isEmpty())
continue;
QString inpf = (*input).toQString();
- QString in = fileFixify(Option::fixPathToTargetOS(inpf, false));
+ QString in = fileFixify(inpf);
if(in == file) {
- QString out = replaceExtraCompilerVariables(tmp_out, inpf, QString());
- QString cmd = replaceExtraCompilerVariables(tmp_cmd, in, out);
+ QString out = replaceExtraCompilerVariables(tmp_out, inpf, QString(), NoShell);
+ QString cmd = replaceExtraCompilerVariables(tmp_cmd, in, out, LocalShell);
if(system(cmd.toLatin1().constData()))
return false;
break;
@@ -1802,8 +1830,7 @@ MakefileGenerator::writeExtraCompilerTargets(QTextStream &t)
for (ProStringList::ConstIterator it2 = comp_inputs.begin(); it2 != comp_inputs.end(); ++it2) {
const ProStringList &tmp = project->values((*it2).toKey());
for (ProStringList::ConstIterator input = tmp.begin(); input != tmp.end(); ++input) {
- QString in = Option::fixPathToTargetOS((*input).toQString(), false);
- if(verifyExtraCompiler((*it), in))
+ if (verifyExtraCompiler((*it), (*input).toQString()))
tmp_inputs.append((*input));
}
}
@@ -1814,16 +1841,19 @@ MakefileGenerator::writeExtraCompilerTargets(QTextStream &t)
if (config.indexOf("combine") != -1) {
// compilers with a combined input only have one output
QString input = project->first(ProKey(*it + ".output")).toQString();
- t << " " << escapeDependencyPath(Option::fixPathToTargetOS(replaceExtraCompilerVariables(tmp_out, input, QString())));
+ t << ' ' << escapeDependencyPath(Option::fixPathToTargetOS(
+ replaceExtraCompilerVariables(tmp_out, input, QString(), NoShell)));
} else {
for (ProStringList::ConstIterator input = tmp_inputs.begin(); input != tmp_inputs.end(); ++input) {
- t << " " << escapeDependencyPath(Option::fixPathToTargetOS(replaceExtraCompilerVariables(tmp_out, (*input).toQString(), QString())));
+ t << ' ' << escapeDependencyPath(Option::fixPathToTargetOS(
+ replaceExtraCompilerVariables(tmp_out, (*input).toQString(), QString(), NoShell)));
}
}
t << endl;
if (config.indexOf("no_clean") == -1) {
- QString tmp_clean = project->values(ProKey(*it + ".clean")).join(' ');
+ const ProStringList &raw_clean = project->values(ProKey(*it + ".clean"));
+ QString tmp_clean = escapeFilePaths(raw_clean).join(' ');
QString tmp_clean_cmds = project->values(ProKey(*it + ".clean_commands")).join(' ');
if(!tmp_inputs.isEmpty())
clean_targets += QString("compiler_" + (*it) + "_clean ");
@@ -1836,34 +1866,37 @@ MakefileGenerator::writeExtraCompilerTargets(QTextStream &t)
wrote_clean_cmds = true;
}
if(tmp_clean.isEmpty())
- tmp_clean = tmp_out;
+ tmp_clean = escapeFilePath(tmp_out);
if(tmp_clean.indexOf("${QMAKE_") == -1) {
t << "\n\t-$(DEL_FILE) " << tmp_clean;
wrote_clean = true;
}
if(!wrote_clean_cmds || !wrote_clean) {
- ProStringList cleans;
+ QStringList q_raw_clean = raw_clean.toQStringList();
+ QStringList cleans;
const QString del_statement("-$(DEL_FILE)");
if(!wrote_clean) {
- if(project->isActiveConfig("no_delete_multiple_files")) {
- for (ProStringList::ConstIterator input = tmp_inputs.begin(); input != tmp_inputs.end(); ++input) {
- QString tinp = (*input).toQString();
- cleans.append(" " + Option::fixPathToTargetOS(replaceExtraCompilerVariables(tmp_clean, tinp,
- replaceExtraCompilerVariables(tmp_out, tinp, QString()))));
+ QStringList dels;
+ for (ProStringList::ConstIterator input = tmp_inputs.begin(); input != tmp_inputs.end(); ++input) {
+ QString tinp = (*input).toQString();
+ QString out = replaceExtraCompilerVariables(tmp_out, tinp, QString(), NoShell);
+ foreach (const QString &rc, q_raw_clean) {
+ dels << ' ' + escapeFilePath(Option::fixPathToTargetOS(
+ replaceExtraCompilerVariables(rc, tinp, out, NoShell), false));
}
+ }
+ if(project->isActiveConfig("no_delete_multiple_files")) {
+ cleans = dels;
} else {
- QString files, file;
+ QString files;
const int commandlineLimit = 2047; // NT limit, expanded
- for(int input = 0; input < tmp_inputs.size(); ++input) {
- QString tinp = tmp_inputs.at(input).toQString();
- file = " " + replaceExtraCompilerVariables(tmp_clean, tinp,
- replaceExtraCompilerVariables(tmp_out, tinp, QString()));
+ foreach (const QString &file, dels) {
if(del_statement.length() + files.length() +
qMax(fixEnvVariables(file).length(), file.length()) > commandlineLimit) {
cleans.append(files);
files.clear();
}
- files += Option::fixPathToTargetOS(file);
+ files += file;
}
if(!files.isEmpty())
cleans.append(files);
@@ -1875,7 +1908,7 @@ MakefileGenerator::writeExtraCompilerTargets(QTextStream &t)
for (ProStringList::ConstIterator input = tmp_inputs.begin(); input != tmp_inputs.end(); ++input) {
QString tinp = (*input).toQString();
t << "\n\t" << replaceExtraCompilerVariables(tmp_clean_cmds, tinp,
- replaceExtraCompilerVariables(tmp_out, tinp, QString()));
+ replaceExtraCompilerVariables(tmp_out, tinp, QString(), NoShell), TargetShell);
}
}
}
@@ -1897,7 +1930,7 @@ MakefileGenerator::writeExtraCompilerTargets(QTextStream &t)
inputs += Option::fixPathToTargetOS(inpf, false);
if(!tmp_dep_cmd.isEmpty() && doDepends()) {
char buff[256];
- QString dep_cmd = replaceExtraCompilerVariables(tmp_dep_cmd, inpf, tmp_out);
+ QString dep_cmd = replaceExtraCompilerVariables(tmp_dep_cmd, inpf, tmp_out, LocalShell);
dep_cmd = dep_cd_cmd + fixEnvVariables(dep_cmd);
if(FILE *proc = QT_POPEN(dep_cmd.toLatin1().constData(), "r")) {
QString indeps;
@@ -1909,6 +1942,7 @@ MakefileGenerator::writeExtraCompilerTargets(QTextStream &t)
}
QT_PCLOSE(proc);
if(!indeps.isEmpty()) {
+ // ### This is basically fubar. Add 'lines' flag to CONFIG?
QStringList dep_cmd_deps = indeps.replace('\n', ' ').simplified().split(' ');
for(int i = 0; i < dep_cmd_deps.count(); ++i) {
QString &file = dep_cmd_deps[i];
@@ -1920,8 +1954,8 @@ MakefileGenerator::writeExtraCompilerTargets(QTextStream &t)
QList<QMakeLocalFileName> depdirs = QMakeSourceFileInfo::dependencyPaths();
for (QList<QMakeLocalFileName>::Iterator dit = depdirs.begin();
dit != depdirs.end(); ++dit) {
- if (exists((*dit).real() + Option::dir_sep + file)) {
- localFile = (*dit).local() + Option::dir_sep + file;
+ if (exists((*dit).local() + '/' + file)) {
+ localFile = (*dit).local() + '/' + file;
break;
}
}
@@ -1959,8 +1993,8 @@ MakefileGenerator::writeExtraCompilerTargets(QTextStream &t)
if (inputs.isEmpty())
continue;
- QString out = replaceExtraCompilerVariables(tmp_out, QString(), QString());
- QString cmd = replaceExtraCompilerVariables(tmp_cmd, escapeFilePaths(inputs), QStringList() << out);
+ QString out = replaceExtraCompilerVariables(tmp_out, QString(), QString(), NoShell);
+ QString cmd = replaceExtraCompilerVariables(tmp_cmd, inputs, QStringList() << out, TargetShell);
t << escapeDependencyPath(Option::fixPathToTargetOS(out)) << ":";
// compiler.CONFIG+=explicit_dependencies means that ONLY compiler.depends gets to cause Makefile dependencies
if (config.indexOf("explicit_dependencies") != -1) {
@@ -1975,20 +2009,20 @@ MakefileGenerator::writeExtraCompilerTargets(QTextStream &t)
QString inpf = (*input).toQString();
QString in = Option::fixPathToTargetOS(inpf, false);
QStringList deps = findDependencies(inpf);
- deps += escapeDependencyPath(in);
- QString out = unescapeFilePath(Option::fixPathToTargetOS(replaceExtraCompilerVariables(tmp_out, inpf, QString())));
+ deps << in;
+ QString out = Option::fixPathToTargetOS(replaceExtraCompilerVariables(tmp_out, inpf, QString(), NoShell));
if(!tmp_dep.isEmpty()) {
QStringList pre_deps = fileFixify(tmp_dep, Option::output_dir, Option::output_dir);
for(int i = 0; i < pre_deps.size(); ++i)
- deps += replaceExtraCompilerVariables(pre_deps.at(i), inpf, out);
+ deps << replaceExtraCompilerVariables(pre_deps.at(i), inpf, out, NoShell);
}
- QString cmd = replaceExtraCompilerVariables(tmp_cmd, inpf, out);
+ QString cmd = replaceExtraCompilerVariables(tmp_cmd, inpf, out, LocalShell);
// NOTE: The var -> QMAKE_COMP_var replace feature is unsupported, do not use!
for (ProStringList::ConstIterator it3 = vars.constBegin(); it3 != vars.constEnd(); ++it3)
cmd.replace("$(" + (*it3) + ")", "$(QMAKE_COMP_" + (*it3)+")");
if(!tmp_dep_cmd.isEmpty() && doDepends()) {
char buff[256];
- QString dep_cmd = replaceExtraCompilerVariables(tmp_dep_cmd, inpf, out);
+ QString dep_cmd = replaceExtraCompilerVariables(tmp_dep_cmd, inpf, out, LocalShell);
dep_cmd = dep_cd_cmd + fixEnvVariables(dep_cmd);
if(FILE *proc = QT_POPEN(dep_cmd.toLatin1().constData(), "r")) {
QString indeps;
@@ -2000,6 +2034,7 @@ MakefileGenerator::writeExtraCompilerTargets(QTextStream &t)
}
QT_PCLOSE(proc);
if(!indeps.isEmpty()) {
+ // ### This is basically fubar. Add 'lines' flag to CONFIG?
QStringList dep_cmd_deps = indeps.replace('\n', ' ').simplified().split(' ');
for(int i = 0; i < dep_cmd_deps.count(); ++i) {
QString &file = dep_cmd_deps[i];
@@ -2011,8 +2046,8 @@ MakefileGenerator::writeExtraCompilerTargets(QTextStream &t)
QList<QMakeLocalFileName> depdirs = QMakeSourceFileInfo::dependencyPaths();
for (QList<QMakeLocalFileName>::Iterator dit = depdirs.begin();
dit != depdirs.end(); ++dit) {
- if (exists((*dit).real() + Option::dir_sep + file)) {
- localFile = (*dit).local() + Option::dir_sep + file;
+ if (exists((*dit).local() + '/' + file)) {
+ localFile = (*dit).local() + '/' + file;
break;
}
}
@@ -2077,7 +2112,7 @@ MakefileGenerator::writeExtraCompilerTargets(QTextStream &t)
}
for(int i = 0; i < deps.size(); ) {
QString &dep = deps[i];
- dep = Option::fixPathToTargetOS(unescapeFilePath(dep), false);
+ dep = Option::fixPathToTargetOS(dep, false);
if(out == dep)
deps.removeAt(i);
else
@@ -2216,7 +2251,7 @@ QString MakefileGenerator::build_args(const QString &outdir)
ret += buildArgs();
//output
- QString ofile = Option::fixPathToTargetOS(fileFixify(Option::output.fileName()));
+ QString ofile = fileFixify(Option::output.fileName());
if(!ofile.isEmpty() && ofile != project->first("QMAKE_MAKEFILE"))
ret += " -o " + escapeFilePath(ofile);
@@ -2241,7 +2276,7 @@ MakefileGenerator::writeHeader(QTextStream &t)
QString ofile = Option::fixPathToTargetOS(Option::output.fileName());
if (ofile.lastIndexOf(Option::dir_sep) != -1)
ofile.remove(0, ofile.lastIndexOf(Option::dir_sep) +1);
- t << "MAKEFILE = " << ofile << endl << endl;
+ t << "MAKEFILE = " << escapeFilePath(ofile) << endl << endl;
}
QList<MakefileGenerator::SubTarget*>
@@ -2324,7 +2359,7 @@ MakefileGenerator::findSubDirsSubTargets() const
if (!project->isEmpty(dtkey)) {
st->depends += project->first(dtkey);
} else {
- QString d = Option::fixPathToLocalOS(subName);
+ QString d = Option::fixPathToTargetOS(subName);
const ProKey dfkey(fixedSubDep + ".file");
if (!project->isEmpty(dfkey)) {
d = project->first(dfkey).toQString();
@@ -2431,8 +2466,8 @@ MakefileGenerator::writeSubTargets(QTextStream &t, QList<MakefileGenerator::SubT
out_directory = Option::output_dir + out_directory.mid(abs_source_path.length());
QString out_directory_cdin = out_directory.isEmpty() ? "\n\t"
- : "\n\tcd " + out_directory + " && ";
- QString makefilein = " -f " + subtarget->makefile;
+ : "\n\tcd " + escapeFilePath(out_directory) + " && ";
+ QString makefilein = " -f " + escapeFilePath(subtarget->makefile);
//qmake it
QString out;
@@ -2442,6 +2477,7 @@ MakefileGenerator::writeSubTargets(QTextStream &t, QList<MakefileGenerator::SubT
in = escapeFilePath(fileFixify(in_directory + subtarget->profile, FileFixifyAbsolute));
if(out.startsWith(in_directory))
out = out.mid(in_directory.length());
+ out = escapeFilePath(out);
t << subtarget->target << "-qmake_all: ";
if (flags & SubTargetOrdered) {
if (target)
@@ -2535,18 +2571,18 @@ MakefileGenerator::writeSubTargets(QTextStream &t, QList<MakefileGenerator::SubT
t << " " << targetRule;
}
if(suffix == "all" || suffix == "make_first")
- t << varGlue("ALL_DEPS"," "," ","");
+ t << depVar("ALL_DEPS");
if(suffix == "clean")
- t << varGlue("CLEAN_DEPS"," "," ","");
+ t << depVar("CLEAN_DEPS");
else if (suffix == "distclean")
- t << varGlue("DISTCLEAN_DEPS"," "," ","");
+ t << depVar("DISTCLEAN_DEPS");
t << " FORCE\n";
if(suffix == "clean") {
t << fixFileVarGlue("QMAKE_CLEAN", "\t-$(DEL_FILE) ", "\n\t-$(DEL_FILE) ", "\n");
} else if(suffix == "distclean") {
- QString ofile = Option::fixPathToTargetOS(fileFixify(Option::output.fileName()));
+ QString ofile = fileFixify(Option::output.fileName());
if(!ofile.isEmpty())
- t << "\t-$(DEL_FILE) " << ofile << endl;
+ t << "\t-$(DEL_FILE) " << escapeFilePath(ofile) << endl;
t << fixFileVarGlue("QMAKE_DISTCLEAN", "\t-$(DEL_FILE) ", " ", "\n");
}
}
@@ -2566,7 +2602,7 @@ MakefileGenerator::writeSubTargets(QTextStream &t, QList<MakefileGenerator::SubT
QString dep = var(ProKey(*dep_it + ".target"));
if(dep.isEmpty())
dep = Option::fixPathToTargetOS((*dep_it).toQString(), false);
- deps += " " + dep;
+ deps += ' ' + escapeDependencyPath(dep);
}
if (config.indexOf("recursive") != -1) {
QSet<QString> recurse;
@@ -2592,8 +2628,8 @@ MakefileGenerator::writeSubTargets(QTextStream &t, QList<MakefileGenerator::SubT
continue;
QString out_directory_cdin = out_directory.isEmpty() ? "\n\t"
- : "\n\tcd " + out_directory + " && ";
- QString makefilein = " -f " + subtarget->makefile;
+ : "\n\tcd " + escapeFilePath(out_directory) + " && ";
+ QString makefilein = " -f " + escapeFilePath(subtarget->makefile);
QString out;
QString in;
@@ -2602,6 +2638,7 @@ MakefileGenerator::writeSubTargets(QTextStream &t, QList<MakefileGenerator::SubT
in = escapeFilePath(fileFixify(in_directory + subtarget->profile, FileFixifyAbsolute));
if (out.startsWith(in_directory))
out = out.mid(in_directory.length());
+ out = escapeFilePath(out);
}
//write the rule/depends
@@ -2647,16 +2684,16 @@ MakefileGenerator::writeSubTargets(QTextStream &t, QList<MakefileGenerator::SubT
void
MakefileGenerator::writeMakeQmake(QTextStream &t, bool noDummyQmakeAll)
{
- QString ofile = Option::fixPathToTargetOS(fileFixify(Option::output.fileName()));
+ QString ofile = fileFixify(Option::output.fileName());
if(project->isEmpty("QMAKE_FAILED_REQUIREMENTS") && !project->isEmpty("QMAKE_INTERNAL_PRL_FILE")) {
- QStringList files = fileFixify(Option::mkfile::project_files);
+ QStringList files = escapeFilePaths(fileFixify(Option::mkfile::project_files));
t << escapeDependencyPath(project->first("QMAKE_INTERNAL_PRL_FILE").toQString()) << ": \n\t"
<< "@$(QMAKE) -prl " << buildArgs() << " " << files.join(' ') << endl;
}
QString qmake = build_args();
if(!ofile.isEmpty() && !project->isActiveConfig("no_autoqmake")) {
- t << escapeFilePath(ofile) << ": "
+ t << escapeDependencyPath(ofile) << ": "
<< escapeDependencyPath(fileFixify(project->projectFile())) << " ";
if (Option::globals->do_cache) {
if (!project->confFile().isEmpty())
@@ -2665,11 +2702,11 @@ MakefileGenerator::writeMakeQmake(QTextStream &t, bool noDummyQmakeAll)
t << escapeDependencyPath(fileFixify(project->cacheFile())) << " ";
}
if(!specdir().isEmpty()) {
- if(exists(Option::fixPathToLocalOS(specdir()+QDir::separator()+"qmake.conf")))
+ if (exists(Option::normalizePath(specdir() + "/qmake.conf")))
t << escapeDependencyPath(specdir() + Option::dir_sep + "qmake.conf") << " ";
}
- const ProStringList &included = project->values("QMAKE_INTERNAL_INCLUDED_FILES");
- t << escapeDependencyPaths(included).join(" \\\n\t\t") << "\n\t"
+ const ProStringList &included = escapeDependencyPaths(project->values("QMAKE_INTERNAL_INCLUDED_FILES"));
+ t << included.join(" \\\n\t\t") << "\n\t"
<< qmake << endl;
for(int include = 0; include < included.size(); ++include) {
const ProString &i = included.at(include);
@@ -2704,19 +2741,22 @@ MakefileGenerator::fileInfo(QString file) const
return fi;
}
-QString
-MakefileGenerator::unescapeFilePath(const QString &path) const
+ProStringList
+MakefileGenerator::fixLibFlags(const ProKey &var)
{
- QString ret = path;
- ret.replace(QLatin1String("\\ "), QLatin1String(" "));
- ret.remove(QLatin1Char('\"'));
+ ProStringList in = project->values(var);
+ ProStringList ret;
+
+ ret.reserve(in.length());
+ foreach (const ProString &v, in)
+ ret << fixLibFlag(v);
return ret;
}
-ProString
-MakefileGenerator::unescapeFilePath(const ProString &path) const
+ProString MakefileGenerator::fixLibFlag(const ProString &)
{
- return ProString(unescapeFilePath(path.toQString()));
+ qFatal("MakefileGenerator::fixLibFlag() called");
+ return ProString();
}
ProString
@@ -2743,6 +2783,12 @@ MakefileGenerator::escapeFilePaths(const ProStringList &paths) const
return ret;
}
+ProString
+MakefileGenerator::escapeDependencyPath(const ProString &path) const
+{
+ return ProString(escapeDependencyPath(path.toQString()));
+}
+
QStringList
MakefileGenerator::escapeDependencyPaths(const QStringList &paths) const
{
@@ -2762,24 +2808,6 @@ MakefileGenerator::escapeDependencyPaths(const ProStringList &paths) const
}
QStringList
-MakefileGenerator::unescapeFilePaths(const QStringList &paths) const
-{
- QStringList ret;
- for(int i = 0; i < paths.size(); ++i)
- ret.append(unescapeFilePath(paths.at(i)));
- return ret;
-}
-
-ProStringList
-MakefileGenerator::unescapeFilePaths(const ProStringList &paths) const
-{
- ProStringList ret;
- for (int i = 0; i < paths.size(); ++i)
- ret.append(unescapeFilePath(paths.at(i)));
- return ret;
-}
-
-QStringList
MakefileGenerator::fileFixify(const QStringList& files, const QString &out_dir, const QString &in_dir,
FileFixifyType fix, bool canon) const
{
@@ -2799,7 +2827,7 @@ MakefileGenerator::fileFixify(const QString& file, const QString &out_d, const Q
{
if(file.isEmpty())
return file;
- QString ret = unescapeFilePath(file);
+ QString ret = file;
//do the fixin'
QString orig_file = ret;
@@ -2829,7 +2857,7 @@ MakefileGenerator::fileFixify(const QString& file, const QString &out_d, const Q
out_dir = out_fi.canonicalFilePath();
}
- QString qfile(Option::fixPathToLocalOS(ret, true, canon));
+ QString qfile(Option::normalizePath(ret));
QFileInfo qfileinfo(fileInfo(qfile));
if(out_dir != in_dir || !qfileinfo.isRelative()) {
if(qfileinfo.isRelative()) {
@@ -2958,7 +2986,7 @@ MakefileGenerator::findFileForDep(const QMakeLocalFileName &dep, const QMakeLoca
}
}
{ //is it from an EXTRA_TARGET
- const QString dep_basename = dep.local().section(Option::dir_sep, -1);
+ const QString dep_basename = dep.local().section('/', -1);
const ProStringList &qut = project->values("QMAKE_EXTRA_TARGETS");
for (ProStringList::ConstIterator it = qut.begin(); it != qut.end(); ++it) {
QString targ = var(ProKey(*it + ".target"));
@@ -2972,7 +3000,7 @@ MakefileGenerator::findFileForDep(const QMakeLocalFileName &dep, const QMakeLoca
}
}
{ //is it from an EXTRA_COMPILER
- const QString dep_basename = dep.local().section(Option::dir_sep, -1);
+ const QString dep_basename = dep.local().section('/', -1);
const ProStringList &quc = project->values("QMAKE_EXTRA_COMPILERS");
for (ProStringList::ConstIterator it = quc.begin(); it != quc.end(); ++it) {
const ProString &tmp_out = project->first(ProKey(*it + ".output"));
@@ -2982,8 +3010,8 @@ MakefileGenerator::findFileForDep(const QMakeLocalFileName &dep, const QMakeLoca
for (ProStringList::ConstIterator it2 = tmp.begin(); it2 != tmp.end(); ++it2) {
const ProStringList &inputs = project->values((*it2).toKey());
for (ProStringList::ConstIterator input = inputs.begin(); input != inputs.end(); ++input) {
- QString out = Option::fixPathToTargetOS(unescapeFilePath(
- replaceExtraCompilerVariables(tmp_out.toQString(), (*input).toQString(), QString())));
+ QString out = Option::fixPathToTargetOS(
+ replaceExtraCompilerVariables(tmp_out.toQString(), (*input).toQString(), QString(), NoShell));
if (out == dep.real() || out.section(Option::dir_sep, -1) == dep_basename) {
ret = QMakeLocalFileName(fileFixify(out, qmake_getpwd(), Option::output_dir));
goto found_dep_from_heuristic;
@@ -3102,7 +3130,7 @@ MakefileGenerator::pkgConfigFileName(bool fixify)
if(fixify) {
if(QDir::isRelativePath(ret) && !project->isEmpty("DESTDIR"))
ret.prepend(project->first("DESTDIR").toQString());
- ret = Option::fixPathToLocalOS(fileFixify(ret, qmake_getpwd(), Option::output_dir));
+ ret = fileFixify(ret, qmake_getpwd(), Option::output_dir);
}
return ret;
}
@@ -3213,9 +3241,9 @@ MakefileGenerator::writePkgConfigFile()
}
ProString bundle;
if (!project->isEmpty("QMAKE_FRAMEWORK_BUNDLE_NAME"))
- bundle = unescapeFilePath(project->first("QMAKE_FRAMEWORK_BUNDLE_NAME"));
+ bundle = project->first("QMAKE_FRAMEWORK_BUNDLE_NAME");
else
- bundle = unescapeFilePath(project->first("TARGET"));
+ bundle = project->first("TARGET");
int suffix = bundle.lastIndexOf(".framework");
if (suffix != -1)
bundle = bundle.left(suffix);
@@ -3223,11 +3251,11 @@ MakefileGenerator::writePkgConfigFile()
} else {
if (!project->values("QMAKE_DEFAULT_LIBDIRS").contains(libDir))
t << "-L${libdir} ";
- pkgConfiglibName = "-l" + unescapeFilePath(project->first("QMAKE_ORIG_TARGET"));
+ pkgConfiglibName = "-l" + project->first("QMAKE_ORIG_TARGET");
if (project->isActiveConfig("shared"))
pkgConfiglibName += project->first("TARGET_VERSION_EXT").toQString();
}
- t << pkgConfiglibName << " \n";
+ t << shellQuote(pkgConfiglibName) << " \n";
ProStringList libs;
if(!project->isEmpty("QMAKE_INTERNAL_PRL_LIBS")) {
@@ -3239,7 +3267,7 @@ MakefileGenerator::writePkgConfigFile()
libs << "QMAKE_LFLAGS_THREAD"; //not sure about this one, but what about things like -pthread?
t << "Libs.private: ";
for (ProStringList::ConstIterator it = libs.begin(); it != libs.end(); ++it) {
- t << project->values((*it).toKey()).join(' ') << " ";
+ t << fixLibFlags((*it).toKey()).join(' ') << ' ';
}
t << endl;
@@ -3277,7 +3305,7 @@ QString MakefileGenerator::installMetaFile(const ProKey &replace_rule, const QSt
QString ret;
if (project->isEmpty(replace_rule)
|| project->isActiveConfig("no_sed_meta_install")) {
- ret += "-$(INSTALL_FILE) \"" + src + "\" \"" + dst + "\"";
+ ret += "-$(INSTALL_FILE) " + escapeFilePath(src) + ' ' + escapeFilePath(dst);
} else {
ret += "-$(SED)";
const ProStringList &replace_rules = project->values(replace_rule);
@@ -3291,7 +3319,7 @@ QString MakefileGenerator::installMetaFile(const ProKey &replace_rule, const QSt
+ "," + windowsifyPath(replace.toQString()) + ",gi");
}
}
- ret += " \"" + src + "\" >\"" + dst + "\"";
+ ret += ' ' + escapeFilePath(src) + " > " + escapeFilePath(dst);
}
return ret;
}