diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/build-data/botan-config.in | 17 | ||||
-rw-r--r-- | src/build-data/makefile/dso.in | 6 | ||||
-rw-r--r-- | src/build-data/makefile/gmake.in | 35 | ||||
-rw-r--r-- | src/build-data/makefile/header.in | 8 | ||||
-rw-r--r-- | src/build-data/makefile/nmake.in | 10 | ||||
-rwxr-xr-x | src/scripts/install.py | 171 |
6 files changed, 188 insertions, 59 deletions
diff --git a/src/build-data/botan-config.in b/src/build-data/botan-config.in index f855cbc50..e8d8bc2c1 100644 --- a/src/build-data/botan-config.in +++ b/src/build-data/botan-config.in @@ -1,16 +1,9 @@ #!/bin/sh -# For normal builds: -guess_prefix=`dirname \`dirname $0\`` +prefix=%{prefix} includedir=%{includedir}/botan-%{version_major}.%{version_minor} libdir=%{libdir} -# For workspace builds: -#guess_prefix=`dirname $0` -#includedir=build/include -#libdir= - -install_prefix=%{prefix} prefix= usage() @@ -23,12 +16,6 @@ if test $# -eq 0; then usage fi -if test `echo $guess_prefix | cut -c 1` = "/"; then - prefix=$guess_prefix -else - prefix=$install_prefix -fi - while test $# -gt 0; do case "$1" in -*=*) optarg=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'` ;; @@ -49,7 +36,7 @@ while test $# -gt 0; do echo -I$prefix/$includedir ;; --libs) - if [ $prefix != "/usr" -a $prefix != "/usr/local" ] + if [ $prefix != "/usr" ] then echo -L$prefix/$libdir -lbotan-%{version_major}.%{version_minor} %{link_to} else diff --git a/src/build-data/makefile/dso.in b/src/build-data/makefile/dso.in index 7e9829fff..0c791515f 100644 --- a/src/build-data/makefile/dso.in +++ b/src/build-data/makefile/dso.in @@ -1,6 +1,6 @@ -SONAME = $(LIBNAME)-$(BRANCH).%{so_suffix}.%{so_abi_rev} -SHARED_LIB = $(SONAME).%{version_patch} -SYMLINK = $(LIBNAME)-$(BRANCH).%{so_suffix} +SHARED_LIB = $(LIBNAME).%{so_suffix}.%{so_abi_rev}.%{version_patch} +SONAME = $(LIBNAME).%{so_suffix}.%{so_abi_rev} +SYMLINK = $(LIBNAME).%{so_suffix} $(SHARED_LIB): $(LIBOBJS) $(LIB_LINK_CMD) $(LDFLAGS) $(LIBOBJS) $(LIB_LINKS_TO) -o $(SHARED_LIB) diff --git a/src/build-data/makefile/gmake.in b/src/build-data/makefile/gmake.in index e9320ce02..6b2703cb7 100644 --- a/src/build-data/makefile/gmake.in +++ b/src/build-data/makefile/gmake.in @@ -3,12 +3,9 @@ %{commands_in} # Library targets -LIBRARIES = $(STATIC_LIB) - -LIBNAME = %{lib_prefix}libbotan -STATIC_LIB = $(LIBNAME)-$(BRANCH).a +STATIC_LIB = %{out_dir}/$(LIBNAME).%{static_suffix} -LIBPATH = botan-$(BRANCH) +LIBRARIES = $(STATIC_LIB) # File Lists INCLUDE_DIR = %{botan_include_dir} @@ -30,10 +27,10 @@ TESTOBJS = %{test_objs} %{dso_in} $(APP): $(LIBRARIES) $(APPOBJS) - $(CXX) $(LDFLAGS) $(APPOBJS) -L. -l$(LIBPATH) $(APP_LINKS_TO) -o $(APP) + $(CXX) $(LDFLAGS) $(APPOBJS) -L%{out_dir} -l%{libname} $(APP_LINKS_TO) -o $(APP) $(TEST): $(LIBRARIES) $(TESTOBJS) - $(CXX) $(LDFLAGS) $(TESTOBJS) -L. -l$(LIBPATH) $(TEST_LINKS_TO) -o $(TEST) + $(CXX) $(LDFLAGS) $(TESTOBJS) -L%{out_dir} -l%{libname} $(TEST_LINKS_TO) -o $(TEST) $(STATIC_LIB): $(LIBOBJS) $(RM) $(STATIC_LIB) @@ -64,29 +61,7 @@ docs: %{build_doc_commands} install: $(LIBRARIES) docs - $(MKDIR_INSTALL) $(DOCDIR) - $(COPY_R) %{doc_output_dir}/* $(DOCDIR) - - $(MKDIR_INSTALL) $(HEADERDIR) - for i in $(INCLUDE_DIR)/*.h; do \ - $(INSTALL_CMD_DATA) $$i $(HEADERDIR); \ - done - - $(MKDIR_INSTALL) $(LIBDIR) - $(INSTALL_CMD_DATA) $(STATIC_LIB) $(LIBDIR) - -ifneq ($(SHARED_LIB),) - $(INSTALL_CMD_EXEC) $(SHARED_LIB) $(LIBDIR) - $(CD) $(LIBDIR); $(LN) $(SHARED_LIB) $(SYMLINK) - $(CD) $(LIBDIR); $(LN) $(SHARED_LIB) $(SONAME) -endif - - $(MKDIR_INSTALL) $(BINDIR) - $(INSTALL_CMD_EXEC) $(CONFIG_SCRIPT) $(BINDIR) - $(INSTALL_CMD_EXEC) $(APP) $(BINDIR) - - $(MKDIR_INSTALL) $(PKGCONF_DIR) - $(INSTALL_CMD_DATA) $(PKGCONFIG) $(PKGCONF_DIR) + $(SCRIPTS_DIR)/install.py --destdir=%{destdir} --bindir=%{bindir} --libdir=%{libdir} --docdir=%{docdir} --includedir=%{includedir} website: rm -rf $(WEBSITE_SRC_DIR) $(WEBSITE_DIR) diff --git a/src/build-data/makefile/header.in b/src/build-data/makefile/header.in index c481f65f3..86d4c65c5 100644 --- a/src/build-data/makefile/header.in +++ b/src/build-data/makefile/header.in @@ -16,10 +16,14 @@ LIB_FLAGS = $(SO_OBJ_FLAGS) $(LANG_FLAGS) $(LIB_OPT) $(WARN_FLAGS) APP_FLAGS = $(LANG_FLAGS) $(APP_OPT) $(WARN_FLAGS) TEST_FLAGS = $(LANG_FLAGS) $(APP_OPT) $(WARN_FLAGS) +SCRIPTS_DIR = src/scripts + # Version Numbers VERSION = %{version} BRANCH = %{version_major}.%{version_minor} +LIBNAME = %{lib_prefix}botan-%{version_major}.%{version_minor} + # Installation Settings DESTDIR = %{destdir} BINDIR = $(DESTDIR)/bin @@ -32,7 +36,7 @@ CONFIG_SCRIPT = %{botan_config} PKGCONFIG = %{botan_pkgconfig} # Executable targets -APP = %{app_prefix}botan%{program_suffix} -TEST = %{app_prefix}botan-test%{program_suffix} +APP = %{out_dir}/botan%{program_suffix} +TEST = %{out_dir}/botan-test%{program_suffix} all: $(APP) $(TEST) diff --git a/src/build-data/makefile/nmake.in b/src/build-data/makefile/nmake.in index f45690d06..95d8c0422 100644 --- a/src/build-data/makefile/nmake.in +++ b/src/build-data/makefile/nmake.in @@ -73,12 +73,4 @@ distclean: clean $(RM) Makefile $(LIBNAME).* $(APP).* install: $(LIBRARIES) docs - -$(MKDIR) $(DESTDIR)\include\botan - $(INSTALL_CMD) botan.* $(DESTDIR) - $(INSTALL_CMD) build\include\botan\*.h $(DESTDIR)\include\botan - - -$(MKDIR) $(DESTDIR)\bin - $(INSTALL_CMD) $(APP) $(DESTDIR)\bin - - -$(MKDIR) $(DESTDIR)\lib - $(INSTALL_CMD) $(LIBRARIES) $(DESTDIR)\lib + $(SCRIPTS_DIR)/install.py --destdir=%{destdir} --bindir=%{bindir} --libdir=%{libdir} --docdir=%{docdir} --includedir=%{includedir} 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) |