Add dependencies command.
[cdist.git] / cdist
diff --git a/cdist b/cdist
index 2474307b0f8397595d5c089fc303531c1cd9c2ef..7262702c2258b30e922915b787a0400e8a8621e1 100755 (executable)
--- a/cdist
+++ b/cdist
@@ -480,7 +480,13 @@ class Target(object):
         if self.build_dependencies:
             tree.build_dependencies(options)
         tree.build(options)
-        return tree.call('test', test)
+
+        tree.add_defaults(options)
+        if len(inspect.getfullargspec(tree.cscript['test']).args) == 3:
+            return tree.call('test', options, test)
+        else:
+            log_normal('Deprecated cscript test() method with no options parameter')
+            return tree.call('test', test)
 
     def set(self, a, b):
         self.variables[a] = b
@@ -554,7 +560,7 @@ class DockerTarget(Target):
         if self.privileged:
             opts += '--privileged=true '
         if self.ccache:
-            opts += "-e CCACHE_DIR=/ccache/%s --mount source=ccache,target=/ccache" % self.image
+            opts += "-e CCACHE_DIR=/ccache/%s-%d --mount source=ccache,target=/ccache" % (self.image, os.getuid())
 
         tag = self.image
         if config.has('docker_hub_repository'):
@@ -627,8 +633,6 @@ class WindowsTarget(DockerTarget):
         self.set('PKG_CONFIG_LIBDIR', '%s/lib/pkgconfig' % self.environment_prefix)
         self.set('PKG_CONFIG_PATH', '%s/lib/pkgconfig:%s/bin/pkgconfig' % (self.directory, self.directory))
         self.set('PATH', '%s/bin:%s:%s' % (self.environment_prefix, self.tool_path, os.environ['PATH']))
-        self.set('CC', '%s-gcc' % self.name)
-        self.set('CXX', '%s-g++' % self.name)
         self.set('LD', '%s-ld' % self.name)
         self.set('RANLIB', '%s-ranlib' % self.name)
         self.set('WINRC', '%s-windres' % self.name)
@@ -643,6 +647,15 @@ class WindowsTarget(DockerTarget):
         if environment_version is not None:
             self.image += '_%s' % environment_version
 
+    def setup(self):
+        super().setup()
+        if self.ccache:
+            self.set('CC', '"ccache %s-gcc"' % self.name)
+            self.set('CXX', '"ccache %s-g++"' % self.name)
+        else:
+            self.set('CC', '%s-gcc' % self.name)
+            self.set('CXX', '%s-g++' % self.name)
+
     @property
     def library_prefix(self):
         log_normal('Deprecated property library_prefix: use environment_prefix')
@@ -972,7 +985,7 @@ class Tree(object):
     def dependencies(self, options):
         """
         yield details of the dependencies of this tree.  Each dependency is returned
-        as a tuple of (tree, options).  The 'options' parameter are the options that
+        as a tuple of (tree, options, parent_tree).  The 'options' parameter are the options that
         we want to force for 'self'.
         """
         if not 'dependencies' in self.cscript:
@@ -994,7 +1007,7 @@ class Tree(object):
             dep_options = d[2] if len(d) > 2 else {}
             for i in dep.dependencies(dep_options):
                 yield i
-            yield (dep, dep_options)
+            yield (dep, dep_options, self)
 
     def checkout_dependencies(self, options={}):
         for i in self.dependencies(options):
@@ -1045,7 +1058,8 @@ def main():
         "test": "run the project's unit tests",
         "shell": "build the project then start a shell",
         "checkout": "check out the project",
-        "revision": "print the head git revision number"
+        "revision": "print the head git revision number",
+        "dependencies" : "print details of the project's dependencies as a .dot file"
     }
 
     one_of = "Command is one of:\n"
@@ -1293,6 +1307,19 @@ def main():
             shutil.copytree('.', args.output)
         target.cleanup()
 
+    elif globals.command == 'dependencies':
+        if args.target is None:
+            raise Error('you must specify -t or --target')
+        if args.checkout is None:
+            raise Error('you must specify -c or --checkout')
+
+        target = target_factory(args)
+        tree = globals.trees.get(args.project, args.checkout, target)
+        print("strict digraph {")
+        for d in list(tree.dependencies({})):
+            print("%s -> %s;" % (d[2].name.replace("-", "-"), d[0].name.replace("-", "_")))
+        print("}")
+
     else:
         raise Error('invalid command %s' % globals.command)