| #!/usr/bin/python |
| # |
| # Copyright (C) 2002-2020 Free Software Foundation, Inc. |
| # |
| # 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 |
| # the Free Software Foundation; either version 3 of the License, or |
| # (at your option) any later version. |
| # |
| # This program is distributed in the hope that it will be useful, |
| # but WITHOUT ANY WARRANTY; without even the implied warranty of |
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| # GNU General Public License for more details. |
| # |
| # You should have received a copy of the GNU General Public License |
| # along with this program. If not, see <https://www.gnu.org/licenses/>. |
| # |
| |
| # This program is meant for authors or maintainers which want to import |
| # modules from gnulib into their packages. |
| |
| |
| #=============================================================================== |
| # Define global imports |
| #=============================================================================== |
| import os |
| import re |
| import sys |
| import codecs |
| import random |
| import shutil |
| import argparse |
| import subprocess as sp |
| from tempfile import mktemp |
| from pprint import pprint |
| from pygnulib import constants |
| from pygnulib import classes |
| |
| |
| #=============================================================================== |
| # Define global constants |
| #=============================================================================== |
| PYTHON3 = constants.PYTHON3 |
| APP = constants.APP |
| DIRS = constants.DIRS |
| ENCS = constants.ENCS |
| UTILS = constants.UTILS |
| MODES = constants.MODES |
| TESTS = constants.TESTS |
| compiler = constants.compiler |
| joinpath = constants.joinpath |
| cleaner = constants.cleaner |
| string = constants.string |
| isabs = os.path.isabs |
| isdir = os.path.isdir |
| isfile = os.path.isfile |
| normpath = os.path.normpath |
| relpath = os.path.relpath |
| |
| |
| #=============================================================================== |
| # Define main part |
| #=============================================================================== |
| def main(): |
| # Reset arguments |
| mode = None |
| destdir = None |
| localdir = None |
| modcache = None |
| verbose = None |
| auxdir = None |
| modules = None |
| avoids = None |
| sourcebase = None |
| m4base = None |
| pobase = None |
| docbase = None |
| testsbase = None |
| tests = None |
| libname = None |
| lgpl = None |
| makefile = None |
| libtool = None |
| conddeps = None |
| macro_prefix = None |
| podomain = None |
| witness_c_macro = None |
| vc_files = None |
| dryrun = None |
| errors = None |
| |
| info = classes.GLInfo() |
| parser = argparse.ArgumentParser( |
| prog=constants.APP['name'], |
| usage='gnulib-tool.py --help', |
| add_help=False) |
| # help |
| parser.add_argument('-h', '--help', '--hel', '--he', '--h', |
| dest='help', |
| default=None, |
| action='store_true') |
| # version |
| parser.add_argument('--version', '--versio', '--versi', '--vers', |
| dest='version', |
| default=None, |
| action='store_true') |
| # list |
| parser.add_argument('-l', '--list', '--lis', |
| dest='mode_list', |
| default=None, |
| action='store_true') |
| # find |
| parser.add_argument('-f', '--find', '--fin', '--fi', '--f', |
| dest='mode_find', |
| default=None, |
| nargs='*') |
| # import |
| parser.add_argument('-i', '--import', |
| dest='mode_import', |
| default=None, |
| nargs='*') |
| # add-import |
| parser.add_argument('-a', '--add-import', |
| dest='mode_add_import', |
| default=None, |
| nargs='+') |
| # remove-import |
| parser.add_argument('-r', '--remove-import', |
| dest='mode_remove_import', |
| default=None, |
| nargs='+') |
| # update |
| parser.add_argument('-u', '--update', |
| dest='mode_update', |
| default=None, |
| action='store_true') |
| # create-testdir |
| parser.add_argument('-td', '--create-testdir', |
| dest='mode_create_testdir', |
| default=None, |
| nargs='*') |
| # create-megatestdir |
| parser.add_argument('-mtd', '--create-megatestdir', |
| dest='mode_create_megatestdir', |
| default=None, |
| nargs='*') |
| # test |
| parser.add_argument('-t', '--test', |
| dest='mode_test', |
| default=None, |
| nargs='*') |
| # megatest |
| parser.add_argument('-mt', '--megatest', '--megates', '--megate', '--megat', |
| '--mega', '--meg', '--me', '--m', |
| dest='mode_megatest', |
| default=None, |
| nargs='*') |
| # copy-file |
| parser.add_argument('-c', '--copy-file', |
| dest='mode_copy_file', |
| default=None, |
| nargs='+') |
| # extract-* |
| parser.add_argument('-xD', '--extract-description', |
| dest='mode_xdescription', |
| default=None, |
| nargs='*') |
| parser.add_argument('-xc', '--extract-comment', |
| dest='mode_xcomment', |
| default=None, |
| nargs='*') |
| parser.add_argument('-xs', '--extract-status', |
| dest='mode_xstatus', |
| default=None, |
| nargs='*') |
| parser.add_argument('-xn', '--extract-notice', |
| dest='mode_xnotice', |
| default=None, |
| nargs='*') |
| parser.add_argument('-xa', '--extract-applicability', |
| dest='mode_xapplicability', |
| default=None, |
| nargs='*') |
| parser.add_argument('-xf', '--extract-filelist', |
| dest='mode_xfilelist', |
| default=None, |
| nargs='*') |
| parser.add_argument('-xd', '--extract-dependencies', |
| dest='mode_xdependencies', |
| default=None, |
| nargs='*') |
| parser.add_argument('-xac', '--extract-autoconf-snippet', |
| dest='mode_xautoconf', |
| default=None, |
| nargs='*') |
| parser.add_argument('-xam', '--extract-automake-snippet', |
| dest='mode_xautomake', |
| default=None, |
| nargs='*') |
| parser.add_argument('-xi', '--extract-include-directive', |
| dest='mode_xinclude', |
| default=None, |
| nargs='*') |
| parser.add_argument('-xl', '--extract-link-directive', |
| dest='mode_xlink', |
| default=None, |
| nargs='*') |
| parser.add_argument('-xL', '--extract-license', |
| dest='mode_xlicense', |
| default=None, |
| nargs='*') |
| parser.add_argument('-xm', '--extract-maintainer', |
| dest='mode_xmaintainer', |
| default=None, |
| nargs='*') |
| # no-changelog: a no-op for backward compatibility |
| parser.add_argument('--no-changelog', |
| dest='changelog', |
| default=None, |
| action='store_false') |
| # destdir |
| parser.add_argument('-d', '--dir', |
| dest='destdir', |
| default=None, |
| nargs=1) |
| # localdir |
| parser.add_argument('-ld', '--local-dir', |
| dest='localdir', |
| default=None, |
| nargs=1) |
| # verbose |
| parser.add_argument('-v', '--verbose', |
| default=0, |
| action='count') |
| # quiet |
| parser.add_argument('-q', '--quiet', |
| default=0, |
| action='count') |
| # dryrun |
| parser.add_argument('--dry-run', |
| dest='dryrun', |
| default=None, |
| action='store_true') |
| # inctests |
| parser.add_argument('--with-tests', |
| dest='inctests', |
| default=None, |
| action='store_true') |
| # makefile |
| parser.add_argument("--makefile-name", |
| dest="makefile", |
| default=None, |
| type=str) |
| # obsolete |
| parser.add_argument('--with-obsolete', |
| dest='obsolete', |
| default=None, |
| action='store_true') |
| # c++-tests |
| parser.add_argument('--with-c++-tests', |
| dest='cxx', |
| default=None, |
| action='store_true') |
| # longrunning-tests |
| parser.add_argument('--with-longrunning-tests', |
| dest='longrunning', |
| default=None, |
| action='store_true') |
| # privileged-tests |
| parser.add_argument('--with-privileged-tests', |
| dest='privileged', |
| default=None, |
| action='store_true') |
| # unportable-tests |
| parser.add_argument('--with-unportable-tests', |
| dest='unportable', |
| default=None, |
| action='store_true') |
| # all-tests |
| parser.add_argument('--with-all-tests', |
| dest='alltests', |
| default=None, |
| action='store_true') |
| # auxdir |
| parser.add_argument('--aux-dir', |
| dest='auxdir', |
| default=None, |
| nargs=1) |
| # libname |
| parser.add_argument('--lib', |
| dest='libname', |
| default=None, |
| nargs=1) |
| # libtool |
| parser.add_argument("--libtool", |
| dest=libtool, |
| default=False, |
| action="store_true") |
| # sourcebase |
| parser.add_argument('-sb', '--source-base', |
| dest='sourcebase', |
| default=None, |
| nargs=1) |
| # m4base |
| parser.add_argument('-mb', '--m4-base', |
| dest='m4base', |
| default=None, |
| nargs=1) |
| # pobase |
| parser.add_argument('-pb', '--po-base', |
| dest='pobase', |
| default=None, |
| nargs=1) |
| # docbase |
| parser.add_argument('-db', '--doc-base', |
| dest='docbase', |
| default=None, |
| nargs=1) |
| # testsbase |
| parser.add_argument('-tb', '--tests-base', |
| dest='testsbase', |
| default=None, |
| nargs=1) |
| # lgpl |
| parser.add_argument('--lgpl', |
| dest='lgpl', |
| default=False, |
| type=int, |
| nargs='?') |
| # avoids |
| parser.add_argument('--avoid', |
| dest='avoids', |
| default=None, |
| nargs='+') |
| |
| # Parse the given arguments. |
| cmdargs = parser.parse_args() |
| |
| # Determine when user tries to combine modes. |
| args = [ |
| cmdargs.mode_list, |
| cmdargs.mode_import, |
| cmdargs.mode_add_import, |
| cmdargs.mode_remove_import, |
| cmdargs.mode_update, |
| cmdargs.mode_create_testdir, |
| cmdargs.mode_create_megatestdir, |
| cmdargs.mode_test, |
| cmdargs.mode_megatest, |
| cmdargs.mode_copy_file, |
| cmdargs.mode_xdescription, |
| cmdargs.mode_xcomment, |
| cmdargs.mode_xstatus, |
| cmdargs.mode_xnotice, |
| cmdargs.mode_xapplicability, |
| cmdargs.mode_xfilelist, |
| cmdargs.mode_xdependencies, |
| cmdargs.mode_xautoconf, |
| cmdargs.mode_xautomake, |
| cmdargs.mode_xinclude, |
| cmdargs.mode_xlink, |
| cmdargs.mode_xlicense, |
| cmdargs.mode_xmaintainer, |
| ] |
| overflow = [arg for arg in args if arg] |
| if len(overflow) > 1: |
| message = 'gnulib-tool: Unable to combine different modes of work.\n' |
| message += 'Try \'gnulib-tool --help\' for more information.\n' |
| sys.stderr.write(message) |
| sys.exit(1) |
| |
| # Determine selected mode. |
| if cmdargs.help != None: |
| print(info.usage()) |
| sys.exit(0) |
| if cmdargs.version != None: |
| message = '''gnulib-tool (%s %s)%s\n%s\n%s\n\nWritten by %s.''' % \ |
| (info.package(), info.date(), info.version(), info.copyright(), |
| info.license(), info.authors()) |
| print(message) |
| sys.exit(0) |
| if cmdargs.mode_list != None: |
| mode = 'list' |
| if cmdargs.mode_import != None: |
| mode = 'import' |
| modules = list(cmdargs.mode_import) |
| if cmdargs.mode_add_import != None: |
| mode = 'add-import' |
| modules = list(cmdargs.mode_add_import) |
| if cmdargs.mode_remove_import != None: |
| mode = 'remove-import' |
| modules = list(cmdargs.mode_remove_import) |
| if cmdargs.mode_update != None: |
| mode = 'update' |
| if cmdargs.mode_create_testdir != None: |
| mode = 'create-testdir' |
| modules = list(cmdargs.mode_create_testdir) |
| if cmdargs.mode_create_megatestdir != None: |
| mode = 'create-megatestdir' |
| modules = list(cmdargs.mode_create_megatestdir) |
| if cmdargs.mode_test != None: |
| mode = 'test' |
| modules = list(cmdargs.mode_test) |
| if cmdargs.mode_megatest != None: |
| mode = 'megatest' |
| modules = list(cmdargs.mode_megatest) |
| if cmdargs.mode_xdescription != None: |
| mode = 'extract-description' |
| modules = list(cmdargs.mode_xdescription) |
| if cmdargs.mode_xcomment != None: |
| mode = 'extract-comment' |
| modules = list(cmdargs.mode_xcomment) |
| if cmdargs.mode_xstatus != None: |
| mode = 'extract-status' |
| modules = list(cmdargs.mode_xstatus) |
| if cmdargs.mode_xnotice != None: |
| mode = 'extract-notice' |
| modules = list(cmdargs.mode_xnotice) |
| if cmdargs.mode_xapplicability != None: |
| mode = 'extract-applicability' |
| modules = list(cmdargs.mode_xapplicability) |
| if cmdargs.mode_xfilelist != None: |
| mode = 'extract-filelist' |
| modules = list(cmdargs.mode_xfilelist) |
| if cmdargs.mode_xautoconf != None: |
| mode = 'extract-autoconf-snippet' |
| modules = list(cmdargs.mode_xautoconf) |
| if cmdargs.mode_xautomake != None: |
| mode = 'extract-automake-snippet' |
| modules = list(cmdargs.mode_xautomake) |
| if cmdargs.mode_xdependencies != None: |
| mode = 'extract-dependencies' |
| modules = list(cmdargs.mode_xdependencies) |
| if cmdargs.mode_xinclude != None: |
| mode = 'extract-include-directive' |
| modules = list(cmdargs.mode_xinclude) |
| if cmdargs.mode_xlink != None: |
| mode = 'extract-link-directive' |
| modules = list(cmdargs.mode_xlink) |
| if cmdargs.mode_xlicense != None: |
| mode = 'extract-license' |
| modules = list(cmdargs.mode_xlicense) |
| if cmdargs.mode_xmaintainer != None: |
| mode = 'extract-maintainer' |
| modules = list(cmdargs.mode_xmaintainer) |
| if cmdargs.mode_copy_file != None: |
| mode = 'copy-file' |
| if len(cmdargs.mode_copy_file) > 2: |
| message = '%s: *** ' % constants.APP['name'] |
| message += 'invalid number of arguments for --%s' % mode |
| message += '\n%s: *** Exit.\n' % constants.APP['name'] |
| sys.stderr.write(message) |
| sys.exit(1) |
| files = list(cmdargs.mode_copy_file) |
| |
| # Determine specific settings. |
| destdir = cmdargs.destdir |
| if destdir != None: |
| destdir = cmdargs.destdir[0] |
| localdir = cmdargs.localdir |
| if localdir != None: |
| localdir = cmdargs.localdir[0] |
| libname = cmdargs.libname |
| if libname != None: |
| libname = cmdargs.libname[0] |
| auxdir = cmdargs.auxdir |
| if auxdir != None: |
| auxdir = cmdargs.auxdir[0] |
| sourcebase = cmdargs.sourcebase |
| if sourcebase != None: |
| sourcebase = cmdargs.sourcebase[0] |
| m4base = cmdargs.m4base |
| if m4base != None: |
| m4base = cmdargs.m4base[0] |
| pobase = cmdargs.pobase |
| if pobase != None: |
| pobase = cmdargs.pobase[0] |
| testsbase = cmdargs.testsbase |
| if testsbase != None: |
| testsbase = cmdargs.testsbase[0] |
| dryrun = cmdargs.dryrun |
| verbose = -cmdargs.quiet + cmdargs.verbose |
| inctests = cmdargs.inctests |
| flags = [cmdargs.inctests, cmdargs.obsolete, cmdargs.cxx, |
| cmdargs.longrunning, cmdargs.privileged, cmdargs.unportable, |
| cmdargs.alltests] |
| testflags = list() |
| for flag in flags: |
| index = flags.index(flag) |
| if flag != None: |
| if flag: |
| if index == 0: |
| testflags += [constants.TESTS['tests']] |
| elif index == 1: |
| testflags += [constants.TESTS['obsolete']] |
| elif index == 2: |
| testflags += [constants.TESTS['cxx-tests']] |
| elif index == 3: |
| testflags += [constants.TESTS['longrunning-tests']] |
| elif index == 4: |
| testflags += [constants.TESTS['privileged-tests']] |
| elif index == 5: |
| testflags += [constants.TESTS['unportable-tests']] |
| elif index == 6: |
| testflags += [constants.TESTS['all-tests']] |
| lgpl = cmdargs.lgpl |
| libtool = cmdargs.libtool |
| makefile = cmdargs.makefile |
| if lgpl == None: |
| lgpl = True |
| avoids = cmdargs.avoids |
| |
| # Create pygnulib configuration. |
| config = classes.GLConfig( |
| destdir=destdir, |
| localdir=localdir, |
| m4base=m4base, |
| auxdir=auxdir, |
| modules=modules, |
| avoids=avoids, |
| sourcebase=sourcebase, |
| pobase=pobase, |
| docbase=docbase, |
| testsbase=testsbase, |
| testflags=testflags, |
| libname=libname, |
| lgpl=lgpl, |
| makefile=makefile, |
| libtool=libtool, |
| conddeps=conddeps, |
| macro_prefix=macro_prefix, |
| podomain=podomain, |
| witness_c_macro=witness_c_macro, |
| vc_files=vc_files, |
| modcache=modcache, |
| verbose=verbose, |
| dryrun=dryrun, |
| ) |
| |
| # Canonicalize the inctests variable. |
| if inctests == None: |
| if mode in ['import', 'add-import', 'remove-import', 'update']: |
| config.disableTestFlag(TESTS['tests']) |
| elif mode in ['create-testdir', 'create-megatestdir', 'test', 'megatest']: |
| config.enableTestFlag(TESTS['tests']) |
| |
| # Work in the given mode. |
| if mode in ['list']: |
| modulesystem = classes.GLModuleSystem(config) |
| listing = modulesystem.list() |
| result = '\n'.join(listing) |
| os.rmdir(config['tempdir']) |
| print(result) |
| |
| elif mode in ['import', 'add-import', 'remove-import', 'update']: |
| mode = MODES[mode] |
| if not destdir: |
| destdir = '.' |
| config.setDestDir(destdir) |
| |
| if mode == MODES['import']: |
| # Set variables to default values. |
| if not sourcebase: |
| sourcebase = 'lib' |
| if not m4base: |
| m4base = 'm4' |
| if not docbase: |
| docbase = 'doc' |
| if not testsbase: |
| testsbase = 'tests' |
| if not macro_prefix: |
| macro_prefix = 'gl' |
| config.setSourceBase(sourcebase) |
| config.setM4Base(m4base) |
| config.setDocBase(docbase) |
| config.setTestsBase(testsbase) |
| config.setMacroPrefix(macro_prefix) |
| |
| # Perform GLImport actions. |
| importer = classes.GLImport(config, mode) |
| filetable, transformers = importer.prepare() |
| importer.execute(filetable, transformers) |
| |
| else: # if mode != MODE['--import'] |
| if m4base: |
| if not isfile(joinpath(destdir, m4base, 'gnulib-cache.m4')): |
| if not sourcebase: |
| sourcebase = 'lib' |
| if not docbase: |
| docbase = 'doc' |
| if not testsbase: |
| testsbase = 'tests' |
| if not macro_prefix: |
| macro_prefix = 'gl' |
| config.setSourceBase(sourcebase) |
| config.setM4Base(m4base) |
| config.setDocBase(docbase) |
| config.setTestsBase(testsbase) |
| config.setMacroPrefix(macro_prefix) |
| # Perform GLImport actions. |
| importer = classes.GLImport(config, mode) |
| filetable, transformers = importer.prepare() |
| importer.execute(filetable, transformers) |
| else: # if not m4base |
| m4dirs = list() |
| dirisnext = bool() |
| filepath = joinpath(destdir, 'Makefile.am') |
| if isfile(filepath): |
| with codecs.open(filepath, 'rb', 'UTF-8') as file: |
| data = file.read() |
| data = data.split('ACLOCAL_AMFLAGS')[1] |
| data = data[data.find('=') + 1:data.find('\n')] |
| aclocal_amflags = data.split() |
| for aclocal_amflag in aclocal_amflags: |
| if dirisnext: |
| if not isabs(aclocal_amflag): |
| m4dirs += [aclocal_amflag] |
| else: # if not dirisnext |
| if aclocal_amflag == '-I': |
| dirisnext = True |
| else: # if aclocal_amflag != '-I' |
| dirisnext = False |
| else: # if not isfile(filepath) |
| filepath = joinpath(destdir, 'aclocal.m4') |
| if isfile(filepath): |
| pattern = constants.compiler( |
| r'm4_include\(\[(.*?)\]\)') |
| with codecs.open(filepath, 'rb', 'UTF-8') as file: |
| m4dirs = pattern.findall(file.read()) |
| m4dirs = [os.path.dirname(m4dir) for m4dir in m4dirs] |
| m4dirs = \ |
| [ # Begin filtering |
| m4dir for m4dir in m4dirs \ |
| if isfile(joinpath(destdir, m4dir, 'gnulib-cache.m4')) |
| ] # Finish filtering |
| m4dirs = sorted(set(m4dirs)) |
| if len(m4dirs) == 0: |
| # First use of gnulib in a package. |
| # Any number of additional modules can be given. |
| if not sourcebase: |
| sourcebase = 'lib' |
| m4base = 'm4' |
| if not docbase: |
| docbase = 'doc' |
| if not testsbase: |
| testsbase = 'tests' |
| if not macro_prefix: |
| macro_prefix = 'gl' |
| config.setSourceBase(sourcebase) |
| config.setM4Base(m4base) |
| config.setDocBase(docbase) |
| config.setTestsBase(testsbase) |
| config.setMacroPrefix(macro_prefix) |
| # Perform GLImport actions. |
| importer = classes.GLImport(config, mode) |
| filetable, transformers = importer.prepare() |
| importer.execute(filetable, transformers) |
| elif len(m4dirs) == 1: |
| m4base = m4dirs[-1] |
| config.setM4Base(m4base) |
| # Perform GLImport actions. |
| importer = classes.GLImport(config, mode) |
| filetable, transformers = importer.prepare() |
| importer.execute(filetable, transformers) |
| else: # if len(m4dirs) > 1 |
| for m4base in m4dirs: |
| config.setM4Base(m4base) |
| # Perform GLImport actions. |
| importer = classes.GLImport(config, mode) |
| filetable, transformers = importer.prepare() |
| importer.execute(filetable, transformers) |
| |
| elif mode == 'create-testdir': |
| if not destdir: |
| message = '%s: *** ' % constants.APP['name'] |
| message += 'please specify --dir option' |
| message += '\n%s: *** Exit.\n' % constants.APP['name'] |
| sys.stderr.write(message) |
| sys.exit(1) |
| if not auxdir: |
| auxdir = 'build-aux' |
| config.setAuxDir(auxdir) |
| testdir = classes.GLTestDir(config, destdir) |
| testdir.execute() |
| |
| elif mode == 'create-megatestdir': |
| if not destdir: |
| message = '%s: *** ' % constants.APP['name'] |
| message += 'please specify --dir option' |
| message += '\n%s: *** Exit.\n' % constants.APP['name'] |
| sys.stderr.write(message) |
| sys.exit(1) |
| if not auxdir: |
| auxdir = 'build-aux' |
| config.setAuxDir(auxdir) |
| testdir = classes.GLMegaTestDir(config, destdir) |
| testdir.execute() |
| |
| elif mode == 'test': |
| if not destdir: |
| destdir = 'testdir %04d' % random.randrange(0, 9999) |
| if not auxdir: |
| auxdir = 'build-aux' |
| config.setAuxDir(auxdir) |
| testdir = classes.GLTestDir(config, destdir) |
| testdir.execute() |
| os.chdir(destdir) |
| os.mkdir('build') |
| os.chdir('build') |
| try: # Try to execute commands |
| sp.call(['../configure']) |
| sp.call([UTILS['make']]) |
| sp.call([UTILS['make'], 'check']) |
| sp.call([UTILS['make'], 'distclean']) |
| except Exception as error: |
| sys.exit(1) |
| args = ['find', '.', '-type', 'f', '-print'] |
| remaining = sp.check_output(args).decode(ENCS['shell']) |
| lines = [line.strip() |
| for line in remaining.split('\n') if line.strip()] |
| remaining = ' '.join(lines) |
| if remaining: |
| message = 'Remaining files: %s\n' % remaining |
| message += 'gnulib-tool: *** Stop.\n' |
| sys.stderr.write(message) |
| sys.exit(1) |
| os.chdir('../..') |
| sp.call(['rm', '-rf', destdir], shell=False) |
| |
| elif mode == 'megatest': |
| if not destdir: |
| destdir = 'testdir %04d' % random.randrange(0, 9999) |
| if not auxdir: |
| auxdir = 'build-aux' |
| config.setAuxDir(auxdir) |
| testdir = classes.GLMegaTestDir(config, destdir) |
| testdir.execute() |
| os.chdir(destdir) |
| os.mkdir('build') |
| os.chdir('build') |
| sp.call(['../configure']) |
| sp.call([UTILS['make']]) |
| sp.call([UTILS['make'], 'check']) |
| sp.call([UTILS['make'], 'distclean']) |
| args = ['find', '.', '-type', 'f', '-print'] |
| remaining = sp.check_output(args).decode(ENCS['shell']) |
| lines = [line.strip() |
| for line in remaining.split('\n') if line.strip()] |
| remaining = ' '.join(lines) |
| if remaining: |
| message = 'Remaining files: %s\n' % remaining |
| message += 'gnulib-tool: *** Stop.\n' |
| sys.stderr.write(message) |
| sys.exit(1) |
| os.chdir('../..') |
| sp.call(['rm', '-rf', destdir], shell=False) |
| |
| elif mode == 'extract-description': |
| modulesystem = classes.GLModuleSystem(config) |
| modules = [modulesystem.find(module) for module in modules] |
| for module in modules: |
| print(module.getDescription()) |
| |
| elif mode == 'extract-comment': |
| modulesystem = classes.GLModuleSystem(config) |
| modules = [modulesystem.find(module) for module in modules] |
| for module in modules: |
| print(module.getComment()) |
| |
| elif mode == 'extract-status': |
| modulesystem = classes.GLModuleSystem(config) |
| modules = [modulesystem.find(module) for module in modules] |
| for module in modules: |
| status = module.getStatus() |
| print('\n'.join(status)) |
| |
| elif mode == 'extract-notice': |
| modulesystem = classes.GLModuleSystem(config) |
| modules = [modulesystem.find(module) for module in modules] |
| for module in modules: |
| print(module.getNotice()) |
| |
| elif mode == 'extract-applicability': |
| modulesystem = classes.GLModuleSystem(config) |
| modules = [modulesystem.find(module) for module in modules] |
| for module in modules: |
| print(module.getApplicability()) |
| |
| elif mode == 'extract-filelist': |
| modulesystem = classes.GLModuleSystem(config) |
| modules = [modulesystem.find(module) for module in modules] |
| for module in modules: |
| files = module.getFiles() |
| print('\n'.join(files)) |
| |
| elif mode == 'extract-dependencies': |
| result = string() |
| if avoids: |
| message = '%s: *** ' % constants.APP['name'] |
| message += 'cannot combine --avoid and --extract-dependencies\n' |
| message += '%s: *** Exit.\n' % constants.APP['name'] |
| sys.stderr.write(message) |
| sys.exit(1) |
| modulesystem = classes.GLModuleSystem(config) |
| modules = [modulesystem.find(module) for module in modules] |
| for module in modules: |
| dependencies = module.getDependencies() |
| if dependencies: |
| for depmodule, condition in dependencies: |
| if condition == None: |
| result += '%s\n' % str(depmodule) |
| else: # if condition != None |
| result += '%s\t%s' % (str(depmodule), condition) |
| print(result) |
| |
| elif mode == 'extract-autoconf-snippet': |
| modulesystem = classes.GLModuleSystem(config) |
| modules = [modulesystem.find(module) for module in modules] |
| for module in modules: |
| print(module.getAutoconfSnippet()) |
| |
| elif mode == 'extract-automake-snippet': |
| modulesystem = classes.GLModuleSystem(config) |
| modules = [modulesystem.find(module) for module in modules] |
| for module in modules: |
| print(module.getAutomakeSnippet()) |
| |
| elif mode == 'extract-include-directive': |
| modulesystem = classes.GLModuleSystem(config) |
| modules = [modulesystem.find(module) for module in modules] |
| for module in modules: |
| print(module.getInclude()) |
| |
| elif mode == 'extract-link-directive': |
| modulesystem = classes.GLModuleSystem(config) |
| modules = [modulesystem.find(module) for module in modules] |
| for module in modules: |
| print(module.getLink()) |
| |
| elif mode == 'extract-license': |
| modulesystem = classes.GLModuleSystem(config) |
| modules = [modulesystem.find(module) for module in modules] |
| for module in modules: |
| print(module.getLicense()) |
| |
| elif mode == 'extract-maintainer': |
| modulesystem = classes.GLModuleSystem(config) |
| modules = [modulesystem.find(module) for module in modules] |
| for module in modules: |
| print(module.getMaintainer()) |
| |
| elif mode == 'extract-tests-module': |
| modulesystem = classes.GLModuleSystem(config) |
| modules = [modulesystem.find(module) for module in modules] |
| for module in modules: |
| if module.getTestsModule(): |
| print(module.getTestsName()) |
| |
| elif mode == 'copy-file': |
| srcpath = files[0] |
| if len(files) == 2: |
| dest = files[1] |
| else: # if len(files) != 2 |
| dest = '.' |
| if type(srcpath) is bytes: |
| srcpath = srcpath.decode(ENCS['default']) |
| if type(dest) is bytes: |
| dest = dest.decode(ENCS['default']) |
| if not auxdir: |
| auxdir = 'build-aux' |
| if not sourcebase: |
| sourcebase = 'lib' |
| if not m4base: |
| m4base = 'm4' |
| if not docbase: |
| docbase = 'doc' |
| if not testsbase: |
| testsbase = 'tests' |
| config.setAuxDir(auxdir) |
| config.setSourceBase(sourcebase) |
| config.setM4Base(m4base) |
| config.setDocBase(docbase) |
| config.setTestsBase(testsbase) |
| filesystem = classes.GLFileSystem(config) |
| lookedup, flag = filesystem.lookup(srcpath) |
| if isdir(dest): |
| destdir = string(dest) |
| if srcpath.startswith('build-aux/'): |
| destpath = constants.substart( |
| 'build-aux/', '%s/' % auxdir, srcpath) |
| elif srcpath.startswith('doc/'): |
| destpath = constants.substart('doc/', '%s/' % docbase, srcpath) |
| elif srcpath.startswith('lib/'): |
| destpath = constants.substart( |
| 'lib/', '%s/' % sourcebase, srcpath) |
| elif srcpath.startswith('m4/'): |
| destpath = constants.substart('m4/', '%s/' % m4base, srcpath) |
| elif srcpath.startswith('tests/'): |
| destpath = constants.substart( |
| 'tests/', '%s/' % testsbase, srcpath) |
| elif srcpath.startswith('tests=lib/'): |
| destpath = constants.substart( |
| 'tests=lib/', '%s/' % testsbase, srcpath) |
| elif srcpath.startswith('top/'): |
| destpath = constants.substart('top/', '', srcpath) |
| else: # either case |
| destpath = srcpath |
| else: # if not isdir(destpath) |
| destdir = os.path.dirname(destpath) |
| destpath = os.path.basename(destpath) |
| # Create the directory for destfile. |
| dirname = os.path.dirname(joinpath(destdir, destpath)) |
| if not config['dryrun']: |
| if dirname and not isdir(dirname): |
| try: # Try to create directories |
| os.makedirs(dirname) |
| except Exception as error: |
| pass |
| # Copy the file. |
| assistant = classes.GLFileAssistant(config) |
| tmpfile = assistant.tmpfilename(destpath) |
| shutil.copy(lookedup, tmpfile) |
| already_present = True |
| assistant.setOriginal(srcpath) |
| assistant.setRewritten(destpath) |
| if isfile(joinpath(destdir, destpath)): |
| # The file already exists. |
| assistant.update(lookedup, flag, tmpfile, already_present) |
| else: # if not isfile(joinpath(destdir, destpath)) |
| # Install the file. |
| # Don't protest if the file should be there but isn't: it happens |
| # frequently that developers don't put autogenerated files under version |
| # control. |
| assistant.add(lookedup, flag, tmpfile) |
| if isfile(tmpfile): |
| os.remove(tmpfile) |
| |
| else: |
| message = '%s: *** ' % constants.APP['name'] |
| message += 'no mode specified' |
| message += '\n%s: *** Exit.\n' % constants.APP['name'] |
| sys.stderr.write(message) |
| sys.exit(1) |
| |
| |
| if __name__ == '__main__': |
| try: # Try to execute |
| main() |
| except classes.GLError as error: |
| errmode = 0 # gnulib-style errors |
| errno = error.errno |
| errinfo = error.errinfo |
| if errmode == 0: |
| message = '%s: *** ' % constants.APP['name'] |
| if errinfo == None: |
| errinfo = string() |
| if errno == 1: |
| message += 'file %s not found' % errinfo |
| elif errno == 2: |
| message += 'patch file %s didn\'t apply cleanly' % errinfo |
| elif errno == 3: |
| message += 'cannot find %s - make sure ' % errinfo |
| message += 'you run gnulib-tool from within your package\'s directory' |
| elif errno == 4: |
| message += 'minimum supported autoconf version is 2.59. Try adding' |
| message += 'AC_PREREQ([%s])' % constants.DEFAULT_AUTOCONF_MINVERSION |
| message += ' to your configure.ac.' |
| elif errno == 5: |
| "%s is expected to contain gl_M4_BASE([%s])" % \ |
| (repr(os.path.join(errinfo, 'gnulib-comp.m4')), repr(errinfo)) |
| elif errno == 6: |
| message += 'missing --source-base option' |
| elif errno == 7: |
| message += 'missing --doc-base option. --doc-base has been introduced ' |
| message += 'on 2006-07-11; if your last invocation of \'gnulib-tool ' |
| message += '--import\' is before that date, you need to run' |
| message += '\'gnulib-tool --import\' once, with a --doc-base option.' |
| elif errno == 8: |
| message += 'missing --tests-base option' |
| elif errno == 9: |
| message += 'missing --lib option' |
| elif errno == 10: |
| message = 'gnulib-tool: option --conditional-dependencies is not ' |
| message += 'supported with --with-tests\n' |
| elif errno == 11: |
| incompatibilities = string() |
| message += 'incompatible license on modules:%s' % constants.NL |
| for pair in errinfo: |
| incompatibilities += pair[0] |
| incompatibilities += ' %s' % pair[1] |
| incompatibilities += constants.NL |
| tempname = mktemp() |
| with codecs.open(tempname, 'wb', 'UTF-8') as file: |
| file.write(incompatibilities) |
| sed_table = 's,^\\([^ ]*\\) ,\\1' + ' ' * 51 + ',\n' |
| sed_table += 's,^\\(' + '.' * 49 + \ |
| '[^ ]*\) *,' + ' ' * 17 + '\\1 ,' |
| args = ['sed', '-e', sed_table, tempname] |
| incompatibilities = sp.check_output( |
| args).decode(ENCS['default']) |
| message += incompatibilities |
| os.remove(tempname) |
| elif errno == 12: |
| message += 'refusing to do nothing' |
| elif errno in [13, 14, 15, 16, 17]: |
| message += 'failed' |
| elif errno == 19: |
| message += 'could not create destination directory: %s' % errinfo |
| if errno != 10: |
| message += '\n%s: *** Exit.\n' % constants.APP['name'] |
| sys.stderr.write(message) |
| sys.exit(1) |