#!/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
Option('osx_environment_prefix'),
Option('osx_sdk_prefix'),
Option('osx_sdk'),
+ Option('apple_id'),
+ Option('apple_password'),
BoolOption('docker_sudo'),
BoolOption('docker_no_user'),
Option('docker_hub_repository'),
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:
def command_and_read(c):
log(c)
- p = subprocess.Popen(c.split(), stdout=subprocess.PIPE)
- f = os.fdopen(os.dup(p.stdout.fileno()))
- return f
+ p = subprocess.Popen(c.split(), stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+ (out, err) = p.communicate()
+ if p.returncode != 0:
+ raise Error('command %s failed (%s)' % (c, err))
+ return out.splitlines()
def read_wscript_variable(directory, variable):
f = open('%s/wscript' % directory, 'r')
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
if config.has('docker_hub_repository'):
tag = '%s:%s' % (config.get('docker_hub_repository'), tag)
- self.container = command_and_read('%s run %s %s -itd %s /bin/bash' % (config.docker(), self._user_tag(), opts, tag)).read().strip()
+ self.container = command_and_read('%s run %s %s -itd %s /bin/bash' % (config.docker(), self._user_tag(), opts, tag))[0].strip()
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()
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')
self.set('LDFLAGS', '"%s"' % link)
self.image = 'windows'
+ if environment_version is not None:
+ self.image += '_%s' % environment_version
@property
def library_prefix(self):
"""
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
self.sdk = config.get('osx_sdk')
self.sdk_prefix = config.get('osx_sdk_prefix')
self.environment_prefix = config.get('osx_environment_prefix')
+ self.apple_id = config.get('apple_id')
+ self.apple_password = config.get('apple_password')
def command(self, c):
command('%s %s' % (self.variables_string(False), c))
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-'):
spec = 'master'
command('git checkout %s %s %s' % (flags, spec, redirect))
- self.git_commit = command_and_read('git rev-parse --short=7 HEAD').readline().strip()
- command('git submodule init --quiet')
- command('git submodule update --quiet')
+ self.git_commit = command_and_read('git rev-parse --short=7 HEAD')[0].strip()
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:
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
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
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')
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)
with TreeDirectory(tree):
f = command_and_read('git log --tags --simplify-by-decoration --pretty="%d"')
latest = None
+ line = 0
while latest is None:
- t = f.readline()
+ t = f[line]
+ line += 1
m = re.compile(".*\((.*)\).*").match(t)
if m:
tags = m.group(1).split(', ')
target = SourceTarget()
tree = globals.trees.get(args.project, args.checkout, target)
with TreeDirectory(tree):
- print(command_and_read('git rev-parse HEAD').readline().strip()[:7])
+ print(command_and_read('git rev-parse HEAD')[0].strip()[:7])
target.cleanup()
elif globals.command == 'checkout':