summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSimon Hausmann <simon.hausmann@qt.io>2017-04-27 13:44:23 +0200
committerSimon Hausmann <simon.hausmann@qt.io>2017-04-28 13:46:44 +0000
commit0942f44454f3d81fde436eb40012888e94e36d09 (patch)
tree7b2f1222086499a5fcbd1a9d4d61641e4aa678dc
parent63b94c57725c23c91598535cd325553bd57e8e66 (diff)
Fix make install to be deterministic
The result of "make install" should be the same regardless of whether it has been run multiple times and the destination exists already. This is done by making the file installation calls always take canonical source and target paths and not look at the target directory. Task-number: QTBUG-60370 Change-Id: I83a584c0dbc4fd10c79976d4169bf6bc051884a1 Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@qt.io>
-rw-r--r--qmake/generators/makefile.cpp15
-rw-r--r--qmake/main.cpp10
2 files changed, 12 insertions, 13 deletions
diff --git a/qmake/generators/makefile.cpp b/qmake/generators/makefile.cpp
index 4568f1d4f2..9f0655a2b9 100644
--- a/qmake/generators/makefile.cpp
+++ b/qmake/generators/makefile.cpp
@@ -1283,7 +1283,7 @@ MakefileGenerator::writeInstalls(QTextStream &t, bool noBuild)
if(is_target || exists(wild)) { //real file or target
QFileInfo fi(fileInfo(wild));
QString dst_file = filePrefixRoot(root, dst_dir);
- if(fi.isDir() && project->isActiveConfig("copy_dir_files")) {
+ if (!fi.isDir() || project->isActiveConfig("copy_dir_files")) {
if(!dst_file.endsWith(Option::dir_sep))
dst_file += Option::dir_sep;
dst_file += fi.fileName();
@@ -1317,10 +1317,15 @@ MakefileGenerator::writeInstalls(QTextStream &t, bool noBuild)
dst_file += Option::dir_sep;
dst_file += filestr;
}
- } else if (installConfigValues.contains("executable")) {
- cmd = QLatin1String("-$(QINSTALL_PROGRAM)");
} else {
- cmd = QLatin1String("-$(QINSTALL_FILE)");
+ if (installConfigValues.contains("executable")) {
+ cmd = QLatin1String("-$(QINSTALL_PROGRAM)");
+ } else {
+ cmd = QLatin1String("-$(QINSTALL_FILE)");
+ }
+ if (!dst_file.endsWith(Option::dir_sep))
+ dst_file += Option::dir_sep;
+ dst_file += filestr;
}
cmd += " " + escapeFilePath(wild) + " " + escapeFilePath(dst_file);
inst << cmd;
@@ -1331,7 +1336,7 @@ MakefileGenerator::writeInstalls(QTextStream &t, bool noBuild)
uninst.append(rm_dir_contents + " " + escapeFilePath(filePrefixRoot(root, fileFixify(dst_dir + file, FileFixifyAbsolute, false))));
QFileInfo fi(fileInfo(dirstr + file));
QString dst_file = filePrefixRoot(root, fileFixify(dst_dir, FileFixifyAbsolute, false));
- if(fi.isDir() && project->isActiveConfig("copy_dir_files")) {
+ if (!fi.isDir() || project->isActiveConfig("copy_dir_files")) {
if(!dst_file.endsWith(Option::dir_sep))
dst_file += Option::dir_sep;
dst_file += fi.fileName();
diff --git a/qmake/main.cpp b/qmake/main.cpp
index 2bdb5370df..cc72645b59 100644
--- a/qmake/main.cpp
+++ b/qmake/main.cpp
@@ -236,17 +236,11 @@ static int doLink(int argc, char **argv)
#endif
-static int installFile(const QString &source, const QString &targetFileOrDirectory, bool exe = false)
+static int installFile(const QString &source, const QString &target, bool exe = false)
{
QFile sourceFile(source);
- QString target(targetFileOrDirectory);
- if (QFileInfo(target).isDir())
- target += QDir::separator() + QFileInfo(sourceFile.fileName()).fileName();
-
- if (QFile::exists(target))
- QFile::remove(target);
-
+ QFile::remove(target);
QDir::root().mkpath(QFileInfo(target).absolutePath());
if (!sourceFile.copy(target)) {