Typo.
[cdist.git] / cdist
diff --git a/cdist b/cdist
index 5ad37a081d3fd03799db62070e4a2277f43b523f..c68ee22fd3f56ca74d76f5b2ca50e55bdf72fe84 100755 (executable)
--- a/cdist
+++ b/cdist
@@ -1,6 +1,6 @@
 #!/usr/bin/python
 
-#    Copyright (C) 2012-2019 Carl Hetherington <cth@carlh.net>
+#    Copyright (C) 2012-2020 Carl Hetherington <cth@carlh.net>
 #
 #    This program is free software; you can redistribute it and/or modify
 #    it under the terms of the GNU General Public License as published by
@@ -114,6 +114,18 @@ class Config:
                          Option('flatpak_state_dir'),
                          Option('parallel', multiprocessing.cpu_count()) ]
 
+        config_dir = '%s/.config' % os.path.expanduser('~')
+        if not os.path.exists(config_dir):
+            os.mkdir(config_dir)
+        config_file = '%s/cdist' % config_dir
+        if not os.path.exists(config_file):
+            f = open(config_file, 'w')
+            for o in self.options:
+                print('# %s ' % o.key, file=f)
+            f.close()
+            print('Template config file written to %s; please edit and try again.' % config_file, file=sys.stderr)
+            sys.exit(1)
+
         try:
             f = open('%s/.config/cdist' % os.path.expanduser('~'), 'r')
             while True:
@@ -514,9 +526,8 @@ class Target(object):
 
 
 class DockerTarget(Target):
-    def __init__(self, platform, directory, version):
+    def __init__(self, platform, directory):
         super(DockerTarget, self).__init__(platform, directory)
-        self.version = version
         self.mounts = []
         self.privileged = False
 
@@ -542,7 +553,8 @@ class DockerTarget(Target):
 
     def command(self, cmd):
         dir = os.path.join(self.directory, os.path.relpath(os.getcwd(), self.directory))
-        command('%s exec %s -t %s /bin/bash -c \'export %s; cd %s; %s\'' % (config.docker(), self._user_tag(), self.container, self.variables_string(), dir, cmd))
+        interactive_flag = '-i ' if sys.stdin.isatty() else ''
+        command('%s exec %s %s -t %s /bin/bash -c \'export %s; cd %s; %s\'' % (config.docker(), self._user_tag(), interactive_flag, self.container, self.variables_string(), dir, cmd))
 
     def cleanup(self):
         super(DockerTarget, self).cleanup()
@@ -589,8 +601,9 @@ class WindowsTarget(DockerTarget):
     environment_prefix: path to Windows environment for the appropriate target (libraries and some tools)
     tool_path: path to 32- and 64-bit tools
     """
-    def __init__(self, version, bits, directory=None):
-        super(WindowsTarget, self).__init__('windows', directory, version)
+    def __init__(self, windows_version, bits, directory, environment_version):
+        super(WindowsTarget, self).__init__('windows', directory)
+        self.version = windows_version
         self.bits = bits
 
         self.tool_path = '%s/usr/bin' % config.get('mxe_prefix')
@@ -616,6 +629,8 @@ class WindowsTarget(DockerTarget):
         self.set('LDFLAGS', '"%s"' % link)
 
         self.image = 'windows'
+        if environment_version is not None:
+            self.image += '_%s' % environment_version
 
     @property
     def library_prefix(self):
@@ -655,8 +670,9 @@ class LinuxTarget(DockerTarget):
     """
 
     def __init__(self, distro, version, bits, directory=None):
-        super(LinuxTarget, self).__init__('linux', directory, version)
+        super(LinuxTarget, self).__init__('linux', directory)
         self.distro = distro
+        self.version = version
         self.bits = bits
         self.detail = None
 
@@ -798,9 +814,9 @@ def target_factory(args):
     if s.startswith('windows-'):
         x = s.split('-')
         if len(x) == 2:
