aboutsummaryrefslogtreecommitdiffstats
path: root/src/scripts/install.py
diff options
context:
space:
mode:
authorlloyd <[email protected]>2014-11-12 01:50:35 +0000
committerlloyd <[email protected]>2014-11-12 01:50:35 +0000
commit62ff505146cac307ca751109297332035bdc8b73 (patch)
tree55b31ba6d635338f8f4c8e3906b7f16ba003e72a /src/scripts/install.py
parent8b0cbccc7b11e545ed27bc6d7bda04b5cf632e60 (diff)
Add a new Python install script and clean up the makefile templates
Diffstat (limited to 'src/scripts/install.py')
-rwxr-xr-xsrc/scripts/install.py171
1 files changed, 171 insertions, 0 deletions
diff --git a/src/scripts/install.py b/src/scripts/install.py
new file mode 100755
index 000000000..f3daa9f44
--- /dev/null
+++ b/src/scripts/install.py
@@ -0,0 +1,171 @@
+#!/usr/bin/python
+
+import errno
+import logging
+import optparse
+import os
+import shutil
+import string
+import sys
+
+def parse_command_line(args):
+
+ parser = optparse.OptionParser()
+
+ parser.add_option('--verbose', action='store_true', default=False,
+ help='Show debug messages')
+ parser.add_option('--quiet', action='store_true', default=False,
+ help='Show only warnings and errors')
+
+ build_group = optparse.OptionGroup(parser, 'Source options')
+ build_group.add_option('--build-dir', metavar='DIR', default='build',
+ help='Location of build output (default \'%default\')')
+ parser.add_option_group(build_group)
+
+ install_group = optparse.OptionGroup(parser, 'Installation options')
+ install_group.add_option('--destdir', default='/tmp/local',
+ help='Set output directory (default %default)')
+ install_group.add_option('--bindir', default='bin', metavar='DIR',
+ help='Set binary subdir (default %default)')
+ install_group.add_option('--libdir', default='lib', metavar='DIR',
+ help='Set library subdir (default %default)')
+ install_group.add_option('--includedir', default='include', metavar='DIR',
+ help='Set include subdir (default %default)')
+ install_group.add_option('--docdir', default='share/doc', metavar='DIR',
+ help='Set documentation subdir (default %default)')
+ install_group.add_option('--pkgconfigdir', default='pkgconfig', metavar='DIR',
+ help='Set pkgconfig subdir (default %default)')
+
+ install_group.add_option('--include-dir-suffix', metavar='SUFFIX', default='',
+ help='Set optional suffix on include dir')
+ install_group.add_option('--doc-dir-suffix', metavar='SUFFIX', default='',
+ help='Set optional suffix on doc dir')
+
+ install_group.add_option('--umask', metavar='MASK', default='022',
+ help='Umask to set (default %default)')
+ parser.add_option_group(install_group)
+
+ (options, args) = parser.parse_args(args)
+
+ def log_level():
+ if options.verbose:
+ return logging.DEBUG
+ if options.quiet:
+ return logging.WARNING
+ return logging.INFO
+
+ logging.getLogger().setLevel(log_level())
+
+ return (options, args)
+
+def makedirs(dirname, exist_ok = True):
+ try:
+ logging.debug('Creating directory %s' % (dirname))
+ os.makedirs(dirname)
+ except OSError as e:
+ if e.errno != errno.EEXIST or not exist_ok:
+ raise e
+
+def main(args = None):
+ if args is None:
+ args = sys.argv
+
+ logging.basicConfig(stream = sys.stdout,
+ format = '%(levelname) 7s: %(message)s')
+
+ (options, args) = parse_command_line(args)
+
+ exe_mode = 0777
+
+ if 'umask' in os.__dict__:
+ umask = int(options.umask, 8)
+ logging.debug('Setting umask to %s' % oct(umask))
+ os.umask(int(options.umask, 8))
+ exe_mode &= (umask ^ 0777)
+
+ def copy_executable(src, dest):
+ shutil.copyfile(src, dest)
+ logging.debug('Copied %s to %s' % (src, dest))
+ os.chmod(dest, exe_mode)
+
+ build_vars = eval(open(os.path.join(options.build_dir, 'build_config.py')).read())
+
+ def process_template(template_str):
+ class PercentSignTemplate(string.Template):
+ delimiter = '%'
+
+ try:
+ template = PercentSignTemplate(template_str)
+ return template.substitute(build_vars)
+ except KeyError as e:
+ raise Exception('Unbound var %s in template' % (e))
+ except Exception as e:
+ raise Exception('Exception %s in template' % (e))
+
+ bin_dir = os.path.join(options.destdir, options.bindir)
+ lib_dir = os.path.join(options.destdir, options.libdir)
+ doc_dir = os.path.join(options.destdir, options.docdir)
+ include_dir = os.path.join(options.destdir, options.includedir)
+ botan_doc_dir = os.path.join(doc_dir, 'botan' + options.doc_dir_suffix)
+ botan_include_dir = os.path.join(include_dir, 'botan' + options.include_dir_suffix)
+
+ out_dir = process_template('%{out_dir}')
+ app_exe = process_template('botan%{program_suffix}')
+
+ makedirs(options.destdir)
+ makedirs(lib_dir)
+ makedirs(bin_dir)
+ makedirs(doc_dir)
+ makedirs(include_dir)
+ makedirs(botan_include_dir) # False
+
+ build_include_dir = os.path.join(options.build_dir, 'include', 'botan')
+
+ for include in os.listdir(build_include_dir):
+ if include == 'internal':
+ continue
+ shutil.copyfile(os.path.join(build_include_dir, include),
+ os.path.join(botan_include_dir, include))
+
+ static_lib = process_template('%{lib_prefix}%{libname}.%{static_suffix}')
+ shutil.copyfile(static_lib, os.path.join(lib_dir, os.path.basename(static_lib)))
+
+ if bool(build_vars['with_shared_lib']):
+ shared_lib = process_template('%{lib_prefix}%{libname}.%{so_suffix}.%{so_abi_rev}.%{version_patch}')
+ soname = process_template('%{lib_prefix}%{libname}.%{so_suffix}.%{so_abi_rev}')
+ baselib = process_template('%{lib_prefix}%{libname}.%{so_suffix}')
+
+ copy_executable(shared_lib, os.path.join(lib_dir, os.path.basename(shared_lib)))
+
+ prev_cwd = os.getcwd()
+ try:
+ os.chdir(lib_dir)
+ os.symlink(shared_lib, soname)
+ os.symlink(soname, baselib)
+ finally:
+ os.chdir(prev_cwd)
+
+ copy_executable(os.path.join(out_dir, app_exe), os.path.join(bin_dir, app_exe))
+
+ if 'botan_config' in build_vars:
+ copy_executable(build_vars['botan_config'],
+ os.path.join(bin_dir, os.path.basename(build_vars['botan_config'])))
+
+ if 'botan_pkgconfig' in build_vars:
+ pkgconfig_dir = os.path.join(options.destdir, options.pkgconfigdir)
+ makedirs(pkgconfig_dir)
+ shutil.copyfile(build_vars['botan_pkgconfig'],
+ os.path.join(pkgconfig_dir, os.path.basename(build_vars['botan_pkgconfig'])))
+
+ shutil.copytree(build_vars['doc_output_dir'], botan_doc_dir)
+
+ logging.info('Botan %s installation complete', build_vars['version'])
+
+if __name__ == '__main__':
+ try:
+ sys.exit(main())
+ except Exception as e:
+ logging.error('Failure: %s' % (e))
+ import traceback
+ logging.debug(traceback.format_exc())
+ sys.exit(1)