diff options
author | Dmitry Selyutin <ghostmansd@gmail.com> | 2017-09-08 18:34:58 +0300 |
---|---|---|
committer | Dmitry Selyutin <ghostmansd@gmail.com> | 2017-09-08 18:34:58 +0300 |
commit | 21c52a82444a2f5f3307c7e2c1212beac42b9938 (patch) | |
tree | e8e23e3cf3377bf8f202cd661b0a8f87c7ef07ad /pygnulib/GLModuleSystem.py | |
parent | 4be624beba67fb2e6afd981be32b45fe73ecafb2 (diff) | |
download | gnulib-21c52a82444a2f5f3307c7e2c1212beac42b9938.tar.gz |
[pygnulib] autopep8 (fixing indentation, style, etc.)
Diffstat (limited to 'pygnulib/GLModuleSystem.py')
-rw-r--r-- | pygnulib/GLModuleSystem.py | 2401 |
1 files changed, 1207 insertions, 1194 deletions
diff --git a/pygnulib/GLModuleSystem.py b/pygnulib/GLModuleSystem.py index 34501e20e2..09ce5f6bf4 100644 --- a/pygnulib/GLModuleSystem.py +++ b/pygnulib/GLModuleSystem.py @@ -52,1216 +52,1229 @@ filter_filelist = constants.filter_filelist # Define GLModuleSystem class #=============================================================================== class GLModuleSystem(object): - '''GLModuleSystem is used to operate with module system using dynamic - searching and patching.''' - - def __init__(self, config): - '''GLModuleSystem.__init__(config) -> GLModuleSystem - - Create new GLModuleSystem instance. Some functions use GLFileSystem class - to look up a file in localdir or gnulib directories, or combine it through - 'patch' utility.''' - self.args = dict() - if type(config) is not GLConfig: - raise(TypeError('config must be a GLConfig, not %s' % \ - type(config).__name__)) - self.config = config - self.filesystem = GLFileSystem(self.config) - - def __repr__(self): - '''x.__repr__ <==> repr(x)''' - result = '<pygnulib.GLModuleSystem %s>' % hex(id(self)) - return(result) - - def exists(self, module): - '''GLModuleSystem.exists(module) -> bool - - Check whether the given module exists. - GLConfig: localdir.''' - if type(module) is bytes or string: - if type(module) is bytes: - module = module.decode(ENCS['default']) - else: # if module has not bytes or string type - raise(TypeError( - 'module must be a string, not %s' % type(module).__name__)) - result = bool() - badnames = ['CVS', 'ChangeLog', 'COPYING', 'README', 'TEMPLATE', - 'TEMPLATE-EXTENDED', 'TEMPLATE-TESTS'] - if isfile(joinpath(DIRS['modules'], module)) or \ - all([ # Begin all(iterable) function - self.config['localdir'], - isdir(joinpath(self.config['localdir'], 'modules')), - isfile(joinpath(self.config['localdir'], 'modules', module)) - ]): # Close all(iterable) function - if module not in badnames: - result = True - return(result) - - def find(self, module): - '''GLModuleSystem.find(module) -> GLModule - - Find the given module.''' - if type(module) is bytes or string: - if type(module) is bytes: - module = module.decode(ENCS['default']) - else: # if module has not bytes or string type - raise(TypeError( - 'module must be a string, not %s' % type(module).__name__)) - if self.exists(module): - path, istemp = self.filesystem.lookup(joinpath('modules', module)) - result = GLModule(self.config, path, istemp) - return(result) - else: # if not self.exists(module) - if self.config['errors']: - raise(GLError(3, module)) - else: # if not self.config['errors'] - sys.stderr.write('gnulib-tool: warning: ') - sys.stderr.write('file %s does not exist\n' % str(module)) - - def list(self): - '''GLModuleSystem.list() -> list - - Return the available module names as tuple. We could use a combination - of os.walk() function and re module. However, it takes too much time to - complete, so this version uses subprocess to run shell commands.''' - result = string() - listing = list() - localdir = self.config['localdir'] - find_args = ['find', 'modules', '-type', 'f', '-print'] - sed_args = \ - [ - 'sed', - '-e', r's,^modules/,,', - '-e', r'/^CVS\//d', - '-e', r'/\/CVS\//d', - '-e', r'/^ChangeLog$/d', - '-e', r'/\/ChangeLog$/d', - '-e', r'/^COPYING$/d', - '-e', r'/\/COPYING$/d', - '-e', r'/^README$/d', - '-e', r'/\/README$/d', - '-e', r'/^TEMPLATE$/d', - '-e', r'/^TEMPLATE-EXTENDED$/d', - '-e', r'/^TEMPLATE-TESTS$/d', - '-e', r'/^\..*/d', - '-e', r'/~$/d', - '-e', r'/-tests$/d', - ] - - # Read modules from gnulib root directory. - os.chdir(constants.DIRS['root']) - find = sp.Popen(find_args, stdout=sp.PIPE) - result += find.stdout.read().decode("UTF-8") - - # Read modules from local directory. - if localdir and isdir(joinpath(localdir, 'modules')): - os.chdir(localdir) - find = sp.Popen(find_args, stdout=sp.PIPE) - result += find.stdout.read().decode("UTF-8") - sed_args += ['-e', r's,\.diff$,,'] - - # Save the list of the modules to file. - os.chdir(DIRS['cwd']) - path = joinpath(self.config['tempdir'], 'list') - with codecs.open(path, 'wb', 'UTF-8') as file: - file.write(result) - - # Filter the list of the modules. - stdin = codecs.open(path, 'rb', 'UTF-8') - sed = sp.Popen(sed_args, stdin=stdin, stdout=sp.PIPE) - result = sed.stdout.read().decode("UTF-8") - stdin.close(); os.remove(path) - listing = [line for line in result.split('\n') if line.strip()] - listing = sorted(set(listing)) - return(listing) + '''GLModuleSystem is used to operate with module system using dynamic + searching and patching.''' + + def __init__(self, config): + '''GLModuleSystem.__init__(config) -> GLModuleSystem + + Create new GLModuleSystem instance. Some functions use GLFileSystem class + to look up a file in localdir or gnulib directories, or combine it through + 'patch' utility.''' + self.args = dict() + if type(config) is not GLConfig: + raise(TypeError('config must be a GLConfig, not %s' % + type(config).__name__)) + self.config = config + self.filesystem = GLFileSystem(self.config) + + def __repr__(self): + '''x.__repr__ <==> repr(x)''' + result = '<pygnulib.GLModuleSystem %s>' % hex(id(self)) + return(result) + + def exists(self, module): + '''GLModuleSystem.exists(module) -> bool + + Check whether the given module exists. + GLConfig: localdir.''' + if type(module) is bytes or string: + if type(module) is bytes: + module = module.decode(ENCS['default']) + else: # if module has not bytes or string type + raise(TypeError( + 'module must be a string, not %s' % type(module).__name__)) + result = bool() + badnames = ['CVS', 'ChangeLog', 'COPYING', 'README', 'TEMPLATE', + 'TEMPLATE-EXTENDED', 'TEMPLATE-TESTS'] + if isfile(joinpath(DIRS['modules'], module)) or \ + all([ # Begin all(iterable) function + self.config['localdir'], + isdir(joinpath(self.config['localdir'], 'modules')), + isfile( + joinpath(self.config['localdir'], 'modules', module)) + ]): # Close all(iterable) function + if module not in badnames: + result = True + return(result) + + def find(self, module): + '''GLModuleSystem.find(module) -> GLModule + + Find the given module.''' + if type(module) is bytes or string: + if type(module) is bytes: + module = module.decode(ENCS['default']) + else: # if module has not bytes or string type + raise(TypeError( + 'module must be a string, not %s' % type(module).__name__)) + if self.exists(module): + path, istemp = self.filesystem.lookup(joinpath('modules', module)) + result = GLModule(self.config, path, istemp) + return(result) + else: # if not self.exists(module) + if self.config['errors']: + raise(GLError(3, module)) + else: # if not self.config['errors'] + sys.stderr.write('gnulib-tool: warning: ') + sys.stderr.write('file %s does not exist\n' % str(module)) + + def list(self): + '''GLModuleSystem.list() -> list + + Return the available module names as tuple. We could use a combination + of os.walk() function and re module. However, it takes too much time to + complete, so this version uses subprocess to run shell commands.''' + result = string() + listing = list() + localdir = self.config['localdir'] + find_args = ['find', 'modules', '-type', 'f', '-print'] + sed_args = \ + [ + 'sed', + '-e', r's,^modules/,,', + '-e', r'/^CVS\//d', + '-e', r'/\/CVS\//d', + '-e', r'/^ChangeLog$/d', + '-e', r'/\/ChangeLog$/d', + '-e', r'/^COPYING$/d', + '-e', r'/\/COPYING$/d', + '-e', r'/^README$/d', + '-e', r'/\/README$/d', + '-e', r'/^TEMPLATE$/d', + '-e', r'/^TEMPLATE-EXTENDED$/d', + '-e', r'/^TEMPLATE-TESTS$/d', + '-e', r'/^\..*/d', + '-e', r'/~$/d', + '-e', r'/-tests$/d', + ] + + # Read modules from gnulib root directory. + os.chdir(constants.DIRS['root']) + find = sp.Popen(find_args, stdout=sp.PIPE) + result += find.stdout.read().decode("UTF-8") + + # Read modules from local directory. + if localdir and isdir(joinpath(localdir, 'modules')): + os.chdir(localdir) + find = sp.Popen(find_args, stdout=sp.PIPE) + result += find.stdout.read().decode("UTF-8") + sed_args += ['-e', r's,\.diff$,,'] + + # Save the list of the modules to file. + os.chdir(DIRS['cwd']) + path = joinpath(self.config['tempdir'], 'list') + with codecs.open(path, 'wb', 'UTF-8') as file: + file.write(result) + + # Filter the list of the modules. + stdin = codecs.open(path, 'rb', 'UTF-8') + sed = sp.Popen(sed_args, stdin=stdin, stdout=sp.PIPE) + result = sed.stdout.read().decode("UTF-8") + stdin.close() + os.remove(path) + listing = [line for line in result.split('\n') if line.strip()] + listing = sorted(set(listing)) + return(listing) #=============================================================================== # Define GLModule class #=============================================================================== class GLModule(object): - '''GLModule is used to create a module object from the file with the given - path. GLModule can get all information about module, get its dependencies, - files, etc.''' - - def __init__(self, config, module, patched=False): - '''GLModule.__init__(config, module[, patched]) -> GLModule - - Create new GLModule instance. Arguments are module and patched, where - module is a string representing the path to the module and patched is a - bool indicating that module was created after applying patch.''' - self.args = dict() - self.cache = dict() - self.content = string() - if type(config) is not GLConfig: - raise(TypeError('config must be a GLConfig, not %s' % \ - type(config).__name__)) - if type(module) is bytes or type(module) is string: - if type(module) is bytes: - module = module.decode(ENCS['default']) - else: # if module has not bytes or string type - raise(TypeError('module must be a string, not %s' % \ - type(module).__name__)) - if type(patched) is not bool: - raise(TypeError('patched must be a bool, not %s' % \ - type(module).__name__)) - self.module = module - self.patched = patched - self.config = config - self.filesystem = GLFileSystem(self.config) - self.modulesystem = GLModuleSystem(self.config) - with codecs.open(module, 'rb', 'UTF-8') as file: - self.content = file.read() - self.regex ='(?:Description:|Comment:|Status:|Notice:|Applicability:|\ + '''GLModule is used to create a module object from the file with the given + path. GLModule can get all information about module, get its dependencies, + files, etc.''' + + def __init__(self, config, module, patched=False): + '''GLModule.__init__(config, module[, patched]) -> GLModule + + Create new GLModule instance. Arguments are module and patched, where + module is a string representing the path to the module and patched is a + bool indicating that module was created after applying patch.''' + self.args = dict() + self.cache = dict() + self.content = string() + if type(config) is not GLConfig: + raise(TypeError('config must be a GLConfig, not %s' % + type(config).__name__)) + if type(module) is bytes or type(module) is string: + if type(module) is bytes: + module = module.decode(ENCS['default']) + else: # if module has not bytes or string type + raise(TypeError('module must be a string, not %s' % + type(module).__name__)) + if type(patched) is not bool: + raise(TypeError('patched must be a bool, not %s' % + type(module).__name__)) + self.module = module + self.patched = patched + self.config = config + self.filesystem = GLFileSystem(self.config) + self.modulesystem = GLModuleSystem(self.config) + with codecs.open(module, 'rb', 'UTF-8') as file: + self.content = file.read() + self.regex = '(?:Description:|Comment:|Status:|Notice:|Applicability:|\ Files:|Depends-on:|configure\\.ac-early:|configure\\.ac:|Makefile\\.am:|\ Include:|Link:|License:|Maintainer:)' - - def __eq__(self, module): - '''x.__eq__(y) <==> x==y''' - result = bool() - if type(module) is GLModule: - if self.module == module.module: - result = True - return(result) - - def __ne__(self, module): - '''x.__ne__(y) <==> x!=y''' - result = bool() - if type(module) is GLModule: - if self.module != module.module: - result = True - return(result) - - def __ge__(self, module): - '''x.__ge__(y) <==> x>=y''' - result = bool() - if type(module) is GLModule: - if self.module >= module.module: - result = True - return(result) - - def __gt__(self, module): - '''x.__gt__(y) <==> x>y''' - result = bool() - if type(module) is GLModule: - if self.module > module.module: - result = True - return(result) - - def __hash__(self): - '''x.__hash__() <==> hash(x)''' - module = hash(self.module) - patched = hash(self.patched) - result = module^patched - return(result) - - def __le__(self, module): - '''x.__le__(y) <==> x<=y''' - result = bool() - if type(module) is GLModule: - if self.module <= module.module: - result = True - return(result) - - def __lt__(self, module): - '''x.__lt__(y) <==> x<y''' - result = bool() - if type(module) is GLModule: - if self.module < module.module: - result = True - return(result) - - def __str__(self): - '''x.__str__() <==> str(x)''' - result = self.getName() - return(result) - - def __repr__(self): - '''x.__repr__ <==> repr(x)''' - result = '<pygnulib.GLModule %s %s>' % \ - (repr(self.getName()), hex(id(self))) - return(result) - - def getName(self): - '''GLModule.getName() -> string - - Return the name of the module.''' - pattern = compiler(joinpath('modules', '(.*?)$')) - result = pattern.findall(self.module)[0] - return(result) - - def isPatched(self): - '''GLModule.isPatched() -> bool - - Check whether module was created after applying patch.''' - return(self.patched) - - def isTests(self): - '''GLModule.isTests() -> bool - - Check whether module is a -tests version of module.''' - result = self.getName().endswith('-tests') - return(result) - - def isNonTests(self): - '''GLModule.isTests() -> bool - - Check whether module is not a -tests version of module.''' - result = not(self.isTests()) - return(result) - - def getTestsName(self): - '''Return -tests version of the module name.''' - result = self.getName() - if not result.endswith('-tests'): - result += '-tests' - return(result) - - def getTestsModule(self): - '''Return -tests version of the module as GLModule.''' - result = self.modulesystem.find(self.getTestsName()) - return(result) - - def getShellFunc(self): - '''GLModule.getShellFunc() -> string - - Computes the shell function name that will contain the m4 macros for the - module.''' - isalnum = True - macro_prefix = self.config['macro_prefix'] - for char in str(module): - if char not in constants.ALPHANUMERIC: - isalnum = False - break - if isalnum: - module = str(self) - else: # if not isalnum - module = '%s\n' % str(self) - if type(module) is string: - module = module.encode(ENCS['default']) - module = hashlib.md5(module).hexdigest() - result = 'func_%s_gnulib_m4code_%s' % (macro_prefix, module) - if type(result) is bytes: - result = result.decode(ENCS['default']) - return(result) - - def getShellVar(self): - '''GLModule.getShellVar() -> string - - Compute the shell variable name the will be set to true once the m4 macros - for the module have been executed.''' - isalnum = True - macro_prefix = self.config['macro_prefix'] - for char in str(module): - if char not in constants.ALPHANUMERIC: - isalnum = False - break - if isalnum: - module = str(self) - else: # if not isalnum - module = '%s\n' % str(self) - if type(module) is string: - module = module.encode(ENCS['default']) - module = hashlib.md5(module).hexdigest() - result = '%s_gnulib_enabled_%s' % (macro_prefix, module) - if type(result) is bytes: - result = result.decode(ENCS['default']) - return(result) - - def getConditionalName(self): - '''GLModule.getConditionalName() -> string - - Return the automake conditional name. - GLConfig: macro_prefix.''' - macro_prefix = self.config['macro_prefix'] - nonascii = \ - [ # Begin to filter non-ascii chars - char for char in self.getName() if char not in \ - 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_' - ] # Finish to filter non-ascii chars - if nonascii: - name = self.getName().encode(ENCS['default']) - name = hashlib.md5(name).hexdigest() - conditional = '%s_GNULIB_ENABLED_%s' % (macro_prefix, name) - else: # if not nonascii - result = '%s_GNULIB_ENABLED_%s' (macro_prefix, name) - if type(result) is bytes: - result = result.decode(ENCS['default']) - return(result) - - def getDescription(self): - '''GLModule.getDescription() -> string - - Return description of the module.''' - section = 'Description:' - if 'description' not in self.cache: - if section not in self.content: - result = string() - else: # if section in self.content - pattern = '^%s[\t ]*(.*?)%s' % (section, self.regex) - pattern = compiler(pattern, re.S | re.M) - result = pattern.findall(self.content) - if type(result) is list: - if not result: - result = string() - else: # if result - result = result[-1] - result = result.strip() - self.cache['description'] = result - return(self.cache['description']) - - def getComment(self): - '''GLModule.getComment() -> string - - Return comment to module.''' - section = 'Comment:' - if 'comment' not in self.cache: - if section not in self.content: - result = string() - else: # if section in self.content - pattern = '^%s[\t ]*(.*?)%s' % (section, self.regex) - pattern = compiler(pattern, re.S | re.M) - result = pattern.findall(self.content) - if type(result) is list: - if not result: - result = string() - else: # if result - result = result[-1] - result = result.strip() - self.cache['comment'] = result - return(self.cache['comment']) - - def getStatus(self): - '''GLModule.getStatus() -> string - - Return module status.''' - section = 'Status:' - if 'status' not in self.cache: - if section not in self.content: - result = string() - else: # if section in self.content - snippet = self.content.split(section)[-1] - snippet = snippet.replace('\r\n', '\n') - lines = ['%s\n' % line for line in snippet.split('\n')] - parts = list() - for line in lines: - regex = '^(Description|Comment|Status|Notice|Applicability|' - regex += 'Files|Depends-on|configure\\.ac-early|configure\\.ac|' - regex += 'Makefile\\.am|Include|Link|License|Maintainer):$' - pattern = compiler(regex) - findflag = pattern.findall(line) - if findflag: - break - parts += [line] - result = [part.strip() for part in parts if part.strip()] - self.cache['status'] = list(result) - return(list(self.cache['status'])) - - def getNotice(self): - '''GLModule.getNotice() -> string - - Return notice to module.''' - section = 'Notice:' - if 'notice' not in self.cache: - if section not in self.content: - result = string() - else: # if section in self.content - snippet = self.content.split(section)[-1] - snippet = snippet.replace('\r\n', '\n') - lines = ['%s\n' % line for line in snippet.split('\n')] - parts = list() - for line in lines: - regex = '^(Description|Comment|Status|Notice|Applicability|' - regex += 'Files|Depends-on|configure\\.ac-early|configure\\.ac|' - regex += 'Makefile\\.am|Include|Link|License|Maintainer):$' - pattern = compiler(regex) - findflag = pattern.findall(line) - if findflag: - break - parts += [line] - result = ''.join(parts) - self.cache['notice'] = result - return(self.cache['notice']) - - def getApplicability(self): - '''GLModule.getApplicability() -> string - - Return applicability of module.''' - section = 'Applicability:' - if 'applicability' not in self.cache: - if section not in self.content: - result = string() - else: # if section in self.content - snippet = self.content.split(section)[-1] - snippet = snippet.replace('\r\n', '\n') - lines = ['%s\n' % line for line in snippet.split('\n')] - parts = list() - for line in lines: - regex = '^(Description|Comment|Status|Notice|Applicability|' - regex += 'Files|Depends-on|configure\\.ac-early|configure\\.ac|' - regex += 'Makefile\\.am|Include|Link|License|Maintainer):$' - pattern = compiler(regex) - findflag = pattern.findall(line) - if findflag: - break - parts += [line] - parts = [part.strip() for part in parts] - result = ''.join(parts) - if not result.strip(): - if self.getName().endswith('-tests'): - result = 'tests' - else: # if not self.getName().endswith('-tests') - result = 'main' - if type(result) is bytes: - result = result.decode(ENCS['default']) - result = result.strip() - self.cache['applicability'] = result - return(self.cache['applicability']) - - def getFiles(self): - '''GLModule.getFiles() -> list - - Return list of files. - GLConfig: ac_version.''' - ac_version = self.config['ac_version'] - section = 'Files:' - result = list() - if 'files' not in self.cache: - if section not in self.content: + + def __eq__(self, module): + '''x.__eq__(y) <==> x==y''' + result = bool() + if type(module) is GLModule: + if self.module == module.module: + result = True + return(result) + + def __ne__(self, module): + '''x.__ne__(y) <==> x!=y''' + result = bool() + if type(module) is GLModule: + if self.module != module.module: + result = True + return(result) + + def __ge__(self, module): + '''x.__ge__(y) <==> x>=y''' + result = bool() + if type(module) is GLModule: + if self.module >= module.module: + result = True + return(result) + + def __gt__(self, module): + '''x.__gt__(y) <==> x>y''' + result = bool() + if type(module) is GLModule: + if self.module > module.module: + result = True + return(result) + + def __hash__(self): + '''x.__hash__() <==> hash(x)''' + module = hash(self.module) + patched = hash(self.patched) + result = module ^ patched + return(result) + + def __le__(self, module): + '''x.__le__(y) <==> x<=y''' + result = bool() + if type(module) is GLModule: + if self.module <= module.module: + result = True + return(result) + + def __lt__(self, module): + '''x.__lt__(y) <==> x<y''' + result = bool() + if type(module) is GLModule: + if self.module < module.module: + result = True + return(result) + + def __str__(self): + '''x.__str__() <==> str(x)''' + result = self.getName() + return(result) + + def __repr__(self): + '''x.__repr__ <==> repr(x)''' + result = '<pygnulib.GLModule %s %s>' % \ + (repr(self.getName()), hex(id(self))) + return(result) + + def getName(self): + '''GLModule.getName() -> string + + Return the name of the module.''' + pattern = compiler(joinpath('modules', '(.*?)$')) + result = pattern.findall(self.module)[0] + return(result) + + def isPatched(self): + '''GLModule.isPatched() -> bool + + Check whether module was created after applying patch.''' + return(self.patched) + + def isTests(self): + '''GLModule.isTests() -> bool + + Check whether module is a -tests version of module.''' + result = self.getName().endswith('-tests') + return(result) + + def isNonTests(self): + '''GLModule.isTests() -> bool + + Check whether module is not a -tests version of module.''' + result = not(self.isTests()) + return(result) + + def getTestsName(self): + '''Return -tests version of the module name.''' + result = self.getName() + if not result.endswith('-tests'): + result += '-tests' + return(result) + + def getTestsModule(self): + '''Return -tests version of the module as GLModule.''' + result = self.modulesystem.find(self.getTestsName()) + return(result) + + def getShellFunc(self): + '''GLModule.getShellFunc() -> string + + Computes the shell function name that will contain the m4 macros for the + module.''' + isalnum = True + macro_prefix = self.config['macro_prefix'] + for char in str(module): + if char not in constants.ALPHANUMERIC: + isalnum = False + break + if isalnum: + module = str(self) + else: # if not isalnum + module = '%s\n' % str(self) + if type(module) is string: + module = module.encode(ENCS['default']) + module = hashlib.md5(module).hexdigest() + result = 'func_%s_gnulib_m4code_%s' % (macro_prefix, module) + if type(result) is bytes: + result = result.decode(ENCS['default']) + return(result) + + def getShellVar(self): + '''GLModule.getShellVar() -> string + + Compute the shell variable name the will be set to true once the m4 macros + for the module have been executed.''' + isalnum = True + macro_prefix = self.config['macro_prefix'] + for char in str(module): + if char not in constants.ALPHANUMERIC: + isalnum = False + break + if isalnum: + module = str(self) + else: # if not isalnum + module = '%s\n' % str(self) + if type(module) is string: + module = module.encode(ENCS['default']) + module = hashlib.md5(module).hexdigest() + result = '%s_gnulib_enabled_%s' % (macro_prefix, module) + if type(result) is bytes: + result = result.decode(ENCS['default']) + return(result) + + def getConditionalName(self): + '''GLModule.getConditionalName() -> string + + Return the automake conditional name. + GLConfig: macro_prefix.''' + macro_prefix = self.config['macro_prefix'] + nonascii = \ + [ # Begin to filter non-ascii chars + char for char in self.getName() if char not in \ + 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_' + ] # Finish to filter non-ascii chars + if nonascii: + name = self.getName().encode(ENCS['default']) + name = hashlib.md5(name).hexdigest() + conditional = '%s_GNULIB_ENABLED_%s' % (macro_prefix, name) + else: # if not nonascii + result = '%s_GNULIB_ENABLED_%s' (macro_prefix, name) + if type(result) is bytes: + result = result.decode(ENCS['default']) + return(result) + + def getDescription(self): + '''GLModule.getDescription() -> string + + Return description of the module.''' + section = 'Description:' + if 'description' not in self.cache: + if section not in self.content: + result = string() + else: # if section in self.content + pattern = '^%s[\t ]*(.*?)%s' % (section, self.regex) + pattern = compiler(pattern, re.S | re.M) + result = pattern.findall(self.content) + if type(result) is list: + if not result: + result = string() + else: # if result + result = result[-1] + result = result.strip() + self.cache['description'] = result + return(self.cache['description']) + + def getComment(self): + '''GLModule.getComment() -> string + + Return comment to module.''' + section = 'Comment:' + if 'comment' not in self.cache: + if section not in self.content: + result = string() + else: # if section in self.content + pattern = '^%s[\t ]*(.*?)%s' % (section, self.regex) + pattern = compiler(pattern, re.S | re.M) + result = pattern.findall(self.content) + if type(result) is list: + if not result: + result = string() + else: # if result + result = result[-1] + result = result.strip() + self.cache['comment'] = result + return(self.cache['comment']) + + def getStatus(self): + '''GLModule.getStatus() -> string + + Return module status.''' + section = 'Status:' + if 'status' not in self.cache: + if section not in self.content: + result = string() + else: # if section in self.content + snippet = self.content.split(section)[-1] + snippet = snippet.replace('\r\n', '\n') + lines = ['%s\n' % line for line in snippet.split('\n')] + parts = list() + for line in lines: + regex = '^(Description|Comment|Status|Notice|Applicability|' + regex += 'Files|Depends-on|configure\\.ac-early|configure\\.ac|' + regex += 'Makefile\\.am|Include|Link|License|Maintainer):$' + pattern = compiler(regex) + findflag = pattern.findall(line) + if findflag: + break + parts += [line] + result = [part.strip() for part in parts if part.strip()] + self.cache['status'] = list(result) + return(list(self.cache['status'])) + + def getNotice(self): + '''GLModule.getNotice() -> string + + Return notice to module.''' + section = 'Notice:' + if 'notice' not in self.cache: + if section not in self.content: + result = string() + else: # if section in self.content + snippet = self.content.split(section)[-1] + snippet = snippet.replace('\r\n', '\n') + lines = ['%s\n' % line for line in snippet.split('\n')] + parts = list() + for line in lines: + regex = '^(Description|Comment|Status|Notice|Applicability|' + regex += 'Files|Depends-on|configure\\.ac-early|configure\\.ac|' + regex += 'Makefile\\.am|Include|Link|License|Maintainer):$' + pattern = compiler(regex) + findflag = pattern.findall(line) + if findflag: + break + parts += [line] + result = ''.join(parts) + self.cache['notice'] = result + return(self.cache['notice']) + + def getApplicability(self): + '''GLModule.getApplicability() -> string + + Return applicability of module.''' + section = 'Applicability:' + if 'applicability' not in self.cache: + if section not in self.content: + result = string() + else: # if section in self.content + snippet = self.content.split(section)[-1] + snippet = snippet.replace('\r\n', '\n') + lines = ['%s\n' % line for line in snippet.split('\n')] + parts = list() + for line in lines: + regex = '^(Description|Comment|Status|Notice|Applicability|' + regex += 'Files|Depends-on|configure\\.ac-early|configure\\.ac|' + regex += 'Makefile\\.am|Include|Link|License|Maintainer):$' + pattern = compiler(regex) + findflag = pattern.findall(line) + if findflag: + break + parts += [line] + parts = [part.strip() for part in parts] + result = ''.join(parts) + if not result.strip(): + if self.getName().endswith('-tests'): + result = 'tests' + else: # if not self.getName().endswith('-tests') + result = 'main' + if type(result) is bytes: + result = result.decode(ENCS['default']) + result = result.strip() + self.cache['applicability'] = result + return(self.cache['applicability']) + + def getFiles(self): + '''GLModule.getFiles() -> list + + Return list of files. + GLConfig: ac_version.''' + ac_version = self.config['ac_version'] + section = 'Files:' result = list() - else: # if section in self.content - snippet = self.content.split(section)[-1] - snippet = snippet.replace('\r\n', '\n') - lines = ['%s\n' % line for line in snippet.split('\n')] - parts = list() - for line in lines: - regex = '^(Description|Comment|Status|Notice|Applicability|' - regex += 'Files|Depends-on|configure\\.ac-early|configure\\.ac|' - regex += 'Makefile\\.am|Include|Link|License|Maintainer):$' - pattern = compiler(regex) - findflag = pattern.findall(line) - if findflag: - break - parts += [line] - result = [part.strip() for part in parts if part.strip()] - result += [joinpath('m4', '00gnulib.m4')] - result += [joinpath('m4', 'gnulib-common.m4')] - if ac_version == 2.59: - result += [joinpath('m4', 'onceonly.m4')] - self.cache['files'] = list(result) - return(list(self.cache['files'])) - - def getDependencies(self): - '''GLModule.getDependencies() -> list - - Return list of dependencies. - GLConfig: localdir.''' - localdir = self.config['localdir'] - result = list() - section = 'Depends-on:' - if 'dependencies' not in self.cache: - if section not in self.content: - depmodules = list() - else: # if section in self.content - snippet = self.content.split(section)[-1] - snippet = snippet.replace('\r\n', '\n') - lines = ['%s\n' % line for line in snippet.split('\n')] - parts = list() - for line in lines: - regex = '^(Description|Comment|Status|Notice|Applicability|' - regex += 'Files|Depends-on|configure\\.ac-early|configure\\.ac|' - regex += 'Makefile\\.am|Include|Link|License|Maintainer):$' - pattern = compiler(regex) - findflag = pattern.findall(line) - if findflag: - break - parts += [line] - modules = ''.join(parts) - modules = [line for line in modules.split('\n') if line.strip()] - modules = [module for module in modules if not module.startswith('#')] - for line in modules: - split = [part for part in line.split(' ') if part.strip()] - if len(split) == 1: - module = line.strip() - condition = None - else: # if len(split) != 1 - module = split[0] - condition = split[1] - if type(condition) is bytes: - condition = condition.decode(ENCS['default']) - result += [tuple([self.modulesystem.find(module), condition])] - self.cache['dependencies'] = result - return(list(self.cache['dependencies'])) - - def getAutoconfSnippet_Early(self): - '''GLModule.getAutoconfSnippet_Early() -> string - - Return autoconf-early snippet.''' - section = 'configure.ac-early:' - if 'autoconf-early' not in self.cache: - if section not in self.content: - result = string() - else: # if section in self.content - snippet = self.content.split(section)[-1] - snippet = snippet.replace('\r\n', '\n') - lines = ['%s\n' % line for line in snippet.split('\n')] - parts = list() - for line in lines: - regex = '^(Description|Comment|Status|Notice|Applicability|' - regex += 'Files|Depends-on|configure\\.ac-early|configure\\.ac|' - regex += 'Makefile\\.am|Include|Link|License|Maintainer):$' - pattern = compiler(regex) - findflag = pattern.findall(line) - if findflag: - break - parts += [line] - result = ''.join(parts) - self.cache['autoconf-early'] = result - return(self.cache['autoconf-early']) - - def getAutoconfSnippet(self): - '''GLModule.getAutoconfSnippet() -> string - - Return autoconf snippet.''' - section = 'configure.ac:' - if 'autoconf' not in self.cache: - if section not in self.content: - result = string() - else: # if section in self.content - snippet = self.content.split(section)[-1] - snippet = snippet.replace('\r\n', '\n') - lines = ['%s\n' % line for line in snippet.split('\n')] - parts = list() - for line in lines: - regex = '^(Description|Comment|Status|Notice|Applicability|' - regex += 'Files|Depends-on|configure\\.ac-early|configure\\.ac|' - regex += 'Makefile\\.am|Include|Link|License|Maintainer):$' - pattern = compiler(regex) - findflag = pattern.findall(line) - if findflag: - break - parts += [line] - result = ''.join(parts) - self.cache['autoconf'] = result - return(self.cache['autoconf']) - - def getAutomakeSnippet(self): - '''getAutomakeSnippet() -> string - - Get automake snippet. - GLConfig: auxdir, ac_version.''' - result = string() # Define stack variable - conditional = self.getAutomakeSnippet_Conditional() - if conditional.strip(): - result += self.getAutomakeSnippet_Conditional() - else: # if not conditional.strip() - result += '\n' - result += self.getAutomakeSnippet_Unconditional() - return(result) - - def getAutomakeSnippet_Conditional(self): - '''GLModule.getAutomakeSnippet_Conditional() -> string - - Return conditional automake snippet.''' - section = 'Makefile.am:' - if 'makefile-conditional' not in self.cache: - if section not in self.content: - result = string() - else: # if section in self.content - snippet = self.content.split(section)[-1] - snippet = snippet.replace('\r\n', '\n') - lines = ['%s\n' % line for line in snippet.split('\n')] - parts = list() - for line in lines: - regex = '^(Description|Comment|Status|Notice|Applicability|' - regex += 'Files|Depends-on|configure\\.ac-early|configure\\.ac|' - regex += 'Makefile\\.am|Include|Link|License|Maintainer):$' - pattern = compiler(regex) - findflag = pattern.findall(line) - if findflag: - break - parts += [line] - result = ''.join(parts) - self.cache['makefile-conditional'] = result - return(self.cache['makefile-conditional']) - - def getAutomakeSnippet_Unconditional(self): - '''GLModule.getAutomakeSnippet_Unconditional() -> string - - Return unconditional automake snippet. - GLConfig: auxdir, ac_version.''' - auxdir = self.config['auxdir'] - ac_version = self.config['ac_version'] - result = string() - if 'makefile-unconditional' not in self.cache: - if self.isTests(): - files = self.getFiles() - extra_files = filter_filelist(constants.NL, files, - 'tests/', '', 'tests/', '').split(constants.NL) - extra_files = sorted(set(extra_files)) - if extra_files: - result += string('EXTRA_DIST += %s' % ' '.join(extra_files)) - result += constants.NL *2 - else: # if not tests module - # TODO: unconditional automake snippet for nontests modules - snippet = self.getAutomakeSnippet_Conditional() - snippet = snippet.replace('\\\n', ' ') - pattern = compiler('^lib_SOURCES[\t ]*\\+=[\t ]*(.*?)$', re.S | re.M) - mentioned_files = pattern.findall(snippet) - if mentioned_files != list(): - mentioned_files = mentioned_files[-1].split(' ') - mentioned_files = [f.strip() for f in mentioned_files] - mentioned_files = [f for f in mentioned_files if f != ''] - mentioned_files = sorted(set(mentioned_files)) - all_files = self.getFiles() - lib_files = filter_filelist(constants.NL, all_files, - 'lib/', '', 'lib/', '').split(constants.NL) - extra_files = [f for f in lib_files if f not in mentioned_files] - extra_files = sorted(set(extra_files)) - if extra_files != [''] and extra_files: - result += string('EXTRA_DIST += %s' % ' '.join(extra_files)) - result += '\n\n' - # Synthesize also an EXTRA_lib_SOURCES augmentation - if str(self) != 'relocatable-prog-wrapper' and str(self) != 'pt_chown': - extra_files = filter_filelist(constants.NL, extra_files, - '', '.c', '', '').split(constants.NL) - extra_files = sorted(set(extra_files)) - if extra_files != ['']: - result += string('EXTRA_lib_SOURCES += %s' % ' '.join(extra_files)) - result += '\n\n' - # Synthesize an EXTRA_DIST augmentation also for the files in build-aux - buildaux_files = filter_filelist(constants.NL, all_files, - 'build-aux/', '', 'build-aux/', '').split(constants.NL) - buildaux_files = sorted(set(buildaux_files)) - if buildaux_files != ['']: - buildaux_files = ''.join(buildaux_files) - buildaux_files = joinpath('$(top_srcdir)', auxdir, buildaux_files) - result += string('EXTRA_DIST += %s' % buildaux_files) - result += '\n\n' - # Synthesize an EXTRA_DIST augmentation also for the files from top/. - top_files = filter_filelist(constants.NL, all_files, - 'top/', '', 'top/', '').split(constants.NL) - top_files = sorted(set(top_files)) - if top_files != ['']: - top_files = ''.join(top_files) - top_files = joinpath('$(top_srcdir)', top_files) - result += string('EXTRA_DIST += %s' % top_files) - result += '\n\n' - result = constants.nlconvert(result) - self.cache['makefile-unconditional'] = result - return(self.cache['makefile-unconditional']) - - def getInclude(self): - '''GLModule.getInclude() -> string - - Return include directive.''' - section = 'Include:' - if 'include' not in self.cache: - if section not in self.content: - result = string() - else: # if section in self.content - snippet = self.content.split(section)[-1] - snippet = snippet.replace('\r\n', '\n') - lines = ['%s\n' % line for line in snippet.split('\n')] - parts = list() - for line in lines: - regex = '^(Description|Comment|Status|Notice|Applicability|' - regex += 'Files|Depends-on|configure\\.ac-early|configure\\.ac|' - regex += 'Makefile\\.am|Include|Link|License|Maintainer):$' - pattern = compiler(regex) - findflag = pattern.findall(line) - if findflag: - break - parts += [line] - result = ''.join(parts) - result = result.strip() - pattern = compiler('^(["<].*?[>"])', re.S | re.M) - result = pattern.sub('#include \\1', result) - self.cache['include'] = result - return(self.cache['include']) - - def getLink(self): - '''GLModule.getLink() -> string - - Return link directive.''' - section = 'Link:' - if 'link' not in self.cache: - if section not in self.content: - result = string() - else: # if section in self.content - snippet = self.content.split(section)[-1] - snippet = snippet.replace('\r\n', '\n') - lines = ['%s\n' % line for line in snippet.split('\n')] - parts = list() - for line in lines: - regex = '^(Description|Comment|Status|Notice|Applicability|' - regex += 'Files|Depends-on|configure\\.ac-early|configure\\.ac|' - regex += 'Makefile\\.am|Include|Link|License|Maintainer):$' - pattern = compiler(regex) - findflag = pattern.findall(line) - if findflag: - break - parts += [line] - parts = [part.strip() for part in parts if part.strip()] - result = ''.join(parts) - self.cache['link'] = result - return(self.cache['link']) - - def getLicense(self): - '''GLModule.getLicense(self) -> string - - Get license and warn user if module lacks a license.''' - license = self.getLicense_Raw() - if not self.isTests(): - if not license: - if self.config['errors']: - raise(GLError(18, string(self))) - else: # if not self.config['errors'] - sys.stderr.write('gnulib-tool: warning: ') - sys.stderr.write('module %s lacks a license\n' % str(self)) - if not license: - license = 'GPL' - return(license) - - def getLicense_Raw(self): - '''GLModule.getLicense_Raw() -> string - - Return module license.''' - section = 'License:' - if 'license' not in self.cache: - if section not in self.content: - result = string() - else: # if section in self.content - pattern = '^%s[\t ]*(.*?)%s' % (section, self.regex) - pattern = compiler(pattern, re.S | re.M) - result = pattern.findall(self.content) - if type(result) is list: - if not result: - result = string() - else: # if result - result = result[-1] - result = result.strip() - self.cache['license'] = result - return(self.cache['license']) - - def getMaintainer(self): - '''GLModule.getMaintainer() -> string - - Return maintainer directive.''' - section = 'Maintainer:' - if 'maintainer' not in self.cache: - if section not in self.content: + if 'files' not in self.cache: + if section not in self.content: + result = list() + else: # if section in self.content + snippet = self.content.split(section)[-1] + snippet = snippet.replace('\r\n', '\n') + lines = ['%s\n' % line for line in snippet.split('\n')] + parts = list() + for line in lines: + regex = '^(Description|Comment|Status|Notice|Applicability|' + regex += 'Files|Depends-on|configure\\.ac-early|configure\\.ac|' + regex += 'Makefile\\.am|Include|Link|License|Maintainer):$' + pattern = compiler(regex) + findflag = pattern.findall(line) + if findflag: + break + parts += [line] + result = [part.strip() for part in parts if part.strip()] + result += [joinpath('m4', '00gnulib.m4')] + result += [joinpath('m4', 'gnulib-common.m4')] + if ac_version == 2.59: + result += [joinpath('m4', 'onceonly.m4')] + self.cache['files'] = list(result) + return(list(self.cache['files'])) + + def getDependencies(self): + '''GLModule.getDependencies() -> list + + Return list of dependencies. + GLConfig: localdir.''' + localdir = self.config['localdir'] + result = list() + section = 'Depends-on:' + if 'dependencies' not in self.cache: + if section not in self.content: + depmodules = list() + else: # if section in self.content + snippet = self.content.split(section)[-1] + snippet = snippet.replace('\r\n', '\n') + lines = ['%s\n' % line for line in snippet.split('\n')] + parts = list() + for line in lines: + regex = '^(Description|Comment|Status|Notice|Applicability|' + regex += 'Files|Depends-on|configure\\.ac-early|configure\\.ac|' + regex += 'Makefile\\.am|Include|Link|License|Maintainer):$' + pattern = compiler(regex) + findflag = pattern.findall(line) + if findflag: + break + parts += [line] + modules = ''.join(parts) + modules = [line for line in modules.split( + '\n') if line.strip()] + modules = [ + module for module in modules if not module.startswith('#')] + for line in modules: + split = [part for part in line.split(' ') if part.strip()] + if len(split) == 1: + module = line.strip() + condition = None + else: # if len(split) != 1 + module = split[0] + condition = split[1] + if type(condition) is bytes: + condition = condition.decode(ENCS['default']) + result += [tuple([self.modulesystem.find(module), condition])] + self.cache['dependencies'] = result + return(list(self.cache['dependencies'])) + + def getAutoconfSnippet_Early(self): + '''GLModule.getAutoconfSnippet_Early() -> string + + Return autoconf-early snippet.''' + section = 'configure.ac-early:' + if 'autoconf-early' not in self.cache: + if section not in self.content: + result = string() + else: # if section in self.content + snippet = self.content.split(section)[-1] + snippet = snippet.replace('\r\n', '\n') + lines = ['%s\n' % line for line in snippet.split('\n')] + parts = list() + for line in lines: + regex = '^(Description|Comment|Status|Notice|Applicability|' + regex += 'Files|Depends-on|configure\\.ac-early|configure\\.ac|' + regex += 'Makefile\\.am|Include|Link|License|Maintainer):$' + pattern = compiler(regex) + findflag = pattern.findall(line) + if findflag: + break + parts += [line] + result = ''.join(parts) + self.cache['autoconf-early'] = result + return(self.cache['autoconf-early']) + + def getAutoconfSnippet(self): + '''GLModule.getAutoconfSnippet() -> string + + Return autoconf snippet.''' + section = 'configure.ac:' + if 'autoconf' not in self.cache: + if section not in self.content: + result = string() + else: # if section in self.content + snippet = self.content.split(section)[-1] + snippet = snippet.replace('\r\n', '\n') + lines = ['%s\n' % line for line in snippet.split('\n')] + parts = list() + for line in lines: + regex = '^(Description|Comment|Status|Notice|Applicability|' + regex += 'Files|Depends-on|configure\\.ac-early|configure\\.ac|' + regex += 'Makefile\\.am|Include|Link|License|Maintainer):$' + pattern = compiler(regex) + findflag = pattern.findall(line) + if findflag: + break + parts += [line] + result = ''.join(parts) + self.cache['autoconf'] = result + return(self.cache['autoconf']) + + def getAutomakeSnippet(self): + '''getAutomakeSnippet() -> string + + Get automake snippet. + GLConfig: auxdir, ac_version.''' + result = string() # Define stack variable + conditional = self.getAutomakeSnippet_Conditional() + if conditional.strip(): + result += self.getAutomakeSnippet_Conditional() + else: # if not conditional.strip() + result += '\n' + result += self.getAutomakeSnippet_Unconditional() + return(result) + + def getAutomakeSnippet_Conditional(self): + '''GLModule.getAutomakeSnippet_Conditional() -> string + + Return conditional automake snippet.''' + section = 'Makefile.am:' + if 'makefile-conditional' not in self.cache: + if section not in self.content: + result = string() + else: # if section in self.content + snippet = self.content.split(section)[-1] + snippet = snippet.replace('\r\n', '\n') + lines = ['%s\n' % line for line in snippet.split('\n')] + parts = list() + for line in lines: + regex = '^(Description|Comment|Status|Notice|Applicability|' + regex += 'Files|Depends-on|configure\\.ac-early|configure\\.ac|' + regex += 'Makefile\\.am|Include|Link|License|Maintainer):$' + pattern = compiler(regex) + findflag = pattern.findall(line) + if findflag: + break + parts += [line] + result = ''.join(parts) + self.cache['makefile-conditional'] = result + return(self.cache['makefile-conditional']) + + def getAutomakeSnippet_Unconditional(self): + '''GLModule.getAutomakeSnippet_Unconditional() -> string + + Return unconditional automake snippet. + GLConfig: auxdir, ac_version.''' + auxdir = self.config['auxdir'] + ac_version = self.config['ac_version'] result = string() - else: # if section in self.content - snippet = self.content.split(section)[-1] - snippet = snippet.replace('\r\n', '\n') - lines = ['%s\n' % line for line in snippet.split('\n')] - parts = list() - for line in lines: - regex = '^(Description|Comment|Status|Notice|Applicability|' - regex += 'Files|Depends-on|configure\\.ac-early|configure\\.ac|' - regex += 'Makefile\\.am|Include|Link|License|Maintainer):$' - pattern = compiler(regex) - findflag = pattern.findall(line) - if findflag: - break - parts += [line] - result = ''.join(parts) - result = result.strip() - self.cache['maintainer'] = result - return(self.cache['maintainer']) + if 'makefile-unconditional' not in self.cache: + if self.isTests(): + files = self.getFiles() + extra_files = filter_filelist(constants.NL, files, + 'tests/', '', 'tests/', '').split(constants.NL) + extra_files = sorted(set(extra_files)) + if extra_files: + result += string('EXTRA_DIST += %s' % + ' '.join(extra_files)) + result += constants.NL * 2 + else: # if not tests module + # TODO: unconditional automake snippet for nontests modules + snippet = self.getAutomakeSnippet_Conditional() + snippet = snippet.replace('\\\n', ' ') + pattern = compiler( + '^lib_SOURCES[\t ]*\\+=[\t ]*(.*?)$', re.S | re.M) + mentioned_files = pattern.findall(snippet) + if mentioned_files != list(): + mentioned_files = mentioned_files[-1].split(' ') + mentioned_files = [f.strip() for f in mentioned_files] + mentioned_files = [f for f in mentioned_files if f != ''] + mentioned_files = sorted(set(mentioned_files)) + all_files = self.getFiles() + lib_files = filter_filelist(constants.NL, all_files, + 'lib/', '', 'lib/', '').split(constants.NL) + extra_files = [ + f for f in lib_files if f not in mentioned_files] + extra_files = sorted(set(extra_files)) + if extra_files != [''] and extra_files: + result += string('EXTRA_DIST += %s' % + ' '.join(extra_files)) + result += '\n\n' + # Synthesize also an EXTRA_lib_SOURCES augmentation + if str(self) != 'relocatable-prog-wrapper' and str(self) != 'pt_chown': + extra_files = filter_filelist(constants.NL, extra_files, + '', '.c', '', '').split(constants.NL) + extra_files = sorted(set(extra_files)) + if extra_files != ['']: + result += string('EXTRA_lib_SOURCES += %s' % + ' '.join(extra_files)) + result += '\n\n' + # Synthesize an EXTRA_DIST augmentation also for the files in build-aux + buildaux_files = filter_filelist(constants.NL, all_files, + 'build-aux/', '', 'build-aux/', '').split(constants.NL) + buildaux_files = sorted(set(buildaux_files)) + if buildaux_files != ['']: + buildaux_files = ''.join(buildaux_files) + buildaux_files = joinpath( + '$(top_srcdir)', auxdir, buildaux_files) + result += string('EXTRA_DIST += %s' % buildaux_files) + result += '\n\n' + # Synthesize an EXTRA_DIST augmentation also for the files from top/. + top_files = filter_filelist(constants.NL, all_files, + 'top/', '', 'top/', '').split(constants.NL) + top_files = sorted(set(top_files)) + if top_files != ['']: + top_files = ''.join(top_files) + top_files = joinpath('$(top_srcdir)', top_files) + result += string('EXTRA_DIST += %s' % top_files) + result += '\n\n' + result = constants.nlconvert(result) + self.cache['makefile-unconditional'] = result + return(self.cache['makefile-unconditional']) + + def getInclude(self): + '''GLModule.getInclude() -> string + + Return include directive.''' + section = 'Include:' + if 'include' not in self.cache: + if section not in self.content: + result = string() + else: # if section in self.content + snippet = self.content.split(section)[-1] + snippet = snippet.replace('\r\n', '\n') + lines = ['%s\n' % line for line in snippet.split('\n')] + parts = list() + for line in lines: + regex = '^(Description|Comment|Status|Notice|Applicability|' + regex += 'Files|Depends-on|configure\\.ac-early|configure\\.ac|' + regex += 'Makefile\\.am|Include|Link|License|Maintainer):$' + pattern = compiler(regex) + findflag = pattern.findall(line) + if findflag: + break + parts += [line] + result = ''.join(parts) + result = result.strip() + pattern = compiler('^(["<].*?[>"])', re.S | re.M) + result = pattern.sub('#include \\1', result) + self.cache['include'] = result + return(self.cache['include']) + + def getLink(self): + '''GLModule.getLink() -> string + + Return link directive.''' + section = 'Link:' + if 'link' not in self.cache: + if section not in self.content: + result = string() + else: # if section in self.content + snippet = self.content.split(section)[-1] + snippet = snippet.replace('\r\n', '\n') + lines = ['%s\n' % line for line in snippet.split('\n')] + parts = list() + for line in lines: + regex = '^(Description|Comment|Status|Notice|Applicability|' + regex += 'Files|Depends-on|configure\\.ac-early|configure\\.ac|' + regex += 'Makefile\\.am|Include|Link|License|Maintainer):$' + pattern = compiler(regex) + findflag = pattern.findall(line) + if findflag: + break + parts += [line] + parts = [part.strip() for part in parts if part.strip()] + result = ''.join(parts) + self.cache['link'] = result + return(self.cache['link']) + + def getLicense(self): + '''GLModule.getLicense(self) -> string + + Get license and warn user if module lacks a license.''' + license = self.getLicense_Raw() + if not self.isTests(): + if not license: + if self.config['errors']: + raise(GLError(18, string(self))) + else: # if not self.config['errors'] + sys.stderr.write('gnulib-tool: warning: ') + sys.stderr.write('module %s lacks a license\n' % str(self)) + if not license: + license = 'GPL' + return(license) + + def getLicense_Raw(self): + '''GLModule.getLicense_Raw() -> string + + Return module license.''' + section = 'License:' + if 'license' not in self.cache: + if section not in self.content: + result = string() + else: # if section in self.content + pattern = '^%s[\t ]*(.*?)%s' % (section, self.regex) + pattern = compiler(pattern, re.S | re.M) + result = pattern.findall(self.content) + if type(result) is list: + if not result: + result = string() + else: # if result + result = result[-1] + result = result.strip() + self.cache['license'] = result + return(self.cache['license']) + + def getMaintainer(self): + '''GLModule.getMaintainer() -> string + + Return maintainer directive.''' + section = 'Maintainer:' + if 'maintainer' not in self.cache: + if section not in self.content: + result = string() + else: # if section in self.content + snippet = self.content.split(section)[-1] + snippet = snippet.replace('\r\n', '\n') + lines = ['%s\n' % line for line in snippet.split('\n')] + parts = list() + for line in lines: + regex = '^(Description|Comment|Status|Notice|Applicability|' + regex += 'Files|Depends-on|configure\\.ac-early|configure\\.ac|' + regex += 'Makefile\\.am|Include|Link|License|Maintainer):$' + pattern = compiler(regex) + findflag = pattern.findall(line) + if findflag: + break + parts += [line] + result = ''.join(parts) + result = result.strip() + self.cache['maintainer'] = result + return(self.cache['maintainer']) #=============================================================================== # Define GLModuleTable class #=============================================================================== class GLModuleTable(object): - '''GLModuleTable is used to work with the list of the modules.''' - - def __init__(self, config, avoids=list()): - '''GLModuleTable.__init__(config, avoids) -> GLModuleTable - - Create new GLModuleTable instance. If modules are specified, then add - every module from iterable as unconditional module. If avoids is specified, - then in transitive_closure every dependency which is in avoids won't be - included in the final modules list. If testflags iterable is enabled, then - don't add module which status is in the testflags. If conddeps are enabled, - then store condition for each dependency if it has a condition. - The only necessary argument is localdir, which is needed just to create - modulesystem instance to look for dependencies.''' - self.avoids = list() # Avoids - self.dependers = dict() # Dependencies - self.conditionals = dict() # Conditional modules - self.unconditionals = dict() # Unconditional modules - self.base_modules = list() # Base modules - self.main_modules = list() # Main modules - self.tests_modules = list() # Tests modules - self.final_modules = list() # Final modules - if type(config) is not GLConfig: - raise(TypeError('config must be a GLConfig, not %s' % \ - type(config).__name__)) - for avoid in avoids: - if type(avoid) is not GLModule: - raise(TypeError('each avoid must be a GLModule instance')) - self.avoids += [avoids] - self.config = config - self.filesystem = GLFileSystem(self.config) - self.modulesystem = GLModuleSystem(self.config) - - def __repr__(self): - '''x.__repr__() <==> repr(x)''' - result = '<pygnulib.GLModuleTable %s>' % hex(id(self)) - return(result) - - def __getitem__(self, y): - '''x.__getitem__(y) <==> x[y]''' - if y in ['base', 'final', 'main', 'tests', 'avoids']: - if y == 'base': - return(self.getBaseModules()) - elif y == 'final': - return(self.getFinalModules()) - elif y == 'main': - return(self.getMainModules()) - elif y == 'tests': - return(self.getTestsModules()) - else: # if y == 'avoids' - return(self.getAvoids()) - else: # if y is not in list - raise(KeyError('GLModuleTable does not contain key: %s' % repr(y))) - - def addConditional(self, parent, module, condition): - '''GLModuleTable.addConditional(module, condition) - - Add new conditional dependency from parent to module with condition.''' - if type(parent) is not GLModule: - raise(TypeError('parent must be a GLModule, not %s' % \ - type(parent).__name__)) - if type(module) is not GLModule: - raise(TypeError('module must be a GLModule, not %s' % \ - type(module).__name__)) - if type(condition) is bytes or type(condition) is string \ - or condition == True: - if type(condition) is bytes: - condition = condition.decode(ENCS['default']) - else: # if condition has not bytes or string type or is not True - raise(TypeError('condition must be a string or True, not %s' % \ - type(condition).__name__)) - if not str(module) in self.unconditionals: - if str(module) not in self.dependers: - self.dependers[module] = list() - self.dependers[module] += [module] - key = '%s---%s' % (str(parent), str(module)) - self.conditionals[key] = condition - - def addUnconditional(self, module): - '''GLModuleTable.addUnconditional(module) - - Add module as unconditional dependency.''' - if type(module) is not GLModule: - raise(TypeError('module must be a GLModule, not %s' % \ - type(module).__name__)) - if str(module) in self.dependers: - self.dependers.pop(str(module)) - self.unconditionals[str(module)] = True - - def isConditional(self, module): - '''GLModuleTable.isConditional(module) -> bool - - Check whether module is unconditional.''' - if type(module) is not GLModule: - raise(TypeError('module must be a GLModule, not %s' % \ - type(module).__name__)) - result = str(module) in self.dependers - return(result) - - def getCondition(self, parent, module): - '''GLModuleTable.getCondition(module) -> string or True - - Return condition from parent to module. Condition can be string or True. - If module is not in the list of conddeps, method returns None.''' - if type(parent) is not GLModule: - raise(TypeError('parent must be a GLModule, not %s' % \ - type(parent).__name__)) - if type(module) is not GLModule: - raise(TypeError('module must be a GLModule, not %s' % \ - type(module).__name__)) - key = '%s---%s' % (str(parent), str(module)) - result = None - if key in self.conditionals: - result = self.conditionals[key] - return(result) - - def transitive_closure(self, modules): - '''GLModuleTable.transitive_closure(modules) -> list - - Use transitive closure to add module and its dependencies. Add every - module and its dependencies from modules list, but do not add dependencies - which contain in avoids list. If any testflag is enabled, then do not add - dependencies which have the status as this flag. If conddeps are enabled, - then store condition for each dependency if it has a condition. This method - is used to update final list of modules. Method returns list of modules. - GLConfig: testflags.''' - for module in modules: - if type(module) is not GLModule: - raise(TypeError('each module must be a GLModule instance')) - handledmodules = list() - inmodules = modules - outmodules = list() - if self.config['conddeps']: - for module in modules: - self.addUnconditional(module) - while inmodules: - inmodules_this_round = inmodules - inmodules = list() - for module in inmodules_this_round: - outmodules += [module] + '''GLModuleTable is used to work with the list of the modules.''' + + def __init__(self, config, avoids=list()): + '''GLModuleTable.__init__(config, avoids) -> GLModuleTable + + Create new GLModuleTable instance. If modules are specified, then add + every module from iterable as unconditional module. If avoids is specified, + then in transitive_closure every dependency which is in avoids won't be + included in the final modules list. If testflags iterable is enabled, then + don't add module which status is in the testflags. If conddeps are enabled, + then store condition for each dependency if it has a condition. + The only necessary argument is localdir, which is needed just to create + modulesystem instance to look for dependencies.''' + self.avoids = list() # Avoids + self.dependers = dict() # Dependencies + self.conditionals = dict() # Conditional modules + self.unconditionals = dict() # Unconditional modules + self.base_modules = list() # Base modules + self.main_modules = list() # Main modules + self.tests_modules = list() # Tests modules + self.final_modules = list() # Final modules + if type(config) is not GLConfig: + raise(TypeError('config must be a GLConfig, not %s' % + type(config).__name__)) + for avoid in avoids: + if type(avoid) is not GLModule: + raise(TypeError('each avoid must be a GLModule instance')) + self.avoids += [avoids] + self.config = config + self.filesystem = GLFileSystem(self.config) + self.modulesystem = GLModuleSystem(self.config) + + def __repr__(self): + '''x.__repr__() <==> repr(x)''' + result = '<pygnulib.GLModuleTable %s>' % hex(id(self)) + return(result) + + def __getitem__(self, y): + '''x.__getitem__(y) <==> x[y]''' + if y in ['base', 'final', 'main', 'tests', 'avoids']: + if y == 'base': + return(self.getBaseModules()) + elif y == 'final': + return(self.getFinalModules()) + elif y == 'main': + return(self.getMainModules()) + elif y == 'tests': + return(self.getTestsModules()) + else: # if y == 'avoids' + return(self.getAvoids()) + else: # if y is not in list + raise(KeyError('GLModuleTable does not contain key: %s' % repr(y))) + + def addConditional(self, parent, module, condition): + '''GLModuleTable.addConditional(module, condition) + + Add new conditional dependency from parent to module with condition.''' + if type(parent) is not GLModule: + raise(TypeError('parent must be a GLModule, not %s' % + type(parent).__name__)) + if type(module) is not GLModule: + raise(TypeError('module must be a GLModule, not %s' % + type(module).__name__)) + if type(condition) is bytes or type(condition) is string \ + or condition == True: + if type(condition) is bytes: + condition = condition.decode(ENCS['default']) + else: # if condition has not bytes or string type or is not True + raise(TypeError('condition must be a string or True, not %s' % + type(condition).__name__)) + if not str(module) in self.unconditionals: + if str(module) not in self.dependers: + self.dependers[module] = list() + self.dependers[module] += [module] + key = '%s---%s' % (str(parent), str(module)) + self.conditionals[key] = condition + + def addUnconditional(self, module): + '''GLModuleTable.addUnconditional(module) + + Add module as unconditional dependency.''' + if type(module) is not GLModule: + raise(TypeError('module must be a GLModule, not %s' % + type(module).__name__)) + if str(module) in self.dependers: + self.dependers.pop(str(module)) + self.unconditionals[str(module)] = True + + def isConditional(self, module): + '''GLModuleTable.isConditional(module) -> bool + + Check whether module is unconditional.''' + if type(module) is not GLModule: + raise(TypeError('module must be a GLModule, not %s' % + type(module).__name__)) + result = str(module) in self.dependers + return(result) + + def getCondition(self, parent, module): + '''GLModuleTable.getCondition(module) -> string or True + + Return condition from parent to module. Condition can be string or True. + If module is not in the list of conddeps, method returns None.''' + if type(parent) is not GLModule: + raise(TypeError('parent must be a GLModule, not %s' % + type(parent).__name__)) + if type(module) is not GLModule: + raise(TypeError('module must be a GLModule, not %s' % + type(module).__name__)) + key = '%s---%s' % (str(parent), str(module)) + result = None + if key in self.conditionals: + result = self.conditionals[key] + return(result) + + def transitive_closure(self, modules): + '''GLModuleTable.transitive_closure(modules) -> list + + Use transitive closure to add module and its dependencies. Add every + module and its dependencies from modules list, but do not add dependencies + which contain in avoids list. If any testflag is enabled, then do not add + dependencies which have the status as this flag. If conddeps are enabled, + then store condition for each dependency if it has a condition. This method + is used to update final list of modules. Method returns list of modules. + GLConfig: testflags.''' + for module in modules: + if type(module) is not GLModule: + raise(TypeError('each module must be a GLModule instance')) + handledmodules = list() + inmodules = modules + outmodules = list() if self.config['conddeps']: - automake_snippet = \ - module.getAutomakeSnippet_Conditional() - pattern = compiler('^if') - if not pattern.findall(automake_snippet): - self.addUnconditional(module) - conditional = self.isConditional(module) - dependencies = module.getDependencies() - depmodules = [pair[0] for pair in dependencies] - conditions = [pair[1] for pair in dependencies] + for module in modules: + self.addUnconditional(module) + while inmodules: + inmodules_this_round = inmodules + inmodules = list() + for module in inmodules_this_round: + outmodules += [module] + if self.config['conddeps']: + automake_snippet = \ + module.getAutomakeSnippet_Conditional() + pattern = compiler('^if') + if not pattern.findall(automake_snippet): + self.addUnconditional(module) + conditional = self.isConditional(module) + dependencies = module.getDependencies() + depmodules = [pair[0] for pair in dependencies] + conditions = [pair[1] for pair in dependencies] + if TESTS['tests'] in self.config['testflags']: + testsname = module.getTestsName() + if self.modulesystem.exists(testsname): + testsmodule = self.modulesystem.find(testsname) + depmodules += [testsmodule] + conditions += [None] + for depmodule in depmodules: + include = True + includes = list() + status = depmodule.getStatus() + for word in status: + if word == 'obsolete': + if TESTS['obsolete'] in self.config['testflags'] or \ + TESTS['all-test'] in self.config['testflags']: + includes += [False] + elif word == 'c++-test': + if TESTS['c++-test'] in self.config['testflags'] or \ + TESTS['all-test'] in self.config['testflags']: + includes += [False] + elif word == 'longrunning-test': + if TESTS['longrunning-test'] in self.config['testflags'] or \ + TESTS['all-test'] in self.config['testflags']: + includes += [False] + elif word == 'privileged-test': + if TESTS['privileged-test'] in self.config['testflags'] or \ + TESTS['all-test'] in self.config['testflags']: + includes += [False] + elif word == 'all-test': + if TESTS['all-test'] in self.config['testflags'] or \ + TESTS['all-test'] in self.config['testflags']: + includes += [False] + else: # if any other word + if word.endswith('-tests'): + if TESTS['all-test'] in self.config['testflags']: + includes += [False] + include = any(includes) + if include and depmodule not in self.avoids: + inmodules += [depmodule] + if self.config['conddeps']: + index = depmodules.index(depmodule) + condition = conditions[index] + if condition: + self.addConditional( + module, depmodule, condition) + else: # if condition + if conditional: + self.addConditional( + module, depmodule, True) + else: # if not conditional + self.addUnconditional(module) + listing = list() # Create empty list + inmodules = sorted(set(inmodules)) + handledmodules = sorted(set(handledmodules + inmodules_this_round)) + inmodules = \ + [ # Begin to filter inmodules + module for module in inmodules if module not in handledmodules + ] # Finish to filter inmodules + inmodules = sorted(set(inmodules)) + modules = sorted(set(outmodules)) + self.modules = modules + return(list(modules)) + + def transitive_closure_separately(self, basemodules, finalmodules): + '''GLModuleTable.transitive_closure_separately(*args, **kwargs) -> tuple + + Determine main module list and tests-related module list separately. + The main module list is the transitive closure of the specified modules, + ignoring tests modules. Its lib/* sources go into $sourcebase/. If lgpl is + specified, it will consist only of LGPLed source. + The tests-related module list is the transitive closure of the specified + modules, including tests modules, minus the main module list excluding + modules of applicability 'all'. Its lib/* sources (brought in through + dependencies of *-tests modules) go into $testsbase/. It may contain GPLed + source, even if lgpl is specified. + Arguments are basemodules and finalmodules, where basemodules argument + represents modules specified by user and finalmodules represents modules + list after previous transitive_closure. + Method returns tuple which contains two lists: the list of main modules and + the list of tests-related modules. Both lists contain dependencies. + GLConfig: testflags.''' + inctests = False + main_modules = list() + tests_modules = list() if TESTS['tests'] in self.config['testflags']: - testsname = module.getTestsName() - if self.modulesystem.exists(testsname): - testsmodule = self.modulesystem.find(testsname) - depmodules += [testsmodule] - conditions += [None] - for depmodule in depmodules: - include = True - includes = list() - status = depmodule.getStatus() - for word in status: - if word == 'obsolete': - if TESTS['obsolete'] in self.config['testflags'] or \ - TESTS['all-test'] in self.config['testflags']: - includes += [False] - elif word == 'c++-test': - if TESTS['c++-test'] in self.config['testflags'] or \ - TESTS['all-test'] in self.config['testflags']: - includes += [False] - elif word == 'longrunning-test': - if TESTS['longrunning-test'] in self.config['testflags'] or \ - TESTS['all-test'] in self.config['testflags']: - includes += [False] - elif word == 'privileged-test': - if TESTS['privileged-test'] in self.config['testflags'] or \ - TESTS['all-test'] in self.config['testflags']: - includes += [False] - elif word == 'all-test': - if TESTS['all-test'] in self.config['testflags'] or \ - TESTS['all-test'] in self.config['testflags']: - includes += [False] - else: # if any other word - if word.endswith('-tests'): - if TESTS['all-test'] in self.config['testflags']: - includes += [False] - include = any(includes) - if include and depmodule not in self.avoids: - inmodules += [depmodule] - if self.config['conddeps']: - index = depmodules.index(depmodule) - condition = conditions[index] - if condition: - self.addConditional(module, depmodule, condition) - else: # if condition - if conditional: - self.addConditional(module, depmodule, True) - else: # if not conditional - self.addUnconditional(module) - listing = list() # Create empty list - inmodules = sorted(set(inmodules)) - handledmodules = sorted(set(handledmodules +inmodules_this_round)) - inmodules = \ - [ # Begin to filter inmodules - module for module in inmodules if module not in handledmodules - ] # Finish to filter inmodules - inmodules = sorted(set(inmodules)) - modules = sorted(set(outmodules)) - self.modules = modules - return(list(modules)) - - def transitive_closure_separately(self, basemodules, finalmodules): - '''GLModuleTable.transitive_closure_separately(*args, **kwargs) -> tuple - - Determine main module list and tests-related module list separately. - The main module list is the transitive closure of the specified modules, - ignoring tests modules. Its lib/* sources go into $sourcebase/. If lgpl is - specified, it will consist only of LGPLed source. - The tests-related module list is the transitive closure of the specified - modules, including tests modules, minus the main module list excluding - modules of applicability 'all'. Its lib/* sources (brought in through - dependencies of *-tests modules) go into $testsbase/. It may contain GPLed - source, even if lgpl is specified. - Arguments are basemodules and finalmodules, where basemodules argument - represents modules specified by user and finalmodules represents modules - list after previous transitive_closure. - Method returns tuple which contains two lists: the list of main modules and - the list of tests-related modules. Both lists contain dependencies. - GLConfig: testflags.''' - inctests = False - main_modules = list() - tests_modules = list() - if TESTS['tests'] in self.config['testflags']: - self.config['testflags'].pop(TESTS['tests']) - inctests = True - for module in basemodules: - if type(module) is not GLModule: - raise(TypeError('each module must be a GLModule instance')) - for module in finalmodules: - if type(module) is not GLModule: - raise(TypeError('each module must be a GLModule instance')) - main_modules = self.transitive_closure(basemodules) - tests_modules = \ - [m for m in finalmodules if m not in main_modules] + \ - [m for m in main_modules if m.getApplicability() != 'main'] - tests_modules = sorted(set(tests_modules)) - if inctests: - testflags = sorted(set(self.config['testflags'] +[TESTS['tests']])) - self.config.setTestFlags(testflags) - result = tuple([main_modules, tests_modules]) - return(result) - - def add_dummy(self, modules): - '''GLModuleTable.add_dummy(modules) -> list - - Add dummy package to list of modules if dummy package is needed. If not, - return original list of modules. - GLConfig: auxdir, ac_version.''' - auxdir = self.config['auxdir'] - ac_version = self.config['ac_version'] - have_lib_sources = False - for module in modules: - if type(module) is not GLModule: - raise(TypeError('each module must be a GLModule instance')) - snippet = module.getAutomakeSnippet() - snippet = snippet.replace('\\\n', '') - pattern = compiler('^lib_SOURCES[\t ]*\\+=[\t ]*(.*?)$', re.S | re.M) - files = pattern.findall(snippet) - if files: # if source files were found - files = files[-1].split(' ') - for file in files: - if not file.endswith('.h'): - have_lib_sources = True - break - if not have_lib_sources: - dummy = self.modulesystem.find('dummy') - modules = sorted(set(modules +[dummy])) - return(list(modules)) - - def filelist(self, modules): - '''GLModuleTable.filelist(modules) -> list - - Determine the final file list for the given list of modules. The list of - modules must already include dependencies. - GLConfig: ac_version.''' - ac_version = self.config['ac_version'] - filelist = list() - for module in modules: - if type(module) is not GLModule: - raise(TypeError('each module must be a GLModule instance')) - listings = [module.getFiles() for module in modules] - for listing in listings: - for file in listing: - if file not in filelist: - filelist += [file] - return(filelist) - - def filelist_separately(self, main_modules, tests_modules): - '''GLModuleTable.filelist_separately(**kwargs) -> list - - Determine the final file lists. They must be computed separately, because - files in lib/* go into $sourcebase/ if they are in the main file list but - into $testsbase/ if they are in the tests-related file list. Furthermore - lib/dummy.c can be in both.''' - ac_version = self.config['ac_version'] - main_filelist = self.filelist(main_modules) - tests_filelist = self.filelist(tests_modules) - tests_filelist = \ - [ # Begin to sort filelist - file.replace('lib/', 'tests=lib/', 1) \ - if file.startswith('lib/') else file - for file in tests_filelist - ] # Finish to sort filelist - result = tuple([main_filelist, tests_filelist]) - return(result) - - def getAvoids(self): - '''GLModuleTable.getAvoids() -> list - - Return list of avoids.''' - return(list(self.avoids)) - - def setAvoids(self, modules): - '''GLModuleTable.setAvoids(modules) - - Specify list of avoids.''' - for module in modules: - if type(module) is not GLModule: - raise(TypeError('each module must be a GLModule instance')) - self.avoids = sorted(set(modules)) - - def getBaseModules(self): - '''GLModuleTable.getBaseModules() -> list - - Return list of base modules.''' - return(list(self.base_modules)) - - def setBaseModules(self, modules): - '''GLModuleTable.setBaseModules(modules) - - Specify list of base modules.''' - for module in modules: - if type(module) is not GLModule: - raise(TypeError('each module must be a GLModule instance')) - self.base_modules = sorted(set(modules)) - - def getFinalModules(self): - '''GLModuleTable.getFinalModules() -> list - - Return list of final modules.''' - return(list(self.final_modules)) - - def setFinalModules(self, modules): - '''GLModuleTable.setFinalModules(modules) - - Specify list of final modules.''' - for module in modules: - if type(module) is not GLModule: - raise(TypeError('each module must be a GLModule instance')) - self.final_modules = sorted(set(modules)) - - def getMainModules(self): - '''GLModuleTable.getMainModules() -> list - - Return list of main modules.''' - return(list(self.main_modules)) - - def setMainModules(self, modules): - '''GLModuleTable.setMainModules(modules) - - Specify list of main modules.''' - for module in modules: - if type(module) is not GLModule: - raise(TypeError('each module must be a GLModule instance')) - self.main_modules = sorted(set(modules)) - - def getTestsModules(self): - '''GLModuleTable.getTestsModules() -> list - - Return list of tests modules.''' - return(list(self.tests_modules)) - - def setTestsModules(self, modules): - '''GLModuleTable.setTestsModules(modules) - - Specify list of tests modules.''' - for module in modules: - if type(module) is not GLModule: - raise(TypeError('each module must be a GLModule instance')) - self.tests_modules = sorted(set(modules)) + self.config['testflags'].pop(TESTS['tests']) + inctests = True + for module in basemodules: + if type(module) is not GLModule: + raise(TypeError('each module must be a GLModule instance')) + for module in finalmodules: + if type(module) is not GLModule: + raise(TypeError('each module must be a GLModule instance')) + main_modules = self.transitive_closure(basemodules) + tests_modules = \ + [m for m in finalmodules if m not in main_modules] + \ + [m for m in main_modules if m.getApplicability() != 'main'] + tests_modules = sorted(set(tests_modules)) + if inctests: + testflags = sorted( + set(self.config['testflags'] + [TESTS['tests']])) + self.config.setTestFlags(testflags) + result = tuple([main_modules, tests_modules]) + return(result) + + def add_dummy(self, modules): + '''GLModuleTable.add_dummy(modules) -> list + + Add dummy package to list of modules if dummy package is needed. If not, + return original list of modules. + GLConfig: auxdir, ac_version.''' + auxdir = self.config['auxdir'] + ac_version = self.config['ac_version'] + have_lib_sources = False + for module in modules: + if type(module) is not GLModule: + raise(TypeError('each module must be a GLModule instance')) + snippet = module.getAutomakeSnippet() + snippet = snippet.replace('\\\n', '') + pattern = compiler( + '^lib_SOURCES[\t ]*\\+=[\t ]*(.*?)$', re.S | re.M) + files = pattern.findall(snippet) + if files: # if source files were found + files = files[-1].split(' ') + for file in files: + if not file.endswith('.h'): + have_lib_sources = True + break + if not have_lib_sources: + dummy = self.modulesystem.find('dummy') + modules = sorted(set(modules + [dummy])) + return(list(modules)) + + def filelist(self, modules): + '''GLModuleTable.filelist(modules) -> list + + Determine the final file list for the given list of modules. The list of + modules must already include dependencies. + GLConfig: ac_version.''' + ac_version = self.config['ac_version'] + filelist = list() + for module in modules: + if type(module) is not GLModule: + raise(TypeError('each module must be a GLModule instance')) + listings = [module.getFiles() for module in modules] + for listing in listings: + for file in listing: + if file not in filelist: + filelist += [file] + return(filelist) + + def filelist_separately(self, main_modules, tests_modules): + '''GLModuleTable.filelist_separately(**kwargs) -> list + + Determine the final file lists. They must be computed separately, because + files in lib/* go into $sourcebase/ if they are in the main file list but + into $testsbase/ if they are in the tests-related file list. Furthermore + lib/dummy.c can be in both.''' + ac_version = self.config['ac_version'] + main_filelist = self.filelist(main_modules) + tests_filelist = self.filelist(tests_modules) + tests_filelist = \ + [ # Begin to sort filelist + file.replace('lib/', 'tests=lib/', 1) \ + if file.startswith('lib/') else file + for file in tests_filelist + ] # Finish to sort filelist + result = tuple([main_filelist, tests_filelist]) + return(result) + + def getAvoids(self): + '''GLModuleTable.getAvoids() -> list + + Return list of avoids.''' + return(list(self.avoids)) + + def setAvoids(self, modules): + '''GLModuleTable.setAvoids(modules) + + Specify list of avoids.''' + for module in modules: + if type(module) is not GLModule: + raise(TypeError('each module must be a GLModule instance')) + self.avoids = sorted(set(modules)) + + def getBaseModules(self): + '''GLModuleTable.getBaseModules() -> list + + Return list of base modules.''' + return(list(self.base_modules)) + + def setBaseModules(self, modules): + '''GLModuleTable.setBaseModules(modules) + + Specify list of base modules.''' + for module in modules: + if type(module) is not GLModule: + raise(TypeError('each module must be a GLModule instance')) + self.base_modules = sorted(set(modules)) + + def getFinalModules(self): + '''GLModuleTable.getFinalModules() -> list + + Return list of final modules.''' + return(list(self.final_modules)) + + def setFinalModules(self, modules): + '''GLModuleTable.setFinalModules(modules) + + Specify list of final modules.''' + for module in modules: + if type(module) is not GLModule: + raise(TypeError('each module must be a GLModule instance')) + self.final_modules = sorted(set(modules)) + + def getMainModules(self): + '''GLModuleTable.getMainModules() -> list + + Return list of main modules.''' + return(list(self.main_modules)) + + def setMainModules(self, modules): + '''GLModuleTable.setMainModules(modules) + + Specify list of main modules.''' + for module in modules: + if type(module) is not GLModule: + raise(TypeError('each module must be a GLModule instance')) + self.main_modules = sorted(set(modules)) + + def getTestsModules(self): + '''GLModuleTable.getTestsModules() -> list + + Return list of tests modules.''' + return(list(self.tests_modules)) + + def setTestsModules(self, modules): + '''GLModuleTable.setTestsModules(modules) + Specify list of tests modules.''' + for module in modules: + if type(module) is not GLModule: + raise(TypeError('each module must be a GLModule instance')) + self.tests_modules = sorted(set(modules)) |