-            target = WindowsTarget(None, int(x[1]), args.work)
+            target = WindowsTarget(None, int(x[1]), args.work, args.environment_version)
         elif len(x) == 3:
-            target = WindowsTarget(x[1], int(x[2]), args.work)
+            target = WindowsTarget(x[1], int(x[2]), args.work, args.environment_version)
         else:
             raise Error("Bad Windows target name `%s'")
     elif s.startswith('ubuntu-') or s.startswith('debian-') or s.startswith('centos-') or s.startswith('fedora-') or s.startswith('mageia-'):
@@ -889,14 +905,17 @@ class Tree(object):
 
         command('git checkout %s %s %s' % (flags, spec, redirect))
         self.git_commit = command_and_read('git rev-parse --short=7 HEAD')[0].strip()
-        command('git submodule init --quiet')
-        command('git submodule update --quiet')
 
         proj = '%s/src/%s' % (target.directory, self.name)
 
         self.cscript = {}
         exec(open('%s/cscript' % proj).read(), self.cscript)
 
+        # cscript can include submodules = False to stop submodules being fetched
+        if not 'submodules' in self.cscript or self.cscript['submodules'] == True:
+            command('git submodule init --quiet')
+            command('git submodule update --quiet')
+
         if os.path.exists('%s/wscript' % proj):
             v = read_wscript_variable(proj, "VERSION");
             if v is not None:
@@ -915,7 +934,13 @@ class Tree(object):
     def add_defaults(self, options):
         """Add the defaults from this into a dict options"""
         if 'option_defaults' in self.cscript:
-            for k, v in self.cscript['option_defaults']().items():
+            from_cscript = self.cscript['option_defaults']
+            if isinstance(from_cscript, dict):
+                defaults_dict = from_cscript
+            else:
+                log("Deprecated cscript option_defaults method; replace with a dict")
+                defaults_dict = from_cscript()
+            for k, v in defaults_dict.items():
                 if not k in options:
                     options[k] = v
 
@@ -952,12 +977,19 @@ class Tree(object):
 
     def build_dependencies(self, options):
         for i in self.dependencies(options):
+            global args
+            if args.verbose:
+                print('Building a dependency of %s %s %s with %s' % (self.name, self.specifier, self.version, options))
             i[0].build(i[1])
 
     def build(self, options):
         if self.built:
             return
 
+        global args
+        if args.verbose:
+            print("* Building %s %s %s with %s" % (self.name, self.specifier, self.version, options))
+
         variables = copy.copy(self.target.variables)
 
         # Start with the options passed in
@@ -1011,7 +1043,8 @@ def main():
     parser.add_argument('-c', '--checkout', help='string to pass to git for checkout')
     parser.add_argument('-o', '--output', help='output directory', default='.')
     parser.add_argument('-q', '--quiet', help='be quiet', action='store_true')
-    parser.add_argument('-t', '--target', help='target')
+    parser.add_argument('-t', '--target', help='target', action='append')
+    parser.add_argument('--environment-version', help='version of environment to use')
     parser.add_argument('-k', '--keep', help='keep working tree', action='store_true')
     parser.add_argument('--debug', help='build with debugging symbols where possible', action='store_true')
     parser.add_argument('-w', '--work', help='override default work directory')
@@ -1023,8 +1056,18 @@ def main():
     parser.add_argument('--no-version-commit', help="use just tags for versioning, don't modify wscript, ChangeLog etc.", action='store_true')
     parser.add_argument('--option', help='set an option for the build (use --option key:value)', action='append')
     parser.add_argument('--ccache', help='use ccache', action='store_true')
+    parser.add_argument('--verbose', help='be verbose', action='store_true')
+    global args
     args = parser.parse_args()
 
+    # Check for incorrect multiple parameters
+    if args.target is not None:
+        if len(args.target) > 1:
+            parser.error('multiple -t options specified')
+            sys.exit(1)
+        else:
+            args.target = args.target[0]
+
     # Override configured stuff
     if args.git_prefix is not None:
         config.set('git_prefix', args.git_prefix)