From 01addecb8de0469cd97b55efaf7b1bb6b19b48cb Mon Sep 17 00:00:00 2001
From: Christian Kandeler <christian.kandeler@digia.com>
Date: Wed, 16 Jul 2014 17:13:41 +0200
Subject: [PATCH] qbs build: Get rid of CopyTransformer.

That item was using a directory as an output artifact, which was only
working by accident and often caused warning messages about failure to
remove files.
Use a proper module instead, which is the nicer solution anyway.

Change-Id: Ib75a0ce26a24c78eb5421367995a8fc72f6a3c2a
Reviewed-by: Joerg Bornemann <joerg.bornemann@digia.com>
---
 qbs/imports/QtcAutotest.qbs                   |  1 +
 .../copyable_resource/copyable-resource.qbs   | 32 +++++++++++++++++++
 .../auto/extensionsystem/copytransformer.qbs  | 26 ---------------
 tests/auto/extensionsystem/plugin.qbs         | 10 +++---
 .../circularplugins/plugin1/plugin1.qbs       |  2 +-
 .../circularplugins/plugin2/plugin2.qbs       |  2 +-
 .../circularplugins/plugin3/plugin3.qbs       |  2 +-
 .../correctplugins1/plugin1/plugin1.qbs       |  2 +-
 .../correctplugins1/plugin2/plugin2.qbs       |  2 +-
 .../correctplugins1/plugin3/plugin3.qbs       |  2 +-
 .../extensionsystem/pluginmanager/test.qbs    |  8 ++---
 .../auto/extensionsystem/pluginspec/test.qbs  | 23 ++++---------
 .../pluginspec/testplugin/testplugin.qbs      |  2 +-
 13 files changed, 54 insertions(+), 60 deletions(-)
 create mode 100644 qbs/modules/copyable_resource/copyable-resource.qbs
 delete mode 100644 tests/auto/extensionsystem/copytransformer.qbs

