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/GLEmiter.py | |
parent | 4be624beba67fb2e6afd981be32b45fe73ecafb2 (diff) | |
download | gnulib-21c52a82444a2f5f3307c7e2c1212beac42b9938.tar.gz |
[pygnulib] autopep8 (fixing indentation, style, etc.)
Diffstat (limited to 'pygnulib/GLEmiter.py')
-rw-r--r-- | pygnulib/GLEmiter.py | 1947 |
1 files changed, 988 insertions, 959 deletions
diff --git a/pygnulib/GLEmiter.py b/pygnulib/GLEmiter.py index 3895f4d514..6df6eca7b6 100644 --- a/pygnulib/GLEmiter.py +++ b/pygnulib/GLEmiter.py @@ -56,30 +56,30 @@ relpath = os.path.relpath # Define GLEmiter class #=============================================================================== class GLEmiter(object): - '''This class is used to emit the contents of necessary files.''' - - def __init__(self, config): - '''GLEmiter.__init__(config) -> GLEmiter - - Create GLEmiter instance.''' - self.info = GLInfo() - if type(config) is not GLConfig: - raise(TypeError('config must be a GLConfig, not %s' % \ - type(config).__name__)) - self.config = config - - def __repr__(self): - '''x.__repr__() <==> repr(x)''' - result = '<pygnulib.GLEmiter %s>' % hex(id(self)) - return(result) - - def copyright_notice(self): - '''GLEmiter.copyright_notice() -> string - - Emit a header for a generated file.''' - emit = string() - emit += "# %s" % self.info.copyright() - emit += """ + '''This class is used to emit the contents of necessary files.''' + + def __init__(self, config): + '''GLEmiter.__init__(config) -> GLEmiter + + Create GLEmiter instance.''' + self.info = GLInfo() + if type(config) is not GLConfig: + raise(TypeError('config must be a GLConfig, not %s' % + type(config).__name__)) + self.config = config + + def __repr__(self): + '''x.__repr__() <==> repr(x)''' + result = '<pygnulib.GLEmiter %s>' % hex(id(self)) + return(result) + + def copyright_notice(self): + '''GLEmiter.copyright_notice() -> string + + Emit a header for a generated file.''' + emit = string() + emit += "# %s" % self.info.copyright() + emit += """ # # This file is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -100,284 +100,288 @@ class GLEmiter(object): # the same distribution terms as the rest of that program. # # Generated by gnulib-tool.\n""" - if type(emit) is bytes: - emit = emit.decode(ENCS['default']) - return(constants.nlconvert(emit)) - - def autoconfSnippet(self, module, fileassistant, toplevel, - disable_libtool, disable_gettext, replace_auxdir, indentation): - '''GLEmiter.autoconfSnippet(module, toplevel, - disable_libtool, disable_gettext, replace_auxdir, - indentation) -> string - - Emit the autoconf snippet of a module. - GLConfig: include_guard_prefix. - - module is a GLModule instance, which is processed. - fileassistant is a GLFileAssistant instance, which is used to get temporary - directories and sed transformer. - toplevel is a bool variable, False means a subordinate use of pygnulib. - disable_libtool is a bool variable; it tells whether to disable libtool - handling even if it has been specified through the GLConfig class. - disable_gettext is a bool variable; it tells whether to disable - AM_GNU_GETTEXT invocations. - replace_auxdir is a bool variable; it tells whether to replace - 'build-aux' directory in AC_CONFIG_FILES. - indentation is a string which contain spaces to prepend on each line.''' - emit = string() - if type(module) is not GLModule: - raise(TypeError('module must be a GLModule, not %s' % \ - type(module).__name__)) - if type(fileassistant) is not GLFileAssistant: - raise(TypeError('fileassistant must be a GLFileAssistant, not %s' % \ - type(fileassistant).__name__)) - if type(toplevel) is not bool: - raise(TypeError('toplevel must be a bool, not %s' % \ - type(toplevel).__name__)) - if type(disable_libtool) is not bool: - raise(TypeError('disable_libtool must be a bool, not %s' % \ - type(disable_libtool).__name__)) - if type(disable_gettext) is not bool: - raise(TypeError('disable_gettext must be a bool, not %s' % \ - type(disable_gettext).__name__)) - if type(indentation) is bytes or type(indentation) is string: - if type(indentation) is bytes: - indentation = indentation.decode(ENCS['default']) - else: # if indentation has not bytes or string type - raise(TypeError('indentation must be a string, not %s' % \ - type(indentation).__name__)) - if not indentation.isspace(): - raise(ValueError('indentation must contain only whitespaces')) - auxdir = self.config['auxdir'] - libtool = self.config['libtool'] - include_guard_prefix = self.config['include_guard_prefix'] - if str(module) in ['gnumakefile', 'maintainer-makefile']: - # These modules are meant to be used only in the top-level directory. - flag = toplevel - else: # if not str(module) in ['gnumakefile', 'maintainer-makefile'] - flag = True - if flag: - snippet = module.getAutoconfSnippet() - snippet = snippet.replace('${gl_include_guard_prefix}', - include_guard_prefix) - lines = [line for line in snippet.split('\n') if line.strip()] - snippet = '%s\n' % '\n'.join(lines) - transformer = fileassistant.transformers.get('aux', '') - pattern = compiler('(^.*?$)', re.S | re.M) - snippet = pattern.sub('%s\\1' % indentation, snippet) - if transformer: - args = ['sed', '-e', transformer] - path = fileassistant.tmpfilename('snippet') - with codecs.open(path, 'wb', 'UTF-8') as file: - file.write(snippet) - stdin = codecs.open(path, 'rb', 'UTF-8') - snippet = sp.check_output(args, stdin=stdin, shell=False) - snippet = snippet.decode("UTF-8") - os.remove(path) - if disable_libtool: - snippet = snippet.replace('$gl_cond_libtool', 'false') - snippet = snippet.replace('gl_libdeps', 'gltests_libdeps') - snippet = snippet.replace('gl_ltlibdeps', 'gltests_ltlibdeps') - if disable_gettext: - snippet = snippet.replace('AM_GNU_GETTEXT([external])', 'dnl you must \ + if type(emit) is bytes: + emit = emit.decode(ENCS['default']) + return(constants.nlconvert(emit)) + + def autoconfSnippet(self, module, fileassistant, toplevel, + disable_libtool, disable_gettext, replace_auxdir, indentation): + '''GLEmiter.autoconfSnippet(module, toplevel, + disable_libtool, disable_gettext, replace_auxdir, + indentation) -> string + + Emit the autoconf snippet of a module. + GLConfig: include_guard_prefix. + + module is a GLModule instance, which is processed. + fileassistant is a GLFileAssistant instance, which is used to get temporary + directories and sed transformer. + toplevel is a bool variable, False means a subordinate use of pygnulib. + disable_libtool is a bool variable; it tells whether to disable libtool + handling even if it has been specified through the GLConfig class. + disable_gettext is a bool variable; it tells whether to disable + AM_GNU_GETTEXT invocations. + replace_auxdir is a bool variable; it tells whether to replace + 'build-aux' directory in AC_CONFIG_FILES. + indentation is a string which contain spaces to prepend on each line.''' + emit = string() + if type(module) is not GLModule: + raise(TypeError('module must be a GLModule, not %s' % + type(module).__name__)) + if type(fileassistant) is not GLFileAssistant: + raise(TypeError('fileassistant must be a GLFileAssistant, not %s' % + type(fileassistant).__name__)) + if type(toplevel) is not bool: + raise(TypeError('toplevel must be a bool, not %s' % + type(toplevel).__name__)) + if type(disable_libtool) is not bool: + raise(TypeError('disable_libtool must be a bool, not %s' % + type(disable_libtool).__name__)) + if type(disable_gettext) is not bool: + raise(TypeError('disable_gettext must be a bool, not %s' % + type(disable_gettext).__name__)) + if type(indentation) is bytes or type(indentation) is string: + if type(indentation) is bytes: + indentation = indentation.decode(ENCS['default']) + else: # if indentation has not bytes or string type + raise(TypeError('indentation must be a string, not %s' % + type(indentation).__name__)) + if not indentation.isspace(): + raise(ValueError('indentation must contain only whitespaces')) + auxdir = self.config['auxdir'] + libtool = self.config['libtool'] + include_guard_prefix = self.config['include_guard_prefix'] + if str(module) in ['gnumakefile', 'maintainer-makefile']: + # These modules are meant to be used only in the top-level directory. + flag = toplevel + else: # if not str(module) in ['gnumakefile', 'maintainer-makefile'] + flag = True + if flag: + snippet = module.getAutoconfSnippet() + snippet = snippet.replace('${gl_include_guard_prefix}', + include_guard_prefix) + lines = [line for line in snippet.split('\n') if line.strip()] + snippet = '%s\n' % '\n'.join(lines) + transformer = fileassistant.transformers.get('aux', '') + pattern = compiler('(^.*?$)', re.S | re.M) + snippet = pattern.sub('%s\\1' % indentation, snippet) + if transformer: + args = ['sed', '-e', transformer] + path = fileassistant.tmpfilename('snippet') + with codecs.open(path, 'wb', 'UTF-8') as file: + file.write(snippet) + stdin = codecs.open(path, 'rb', 'UTF-8') + snippet = sp.check_output(args, stdin=stdin, shell=False) + snippet = snippet.decode("UTF-8") + os.remove(path) + if disable_libtool: + snippet = snippet.replace('$gl_cond_libtool', 'false') + snippet = snippet.replace('gl_libdeps', 'gltests_libdeps') + snippet = snippet.replace('gl_ltlibdeps', 'gltests_ltlibdeps') + if disable_gettext: + snippet = snippet.replace('AM_GNU_GETTEXT([external])', 'dnl you must \ add AM_GNU_GETTEXT([external]) or similar to configure.ac.') - emit += snippet - if str(module) == 'alloca' and libtool and not disable_libtool: - emit += 'changequote(,)dnl\n' - emit += "LTALLOCA=`echo \"$ALLOCA\" | sed -e 's/\\.[^.]* /.lo \ + emit += snippet + if str(module) == 'alloca' and libtool and not disable_libtool: + emit += 'changequote(,)dnl\n' + emit += "LTALLOCA=`echo \"$ALLOCA\" | sed -e 's/\\.[^.]* /.lo \ /g;s/\\.[^.]*$/.lo/'`\n" - emit += 'changequote([, ])dnl\n' - emit += 'AC_SUBST([LTALLOCA])' - if replace_auxdir: - regex = 'AC_CONFIG_FILES\\(\\[(.*?)\\:build-aux/(.*?)\\]\\)' - repl = 'AC_CONFIG_FILES([\\1:%s/\\2])' % auxdir - pattern = compiler(regex, re.S | re.M) - emit = pattern.sub(repl, emit) - lines = [line for line in emit.split('\n') if line.strip()] - emit = '%s\n' % '\n'.join(lines) - emit = constants.nlconvert(emit) - if type(emit) is bytes: - emit = emit.decode(ENCS['default']) - return(emit) - - def autoconfSnippets(self, modules, moduletable, fileassistant, - verifier, toplevel, disable_libtool, disable_gettext, replace_auxdir): - '''GLEmiter.autoconfSnippets(modules, fileassistant, - verifier, toplevel, disable_libtool, disable_gettext, - replace_auxdir) -> string - - Collect and emit the autoconf snippets of a set of modules. - GLConfig: conddeps. - - basemodules argument represents list of modules; every module in this list - must be a GLModule instance; this list of modules is used to sort all - modules after they were processed. - modules argument represents list of modules; every module in this list must - be a GLModule instance. - moduletable is a GLModuleTable instance, which contains necessary - information about dependencies of the modules. - fileassistant is a GLFileAssistant instance, which is used to get temporary - directories and sed transformers. - verifier is an integer, which can be 0, 1 or 2. - if verifier == 0, then process every module; - if verifier == 1, then process only non-tests modules; - if verifier == 2, then process only tests modules. - toplevel is a bool variable, False means a subordinate use of pygnulib. - disable_libtool is a bool variable; it tells whether to disable libtool - handling even if it has been specified through the GLConfig class. - disable_gettext is a bool variable; it tells whether to disable - AM_GNU_GETTEXT invocations. - replace_auxdir is a bool variable; it tells whether to replace - 'build-aux' directory in AC_CONFIG_FILES.''' - emit = string() - for module in modules: - if type(module) is not GLModule: - raise(TypeError('each module must be a GLModule instance')) - if type(moduletable) is not GLModuleTable: - raise(TypeError('moduletable must be a GLFileAssistant, not %s' % \ - type(moduletable).__name__)) - if type(fileassistant) is not GLFileAssistant: - raise(TypeError('fileassistant must be a GLFileAssistant, not %s' % \ - type(fileassistant).__name__)) - if type(verifier) is not int: - raise(TypeError('verifier must be an int, not %s' % \ - type(verifier).__name__)) - if not (0 <= verifier <= 2): - raise(ValueError('verifier must be 0, 1 or 2, not %d' % verifier)) - if type(toplevel) is not bool: - raise(TypeError('toplevel must be a bool, not %s' % \ - type(toplevel).__name__)) - if type(disable_libtool) is not bool: - raise(TypeError('disable_libtool must be a bool, not %s' % \ - type(disable_libtool).__name__)) - if type(disable_gettext) is not bool: - raise(TypeError('disable_gettext must be a bool, not %s' % \ - type(disable_gettext).__name__)) - if type(replace_auxdir) is not bool: - raise(TypeError('replace_auxdir must be a bool, not %s' % \ - type(replace_auxdir).__name__)) - auxdir = self.config['auxdir'] - conddeps = self.config['conddeps'] - macro_prefix = self.config['macro_prefix'] - if not conddeps: - # Ignore the conditions, and enable all modules unconditionally. - for module in modules: - if verifier == 0: - solution = True - elif verifier == 1: - solution = module.isNonTests() - elif verifier == 2: - solution = module.isTests() - if solution: - emit += self.autoconfSnippet(module, fileassistant, toplevel, - disable_libtool, disable_gettext, replace_auxdir, ' ') - else: # if conddeps - # Emit the autoconf code for the unconditional modules. - for module in modules: - if verifier == 0: - solution = True - elif verifier == 1: - solution = module.isNonTests() - elif verifier == 2: - solution = module.isTests() - if solution: - if not moduletable.isConditional(module): - emit += self.autoconfSnippet(module, fileassistant, toplevel, - disable_libtool, disable_gettext, replace_auxdir, ' ') - # Initialize the shell variables indicating that the modules are enabled. - for module in modules: - if verifier == 0: - solution = True - elif verifier == 1: - solution = module.isNonTests() - elif verifier == 2: - solution = module.isTests() - if solution: - if moduletable.isConditional(module): - shellvar = module.getShellVar() - emit += ' %s=false\n' % module.getShellVar() - # Emit the autoconf code for the conditional modules, each in a separate - # function. This makes it possible to support cycles among conditional - # modules. - for module in modules: - if verifier == 0: - solution = True - elif verifier == 1: - solution = module.isNonTests() - elif verifier == 2: - solution = module.isTests() - if solution: - if moduletable.isConditional(module): - shellfunc = module.getShellFunc() - shellvar = module.getShellVar() - emit += ' %s ()\n' % shellfunc - emit += ' {\n' - emit += ' if ! $%s; then\n' % shellvar - emit += self.autoconfSnippet(module, fileassistant, toplevel, - disable_libtool, disable_gettext, replace_auxdir, ' ') - emit += ' %s=true\n' % shellvar - dependencies = module.getDependencies() - depmodules = [pair[0] for pair in dependencies] - # Intersect dependencies with the modules list. - depmodules = [dep for dep in depmodules if dep in modules] - for depmodule in depmodules: - if moduletable.isConditional(depmodule): - shellfunc = depmodule.getShellFunc() - condition = moduletable.getCondition(module, depmodule) - if condition != None: - emit += ' if %s; then\n' % condition - emit += ' %s\n' % shellfunc - emit += ' fi\n' - else: # if condition == None - emit += ' %s\n' % shellfunc - else: # if not moduletable.isConditional(depmodule) - # The autoconf code for $dep has already been emitted above and - # therefore is already executed when this code is run. - pass - # Define the Automake conditionals. - emit += ' m4_pattern_allow([^%s_GNULIB_ENABLED_])\n' % macro_prefix - for module in modules: - if verifier == 0: - solution = True - elif verifier == 1: - solution = module.isNonTests() - elif verifier == 2: - solution = module.isTests() - if solution: - condname = module.getConditionalName() - shellvar = module.getShellVar() - emit += ' AM_CONDITIONAL([%s], [$%s])\n' % (condname, shellvar) - lines = [line for line in emit.split('\n') if line.strip()] - emit = '%s\n' % '\n'.join(lines) - emit = constants.nlconvert(emit) - if type(emit) is bytes: - emit = emit.decode(ENCS['default']) - return(emit) - - def po_Makevars(self): - '''GLEmiter.po_Makevars() -> string - - Emit the contents of po/ makefile parameterization. - GLConfig: pobase, podomain.''' - emit = string() - pobase = self.config['pobase'] - podomain = self.config['podomain'] - top_subdir = string() - source = '%s/' % os.path.normpath(pobase) - if os.path.sep in source: - for directory in source.split(os.path.sep): - if directory != '': - top_subdir += '../' - top_subdir = os.path.normpath(top_subdir) - emit += "## DO NOT EDIT! GENERATED AUTOMATICALLY!\n" - emit += "%s\n" % self.copyright_notice() - emit += "# Usually the message domain is the same as the package name.\n" - emit += "# But here it has a '-gnulib' suffix.\n" - emit += "DOMAIN = %s-gnulib\n\n" % podomain - emit += "# These two variables depend on the location of this directory.\n" - emit += "subdir = %s\n" % pobase - emit += "top_subdir = %s\n" % top_subdir - emit += """ + emit += 'changequote([, ])dnl\n' + emit += 'AC_SUBST([LTALLOCA])' + if replace_auxdir: + regex = 'AC_CONFIG_FILES\\(\\[(.*?)\\:build-aux/(.*?)\\]\\)' + repl = 'AC_CONFIG_FILES([\\1:%s/\\2])' % auxdir + pattern = compiler(regex, re.S | re.M) + emit = pattern.sub(repl, emit) + lines = [line for line in emit.split('\n') if line.strip()] + emit = '%s\n' % '\n'.join(lines) + emit = constants.nlconvert(emit) + if type(emit) is bytes: + emit = emit.decode(ENCS['default']) + return(emit) + + def autoconfSnippets(self, modules, moduletable, fileassistant, + verifier, toplevel, disable_libtool, disable_gettext, replace_auxdir): + '''GLEmiter.autoconfSnippets(modules, fileassistant, + verifier, toplevel, disable_libtool, disable_gettext, + replace_auxdir) -> string + + Collect and emit the autoconf snippets of a set of modules. + GLConfig: conddeps. + + basemodules argument represents list of modules; every module in this list + must be a GLModule instance; this list of modules is used to sort all + modules after they were processed. + modules argument represents list of modules; every module in this list must + be a GLModule instance. + moduletable is a GLModuleTable instance, which contains necessary + information about dependencies of the modules. + fileassistant is a GLFileAssistant instance, which is used to get temporary + directories and sed transformers. + verifier is an integer, which can be 0, 1 or 2. + if verifier == 0, then process every module; + if verifier == 1, then process only non-tests modules; + if verifier == 2, then process only tests modules. + toplevel is a bool variable, False means a subordinate use of pygnulib. + disable_libtool is a bool variable; it tells whether to disable libtool + handling even if it has been specified through the GLConfig class. + disable_gettext is a bool variable; it tells whether to disable + AM_GNU_GETTEXT invocations. + replace_auxdir is a bool variable; it tells whether to replace + 'build-aux' directory in AC_CONFIG_FILES.''' + emit = string() + for module in modules: + if type(module) is not GLModule: + raise(TypeError('each module must be a GLModule instance')) + if type(moduletable) is not GLModuleTable: + raise(TypeError('moduletable must be a GLFileAssistant, not %s' % + type(moduletable).__name__)) + if type(fileassistant) is not GLFileAssistant: + raise(TypeError('fileassistant must be a GLFileAssistant, not %s' % + type(fileassistant).__name__)) + if type(verifier) is not int: + raise(TypeError('verifier must be an int, not %s' % + type(verifier).__name__)) + if not (0 <= verifier <= 2): + raise(ValueError('verifier must be 0, 1 or 2, not %d' % verifier)) + if type(toplevel) is not bool: + raise(TypeError('toplevel must be a bool, not %s' % + type(toplevel).__name__)) + if type(disable_libtool) is not bool: + raise(TypeError('disable_libtool must be a bool, not %s' % + type(disable_libtool).__name__)) + if type(disable_gettext) is not bool: + raise(TypeError('disable_gettext must be a bool, not %s' % + type(disable_gettext).__name__)) + if type(replace_auxdir) is not bool: + raise(TypeError('replace_auxdir must be a bool, not %s' % + type(replace_auxdir).__name__)) + auxdir = self.config['auxdir'] + conddeps = self.config['conddeps'] + macro_prefix = self.config['macro_prefix'] + if not conddeps: + # Ignore the conditions, and enable all modules unconditionally. + for module in modules: + if verifier == 0: + solution = True + elif verifier == 1: + solution = module.isNonTests() + elif verifier == 2: + solution = module.isTests() + if solution: + emit += self.autoconfSnippet(module, fileassistant, toplevel, + disable_libtool, disable_gettext, replace_auxdir, ' ') + else: # if conddeps + # Emit the autoconf code for the unconditional modules. + for module in modules: + if verifier == 0: + solution = True + elif verifier == 1: + solution = module.isNonTests() + elif verifier == 2: + solution = module.isTests() + if solution: + if not moduletable.isConditional(module): + emit += self.autoconfSnippet(module, fileassistant, toplevel, + disable_libtool, disable_gettext, replace_auxdir, ' ') + # Initialize the shell variables indicating that the modules are enabled. + for module in modules: + if verifier == 0: + solution = True + elif verifier == 1: + solution = module.isNonTests() + elif verifier == 2: + solution = module.isTests() + if solution: + if moduletable.isConditional(module): + shellvar = module.getShellVar() + emit += ' %s=false\n' % module.getShellVar() + # Emit the autoconf code for the conditional modules, each in a separate + # function. This makes it possible to support cycles among conditional + # modules. + for module in modules: + if verifier == 0: + solution = True + elif verifier == 1: + solution = module.isNonTests() + elif verifier == 2: + solution = module.isTests() + if solution: + if moduletable.isConditional(module): + shellfunc = module.getShellFunc() + shellvar = module.getShellVar() + emit += ' %s ()\n' % shellfunc + emit += ' {\n' + emit += ' if ! $%s; then\n' % shellvar + emit += self.autoconfSnippet(module, fileassistant, toplevel, + disable_libtool, disable_gettext, replace_auxdir, ' ') + emit += ' %s=true\n' % shellvar + dependencies = module.getDependencies() + depmodules = [pair[0] for pair in dependencies] + # Intersect dependencies with the modules list. + depmodules = [ + dep for dep in depmodules if dep in modules] + for depmodule in depmodules: + if moduletable.isConditional(depmodule): + shellfunc = depmodule.getShellFunc() + condition = moduletable.getCondition( + module, depmodule) + if condition != None: + emit += ' if %s; then\n' % condition + emit += ' %s\n' % shellfunc + emit += ' fi\n' + else: # if condition == None + emit += ' %s\n' % shellfunc + # if not moduletable.isConditional(depmodule) + else: + # The autoconf code for $dep has already been emitted above and + # therefore is already executed when this code is run. + pass + # Define the Automake conditionals. + emit += ' m4_pattern_allow([^%s_GNULIB_ENABLED_])\n' % macro_prefix + for module in modules: + if verifier == 0: + solution = True + elif verifier == 1: + solution = module.isNonTests() + elif verifier == 2: + solution = module.isTests() + if solution: + condname = module.getConditionalName() + shellvar = module.getShellVar() + emit += ' AM_CONDITIONAL([%s], [$%s])\n' % ( + condname, shellvar) + lines = [line for line in emit.split('\n') if line.strip()] + emit = '%s\n' % '\n'.join(lines) + emit = constants.nlconvert(emit) + if type(emit) is bytes: + emit = emit.decode(ENCS['default']) + return(emit) + + def po_Makevars(self): + '''GLEmiter.po_Makevars() -> string + + Emit the contents of po/ makefile parameterization. + GLConfig: pobase, podomain.''' + emit = string() + pobase = self.config['pobase'] + podomain = self.config['podomain'] + top_subdir = string() + source = '%s/' % os.path.normpath(pobase) + if os.path.sep in source: + for directory in source.split(os.path.sep): + if directory != '': + top_subdir += '../' + top_subdir = os.path.normpath(top_subdir) + emit += "## DO NOT EDIT! GENERATED AUTOMATICALLY!\n" + emit += "%s\n" % self.copyright_notice() + emit += "# Usually the message domain is the same as the package name.\n" + emit += "# But here it has a '-gnulib' suffix.\n" + emit += "DOMAIN = %s-gnulib\n\n" % podomain + emit += "# These two variables depend on the location of this directory.\n" + emit += "subdir = %s\n" % pobase + emit += "top_subdir = %s\n" % top_subdir + emit += """ # These options get passed to xgettext. XGETTEXT_OPTIONS = \\ --keyword=_ --flag=_:1:pass-c-format \\ @@ -417,93 +421,93 @@ EXTRA_LOCALE_CATEGORIES = # package uses functions taking also a message context, like pgettext(), or # if in $(XGETTEXT_OPTIONS) you define keywords with a context argument. USE_MSGCTXT = no\n""" - if type(emit) is bytes: - emit = emit.decode(ENCS['default']) - return(constants.nlconvert(emit)) - - def po_POTFILES_in(self, files): - '''GLEmiter.po_POTFILES_in(files) -> string - - Emit the file list to be passed to xgettext. - GLConfig: sourcebase.''' - emit = string() - sourcebase = self.config['sourcebase'] - sourcebase = '%s%s' % (self.sourcebase, os.path.sep) - if type(sourcebase) is bytes: - sourcebase = sourcebase.decode(ENCS['default']) - files = [substart('lib/', sourcebase, file) for file in files] - files = [file for file in files if file.startswith(sourcebase)] - emit += "## DO NOT EDIT! GENERATED AUTOMATICALLY!\n" - emit += "%s\n" % self.copyright_notice() - emit += "# List of files which contain translatable strings.\n" - emit += '\n'.join(files) - emit += '\n' - if type(emit) is bytes: - emit = emit.decode(ENCS['default']) - return(constants.nlconvert(emit)) - - def initmacro_start(self, macro_prefix_arg): - '''GLEmiter.initmacro_start(macro_prefix_arg) -> string - - Emit the first few statements of the gl_INIT macro.''' - emit = string() - if type(macro_prefix_arg) is bytes or type(macro_prefix_arg) is string: - if type(macro_prefix_arg) is bytes: - macro_prefix_arg = macro_prefix_arg.decode(ENCS['default']) - else: # if macro_prefix_arg has not bytes or string type - raise(TypeError('macro_prefix_arg must be a string, not %s' % \ - type(macro_prefix_arg).__name__)) - # Overriding AC_LIBOBJ and AC_REPLACE_FUNCS has the effect of storing - # platform-dependent object files in ${macro_prefix_arg}_LIBOBJS instead - # of LIBOBJS. The purpose is to allow several gnulib instantiations under - # a single configure.ac file. (AC_CONFIG_LIBOBJ_DIR does not allow this - # flexibility). - # Furthermore it avoids an automake error like this when a Makefile.am - # that uses pieces of gnulib also uses $(LIBOBJ): - # automatically discovered file `error.c' should not be explicitly - # mentioned. - emit += " m4_pushdef([AC_LIBOBJ]," - emit += " m4_defn([%V1%_LIBOBJ]))\n" - emit += " m4_pushdef([AC_REPLACE_FUNCS]," - emit += " m4_defn([%V1%_REPLACE_FUNCS]))\n" - # Overriding AC_LIBSOURCES has the same purpose of avoiding the automake - # error when a Makefile.am that uses pieces of gnulib also uses $(LIBOBJ): - # automatically discovered file `error.c' should not be explicitly - # mentioned - # We let automake know about the files to be distributed through the - # EXTRA_lib_SOURCES variable. - emit += " m4_pushdef([AC_LIBSOURCES]," - emit += " m4_defn([%V1%_LIBSOURCES]))\n" - # Create data variables for checking the presence of files that are - # mentioned as AC_LIBSOURCES arguments. These are m4 variables, not shell - # variables, because we want the check to happen when the configure file is - # created, not when it is run. ${macro_prefix_arg}_LIBSOURCES_LIST is the - # list of files to check for. ${macro_prefix_arg}_LIBSOURCES_DIR is the - # subdirectory in which to expect them. - emit += " m4_pushdef([%V1%_LIBSOURCES_LIST], [])\n" - emit += " m4_pushdef([%V1%_LIBSOURCES_DIR], [])\n" - emit += " gl_COMMON\n" - emit = emit.replace('%V1%', macro_prefix_arg) - if type(emit) is bytes: - emit = emit.decode(ENCS['default']) - return(constants.nlconvert(emit)) - - def initmacro_end(self, macro_prefix_arg): - '''GLEmiter.initmacro_end(macro_prefix_arg) -> string - - Emit the last few statements of the gl_INIT macro.''' - emit = string() - if type(macro_prefix_arg) is bytes or type(macro_prefix_arg) is string: - if type(macro_prefix_arg) is bytes: - macro_prefix_arg = macro_prefix_arg.decode(ENCS['default']) - else: # if macro_prefix_arg has not bytes or string type - raise(TypeError('macro_prefix_arg must be a string, not %s' % \ - type(macro_prefix_arg).__name__)) - # Check the presence of files that are mentioned as AC_LIBSOURCES - # arguments. The check is performed only when autoconf is run from the - # directory where the configure.ac resides; if it is run from a different - # directory, the check is skipped. - emit += """\ + if type(emit) is bytes: + emit = emit.decode(ENCS['default']) + return(constants.nlconvert(emit)) + + def po_POTFILES_in(self, files): + '''GLEmiter.po_POTFILES_in(files) -> string + + Emit the file list to be passed to xgettext. + GLConfig: sourcebase.''' + emit = string() + sourcebase = self.config['sourcebase'] + sourcebase = '%s%s' % (self.sourcebase, os.path.sep) + if type(sourcebase) is bytes: + sourcebase = sourcebase.decode(ENCS['default']) + files = [substart('lib/', sourcebase, file) for file in files] + files = [file for file in files if file.startswith(sourcebase)] + emit += "## DO NOT EDIT! GENERATED AUTOMATICALLY!\n" + emit += "%s\n" % self.copyright_notice() + emit += "# List of files which contain translatable strings.\n" + emit += '\n'.join(files) + emit += '\n' + if type(emit) is bytes: + emit = emit.decode(ENCS['default']) + return(constants.nlconvert(emit)) + + def initmacro_start(self, macro_prefix_arg): + '''GLEmiter.initmacro_start(macro_prefix_arg) -> string + + Emit the first few statements of the gl_INIT macro.''' + emit = string() + if type(macro_prefix_arg) is bytes or type(macro_prefix_arg) is string: + if type(macro_prefix_arg) is bytes: + macro_prefix_arg = macro_prefix_arg.decode(ENCS['default']) + else: # if macro_prefix_arg has not bytes or string type + raise(TypeError('macro_prefix_arg must be a string, not %s' % + type(macro_prefix_arg).__name__)) + # Overriding AC_LIBOBJ and AC_REPLACE_FUNCS has the effect of storing + # platform-dependent object files in ${macro_prefix_arg}_LIBOBJS instead + # of LIBOBJS. The purpose is to allow several gnulib instantiations under + # a single configure.ac file. (AC_CONFIG_LIBOBJ_DIR does not allow this + # flexibility). + # Furthermore it avoids an automake error like this when a Makefile.am + # that uses pieces of gnulib also uses $(LIBOBJ): + # automatically discovered file `error.c' should not be explicitly + # mentioned. + emit += " m4_pushdef([AC_LIBOBJ]," + emit += " m4_defn([%V1%_LIBOBJ]))\n" + emit += " m4_pushdef([AC_REPLACE_FUNCS]," + emit += " m4_defn([%V1%_REPLACE_FUNCS]))\n" + # Overriding AC_LIBSOURCES has the same purpose of avoiding the automake + # error when a Makefile.am that uses pieces of gnulib also uses $(LIBOBJ): + # automatically discovered file `error.c' should not be explicitly + # mentioned + # We let automake know about the files to be distributed through the + # EXTRA_lib_SOURCES variable. + emit += " m4_pushdef([AC_LIBSOURCES]," + emit += " m4_defn([%V1%_LIBSOURCES]))\n" + # Create data variables for checking the presence of files that are + # mentioned as AC_LIBSOURCES arguments. These are m4 variables, not shell + # variables, because we want the check to happen when the configure file is + # created, not when it is run. ${macro_prefix_arg}_LIBSOURCES_LIST is the + # list of files to check for. ${macro_prefix_arg}_LIBSOURCES_DIR is the + # subdirectory in which to expect them. + emit += " m4_pushdef([%V1%_LIBSOURCES_LIST], [])\n" + emit += " m4_pushdef([%V1%_LIBSOURCES_DIR], [])\n" + emit += " gl_COMMON\n" + emit = emit.replace('%V1%', macro_prefix_arg) + if type(emit) is bytes: + emit = emit.decode(ENCS['default']) + return(constants.nlconvert(emit)) + + def initmacro_end(self, macro_prefix_arg): + '''GLEmiter.initmacro_end(macro_prefix_arg) -> string + + Emit the last few statements of the gl_INIT macro.''' + emit = string() + if type(macro_prefix_arg) is bytes or type(macro_prefix_arg) is string: + if type(macro_prefix_arg) is bytes: + macro_prefix_arg = macro_prefix_arg.decode(ENCS['default']) + else: # if macro_prefix_arg has not bytes or string type + raise(TypeError('macro_prefix_arg must be a string, not %s' % + type(macro_prefix_arg).__name__)) + # Check the presence of files that are mentioned as AC_LIBSOURCES + # arguments. The check is performed only when autoconf is run from the + # directory where the configure.ac resides; if it is run from a different + # directory, the check is skipped. + emit += """\ m4_ifval(%V1%_LIBSOURCES_LIST, [ m4_syscmd([test ! -d ]m4_defn([%V1%_LIBSOURCES_DIR])[ || for gl_file in ]%V1%_LIBSOURCES_LIST[ ; do @@ -536,30 +540,30 @@ found])]) AC_SUBST([%V1%_LIBOBJS], [$%V1%_libobjs]) AC_SUBST([%V1%_LTLIBOBJS], [$%V1%_ltlibobjs]) ])\n""" - emit = emit.replace('%V1%', macro_prefix_arg) - if type(emit) is bytes: - emit = emit.decode(ENCS['default']) - return(constants.nlconvert(emit)) - - def initmacro_done(self, macro_prefix_arg, sourcebase_arg): - '''GLEmiter.initmacro_done(macro_prefix_arg, sourcebase_arg) -> string - - Emit a few statements after the gl_INIT macro. - GLConfig: sourcebase.''' - emit = string() - if type(macro_prefix_arg) is bytes or type(macro_prefix_arg) is string: - if type(macro_prefix_arg) is bytes: - macro_prefix_arg = macro_prefix_arg.decode(ENCS['default']) - else: # if macro_prefix_arg has not bytes or string type - raise(TypeError('macro_prefix_arg must be a string, not %s' % \ - type(macro_prefix_arg).__name__)) - if type(sourcebase_arg) is bytes or type(sourcebase_arg) is string: - if type(sourcebase_arg) is bytes: - sourcebase_arg = sourcebase_arg.decode(ENCS['default']) - else: # if sourcebase_arg has not bytes or string type - raise(TypeError('sourcebase_arg must be a string, not %s' % \ - type(sourcebase_arg).__name__)) - emit += """\ + emit = emit.replace('%V1%', macro_prefix_arg) + if type(emit) is bytes: + emit = emit.decode(ENCS['default']) + return(constants.nlconvert(emit)) + + def initmacro_done(self, macro_prefix_arg, sourcebase_arg): + '''GLEmiter.initmacro_done(macro_prefix_arg, sourcebase_arg) -> string + + Emit a few statements after the gl_INIT macro. + GLConfig: sourcebase.''' + emit = string() + if type(macro_prefix_arg) is bytes or type(macro_prefix_arg) is string: + if type(macro_prefix_arg) is bytes: + macro_prefix_arg = macro_prefix_arg.decode(ENCS['default']) + else: # if macro_prefix_arg has not bytes or string type + raise(TypeError('macro_prefix_arg must be a string, not %s' % + type(macro_prefix_arg).__name__)) + if type(sourcebase_arg) is bytes or type(sourcebase_arg) is string: + if type(sourcebase_arg) is bytes: + sourcebase_arg = sourcebase_arg.decode(ENCS['default']) + else: # if sourcebase_arg has not bytes or string type + raise(TypeError('sourcebase_arg must be a string, not %s' % + type(sourcebase_arg).__name__)) + emit += """\ # Like AC_LIBOBJ, except that the module name goes # into %V1%_LIBOBJS instead of into LIBOBJS. @@ -587,552 +591,577 @@ AC_DEFUN([%V1%_LIBSOURCES], [ ]) ]) ])\n""" - emit = emit.replace('%V1%', macro_prefix_arg) - emit = emit.replace('%V2%', sourcebase_arg) - if type(emit) is bytes: - emit = emit.decode(ENCS['default']) - return(constants.nlconvert(emit)) - - def lib_Makefile_am(self, destfile, modules, - moduletable, makefiletable, actioncmd, for_test): - '''GLEmiter.lib_Makefile_am(destfile, modules, moduletable, makefiletable, - actioncmd, for_test) -> tuple of string and bool - - Emit the contents of the library Makefile. Returns string and a bool - variable which shows if subdirectories are used. - GLConfig: localdir, sourcebase, libname, pobase, auxdir, makefile, libtool, - macro_prefix, podomain, conddeps, witness_c_macro. - - destfile is a filename relative to destdir of Makefile being generated. - modules is a list of GLModule instances. - moduletable is a GLModuleTable instance. - makefiletable is a GLMakefileTable instance. - actioncmd is a string variable, which represents the actioncmd; it can be - an empty string e.g. when user wants to generate files for GLTestDir. - for_test is a bool variable; it must be set to True if creating a package - for testing, False otherwise.''' - if type(destfile) is bytes or type(destfile) is string: - if type(destfile) is bytes: - destfile = destfile.decode(ENCS['default']) - else: # if destfile has not bytes or string type - raise(TypeError('destfile must be a string, not %s' % \ - type(destfile).__name__)) - for module in modules: - if type(module) is not GLModule: - raise(TypeError('each module must be a GLModule instance')) - if type(moduletable) is not GLModuleTable: - raise(TypeError('moduletable must be a GLModuleTable, not %s' % \ - type(moduletable).__name__)) - if type(makefiletable) is not GLMakefileTable: - raise(TypeError('makefiletable must be a GLMakefileTable, not %s' % \ - type(makefiletable).__name__)) - if type(actioncmd) is bytes or type(actioncmd) is string: - if type(actioncmd) is bytes: - actioncmd = actioncmd.decode(ENCS['default']) - else: # if actioncmd has not bytes or string type - raise(TypeError('actioncmd must be a string, not %s' % \ - type(actioncmd).__name__)) - if type(for_test) is not bool: - raise(TypeError('for_test must be a bool, not %s' % \ - type(for_test).__name__)) - emit = string() - localdir = self.config['localdir'] - sourcebase = self.config['sourcebase'] - modcache = self.config['modcache'] - libname = self.config['libname'] - pobase = self.config['pobase'] - auxdir = self.config['auxdir'] - makefile = self.config['makefile'] - libtool = self.config['libtool'] - macro_prefix = self.config['macro_prefix'] - podomain = self.config['podomain'] - conddeps = self.config['conddeps'] - witness_c_macro = self.config['witness_c_macro'] - include_guard_prefix = self.config['include_guard_prefix'] - ac_version = self.config['ac_version'] - destfile = os.path.normpath(destfile) - - # When creating an includable Makefile.am snippet, augment variables with - # += instead of assigning them. - if makefile: - assign = '+=' - else: # if not makefile - assign = '=' - if libtool: - libext = 'la' - perhapsLT = 'LT' - LD_flags = False - else: # if not libtool - libext = 'a' - perhapsLT = '' - LD_flags = True - if for_test: - # When creating a package for testing: Attempt to provoke failures, - # especially link errors, already during "make" rather than during - # "make check", because "make check" is not possible in a cross-compiling - # situation. Turn check_PROGRAMS into noinst_PROGRAMS. - check_PROGRAMS = True - else: # if not for_test - check_PROGRAMS = False - emit += "## DO NOT EDIT! GENERATED AUTOMATICALLY!\n" - emit += "## Process this file with automake to produce Makefile.in.\n" - emit += self.copyright_notice() - if actioncmd: - if len(actioncmd) <= 3000: - emit += "# Reproduce by: %s\n" % actioncmd - emit += '\n' - uses_subdirs = False - - # Modify allsnippets variable. - allsnippets = string() - for module in modules: - if not module.isTests(): - # Get conditional snippet, edit it and save to amsnippet1. - amsnippet1 = module.getAutomakeSnippet_Conditional() - amsnippet1 = amsnippet1.replace('lib_LIBRARIES', 'lib%_LIBRARIES') - amsnippet1 = amsnippet1.replace('lib_LTLIBRARIES', 'lib%_LTLIBRARIES') - if LD_flags: - pattern = compiler('lib_LDFLAGS[\t ]*\\+=(.*?)$', re.S | re.M) - amsnippet1 = pattern.sub('', amsnippet1) - pattern = compiler('lib_([A-Z][A-Z](?:.*?))', re.S | re.M) - amsnippet1 = pattern.sub('%s_%s_\\1' % (libname, libext), amsnippet1) - amsnippet1 = amsnippet1.replace('lib%_LIBRARIES', 'lib_LIBRARIES') - amsnippet1 = amsnippet1.replace('lib%_LTLIBRARIES', 'lib_LTLIBRARIES') - amsnippet1 = amsnippet1.replace('${gl_include_guard_prefix}', - include_guard_prefix) - if str(module) == 'alloca': - amsnippet1 += '%s_%s_LIBADD += @%sALLOCA@\n' % \ - (libname, libext, perhapsLT) - amsnippet1 += '%s_%s_DEPENDENCIES += @%sALLOCA@\n' % \ - (libname, libext, perhapsLT) - if check_PROGRAMS: - amsnippet1 = amsnippet1.replace('check_PROGRAMS', 'noinst_PROGRAMS') - - # Get unconditional snippet, edit it and save to amsnippet1. - amsnippet2 = module.getAutomakeSnippet_Unconditional() - pattern = compiler('lib_([A-Z][A-Z](?:.*?))', re.S | re.M) - amsnippet2 = pattern.sub('%s_%s_\\1' % (libname, libext), amsnippet2) - if type(amsnippet1) is bytes: - amsnippet1 = amsnippet1.decode(ENCS['default']) - if type(amsnippet2) is bytes: - amsnippet2 = amsnippet1.decode(ENCS['default']) - if not (amsnippet1 +amsnippet2).isspace(): - allsnippets += '## begin gnulib module %s\n' % str(module) - if conddeps: - if moduletable.isConditional(module): - name = module.getConditionalName() - allsnippets += 'if %s\n' % name - allsnippets += amsnippet1 - if conddeps: - allsnippets += 'endif\n' - allsnippets += amsnippet2 - allsnippets += '## end gnulib module %s\n\n' % str(module) - - # Test whether there are some source files in subdirectories. - for file in module.getFiles(): - if file.startswith('lib/') and file.endswith('.c') and \ - file.count('/') > 1: - uses_subdirs = True - break - if not makefile: - subdir_options = string() - # If there are source files in subdirectories, prevent collision of the - # object files (example: hash.c and libxml/hash.c). - if uses_subdirs: - subdir_options = string(' subdir-objects') - emit += 'AUTOMAKE_OPTIONS = 1.5 gnits%s\n' % subdir_options - emit += '\n' - if not makefile: - emit += 'SUBDIRS =\n' - emit += 'noinst_HEADERS =\n' - emit += 'noinst_LIBRARIES =\n' - emit += 'noinst_LTLIBRARIES =\n' - # Automake versions < 1.11.4 create an empty pkgdatadir at - # installation time if you specify pkgdata_DATA to empty. - # See automake bugs #10997 and #11030: - # * http://debbugs.gnu.org/10997 - # * http://debbugs.gnu.org/11030 - # So we need this workaround. - pattern = compiler('^pkgdata_DATA *\\+=', re.S | re.M) - if pattern.findall(allsnippets): - emit += 'pkgdata_DATA =\n' - emit += 'EXTRA_DIST =\n' - emit += 'BUILT_SOURCES =\n' - emit += 'SUFFIXES =\n' - emit += 'MOSTLYCLEANFILES %s core *.stackdump\n' % assign - if not makefile: - emit += 'MOSTLYCLEANDIRS =\n' - emit += 'CLEANFILES =\n' - emit += 'DISTCLEANFILES =\n' - emit += 'MAINTAINERCLEANFILES =\n' - - # Execute edits that apply to the Makefile.am being generated. - current_edit = int() - makefile_am_edits = makefiletable.count() - while current_edit != makefile_am_edits: - dictionary = makefiletable[current_edit] - if dictionary['var']: - paths = list() - paths += [joinpath(dictionary['dir'], 'Makefile.am')] - paths += [os.path.normpath('./%s/Makefile.am' % dictionary['dir'])] - paths = sorted(set(paths)) - if destfile in paths: - emit += '%s += %s\n' % (dictionary['var'], dictionary['val']) - current_edit += 1 - - # Define two parts of cppflags variable. - emit += '\n' - cppflags_part1 = string() - cppflags_part2 = string() - if witness_c_macro: - cppflags_part1 = ' -D%s=1' % witness_c_macro - if for_test: - cppflags_part2 = ' -DGNULIB_STRICT_CHECKING=1' - cppflags = '%s%s' % (cppflags_part1, cppflags_part2) - if not makefile: - emit += 'AM_CPPFLAGS =%s\n' % cppflags - emit += 'AM_CFLAGS =\n' - else: # if makefile - if cppflags: - emit += 'AM_CPPFLAGS +=%s\n' % cppflags - emit += '\n' - - # One of the snippets or the user's Makefile.am already specifies an - # installation location for the library. Don't confuse automake by saying - # it should not be installed. - # First test if allsnippets already specify an installation location. - insnippets = False - inmakefile = False - regex = '^[a-zA-Z0-9_]*_%sLIBRARIES *\\+{0,1}= *%s.%s' % \ - (perhapsLT, libname, libext) - pattern = compiler(regex, re.S | re.M) - insnippets = bool(pattern.findall(allsnippets)) - # Then test if $sourcebase/Makefile.am (if it exists) specifies it. - path = joinpath(sourcebase, 'Makefile.am') - if makefile and isfile(path): - with codecs.open(path, 'rb', 'UTF-8') as file: - data = file.read() - inmakefile = bool(pattern.findall(data)) - if not any([insnippets, inmakefile]): - # By default, the generated library should not be installed. - emit += 'noinst_%sLIBRARIES += %s.%s\n' % (perhapsLT, libname, libext) - - emit += '\n' - emit += '%s_%s_SOURCES =\n' % (libname, libext) - # Here we use $(LIBOBJS), not @LIBOBJS@. The value is the same. However, - # automake during its analysis looks for $(LIBOBJS), not for @LIBOBJS@. - emit += '%s_%s_LIBADD = $(%s_%sLIBOBJS)\n' % \ - (libname, libext, macro_prefix, perhapsLT) - emit += '%s_%s_DEPENDENCIES = $(%s_%sLIBOBJS)\n' % \ - (libname, libext, macro_prefix, perhapsLT) - emit += 'EXTRA_%s_%s_SOURCES =\n' % (libname, libext) - if libtool: - emit += '%s_%s_LDFLAGS = $(AM_LDFLAGS)\n' % (libname, libext) - emit += '%s_%s_LDFLAGS += -no-undefined\n' % (libname, libext) - # Synthesize an ${libname}_${libext}_LDFLAGS augmentation by combining - # the link dependencies of all modules. - listing = list() - links = [module.getLink() for module in modules if not module.isTests()] - for link in links: - link = constants.nlremove(link) - position = link.find(' when linking with libtool') - if position != -1: - link = link[:position] - listing += [link] - listing = sorted(set([link for link in listing if link != ''])) - for link in listing: - emit += '%s_%s_LDFLAGS += %s\n' % (libname, libext, link) - emit += '\n' - if pobase: - emit += 'AM_CPPFLAGS += -DDEFAULT_TEXT_DOMAIN="%s-gnulib"\n' % podomain - emit += '\n' - allsnippets = allsnippets.replace('$(top_srcdir)/build-aux/', - '$(top_srcdir)/%s/' % auxdir) - emit += allsnippets - emit += '\n' - emit += 'mostlyclean-local: mostlyclean-generic\n' - emit += '\t@for dir in \'\' $(MOSTLYCLEANDIRS); do \\\n' - emit += '\t if test -n "$$dir" && test -d $$dir; then \\\n' - emit += '\t echo "rmdir $$dir"; rmdir $$dir; \\\n' - emit += '\t fi; \\\n' - emit += '\tdone; \\\n' - emit += '\t:\n' - emit = constants.nlconvert(emit) - if type(emit) is bytes: - emit = emit.decode(ENCS['default']) - result = tuple([emit, uses_subdirs]) - return(result) - - def tests_Makefile_am(self, destfile, modules, makefiletable, - witness_macro, for_test): - '''GLEmiter.tests_Makefile_am(destfile, modules, makefiletable, - witness_c_macro, for_test) -> tuple of string and bool - - Emit the contents of the tests Makefile. Returns string and a bool variable - which shows if subdirectories are used. - GLConfig: localdir, modules, libname, auxdir, makefile, libtool, - sourcebase, m4base, testsbase, macro_prefix, witness_c_macro, - single_configure, libtests. - - destfile is a filename relative to destdir of Makefile being generated. - witness_macro is a string which represents witness_c_macro with the suffix. - modules is a list of GLModule instances. - moduletable is a GLModuleTable instance. - makefiletable is a GLMakefileTable instance. - actioncmd is a string variable, which represents the actioncmd; it can be - an empty string e.g. when user wants to generate files for GLTestDir. - for_test is a bool variable; it must be set to True if creating a package - for testing, False otherwise.''' - if type(destfile) is bytes or type(destfile) is string: - if type(destfile) is bytes: - destfile = destfile.decode(ENCS['default']) - else: # if destfile has not bytes or string type - raise(TypeError('destfile must be a string, not %s' % \ - type(destfile).__name__)) - for module in modules: - if type(module) is not GLModule: - raise(TypeError('each module must be a GLModule instance')) - if type(makefiletable) is not GLMakefileTable: - raise(TypeError('makefiletable must be a GLMakefileTable, not %s' % \ - type(makefiletable).__name__)) - if type(witness_macro) is bytes or type(witness_macro) is string: - if type(witness_macro) is bytes: - witness_macro = witness_macro.decode(ENCS['default']) - else: # if witness_macro has not bytes or string type - raise(TypeError('witness_macro must be a string, not %s' % \ - type(witness_macro).__name__)) - if type(for_test) is not bool: - raise(TypeError('for_test must be a bool, not %s' % \ - type(for_test).__name__)) - emit = string() - localdir = self.config['localdir'] - auxdir = self.config['auxdir'] - sourcebase = self.config['sourcebase'] - modcache = self.config['modcache'] - libname = self.config['libname'] - m4base = self.config['m4base'] - pobase = self.config['pobase'] - testsbase = self.config['testsbase'] - makefile = self.config['makefile'] - libtool = self.config['libtool'] - macro_prefix = self.config['macro_prefix'] - podomain = self.config['podomain'] - conddeps = self.config['conddeps'] - witness_c_macro = self.config['witness_c_macro'] - include_guard_prefix = self.config['include_guard_prefix'] - ac_version = self.config['ac_version'] - libtests = self.config['libtests'] - single_configure = self.config['single_configure'] - - if libtool: - libext = 'la' - perhapsLT = 'LT' - LD_flags = False - else: # if not libtool - libext = 'a' - perhapsLT = '' - LD_flags = True - if for_test: - # When creating a package for testing: Attempt to provoke failures, - # especially link errors, already during "make" rather than during - # "make check", because "make check" is not possible in a cross-compiling - # situation. Turn check_PROGRAMS into noinst_PROGRAMS. - check_PROGRAMS = True - else: # if not for_test - check_PROGRAMS = False - - # Calculate testsbase_inverse - counter = int() - testsbase_inverse = string() - while counter < len(testsbase.split('/')): - testsbase_inverse += '../' - counter += 1 - testsbase_inverse = os.path.normpath(testsbase_inverse) - - # Begin the generation. - emit += "## DO NOT EDIT! GENERATED AUTOMATICALLY!\n" - emit += "## Process this file with automake to produce Makefile.in.\n" - emit += '%s\n' % self.copyright_notice() - - uses_subdirs = False - main_snippets = string() - longrun_snippets = string() - for module in modules: - if for_test and not single_configure: - flag = module.isTests() - else: # if for_test and not single_configure - flag = True - if flag: - snippet = module.getAutomakeSnippet() - snippet = snippet.replace('lib_LIBRARIES', 'lib%_LIBRARIES') - snippet = snippet.replace('lib_LTLIBRARIES', 'lib%_LTLIBRARIES') - if LD_flags: - pattern = compiler('lib_LDFLAGS[\t ]*\\+=(.*?)$', re.S | re.M) - snippet = pattern.sub('', snippet) - pattern = compiler('lib_([A-Z][A-Z](?:.*?))', re.S | re.M) - snippet = pattern.sub('libtests_a_\\1', snippet) - snippet = snippet.replace('lib%_LIBRARIES', 'lib_LIBRARIES') - snippet = snippet.replace('lib%_LTLIBRARIES', 'lib_LTLIBRARIES') - snippet = snippet.replace('${gl_include_guard_prefix}', - include_guard_prefix) - if check_PROGRAMS: - snippet = snippet.replace('check_PROGRAMS', 'noinst_PROGRAMS') - # Check if module is 'alloca'. - if libtests and str(module) == 'alloca': - snippet += 'libtests_a_LIBADD += @%sALLOCA@\n' % perhapsLT - snippet += 'libtests_a_DEPENDENCIES += @%sALLOCA@\n' % perhapsLT - - # Skip the contents if it's entirely empty. - if snippet.strip(): - # Check status of the module. - status = module.getStatus() - islongrun = False - for word in status: - if word == 'longrunning-test': - islongrun = True - break - if not islongrun: - snippet = snippet.replace('\n\nEXTRA_DIST', '\nEXTRA_DIST') - main_snippets += '## begin gnulib module %s\n' % str(module) - main_snippets += snippet - main_snippets += '## end gnulib module %s\n\n' % str(module) - else: # if islongrunning - snippet = snippet.replace('\n\nEXTRA_DIST', '\nEXTRA_DIST') - longrun_snippets += '## begin gnulib module %s\n' % str(module) - longrun_snippets += snippet - longrun_snippets += '## end gnulib module %s\n' % str(module) - - # Test whether there are some source files in subdirectories. - for file in module.getFiles(): - if file.startswith('lib/') and file.endswith('.c') and \ - file.count('/') > 1: - uses_subdirs = True - break - - # Generate dependencies here, since it eases the debugging of test failures. - # If there are source files in subdirectories, prevent collision of the - # object files (example: hash.c and libxml/hash.c). - subdir_options = string() - if uses_subdirs: - subdir_options = string(' subdir-objects') - emit += 'AUTOMAKE_OPTIONS = 1.5 foreign%s\n\n' % subdir_options - if for_test and not single_configure: - emit += 'ACLOCAL_AMFLAGS = -I %s/%s\n\n' % (testsbase_inverse, m4base) - - # Nothing is being added to SUBDIRS; nevertheless the existence of this - # variable is needed to avoid an error from automake: - # "AM_GNU_GETTEXT used but SUBDIRS not defined" - emit += 'SUBDIRS = .\n' - emit += 'TESTS =\n' - emit += 'XFAIL_TESTS =\n' - emit += 'TESTS_ENVIRONMENT =\n' - emit += 'noinst_PROGRAMS =\n' - if not for_test: - emit += 'check_PROGRAMS =\n' - emit += 'noinst_HEADERS =\n' - emit += 'noinst_LIBRARIES =\n' - if libtests: - if for_test: - emit += 'noinst_LIBRARIES += libtests.a\n' - else: # if not for_test - emit += 'check_LIBRARIES = libtests.a\n' - - # Automake versions < 1.11.4 create an empty pkgdatadir at - # installation time if you specify pkgdata_DATA to empty. - # See automake bugs #10997 and #11030: - # * http://debbugs.gnu.org/10997 - # * http://debbugs.gnu.org/11030 - # So we need this workaround. - pattern = compiler('^pkgdata_DATA *\\+=', re.S | re.M) - if bool(pattern.findall(main_snippets)) or \ - bool(pattern.findall(longrun_snippets)): - emit += 'pkgdata_DATA =\n' - - emit += 'EXTRA_DIST =\n' - emit += 'BUILT_SOURCES =\n' - emit += 'SUFFIXES =\n' - emit += 'MOSTLYCLEANFILES = core *.stackdump\n' - emit += 'MOSTLYCLEANDIRS =\n' - emit += 'CLEANFILES =\n' - emit += 'DISTCLEANFILES =\n' - emit += 'MAINTAINERCLEANFILES =\n' - - # Execute edits that apply to the Makefile.am being generated. - # Execute edits that apply to the Makefile.am being generated. - current_edit = int() - makefile_am_edits = makefiletable.count() - while current_edit != makefile_am_edits: - dictionary = makefiletable[current_edit] - if dictionary['var']: - paths = list() - paths += [joinpath(dictionary['dir'], 'Makefile.am')] - paths += [os.path.normpath('./%s/Makefile.am' % dictionary['dir'])] - paths = sorted(set(paths)) - if destfile in paths: - emit += '%s += %s\n' % (dictionary['var'], dictionary['val']) - current_edit += 1 - - emit += '\nAM_CPPFLAGS = \\\n' - if for_test: - emit += ' -DGNULIB_STRICT_CHECKING=1 \\\n' - if witness_c_macro: - emit += ' -D%s=1 \\\n' % witness_c_macro - if witness_macro: - emit += ' -D@%s@=1 \\\n' % witness_macro - emit += ' -I. -I$(srcdir) \\\n' - emit += ' -I%s -I$(srcdir)/%s \\\n' % \ - (testsbase_inverse, testsbase_inverse) - emit += ' -I%s/%s -I$(srcdir)/%s/%s\n' % \ - (testsbase_inverse, sourcebase, testsbase_inverse, sourcebase) - emit += '\n' - - local_ldadd_before = string() - local_ldadd_after = string() - if libtests: - # All test programs need to be linked with libtests.a. - # It needs to be passed to the linker before ${libname}.${libext}, since - # the tests-related modules depend on the main modules. - # It also needs to be passed to the linker after ${libname}.${libext} - # because the latter might contain incomplete modules (such as the - # 'error' module whose dependency to 'progname' is voluntarily omitted). - # The LIBTESTS_LIBDEPS can be passed to the linker once or twice, it does - # not matter. - local_ldadd_before = ' libtests.a' - local_ldadd_after = ' libtests.a $(LIBTESTS_LIBDEPS)' - emit += 'LDADD =%s %s/%s/%s.%s%s\n\n' % \ - (local_ldadd_before, testsbase_inverse, sourcebase, libname, libext, - local_ldadd_after) - if libtests: - emit += 'libtests_a_SOURCES =\n' - # Here we use $(LIBOBJS), not @LIBOBJS@. The value is the same. However, - # automake during its analysis looks for $(LIBOBJS), not for @LIBOBJS@. - emit += 'libtests_a_LIBADD = $(%stests_LIBOBJS)\n' % macro_prefix - emit += 'libtests_a_DEPENDENCIES = $(%stests_LIBOBJS)\n' % macro_prefix - emit += 'EXTRA_libtests_a_SOURCES =\n' - # The circular dependency in LDADD requires this. - emit += 'AM_LIBTOOLFLAGS = --preserve-dup-deps\n\n' - # Many test scripts use ${EXEEXT} or ${srcdir}. - # EXEEXT is defined by AC_PROG_CC through autoconf. - # srcdir is defined by autoconf and automake. - emit += "TESTS_ENVIRONMENT += EXEEXT='@EXEEXT@' srcdir='$(srcdir)'\n\n" - main_snippets = main_snippets.replace('$(top_srcdir)/build-aux/', - '$(top_srcdir)/%s/' % auxdir) - longrun_snippets = longrun_snippets.replace('$(top_srcdir)/build-aux/', - '$(top_srcdir)/%s/' % auxdir) - emit += main_snippets +longrun_snippets - emit += '# Clean up after Solaris cc.\n' - emit += 'clean-local:\n' - emit += '\trm -rf SunWS_cache\n\n' - emit += 'mostlyclean-local: mostlyclean-generic\n' - emit += '\t@for dir in \'\' $(MOSTLYCLEANDIRS); do \\\n' - emit += '\t if test -n "$$dir" && test -d $$dir; then \\\n' - emit += '\t echo "rmdir $$dir"; rmdir $$dir; \\\n' - emit += '\t fi; \\\n' - emit += '\tdone; \\\n' - emit += '\t:\n' - emit = constants.nlconvert(emit) - if type(emit) is bytes: - emit = emit.decode(ENCS['default']) - result = tuple([emit, uses_subdirs]) - return(result) + emit = emit.replace('%V1%', macro_prefix_arg) + emit = emit.replace('%V2%', sourcebase_arg) + if type(emit) is bytes: + emit = emit.decode(ENCS['default']) + return(constants.nlconvert(emit)) + + def lib_Makefile_am(self, destfile, modules, + moduletable, makefiletable, actioncmd, for_test): + '''GLEmiter.lib_Makefile_am(destfile, modules, moduletable, makefiletable, + actioncmd, for_test) -> tuple of string and bool + + Emit the contents of the library Makefile. Returns string and a bool + variable which shows if subdirectories are used. + GLConfig: localdir, sourcebase, libname, pobase, auxdir, makefile, libtool, + macro_prefix, podomain, conddeps, witness_c_macro. + + destfile is a filename relative to destdir of Makefile being generated. + modules is a list of GLModule instances. + moduletable is a GLModuleTable instance. + makefiletable is a GLMakefileTable instance. + actioncmd is a string variable, which represents the actioncmd; it can be + an empty string e.g. when user wants to generate files for GLTestDir. + for_test is a bool variable; it must be set to True if creating a package + for testing, False otherwise.''' + if type(destfile) is bytes or type(destfile) is string: + if type(destfile) is bytes: + destfile = destfile.decode(ENCS['default']) + else: # if destfile has not bytes or string type + raise(TypeError('destfile must be a string, not %s' % + type(destfile).__name__)) + for module in modules: + if type(module) is not GLModule: + raise(TypeError('each module must be a GLModule instance')) + if type(moduletable) is not GLModuleTable: + raise(TypeError('moduletable must be a GLModuleTable, not %s' % + type(moduletable).__name__)) + if type(makefiletable) is not GLMakefileTable: + raise(TypeError('makefiletable must be a GLMakefileTable, not %s' % + type(makefiletable).__name__)) + if type(actioncmd) is bytes or type(actioncmd) is string: + if type(actioncmd) is bytes: + actioncmd = actioncmd.decode(ENCS['default']) + else: # if actioncmd has not bytes or string type + raise(TypeError('actioncmd must be a string, not %s' % + type(actioncmd).__name__)) + if type(for_test) is not bool: + raise(TypeError('for_test must be a bool, not %s' % + type(for_test).__name__)) + emit = string() + localdir = self.config['localdir'] + sourcebase = self.config['sourcebase'] + modcache = self.config['modcache'] + libname = self.config['libname'] + pobase = self.config['pobase'] + auxdir = self.config['auxdir'] + makefile = self.config['makefile'] + libtool = self.config['libtool'] + macro_prefix = self.config['macro_prefix'] + podomain = self.config['podomain'] + conddeps = self.config['conddeps'] + witness_c_macro = self.config['witness_c_macro'] + include_guard_prefix = self.config['include_guard_prefix'] + ac_version = self.config['ac_version'] + destfile = os.path.normpath(destfile) + + # When creating an includable Makefile.am snippet, augment variables with + # += instead of assigning them. + if makefile: + assign = '+=' + else: # if not makefile + assign = '=' + if libtool: + libext = 'la' + perhapsLT = 'LT' + LD_flags = False + else: # if not libtool + libext = 'a' + perhapsLT = '' + LD_flags = True + if for_test: + # When creating a package for testing: Attempt to provoke failures, + # especially link errors, already during "make" rather than during + # "make check", because "make check" is not possible in a cross-compiling + # situation. Turn check_PROGRAMS into noinst_PROGRAMS. + check_PROGRAMS = True + else: # if not for_test + check_PROGRAMS = False + emit += "## DO NOT EDIT! GENERATED AUTOMATICALLY!\n" + emit += "## Process this file with automake to produce Makefile.in.\n" + emit += self.copyright_notice() + if actioncmd: + if len(actioncmd) <= 3000: + emit += "# Reproduce by: %s\n" % actioncmd + emit += '\n' + uses_subdirs = False + + # Modify allsnippets variable. + allsnippets = string() + for module in modules: + if not module.isTests(): + # Get conditional snippet, edit it and save to amsnippet1. + amsnippet1 = module.getAutomakeSnippet_Conditional() + amsnippet1 = amsnippet1.replace( + 'lib_LIBRARIES', 'lib%_LIBRARIES') + amsnippet1 = amsnippet1.replace( + 'lib_LTLIBRARIES', 'lib%_LTLIBRARIES') + if LD_flags: + pattern = compiler( + 'lib_LDFLAGS[\t ]*\\+=(.*?)$', re.S | re.M) + amsnippet1 = pattern.sub('', amsnippet1) + pattern = compiler('lib_([A-Z][A-Z](?:.*?))', re.S | re.M) + amsnippet1 = pattern.sub('%s_%s_\\1' % + (libname, libext), amsnippet1) + amsnippet1 = amsnippet1.replace( + 'lib%_LIBRARIES', 'lib_LIBRARIES') + amsnippet1 = amsnippet1.replace( + 'lib%_LTLIBRARIES', 'lib_LTLIBRARIES') + amsnippet1 = amsnippet1.replace('${gl_include_guard_prefix}', + include_guard_prefix) + if str(module) == 'alloca': + amsnippet1 += '%s_%s_LIBADD += @%sALLOCA@\n' % \ + (libname, libext, perhapsLT) + amsnippet1 += '%s_%s_DEPENDENCIES += @%sALLOCA@\n' % \ + (libname, libext, perhapsLT) + if check_PROGRAMS: + amsnippet1 = amsnippet1.replace( + 'check_PROGRAMS', 'noinst_PROGRAMS') + + # Get unconditional snippet, edit it and save to amsnippet1. + amsnippet2 = module.getAutomakeSnippet_Unconditional() + pattern = compiler('lib_([A-Z][A-Z](?:.*?))', re.S | re.M) + amsnippet2 = pattern.sub('%s_%s_\\1' % + (libname, libext), amsnippet2) + if type(amsnippet1) is bytes: + amsnippet1 = amsnippet1.decode(ENCS['default']) + if type(amsnippet2) is bytes: + amsnippet2 = amsnippet1.decode(ENCS['default']) + if not (amsnippet1 + amsnippet2).isspace(): + allsnippets += '## begin gnulib module %s\n' % str(module) + if conddeps: + if moduletable.isConditional(module): + name = module.getConditionalName() + allsnippets += 'if %s\n' % name + allsnippets += amsnippet1 + if conddeps: + allsnippets += 'endif\n' + allsnippets += amsnippet2 + allsnippets += '## end gnulib module %s\n\n' % str( + module) + + # Test whether there are some source files in subdirectories. + for file in module.getFiles(): + if file.startswith('lib/') and file.endswith('.c') and \ + file.count('/') > 1: + uses_subdirs = True + break + if not makefile: + subdir_options = string() + # If there are source files in subdirectories, prevent collision of the + # object files (example: hash.c and libxml/hash.c). + if uses_subdirs: + subdir_options = string(' subdir-objects') + emit += 'AUTOMAKE_OPTIONS = 1.5 gnits%s\n' % subdir_options + emit += '\n' + if not makefile: + emit += 'SUBDIRS =\n' + emit += 'noinst_HEADERS =\n' + emit += 'noinst_LIBRARIES =\n' + emit += 'noinst_LTLIBRARIES =\n' + # Automake versions < 1.11.4 create an empty pkgdatadir at + # installation time if you specify pkgdata_DATA to empty. + # See automake bugs #10997 and #11030: + # * http://debbugs.gnu.org/10997 + # * http://debbugs.gnu.org/11030 + # So we need this workaround. + pattern = compiler('^pkgdata_DATA *\\+=', re.S | re.M) + if pattern.findall(allsnippets): + emit += 'pkgdata_DATA =\n' + emit += 'EXTRA_DIST =\n' + emit += 'BUILT_SOURCES =\n' + emit += 'SUFFIXES =\n' + emit += 'MOSTLYCLEANFILES %s core *.stackdump\n' % assign + if not makefile: + emit += 'MOSTLYCLEANDIRS =\n' + emit += 'CLEANFILES =\n' + emit += 'DISTCLEANFILES =\n' + emit += 'MAINTAINERCLEANFILES =\n' + + # Execute edits that apply to the Makefile.am being generated. + current_edit = int() + makefile_am_edits = makefiletable.count() + while current_edit != makefile_am_edits: + dictionary = makefiletable[current_edit] + if dictionary['var']: + paths = list() + paths += [joinpath(dictionary['dir'], 'Makefile.am')] + paths += [os.path.normpath('./%s/Makefile.am' % + dictionary['dir'])] + paths = sorted(set(paths)) + if destfile in paths: + emit += '%s += %s\n' % (dictionary['var'], + dictionary['val']) + current_edit += 1 + + # Define two parts of cppflags variable. + emit += '\n' + cppflags_part1 = string() + cppflags_part2 = string() + if witness_c_macro: + cppflags_part1 = ' -D%s=1' % witness_c_macro + if for_test: + cppflags_part2 = ' -DGNULIB_STRICT_CHECKING=1' + cppflags = '%s%s' % (cppflags_part1, cppflags_part2) + if not makefile: + emit += 'AM_CPPFLAGS =%s\n' % cppflags + emit += 'AM_CFLAGS =\n' + else: # if makefile + if cppflags: + emit += 'AM_CPPFLAGS +=%s\n' % cppflags + emit += '\n' + + # One of the snippets or the user's Makefile.am already specifies an + # installation location for the library. Don't confuse automake by saying + # it should not be installed. + # First test if allsnippets already specify an installation location. + insnippets = False + inmakefile = False + regex = '^[a-zA-Z0-9_]*_%sLIBRARIES *\\+{0,1}= *%s.%s' % \ + (perhapsLT, libname, libext) + pattern = compiler(regex, re.S | re.M) + insnippets = bool(pattern.findall(allsnippets)) + # Then test if $sourcebase/Makefile.am (if it exists) specifies it. + path = joinpath(sourcebase, 'Makefile.am') + if makefile and isfile(path): + with codecs.open(path, 'rb', 'UTF-8') as file: + data = file.read() + inmakefile = bool(pattern.findall(data)) + if not any([insnippets, inmakefile]): + # By default, the generated library should not be installed. + emit += 'noinst_%sLIBRARIES += %s.%s\n' % ( + perhapsLT, libname, libext) + + emit += '\n' + emit += '%s_%s_SOURCES =\n' % (libname, libext) + # Here we use $(LIBOBJS), not @LIBOBJS@. The value is the same. However, + # automake during its analysis looks for $(LIBOBJS), not for @LIBOBJS@. + emit += '%s_%s_LIBADD = $(%s_%sLIBOBJS)\n' % \ + (libname, libext, macro_prefix, perhapsLT) + emit += '%s_%s_DEPENDENCIES = $(%s_%sLIBOBJS)\n' % \ + (libname, libext, macro_prefix, perhapsLT) + emit += 'EXTRA_%s_%s_SOURCES =\n' % (libname, libext) + if libtool: + emit += '%s_%s_LDFLAGS = $(AM_LDFLAGS)\n' % (libname, libext) + emit += '%s_%s_LDFLAGS += -no-undefined\n' % (libname, libext) + # Synthesize an ${libname}_${libext}_LDFLAGS augmentation by combining + # the link dependencies of all modules. + listing = list() + links = [module.getLink() + for module in modules if not module.isTests()] + for link in links: + link = constants.nlremove(link) + position = link.find(' when linking with libtool') + if position != -1: + link = link[:position] + listing += [link] + listing = sorted(set([link for link in listing if link != ''])) + for link in listing: + emit += '%s_%s_LDFLAGS += %s\n' % (libname, libext, link) + emit += '\n' + if pobase: + emit += 'AM_CPPFLAGS += -DDEFAULT_TEXT_DOMAIN="%s-gnulib"\n' % podomain + emit += '\n' + allsnippets = allsnippets.replace('$(top_srcdir)/build-aux/', + '$(top_srcdir)/%s/' % auxdir) + emit += allsnippets + emit += '\n' + emit += 'mostlyclean-local: mostlyclean-generic\n' + emit += '\t@for dir in \'\' $(MOSTLYCLEANDIRS); do \\\n' + emit += '\t if test -n "$$dir" && test -d $$dir; then \\\n' + emit += '\t echo "rmdir $$dir"; rmdir $$dir; \\\n' + emit += '\t fi; \\\n' + emit += '\tdone; \\\n' + emit += '\t:\n' + emit = constants.nlconvert(emit) + if type(emit) is bytes: + emit = emit.decode(ENCS['default']) + result = tuple([emit, uses_subdirs]) + return(result) + + def tests_Makefile_am(self, destfile, modules, makefiletable, + witness_macro, for_test): + '''GLEmiter.tests_Makefile_am(destfile, modules, makefiletable, + witness_c_macro, for_test) -> tuple of string and bool + + Emit the contents of the tests Makefile. Returns string and a bool variable + which shows if subdirectories are used. + GLConfig: localdir, modules, libname, auxdir, makefile, libtool, + sourcebase, m4base, testsbase, macro_prefix, witness_c_macro, + single_configure, libtests. + + destfile is a filename relative to destdir of Makefile being generated. + witness_macro is a string which represents witness_c_macro with the suffix. + modules is a list of GLModule instances. + moduletable is a GLModuleTable instance. + makefiletable is a GLMakefileTable instance. + actioncmd is a string variable, which represents the actioncmd; it can be + an empty string e.g. when user wants to generate files for GLTestDir. + for_test is a bool variable; it must be set to True if creating a package + for testing, False otherwise.''' + if type(destfile) is bytes or type(destfile) is string: + if type(destfile) is bytes: + destfile = destfile.decode(ENCS['default']) + else: # if destfile has not bytes or string type + raise(TypeError('destfile must be a string, not %s' % + type(destfile).__name__)) + for module in modules: + if type(module) is not GLModule: + raise(TypeError('each module must be a GLModule instance')) + if type(makefiletable) is not GLMakefileTable: + raise(TypeError('makefiletable must be a GLMakefileTable, not %s' % + type(makefiletable).__name__)) + if type(witness_macro) is bytes or type(witness_macro) is string: + if type(witness_macro) is bytes: + witness_macro = witness_macro.decode(ENCS['default']) + else: # if witness_macro has not bytes or string type + raise(TypeError('witness_macro must be a string, not %s' % + type(witness_macro).__name__)) + if type(for_test) is not bool: + raise(TypeError('for_test must be a bool, not %s' % + type(for_test).__name__)) + emit = string() + localdir = self.config['localdir'] + auxdir = self.config['auxdir'] + sourcebase = self.config['sourcebase'] + modcache = self.config['modcache'] + libname = self.config['libname'] + m4base = self.config['m4base'] + pobase = self.config['pobase'] + testsbase = self.config['testsbase'] + makefile = self.config['makefile'] + libtool = self.config['libtool'] + macro_prefix = self.config['macro_prefix'] + podomain = self.config['podomain'] + conddeps = self.config['conddeps'] + witness_c_macro = self.config['witness_c_macro'] + include_guard_prefix = self.config['include_guard_prefix'] + ac_version = self.config['ac_version'] + libtests = self.config['libtests'] + single_configure = self.config['single_configure'] + + if libtool: + libext = 'la' + perhapsLT = 'LT' + LD_flags = False + else: # if not libtool + libext = 'a' + perhapsLT = '' + LD_flags = True + if for_test: + # When creating a package for testing: Attempt to provoke failures, + # especially link errors, already during "make" rather than during + # "make check", because "make check" is not possible in a cross-compiling + # situation. Turn check_PROGRAMS into noinst_PROGRAMS. + check_PROGRAMS = True + else: # if not for_test + check_PROGRAMS = False + + # Calculate testsbase_inverse + counter = int() + testsbase_inverse = string() + while counter < len(testsbase.split('/')): + testsbase_inverse += '../' + counter += 1 + testsbase_inverse = os.path.normpath(testsbase_inverse) + + # Begin the generation. + emit += "## DO NOT EDIT! GENERATED AUTOMATICALLY!\n" + emit += "## Process this file with automake to produce Makefile.in.\n" + emit += '%s\n' % self.copyright_notice() + + uses_subdirs = False + main_snippets = string() + longrun_snippets = string() + for module in modules: + if for_test and not single_configure: + flag = module.isTests() + else: # if for_test and not single_configure + flag = True + if flag: + snippet = module.getAutomakeSnippet() + snippet = snippet.replace('lib_LIBRARIES', 'lib%_LIBRARIES') + snippet = snippet.replace( + 'lib_LTLIBRARIES', 'lib%_LTLIBRARIES') + if LD_flags: + pattern = compiler( + 'lib_LDFLAGS[\t ]*\\+=(.*?)$', re.S | re.M) + snippet = pattern.sub('', snippet) + pattern = compiler('lib_([A-Z][A-Z](?:.*?))', re.S | re.M) + snippet = pattern.sub('libtests_a_\\1', snippet) + snippet = snippet.replace('lib%_LIBRARIES', 'lib_LIBRARIES') + snippet = snippet.replace( + 'lib%_LTLIBRARIES', 'lib_LTLIBRARIES') + snippet = snippet.replace('${gl_include_guard_prefix}', + include_guard_prefix) + if check_PROGRAMS: + snippet = snippet.replace( + 'check_PROGRAMS', 'noinst_PROGRAMS') + # Check if module is 'alloca'. + if libtests and str(module) == 'alloca': + snippet += 'libtests_a_LIBADD += @%sALLOCA@\n' % perhapsLT + snippet += 'libtests_a_DEPENDENCIES += @%sALLOCA@\n' % perhapsLT + + # Skip the contents if it's entirely empty. + if snippet.strip(): + # Check status of the module. + status = module.getStatus() + islongrun = False + for word in status: + if word == 'longrunning-test': + islongrun = True + break + if not islongrun: + snippet = snippet.replace( + '\n\nEXTRA_DIST', '\nEXTRA_DIST') + main_snippets += '## begin gnulib module %s\n' % str( + module) + main_snippets += snippet + main_snippets += '## end gnulib module %s\n\n' % str( + module) + else: # if islongrunning + snippet = snippet.replace( + '\n\nEXTRA_DIST', '\nEXTRA_DIST') + longrun_snippets += '## begin gnulib module %s\n' % str( + module) + longrun_snippets += snippet + longrun_snippets += '## end gnulib module %s\n' % str( + module) + + # Test whether there are some source files in subdirectories. + for file in module.getFiles(): + if file.startswith('lib/') and file.endswith('.c') and \ + file.count('/') > 1: + uses_subdirs = True + break + + # Generate dependencies here, since it eases the debugging of test failures. + # If there are source files in subdirectories, prevent collision of the + # object files (example: hash.c and libxml/hash.c). + subdir_options = string() + if uses_subdirs: + subdir_options = string(' subdir-objects') + emit += 'AUTOMAKE_OPTIONS = 1.5 foreign%s\n\n' % subdir_options + if for_test and not single_configure: + emit += 'ACLOCAL_AMFLAGS = -I %s/%s\n\n' % ( + testsbase_inverse, m4base) + + # Nothing is being added to SUBDIRS; nevertheless the existence of this + # variable is needed to avoid an error from automake: + # "AM_GNU_GETTEXT used but SUBDIRS not defined" + emit += 'SUBDIRS = .\n' + emit += 'TESTS =\n' + emit += 'XFAIL_TESTS =\n' + emit += 'TESTS_ENVIRONMENT =\n' + emit += 'noinst_PROGRAMS =\n' + if not for_test: + emit += 'check_PROGRAMS =\n' + emit += 'noinst_HEADERS =\n' + emit += 'noinst_LIBRARIES =\n' + if libtests: + if for_test: + emit += 'noinst_LIBRARIES += libtests.a\n' + else: # if not for_test + emit += 'check_LIBRARIES = libtests.a\n' + + # Automake versions < 1.11.4 create an empty pkgdatadir at + # installation time if you specify pkgdata_DATA to empty. + # See automake bugs #10997 and #11030: + # * http://debbugs.gnu.org/10997 + # * http://debbugs.gnu.org/11030 + # So we need this workaround. + pattern = compiler('^pkgdata_DATA *\\+=', re.S | re.M) + if bool(pattern.findall(main_snippets)) or \ + bool(pattern.findall(longrun_snippets)): + emit += 'pkgdata_DATA =\n' + + emit += 'EXTRA_DIST =\n' + emit += 'BUILT_SOURCES =\n' + emit += 'SUFFIXES =\n' + emit += 'MOSTLYCLEANFILES = core *.stackdump\n' + emit += 'MOSTLYCLEANDIRS =\n' + emit += 'CLEANFILES =\n' + emit += 'DISTCLEANFILES =\n' + emit += 'MAINTAINERCLEANFILES =\n' + + # Execute edits that apply to the Makefile.am being generated. + # Execute edits that apply to the Makefile.am being generated. + current_edit = int() + makefile_am_edits = makefiletable.count() + while current_edit != makefile_am_edits: + dictionary = makefiletable[current_edit] + if dictionary['var']: + paths = list() + paths += [joinpath(dictionary['dir'], 'Makefile.am')] + paths += [os.path.normpath('./%s/Makefile.am' % + dictionary['dir'])] + paths = sorted(set(paths)) + if destfile in paths: + emit += '%s += %s\n' % (dictionary['var'], + dictionary['val']) + current_edit += 1 + + emit += '\nAM_CPPFLAGS = \\\n' + if for_test: + emit += ' -DGNULIB_STRICT_CHECKING=1 \\\n' + if witness_c_macro: + emit += ' -D%s=1 \\\n' % witness_c_macro + if witness_macro: + emit += ' -D@%s@=1 \\\n' % witness_macro + emit += ' -I. -I$(srcdir) \\\n' + emit += ' -I%s -I$(srcdir)/%s \\\n' % \ + (testsbase_inverse, testsbase_inverse) + emit += ' -I%s/%s -I$(srcdir)/%s/%s\n' % \ + (testsbase_inverse, sourcebase, testsbase_inverse, sourcebase) + emit += '\n' + local_ldadd_before = string() + local_ldadd_after = string() + if libtests: + # All test programs need to be linked with libtests.a. + # It needs to be passed to the linker before ${libname}.${libext}, since + # the tests-related modules depend on the main modules. + # It also needs to be passed to the linker after ${libname}.${libext} + # because the latter might contain incomplete modules (such as the + # 'error' module whose dependency to 'progname' is voluntarily omitted). + # The LIBTESTS_LIBDEPS can be passed to the linker once or twice, it does + # not matter. + local_ldadd_before = ' libtests.a' + local_ldadd_after = ' libtests.a $(LIBTESTS_LIBDEPS)' + emit += 'LDADD =%s %s/%s/%s.%s%s\n\n' % \ + (local_ldadd_before, testsbase_inverse, sourcebase, libname, libext, + local_ldadd_after) + if libtests: + emit += 'libtests_a_SOURCES =\n' + # Here we use $(LIBOBJS), not @LIBOBJS@. The value is the same. However, + # automake during its analysis looks for $(LIBOBJS), not for @LIBOBJS@. + emit += 'libtests_a_LIBADD = $(%stests_LIBOBJS)\n' % macro_prefix + emit += 'libtests_a_DEPENDENCIES = $(%stests_LIBOBJS)\n' % macro_prefix + emit += 'EXTRA_libtests_a_SOURCES =\n' + # The circular dependency in LDADD requires this. + emit += 'AM_LIBTOOLFLAGS = --preserve-dup-deps\n\n' + # Many test scripts use ${EXEEXT} or ${srcdir}. + # EXEEXT is defined by AC_PROG_CC through autoconf. + # srcdir is defined by autoconf and automake. + emit += "TESTS_ENVIRONMENT += EXEEXT='@EXEEXT@' srcdir='$(srcdir)'\n\n" + main_snippets = main_snippets.replace('$(top_srcdir)/build-aux/', + '$(top_srcdir)/%s/' % auxdir) + longrun_snippets = longrun_snippets.replace('$(top_srcdir)/build-aux/', + '$(top_srcdir)/%s/' % auxdir) + emit += main_snippets + longrun_snippets + emit += '# Clean up after Solaris cc.\n' + emit += 'clean-local:\n' + emit += '\trm -rf SunWS_cache\n\n' + emit += 'mostlyclean-local: mostlyclean-generic\n' + emit += '\t@for dir in \'\' $(MOSTLYCLEANDIRS); do \\\n' + emit += '\t if test -n "$$dir" && test -d $$dir; then \\\n' + emit += '\t echo "rmdir $$dir"; rmdir $$dir; \\\n' + emit += '\t fi; \\\n' + emit += '\tdone; \\\n' + emit += '\t:\n' + emit = constants.nlconvert(emit) + if type(emit) is bytes: + emit = emit.decode(ENCS['default']) + result = tuple([emit, uses_subdirs]) + return(result) |