Author: johannes Date: 2007-12-07 08:57:58 -0600 (Fri, 07 Dec 2007) New Revision: 9843
Added: trunk/gnue-common/src/utils/setup.py Modified: trunk/gnue-common/src/setup/GSetup.py Log: Moved GSetup.py from src/setup into src/utils/setup.py Modified: trunk/gnue-common/src/setup/GSetup.py =================================================================== --- trunk/gnue-common/src/setup/GSetup.py 2007-12-07 14:46:25 UTC (rev 9842) +++ trunk/gnue-common/src/setup/GSetup.py 2007-12-07 14:57:58 UTC (rev 9843) @@ -22,559 +22,8 @@ # $Id: GSetup.py,v 1.4 2003/10/06 18:33:16 reinhard Exp $ """ Base classes for package setup based on distutils + +This module is deprecated. Please use gnue.common.utils.setup instead. """ -import sys -import time -import os - -from distutils import log -from distutils.core import setup -from distutils.filelist import FileList - -import distutils.command.sdist -import distutils.command.build -import distutils.command.install - -import gnue.paths - -from gnue.common.utils import version - -__all__ = ['GSetup'] - -# ----------------------------------------------------------------------------- -# Check Python version -# ----------------------------------------------------------------------------- - -try: - if sys.hexversion < 0x02030000: - raise AttributeError - -except AttributeError: - print "-" * 70 - print """ -You are running Python %s. - -GNU Enterprise requires at least Python 2.3. -If you have a later version installed, you should run setup.py -against that version. For example, if you have Python 2.3 -installed, you may need to run: - -python2.3 setup.py -""" % sys.version.split()[0] - print "-" * 70 - sys.exit(1) - -# ----------------------------------------------------------------------------- -# Global GSetup instance -# ----------------------------------------------------------------------------- - -_setup = None - -# ============================================================================= -# SDist: build files to be distributed first -# ============================================================================= - -class SDist(distutils.command.sdist.sdist): - """ - Build files to be distributed - """ - - # ------------------------------------------------------------------------- - # Run the sdist command - # ------------------------------------------------------------------------- - - def run(self): - """ - Run the sdist command - """ - global _setup - - _setup.do_build_files('sdist') - distutils.command.sdist.sdist.run(self) - - - # ------------------------------------------------------------------------- - # Remove files not used - # ------------------------------------------------------------------------- - - def prune_file_list(self): - """ - Prune the list of files included - """ - distutils.command.sdist.sdist.prune_file_list(self) - self.filelist.exclude_pattern('*.dist_template', anchor=0) - - - # ------------------------------------------------------------------------- - # Create the directory tree that will become the source distribution arch. - # ------------------------------------------------------------------------- - - def make_release_tree(self, base_dir, files): - """ - Create the directory tree that will become the source distribution - archive. - """ - distutils.command.sdist.sdist.make_release_tree(self, base_dir, files) - self.process_templates(base_dir) - - _setup.do_build_svnrev(os.path.join(base_dir, 'src', 'svnrev.py')) - - - # ------------------------------------------------------------------------- - # Process all template files - # ------------------------------------------------------------------------- - - def process_templates(self, target): - """ - Process all distribution template files. Such a template file is - called "<filename>.dist_template" and will be stored as "<filename>" - after processing. This method replaces the following strings by their - corresponding values: - - * :PACKAGE: Name of the package, i.e. 'gnue-forms' - * :TITLE: Title of the package, i.e. 'GNU Enterprise Forms' - * :VERSION: Full version of the package, i.e. '0.6.9+svn.9794' - * :MAJOR: The major version, i.e. '0' - * :MINOR: The minor version, i.e. '6' - * :PHASE: The phase, i.e. 'final' - * :BUILD: The build, i.e. '1' - * :SVN: The current SubVersion revision - * :DATE_ISO: The date of the package formatted as YYYY-MM-DD - * :DATE_RFC: The date of the package formatted according to RFC 822 - * :TIME: The time of the package formattes as HH:MM:SS - * :FINAL: If the build is final it contains the build number, - otherwise '0' - """ - - # Build list of files to be processed. - filelist = FileList() - if filelist.include_pattern('*.dist_template', anchor=0) == 0: - # Nothing to do. - return - - # FIXME: For compatibility with old packages not yet using the version - # module. Change to unconditional import in gnue-common 0.8. - try: - from src import version - - except: - return - - # List of keywords to replace. - keywords = { - ':PACKAGE:': self.distribution.get_name(), - ':TITLE:': self.distribution.get_description(), - ':VERSION:': self.distribution.get_version(), - ':MAJOR:': str(version.major), - ':MINOR:': str(version.minor), - ':PHASE:': str(version.phase), - ':BUILD:': str(version.build), - ':SVN:': str(version.svn), - ':DATE_ISO:': time.strftime('%Y-%m-%d', time.gmtime()), - ':DATE_RFC:': time.strftime('%a, %d %b %Y', time.gmtime()), - ':TIME:': time.strftime('%H:%M:%S', time.gmtime())} - - # Hack for version numbering schemes that are limited to x.y.z. - if version.phase == 'final': - keywords[':FINAL:'] = str(version.build) - else: - keywords[':FINAL:'] = '0' - - for src in filelist.files: - dst = os.path.join(target, src[:-14]) - args = (src, dst, keywords) - self.execute(self.__process_template, args, - "generating %s from %s" % (dst, src)) - - - # ------------------------------------------------------------------------- - # Process a single template - # ------------------------------------------------------------------------- - - def __process_template(self, src, dst, keywords): - - infile = open(src, 'r') - content = infile.read() - infile.close() - - for keyword, value in keywords.iteritems(): - content = content.replace(keyword, value) - - outfile = open(dst, 'w') - outfile.write(content) - outfile.close() - - # Let destination file have the same mode than the source file. - os.chmod(dst, os.stat(src).st_mode) - - -# ============================================================================= -# build: if done from SVN, build files to be installed first -# ============================================================================= - -class Build(distutils.command.build.build): - """ - Build files to be installed - """ - - # ------------------------------------------------------------------------- - # Run the command - # ------------------------------------------------------------------------- - - def run(self): - """ - Run the build command - """ - global _setup - - if not os.path.isfile("PKG-INFO"): # downloaded from SVN? - _setup.do_build_files('build') - - distutils.command.build.build.run(self) - - if not os.path.isfile("PKG-INFO"): - _setup.do_build_svnrev(os.path.join(self.build_lib, 'gnue', - _setup.package[5:].lower(), 'svnrev.py')) - - -# ============================================================================= -# install: Some user_options are no longer allowed -# ============================================================================= - -class Install(distutils.command.install.install): - """ - Install the package - """ - - # Commented out because sometimes, to create packages, we want to install - # other tools in a different target directory than common is installed - #user_options = distutils.command.install.install.user_options - - #allowed_options = ["root=", "compile", "no-compile", "optimize=", "force", - # "skip-build", "record="] - - #user_options = [opt for opt in user_options if opt [0] in allowed_options] - - - # TODO: this code is executed as soon as this module get's importet. - # Need to check wether this is really what we want here. - user_options = distutils.command.install.install.user_options - i = 0 - for option in user_options: - i = i + 1 - if option[0] == "install-data=": - user_options.insert(i, ("install-config=", None, - "installation directory for configuration files")) - break - - - # ------------------------------------------------------------------------- - # Initalize options - # ------------------------------------------------------------------------- - - def initialize_options(self): - """ - Initialize options - """ - - distutils.command.install.install.initialize_options(self) - self.install_config = None - - - # ------------------------------------------------------------------------- - # Finalize options - set all install targets - # ------------------------------------------------------------------------- - - def finalize_options(self): - """ - Finalize options and set all install targets - """ - - if self.install_lib is None: - self.install_lib = gnue.paths.lib - if self.install_scripts is None: - self.install_scripts = gnue.paths.scripts - if self.install_data is None: - self.install_data = gnue.paths.data - if self.install_config is None: - self.install_config = gnue.paths.config - - distutils.command.install.install.finalize_options(self) - - - # ------------------------------------------------------------------------- - # install.run: generate and install path dependent files afterwards - # ------------------------------------------------------------------------- - - def run(self): - """ - Run the install command - """ - - global _setup - - _setup.check_dependencies() - - self.__outputs = [] - - # install translations - if os.path.isdir('po'): - # copy files - for fname in os.listdir('po'): - if fname[-4:] == '.gmo': - src = os.path.join('po', fname) - dst = os.path.join(self.install_data, 'share', 'locale', - fname[:-4], 'LC_MESSAGES') - self.mkpath(dst) - dst = os.path.join(dst, _setup.package + '.mo') - self.copy_file(src, dst) - self.__outputs.append(dst) - - distutils.command.install.install.run(self) - - - # ------------------------------------------------------------------------- - # install.get_outputs: list all installed files - # ------------------------------------------------------------------------- - - def get_outputs(self): - """ - List all installed files - """ - - return distutils.command.install.install.get_outputs(self) \ - + self.__outputs - - -# ============================================================================= -# GSetup: Basic class for setup scripts of GNUe packages -# ============================================================================= - -class GSetup: - """ - Base class for setup scripts of GNU Enterprise packages - """ - - # ------------------------------------------------------------------------- - # Abstract methods: setup.py scripts generally override these - # ------------------------------------------------------------------------- - - def set_params(self, params): - """ - Define setup paramters - """ - pass - - - # ------------------------------------------------------------------------- - # Build list of file - # ------------------------------------------------------------------------- - - def build_files(self, action): - """ - Build a list of files depending on a given action - """ - pass - - - # ------------------------------------------------------------------------- - # Check if all dependencies are met - # ------------------------------------------------------------------------- - - def check_dependencies(self): - """ - Check all dependencies - """ - pass - - - # ------------------------------------------------------------------------- - # Build files if called from SVN - # ------------------------------------------------------------------------- - - def do_build_files(self, action): - """ - Build all files if called from SVN - """ - - if os.name == 'posix': - - # First check if we have everything installed we need to build the - # distribution - - if os.path.isdir('po'): - # xgettext - if os.system("pygettext --version > /dev/null") != 0: - log.fatal("Could not find 'pygettext'. Strange.") - log.fatal("It should be included in the Python " \ - "distribution.") - sys.exit(1) - - # msgmerge - if os.system("msgmerge --version > /dev/null") != 0: - log.fatal("Could not find 'msgmerge'. Please install " \ - "Gettext.") - sys.exit(1) - - # msgfmt - if os.system("msgfmt --version > /dev/null") != 0: - log.fatal("Could not find 'msgfmt'. Please install " \ - "Gettext.") - sys.exit(1) - - # ----------------------------------------------------------------- - - # build translations - if os.path.isdir('po'): - log.info("building translations") - if os.system("cd po && make gmo") != 0: - sys.exit(1) - - else: - # on non posix systems just run msgfmt on existing .po files - if os.path.isdir('po'): - # msgfmt.py - argv0_path = os.path.dirname(os.path.abspath(sys.executable)) - sys.path.append(argv0_path + "\\tools\\i18n") - - msgfmt_ok = 0 - try: - import msgfmt - msgfmt_ok = 1 - except: - pass - - if msgfmt_ok == 1: - # pygettext.py exist in Python, but no msgmerge, so - # just create a placeholder... - potfile = open('po/'+ self.package +'.pot', 'w') - potfile.write("#placeholder") - potfile.close() - - # build translations - log.info("building translations") - for f in os.listdir('po'): - if f[-3:] == '.po': - msgfmt.make('po/'+f, 'po/'+f[:-3]+'.gmo') - msgfmt.MESSAGES = {} - - # --------------------------------------------------------------------- - - # do package specific stuff - self.build_files(action) - - - # ------------------------------------------------------------------------- - # Create the svnrev.py file - # ------------------------------------------------------------------------- - - def do_build_svnrev(self, filename): - """ - Create the file 'svnrev.py' which contains the current SubVersion - revision. - """ - - log.info("building svnrev.py") - output = open(filename, 'w') - output.write('svnrev = %r' % version.get_svn_revision('src')) - output.close() - - - # ------------------------------------------------------------------------- - # Helper methods for descendants - # ------------------------------------------------------------------------- - - def allfiles(self, directory): - """ - Get a list of files in a given directory, excluding some specials like - Makefile, .svn, CSV and so on - """ - - directory = os.path.normpath(directory) - exclude = [".svn", "CVS", "README.cvs", ".cvsignore", "Makefile"] - return [directory + "/" + fname for fname in os.listdir(directory) \ - if not fname in exclude and - not os.path.isdir(os.path.join(directory, fname))] - - - # ------------------------------------------------------------------------- - # Get all packages in a directory - # ------------------------------------------------------------------------- - - def __get_packages(self, directory, package): - - content = os.listdir(directory) - result = [] - if "__init__.py" in content: - result = [package] - for name in content: - fullname = os.path.join(directory, name) - if os.path.isdir(fullname): - result = result + self.__get_packages(fullname, package + - "." + name) - return result - - - # ------------------------------------------------------------------------- - # Call the actual setup routine - # ------------------------------------------------------------------------- - - def run(self): - """ - Run the setup routine - """ - - global _setup - - # set global variable - _setup = self - - setup_params = {"cmdclass_sdist": SDist, - "cmdclass_build": Build, - "cmdclass_install": Install - } - - _setup.set_params(setup_params) - - # make package available - self.package = setup_params["name"] - - # find out all packages - if not setup_params.has_key("packages"): - packages = [] - - for module, directory in setup_params["package_dir"].items(): - packages = packages + self.__get_packages(directory, module) - - setup_params["packages"] = packages - - # remove data files that are not available - for target, files in setup_params["data_files"]: - i = 0 - while i < len(files): - fname = files[i] - if os.path.isfile(fname): - i += 1 - else: - log.warn("warning: did not find file %s" % fname) - files.remove(fname) - - # now call setup - setup(name = setup_params["name"], - version = setup_params["version"], - description = setup_params["description"], - long_description = setup_params["long_description"], - author = setup_params["author"], - author_email = setup_params["author_email"], - url = setup_params["url"], - license = setup_params["license"], - packages = setup_params["packages"], - package_dir = setup_params["package_dir"], - scripts = setup_params["scripts"], - data_files = setup_params["data_files"], - - # Override certain command classes with our own ones - cmdclass = {"sdist": setup_params["cmdclass_sdist"], - "build": setup_params["cmdclass_build"], - "install": setup_params["cmdclass_install"]}) +from gnue.common.utils.setup import GSetup Added: trunk/gnue-common/src/utils/setup.py =================================================================== --- trunk/gnue-common/src/utils/setup.py 2007-12-07 14:46:25 UTC (rev 9842) +++ trunk/gnue-common/src/utils/setup.py 2007-12-07 14:57:58 UTC (rev 9843) @@ -0,0 +1,580 @@ +# GNU Enterprise Common Library - Installation Helper For Tools +# +# This file is part of GNU Enterprise. +# +# GNU Enterprise is free software; you can redistribute it +# and/or modify it under the terms of the GNU General Public +# License as published by the Free Software Foundation; either +# version 2, or (at your option) any later version. +# +# GNU Enterprise is distributed in the hope that it will be +# useful, but WITHOUT ANY WARRANTY; without even the implied +# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +# PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public +# License along with program; see the file COPYING. If not, +# write to the Free Software Foundation, Inc., 59 Temple Place +# - Suite 330, Boston, MA 02111-1307, USA. +# +# Copyright 2001-2007 Free Software Foundation +# +# $Id: GSetup.py,v 1.4 2003/10/06 18:33:16 reinhard Exp $ +""" +Base classes for package setup based on distutils +""" + +import sys +import time +import os + +from distutils import log +from distutils.core import setup +from distutils.filelist import FileList + +import distutils.command.sdist +import distutils.command.build +import distutils.command.install + +import gnue.paths + +from gnue.common.utils import version + +__all__ = ['GSetup'] + +# ----------------------------------------------------------------------------- +# Check Python version +# ----------------------------------------------------------------------------- + +try: + if sys.hexversion < 0x02030000: + raise AttributeError + +except AttributeError: + print "-" * 70 + print """ +You are running Python %s. + +GNU Enterprise requires at least Python 2.3. +If you have a later version installed, you should run setup.py +against that version. For example, if you have Python 2.3 +installed, you may need to run: + +python2.3 setup.py +""" % sys.version.split()[0] + print "-" * 70 + sys.exit(1) + +# ----------------------------------------------------------------------------- +# Global GSetup instance +# ----------------------------------------------------------------------------- + +_setup = None + +# ============================================================================= +# SDist: build files to be distributed first +# ============================================================================= + +class SDist(distutils.command.sdist.sdist): + """ + Build files to be distributed + """ + + # ------------------------------------------------------------------------- + # Run the sdist command + # ------------------------------------------------------------------------- + + def run(self): + """ + Run the sdist command + """ + global _setup + + _setup.do_build_files('sdist') + distutils.command.sdist.sdist.run(self) + + + # ------------------------------------------------------------------------- + # Remove files not used + # ------------------------------------------------------------------------- + + def prune_file_list(self): + """ + Prune the list of files included + """ + distutils.command.sdist.sdist.prune_file_list(self) + self.filelist.exclude_pattern('*.dist_template', anchor=0) + + + # ------------------------------------------------------------------------- + # Create the directory tree that will become the source distribution arch. + # ------------------------------------------------------------------------- + + def make_release_tree(self, base_dir, files): + """ + Create the directory tree that will become the source distribution + archive. + """ + distutils.command.sdist.sdist.make_release_tree(self, base_dir, files) + self.process_templates(base_dir) + + _setup.do_build_svnrev(os.path.join(base_dir, 'src', 'svnrev.py')) + + + # ------------------------------------------------------------------------- + # Process all template files + # ------------------------------------------------------------------------- + + def process_templates(self, target): + """ + Process all distribution template files. Such a template file is + called "<filename>.dist_template" and will be stored as "<filename>" + after processing. This method replaces the following strings by their + corresponding values: + + * :PACKAGE: Name of the package, i.e. 'gnue-forms' + * :TITLE: Title of the package, i.e. 'GNU Enterprise Forms' + * :VERSION: Full version of the package, i.e. '0.6.9+svn.9794' + * :MAJOR: The major version, i.e. '0' + * :MINOR: The minor version, i.e. '6' + * :PHASE: The phase, i.e. 'final' + * :BUILD: The build, i.e. '1' + * :SVN: The current SubVersion revision + * :DATE_ISO: The date of the package formatted as YYYY-MM-DD + * :DATE_RFC: The date of the package formatted according to RFC 822 + * :TIME: The time of the package formattes as HH:MM:SS + * :FINAL: If the build is final it contains the build number, + otherwise '0' + """ + + # Build list of files to be processed. + filelist = FileList() + if filelist.include_pattern('*.dist_template', anchor=0) == 0: + # Nothing to do. + return + + # FIXME: For compatibility with old packages not yet using the version + # module. Change to unconditional import in gnue-common 0.8. + try: + from src import version + + except: + return + + # List of keywords to replace. + keywords = { + ':PACKAGE:': self.distribution.get_name(), + ':TITLE:': self.distribution.get_description(), + ':VERSION:': self.distribution.get_version(), + ':MAJOR:': str(version.major), + ':MINOR:': str(version.minor), + ':PHASE:': str(version.phase), + ':BUILD:': str(version.build), + ':SVN:': str(version.svn), + ':DATE_ISO:': time.strftime('%Y-%m-%d', time.gmtime()), + ':DATE_RFC:': time.strftime('%a, %d %b %Y', time.gmtime()), + ':TIME:': time.strftime('%H:%M:%S', time.gmtime())} + + # Hack for version numbering schemes that are limited to x.y.z. + if version.phase == 'final': + keywords[':FINAL:'] = str(version.build) + else: + keywords[':FINAL:'] = '0' + + for src in filelist.files: + dst = os.path.join(target, src[:-14]) + args = (src, dst, keywords) + self.execute(self.__process_template, args, + "generating %s from %s" % (dst, src)) + + + # ------------------------------------------------------------------------- + # Process a single template + # ------------------------------------------------------------------------- + + def __process_template(self, src, dst, keywords): + + infile = open(src, 'r') + content = infile.read() + infile.close() + + for keyword, value in keywords.iteritems(): + content = content.replace(keyword, value) + + outfile = open(dst, 'w') + outfile.write(content) + outfile.close() + + # Let destination file have the same mode than the source file. + os.chmod(dst, os.stat(src).st_mode) + + +# ============================================================================= +# build: if done from SVN, build files to be installed first +# ============================================================================= + +class Build(distutils.command.build.build): + """ + Build files to be installed + """ + + # ------------------------------------------------------------------------- + # Run the command + # ------------------------------------------------------------------------- + + def run(self): + """ + Run the build command + """ + global _setup + + if not os.path.isfile("PKG-INFO"): # downloaded from SVN? + _setup.do_build_files('build') + + distutils.command.build.build.run(self) + + if not os.path.isfile("PKG-INFO"): + _setup.do_build_svnrev(os.path.join(self.build_lib, 'gnue', + _setup.package[5:].lower(), 'svnrev.py')) + + +# ============================================================================= +# install: Some user_options are no longer allowed +# ============================================================================= + +class Install(distutils.command.install.install): + """ + Install the package + """ + + # Commented out because sometimes, to create packages, we want to install + # other tools in a different target directory than common is installed + #user_options = distutils.command.install.install.user_options + + #allowed_options = ["root=", "compile", "no-compile", "optimize=", "force", + # "skip-build", "record="] + + #user_options = [opt for opt in user_options if opt [0] in allowed_options] + + + # TODO: this code is executed as soon as this module get's importet. + # Need to check wether this is really what we want here. + user_options = distutils.command.install.install.user_options + i = 0 + for option in user_options: + i = i + 1 + if option[0] == "install-data=": + user_options.insert(i, ("install-config=", None, + "installation directory for configuration files")) + break + + + # ------------------------------------------------------------------------- + # Initalize options + # ------------------------------------------------------------------------- + + def initialize_options(self): + """ + Initialize options + """ + + distutils.command.install.install.initialize_options(self) + self.install_config = None + + + # ------------------------------------------------------------------------- + # Finalize options - set all install targets + # ------------------------------------------------------------------------- + + def finalize_options(self): + """ + Finalize options and set all install targets + """ + + if self.install_lib is None: + self.install_lib = gnue.paths.lib + if self.install_scripts is None: + self.install_scripts = gnue.paths.scripts + if self.install_data is None: + self.install_data = gnue.paths.data + if self.install_config is None: + self.install_config = gnue.paths.config + + distutils.command.install.install.finalize_options(self) + + + # ------------------------------------------------------------------------- + # install.run: generate and install path dependent files afterwards + # ------------------------------------------------------------------------- + + def run(self): + """ + Run the install command + """ + + global _setup + + _setup.check_dependencies() + + self.__outputs = [] + + # install translations + if os.path.isdir('po'): + # copy files + for fname in os.listdir('po'): + if fname[-4:] == '.gmo': + src = os.path.join('po', fname) + dst = os.path.join(self.install_data, 'share', 'locale', + fname[:-4], 'LC_MESSAGES') + self.mkpath(dst) + dst = os.path.join(dst, _setup.package + '.mo') + self.copy_file(src, dst) + self.__outputs.append(dst) + + distutils.command.install.install.run(self) + + + # ------------------------------------------------------------------------- + # install.get_outputs: list all installed files + # ------------------------------------------------------------------------- + + def get_outputs(self): + """ + List all installed files + """ + + return distutils.command.install.install.get_outputs(self) \ + + self.__outputs + + +# ============================================================================= +# GSetup: Basic class for setup scripts of GNUe packages +# ============================================================================= + +class GSetup: + """ + Base class for setup scripts of GNU Enterprise packages + """ + + # ------------------------------------------------------------------------- + # Abstract methods: setup.py scripts generally override these + # ------------------------------------------------------------------------- + + def set_params(self, params): + """ + Define setup paramters + """ + pass + + + # ------------------------------------------------------------------------- + # Build list of file + # ------------------------------------------------------------------------- + + def build_files(self, action): + """ + Build a list of files depending on a given action + """ + pass + + + # ------------------------------------------------------------------------- + # Check if all dependencies are met + # ------------------------------------------------------------------------- + + def check_dependencies(self): + """ + Check all dependencies + """ + pass + + + # ------------------------------------------------------------------------- + # Build files if called from SVN + # ------------------------------------------------------------------------- + + def do_build_files(self, action): + """ + Build all files if called from SVN + """ + + if os.name == 'posix': + + # First check if we have everything installed we need to build the + # distribution + + if os.path.isdir('po'): + # xgettext + if os.system("pygettext --version > /dev/null") != 0: + log.fatal("Could not find 'pygettext'. Strange.") + log.fatal("It should be included in the Python " \ + "distribution.") + sys.exit(1) + + # msgmerge + if os.system("msgmerge --version > /dev/null") != 0: + log.fatal("Could not find 'msgmerge'. Please install " \ + "Gettext.") + sys.exit(1) + + # msgfmt + if os.system("msgfmt --version > /dev/null") != 0: + log.fatal("Could not find 'msgfmt'. Please install " \ + "Gettext.") + sys.exit(1) + + # ----------------------------------------------------------------- + + # build translations + if os.path.isdir('po'): + log.info("building translations") + if os.system("cd po && make gmo") != 0: + sys.exit(1) + + else: + # on non posix systems just run msgfmt on existing .po files + if os.path.isdir('po'): + # msgfmt.py + argv0_path = os.path.dirname(os.path.abspath(sys.executable)) + sys.path.append(argv0_path + "\\tools\\i18n") + + msgfmt_ok = 0 + try: + import msgfmt + msgfmt_ok = 1 + except: + pass + + if msgfmt_ok == 1: + # pygettext.py exist in Python, but no msgmerge, so + # just create a placeholder... + potfile = open('po/'+ self.package +'.pot', 'w') + potfile.write("#placeholder") + potfile.close() + + # build translations + log.info("building translations") + for f in os.listdir('po'): + if f[-3:] == '.po': + msgfmt.make('po/'+f, 'po/'+f[:-3]+'.gmo') + msgfmt.MESSAGES = {} + + # --------------------------------------------------------------------- + + # do package specific stuff + self.build_files(action) + + + # ------------------------------------------------------------------------- + # Create the svnrev.py file + # ------------------------------------------------------------------------- + + def do_build_svnrev(self, filename): + """ + Create the file 'svnrev.py' which contains the current SubVersion + revision. + """ + + log.info("building svnrev.py") + output = open(filename, 'w') + output.write('svnrev = %r' % version.get_svn_revision('src')) + output.close() + + + # ------------------------------------------------------------------------- + # Helper methods for descendants + # ------------------------------------------------------------------------- + + def allfiles(self, directory): + """ + Get a list of files in a given directory, excluding some specials like + Makefile, .svn, CSV and so on + """ + + directory = os.path.normpath(directory) + exclude = [".svn", "CVS", "README.cvs", ".cvsignore", "Makefile"] + return [directory + "/" + fname for fname in os.listdir(directory) \ + if not fname in exclude and + not os.path.isdir(os.path.join(directory, fname))] + + + # ------------------------------------------------------------------------- + # Get all packages in a directory + # ------------------------------------------------------------------------- + + def __get_packages(self, directory, package): + + content = os.listdir(directory) + result = [] + if "__init__.py" in content: + result = [package] + for name in content: + fullname = os.path.join(directory, name) + if os.path.isdir(fullname): + result = result + self.__get_packages(fullname, package + + "." + name) + return result + + + # ------------------------------------------------------------------------- + # Call the actual setup routine + # ------------------------------------------------------------------------- + + def run(self): + """ + Run the setup routine + """ + + global _setup + + # set global variable + _setup = self + + setup_params = {"cmdclass_sdist": SDist, + "cmdclass_build": Build, + "cmdclass_install": Install + } + + _setup.set_params(setup_params) + + # make package available + self.package = setup_params["name"] + + # find out all packages + if not setup_params.has_key("packages"): + packages = [] + + for module, directory in setup_params["package_dir"].items(): + packages = packages + self.__get_packages(directory, module) + + setup_params["packages"] = packages + + # remove data files that are not available + for target, files in setup_params["data_files"]: + i = 0 + while i < len(files): + fname = files[i] + if os.path.isfile(fname): + i += 1 + else: + log.warn("warning: did not find file %s" % fname) + files.remove(fname) + + # now call setup + setup(name = setup_params["name"], + version = setup_params["version"], + description = setup_params["description"], + long_description = setup_params["long_description"], + author = setup_params["author"], + author_email = setup_params["author_email"], + url = setup_params["url"], + license = setup_params["license"], + packages = setup_params["packages"], + package_dir = setup_params["package_dir"], + scripts = setup_params["scripts"], + data_files = setup_params["data_files"], + + # Override certain command classes with our own ones + cmdclass = {"sdist": setup_params["cmdclass_sdist"], + "build": setup_params["cmdclass_build"], + "install": setup_params["cmdclass_install"]}) _______________________________________________ commit-gnue mailing list commit-gnue@gnu.org http://lists.gnu.org/mailman/listinfo/commit-gnue