diff --git a/qbs/imports/QtcAutotest.qbs b/qbs/imports/QtcAutotest.qbs
index 376c2f91c64..0bd37a905b2 100644
--- a/qbs/imports/QtcAutotest.qbs
+++ b/qbs/imports/QtcAutotest.qbs
@@ -5,6 +5,7 @@ import QtcProduct
 QtcProduct {
     type: "application"
     Depends { name: "Qt.test" }
+    Depends { name: "copyable_resource" }
     targetName: "tst_" + name.split(' ').join("")
 
     // This needs to be absolute, because it is passed to one of the source files.
diff --git a/qbs/modules/copyable_resource/copyable-resource.qbs b/qbs/modules/copyable_resource/copyable-resource.qbs
new file mode 100644
index 00000000000..d8dda99a919
--- /dev/null
+++ b/qbs/modules/copyable_resource/copyable-resource.qbs
@@ -0,0 +1,32 @@
+import qbs
+import qbs.File
+import qbs.FileInfo
+
+Module {
+    property path targetDirectory
+    additionalProductTypes: "copied_resource"
+    Rule {
+        inputs: ["copyable_resource"]
+        outputFileTags: ["copied_resource"]
+        outputArtifacts: {
+            var destinationDir = input.moduleProperty("copyable_resource", "targetDirectory");
+            if (!destinationDir) {
+                // If the destination directory has not been explicitly set, replicate the
+                // structure from the source directory in the build directory.
+                destinationDir = project.buildDirectory + '/'
+                        + FileInfo.relativePath(project.sourceDirectory, input.filePath);
+            }
+            return [{
+                filePath: destinationDir + '/' + input.fileName,
+                fileTags: ["copied_resource"]
+            }];
+        }
+        prepare: {
+            var cmd = new JavaScriptCommand();
+            cmd.description = "Copying " + FileInfo.fileName(input.fileName);
+            cmd.highlight = "codegen";
+            cmd.sourceCode = function() { File.copy(input.filePath, output.filePath); };
+            return cmd;
+        }
+    }
+}
diff --git a/tests/auto/extensionsystem/copytransformer.qbs b/tests/auto/extensionsystem/copytransformer.qbs
deleted file mode 100644
index c306748a8c0..00000000000
--- a/tests/auto/extensionsystem/copytransformer.qbs
+++ /dev/null
@@ -1,26 +0,0 @@
-import qbs
-import qbs.File
-import qbs.FileInfo
-
-Transformer {
-    property pathList sourceFiles
-    property path targetDirectory
-    inputs: sourceFiles
-    Artifact { fileName: targetDirectory }
-    prepare: {
-        var commands = []
-        for (var tag in inputs) {
-            for (var index in inputs[tag]) {
-                var artifact = inputs[tag][index];
-                var cmd = new JavaScriptCommand();
-                cmd.sourceFile = artifact.filePath;
-                cmd.description = "Copying '" + cmd.sourceFile + "' to '" + output.filePath + "/'.";
-                cmd.highlight = "codegen";
-                cmd.targetFilePath = output.filePath + '/' + FileInfo.fileName(cmd.sourceFile);
-                cmd.sourceCode = function() { File.copy(sourceFile, targetFilePath); }
-                commands.push(cmd);
-            }
-        }
-        return commands;
-    }
-}
diff --git a/tests/auto/extensionsystem/plugin.qbs b/tests/auto/extensionsystem/plugin.qbs
index 98c27e15c70..8a97ad522e0 100644
--- a/tests/auto/extensionsystem/plugin.qbs
+++ b/tests/auto/extensionsystem/plugin.qbs
@@ -1,6 +1,5 @@
 import qbs
 import qbs.FileInfo
-import "./copytransformer.qbs" as CopyTransformer
 import QtcFunctions
 
 DynamicLibrary {
@@ -8,6 +7,7 @@ DynamicLibrary {
     Depends { name: "ExtensionSystem" }
     Depends { name: "cpp" }
     Depends { name: "Qt.core" }
+    Depends { name: "copyable_resource" }
     targetName: QtcFunctions.qtLibraryName(qbs, name.split('_')[1])
     destinationDirectory: project.buildDirectory + '/'
                           + FileInfo.relativePath(project.ide_source_tree, sourceDirectory)
@@ -17,8 +17,10 @@ DynamicLibrary {
     ].concat(additionalRPaths)
     property pathList filesToCopy
     property pathList additionalRPaths: []
-    CopyTransformer {
-        sourceFiles: product.filesToCopy
-        targetDirectory: product.destinationDirectory
+    Group {
+        name: "resources"
+        fileTags: "copyable_resource"
+        copyable_resource.targetDirectory: product.destinationDirectory
+        files: product.filesToCopy
     }
 }
diff --git a/tests/auto/extensionsystem/pluginmanager/circularplugins/plugin1/plugin1.qbs b/tests/auto/extensionsystem/pluginmanager/circularplugins/plugin1/plugin1.qbs
index 106403770ab..b90744efb61 100644
--- a/tests/auto/extensionsystem/pluginmanager/circularplugins/plugin1/plugin1.qbs
+++ b/tests/auto/extensionsystem/pluginmanager/circularplugins/plugin1/plugin1.qbs
@@ -4,6 +4,6 @@ import "../../../plugin.qbs" as Plugin
 Plugin {
     name: "circular_plugin1"
     filesToCopy: "plugin.xml"
-    files: ["plugin1.h", "plugin1.cpp"].concat(filesToCopy)
+    files: ["plugin1.h", "plugin1.cpp"]
     cpp.defines: base.concat(["PLUGIN1_LIBRARY"])
 }
diff --git a/tests/auto/extensionsystem/pluginmanager/circularplugins/plugin2/plugin2.qbs b/tests/auto/extensionsystem/pluginmanager/circularplugins/plugin2/plugin2.qbs
index a54b405a905..5bf73892976 100644
--- a/tests/auto/extensionsystem/pluginmanager/circularplugins/plugin2/plugin2.qbs
+++ b/tests/auto/extensionsystem/pluginmanager/circularplugins/plugin2/plugin2.qbs
@@ -4,6 +4,6 @@ import "../../../plugin.qbs" as Plugin
 Plugin {
     name: "circular_plugin2"
     filesToCopy: "plugin.xml"
-    files: ["plugin2.h", "plugin2.cpp"].concat(filesToCopy)
+    files: ["plugin2.h", "plugin2.cpp"]
     cpp.defines: base.concat(["PLUGIN2_LIBRARY"])
 }
diff --git a/tests/auto/extensionsystem/pluginmanager/circularplugins/plugin3/plugin3.qbs b/tests/auto/extensionsystem/pluginmanager/circularplugins/plugin3/plugin3.qbs
index 600741b2234..5bf2bf3fadb 100644
--- a/tests/auto/extensionsystem/pluginmanager/circularplugins/plugin3/plugin3.qbs
+++ b/tests/auto/extensionsystem/pluginmanager/circularplugins/plugin3/plugin3.qbs
@@ -4,6 +4,6 @@ import "../../../plugin.qbs" as Plugin
 Plugin {
     name: "circular_plugin3"
     filesToCopy: "plugin.xml"
-    files: ["plugin3.h", "plugin3.cpp"].concat(filesToCopy)
+    files: ["plugin3.h", "plugin3.cpp"]
     cpp.defines: base.concat(["PLUGIN3_LIBRARY"])
 }
diff --git a/tests/auto/extensionsystem/pluginmanager/correctplugins1/plugin1/plugin1.qbs b/tests/auto/extensionsystem/pluginmanager/correctplugins1/plugin1/plugin1.qbs
index 9c73779a722..01f72ee6f3d 100644
--- a/tests/auto/extensionsystem/pluginmanager/correctplugins1/plugin1/plugin1.qbs
+++ b/tests/auto/extensionsystem/pluginmanager/correctplugins1/plugin1/plugin1.qbs
@@ -10,6 +10,6 @@ Plugin {
         destinationDirectory + "/../plugin2",
         destinationDirectory + "/../plugin3"
     ]
-    files: ["plugin1.h", "plugin1.cpp"].concat(filesToCopy)
+    files: ["plugin1.h", "plugin1.cpp"]
     cpp.defines: base.concat(["PLUGIN1_LIBRARY"])
 }
diff --git a/tests/auto/extensionsystem/pluginmanager/correctplugins1/plugin2/plugin2.qbs b/tests/auto/extensionsystem/pluginmanager/correctplugins1/plugin2/plugin2.qbs
index 638cb3072a6..916c5dfebc4 100644
--- a/tests/auto/extensionsystem/pluginmanager/correctplugins1/plugin2/plugin2.qbs
+++ b/tests/auto/extensionsystem/pluginmanager/correctplugins1/plugin2/plugin2.qbs
@@ -4,6 +4,6 @@ import "../../../plugin.qbs" as Plugin
 Plugin {
     name: "correct_plugin2"
     filesToCopy: "plugin.spec"
-    files: ["plugin2.h", "plugin2.cpp"].concat(filesToCopy)
+    files: ["plugin2.h", "plugin2.cpp"]
     cpp.defines: base.concat(["PLUGIN2_LIBRARY"])
 }
diff --git a/tests/auto/extensionsystem/pluginmanager/correctplugins1/plugin3/plugin3.qbs b/tests/auto/extensionsystem/pluginmanager/correctplugins1/plugin3/plugin3.qbs
index 9f0a5167aaf..3f0ba482958 100644
--- a/tests/auto/extensionsystem/pluginmanager/correctplugins1/plugin3/plugin3.qbs
+++ b/tests/auto/extensionsystem/pluginmanager/correctplugins1/plugin3/plugin3.qbs
@@ -6,6 +6,6 @@ Plugin {
     Depends { name: "correct_plugin2" }
     filesToCopy: "plugin.spec"
     additionalRPaths: [destinationDirectory + "/../plugin2"]
-    files: ["plugin3.h", "plugin3.cpp"].concat(filesToCopy)
+    files: ["plugin3.h", "plugin3.cpp"]
     cpp.defines: base.concat(["PLUGIN3_LIBRARY"])
 }
diff --git a/tests/auto/extensionsystem/pluginmanager/test.qbs b/tests/auto/extensionsystem/pluginmanager/test.qbs
index cc930a49cfc..47958855c31 100644
--- a/tests/auto/extensionsystem/pluginmanager/test.qbs
+++ b/tests/auto/extensionsystem/pluginmanager/test.qbs
@@ -1,6 +1,5 @@
 import qbs
 import QtcAutotest
-import "../copytransformer.qbs" as CopyTransformer
 
 QtcAutotest {
     name: "PluginManager autotest"
@@ -15,6 +14,8 @@ QtcAutotest {
     Group {
         id: pluginGroup
         name: "plugins"
+        fileTags: "copyable_resource"
+        copyable_resource.targetDirectory: product.destinationDirectory + "/plugins"
         files: [
             "plugins/otherplugin.xml",
             "plugins/plugin1.xml",
@@ -22,11 +23,6 @@ QtcAutotest {
         ]
     }
 
-    CopyTransformer {
-        sourceFiles: pluginGroup.files
-        targetDirectory: product.destinationDirectory + "/plugins"
-    }
-
     files: "tst_pluginmanager.cpp"
     cpp.defines: base.concat(['PLUGINMANAGER_TESTS_DIR="' + destinationDirectory + '"'])
 }
diff --git a/tests/auto/extensionsystem/pluginspec/test.qbs b/tests/auto/extensionsystem/pluginspec/test.qbs
index e87698c333e..365266d5e99 100644
--- a/tests/auto/extensionsystem/pluginspec/test.qbs
+++ b/tests/auto/extensionsystem/pluginspec/test.qbs
@@ -1,7 +1,5 @@
 import qbs
-
 import QtcAutotest
-import "../copytransformer.qbs" as CopyTransformer
 
 QtcAutotest {
     name: "ExtensionSystem pluginspec autotest"
@@ -13,6 +11,8 @@ QtcAutotest {
     Group {
         id: testSpecsGroup
         name: "test specs"
+        fileTags: "copyable_resource"
+        copyable_resource.targetDirectory: product.destinationDirectory + "/testspecs"
         files: [
             "testspecs/simplespec.xml",
             "testspecs/simplespec_experimental.xml",
@@ -28,6 +28,8 @@ QtcAutotest {
     Group {
         id: testDependenciesGroup
         name: "test dependencies"
+        fileTags: "copyable_resource"
+        copyable_resource.targetDirectory: product.destinationDirectory + "/testdependencies"
         files: [
             "testdependencies/spec1.xml",
             "testdependencies/spec2.xml",
@@ -39,21 +41,8 @@ QtcAutotest {
     Group {
         id: specGroup
         name: "spec"
+        fileTags: "copyable_resource"
+        copyable_resource.targetDirectory: product.destinationDirectory + "/testdir"
         files: ["testdir/spec.xml"]
     }
-
-    CopyTransformer {
-        sourceFiles: testSpecsGroup.files
-        targetDirectory: product.destinationDirectory + "/testspecs"
-    }
-
-    CopyTransformer {
-        sourceFiles: testDependenciesGroup.files
-        targetDirectory: product.destinationDirectory + "/testdependencies"
-    }
-
-    CopyTransformer {
-        sourceFiles: specGroup.files
-        targetDirectory: product.destinationDirectory + "/testdir"
-    }
 }
diff --git a/tests/auto/extensionsystem/pluginspec/testplugin/testplugin.qbs b/tests/auto/extensionsystem/pluginspec/testplugin/testplugin.qbs
index 2ed6f66b597..5bf464c01d4 100644
--- a/tests/auto/extensionsystem/pluginspec/testplugin/testplugin.qbs
+++ b/tests/auto/extensionsystem/pluginspec/testplugin/testplugin.qbs
@@ -6,7 +6,7 @@ Plugin {
     files: [
         "testplugin.h", "testplugin.cpp",
         "testplugin_global.h"
-    ].concat(filesToCopy)
+    ]
     filesToCopy: "testplugin.xml"
     cpp.defines: base.concat(["MYPLUGIN_LIBRARY"])
 }
-- 
GitLab