diff options
author | Slávek Banko <[email protected]> | 2014-01-18 16:57:50 +0100 |
---|---|---|
committer | Slávek Banko <[email protected]> | 2014-01-18 16:59:29 +0100 |
commit | 5559f44ec69d0117494b80a0eaa235bd7baa2561 (patch) | |
tree | cd0fe69ade3709ae18619959ca6815f17a95166b /src/kdedistutils.py | |
parent | edae246dc73fd1a4d239d330cda804f7c8dc32bc (diff) | |
download | pytdeextensions-5559f44ec69d0117494b80a0eaa235bd7baa2561.tar.gz pytdeextensions-5559f44ec69d0117494b80a0eaa235bd7baa2561.zip |
Rename kdedistutils => tdedistutils
Diffstat (limited to 'src/kdedistutils.py')
-rw-r--r-- | src/kdedistutils.py | 2278 |
1 files changed, 0 insertions, 2278 deletions
diff --git a/src/kdedistutils.py b/src/kdedistutils.py deleted file mode 100644 index ceaa499..0000000 --- a/src/kdedistutils.py +++ /dev/null @@ -1,2278 +0,0 @@ -#!/usr/bin/python -########################################################################### -# kdedistutils - description # -# ------------------------------ # -# begin : Thu Apr 21 2005 # -# copyright : (C) 2005 by Simon Edwards # -# email : [email protected] # -# # -########################################################################### -# # -# This program is free software; you can redistribute it and/or modify # -# it under the terms of the GNU Library General Public License as # -# published by the Free Software Foundation; either version 2 of the # -# License, or (at your option) any later version. # -# # -########################################################################### - -import distutils.core -from distutils.core import Extension -from distutils.cmd import Command -from distutils.dist import Distribution -from distutils.command.build import build -from distutils.command.install import install -from distutils.command.install_scripts import install_scripts -from distutils.command.install_data import install_data -from distutils.command.install_lib import install_lib -from distutils.util import change_root, convert_path -from distutils.spawn import find_executable,spawn -from distutils import sysconfig -from distutils import log -from distutils import file_util -from distutils import dir_util -from distutils.util import byte_compile -import qtuicompiler -import stat -import os,os.path,imp,glob -import sys -from types import StringType - -INSTALL_LIST = 'install_log.txt' - -# Trinity-specific paths -tqt_modules = [] -for m_path in sys.path: - if os.path.exists(os.path.join(m_path, 'sip4_tqt')): - m_sip_dir = os.path.join(m_path, 'sip4_tqt') - tqt_modules.insert(0, m_sip_dir) - if os.path.exists(os.path.join(m_path, 'python_tqt')): - m_pyqt_dir = os.path.join(m_path, 'python_tqt') - tqt_modules.insert(0, m_pyqt_dir) -for m_path in tqt_modules: - sys.path.insert(0, m_path) - - -########################################################################### -def setup(**arg_dict): - - if 'cmdclass' not in arg_dict: - arg_dict['cmdclass'] = {} - - cmdclass = arg_dict['cmdclass'] - - arg_dict.setdefault('data_files',[]) - - kdecmdclass = {'install' : InstallKDE, - 'install_executable_links' : InstallExecutableLinks, - 'install_application_data' : InstallApplicationDataAndLinks, - 'build_messages' : BuildI18NMessages, - 'install_messages' : InstallI18NMessages, - 'update_messages' : UpdateI18NMessages, - 'checkpyqt' : CheckPyQt, - 'checkpytde' : CheckPyTDE, - 'uninstall' : Uninstall, - 'build' : BuildKDE, - 'build_kcm' : BuildKControlModule, - 'install_kcm' : InstallKControlModule, - 'build_html' : BuildDocbookHTML, - 'install_html' : InstallDocbookHTML, - 'install_lib' : InstallLibWithRoot, - 'build_tdeioslave' : BuildTdeioslave, - 'install_tdeioslave' : InstallTdeioslave} - - for key in kdecmdclass.iterkeys(): - cmdclass.setdefault(key,kdecmdclass[key]) - - arg_dict.setdefault('distclass',KDEDistribution) - - apply(distutils.core.setup,[],arg_dict) - -########################################################################### -class KDEDistribution(Distribution): - def __init__(self,attrs=None): - self.min_kde_version = None - self.min_qt_version = None - self.kcontrol_modules = None - self.tdeioslaves = None - self.executable_links = None - self.docbooks = None - self.application_data = None - self.i18n = None - Distribution.__init__(self,attrs) - -########################################################################### -def has_kcms(self): - if self.distribution.kcontrol_modules is None: - return 0 - return len(self.distribution.kcontrol_modules)!=0 - -def has_docbook_html(self): - if self.distribution.docbooks is None: - return 0 - return len(self.distribution.docbooks)!=0 - -def has_messages(self): - if self.distribution.i18n is None: - return 0 - return len(self.distribution.i18n)!=0 - -def has_application_data(self): - if self.distribution.application_data is None: - return 0 - return len(self.distribution.application_data)!=0 - -def has_tdeioslaves(self): - if self.distribution.tdeioslaves is None: - return 0 - return len(self.distribution.tdeioslaves)!=0 - -########################################################################### -# Our slightly extended build command. This also does kcontrol modules. -class BuildKDE(build): - - user_options = build.user_options[:] - user_options.append( ('msgfmt-exe=',None,'Path to the msgfmt executable') ) - user_options.append( ('meinproc-exe=',None,'Path to the meinproc executable') ) - - sub_commands = build.sub_commands[:] - sub_commands.append( ('build_kcm',has_kcms) ) - sub_commands.append( ('build_tdeioslave',has_tdeioslaves) ) - sub_commands.append( ('build_html',has_docbook_html) ) - sub_commands.append( ('build_messages',has_messages) ) - - def __init__(self,dist): - build.__init__(self,dist) - self.has_kcms = has_kcms - self.has_tdeioslaves = has_tdeioslaves - self.has_docbook_html = has_docbook_html - self.has_messages = has_messages - - def initialize_options(self): - self.msgfmt_exe = None - self.meinproc_exe = None - build.initialize_options(self) - - def finalize_options(self): - build.finalize_options(self) - - if self.msgfmt_exe is None: - # Find msgfmt - canidatepaths = [] - canidatepaths.append( ask_kde_config('--install exe --expandvars').strip() ) - self.msgfmt_exe = FindExeOnPath('msgfmt',canidatepaths) - if self.msgfmt_exe is None: - raise SystemExit, "Unable to find 'msgfmt', needed to build i18n messages." - - if self.meinproc_exe is None: - # Find meinproc - canidatepaths = [] - canidatepaths.append( ask_kde_config('--install exe --expandvars').strip() ) - self.meinproc_exe = FindExeOnPath('meinproc',canidatepaths) - if self.meinproc_exe is None: - raise SystemExit, "Unable to find 'meinproc', needed to generate Docbook HTML documentation." - -########################################################################### -def has_executable_links(self): - if self.distribution.executable_links is None: - return 0 - return len(self.distribution.executable_links)!=0 - -########################################################################### -class InstallKDE(install): - user_options = install.user_options[:] - user_options.append( ('kde-prefix=',None,"TDE installation prefix") ) - user_options.append( ('install-messages=',None,"installation directory for i18n message files") ) - user_options.append( ('install-html=',None,"installation directory for Docbook HTML files") ) - user_options.append( ('install-cmd=',None,"Command to use to install the files") ) - user_options.append( ('install-xdg-apps=',None,"directory for XDG app files") ) - user_options.append( ('install-kcm=',None,"directory for kcm library files") ) - user_options.append( ('install-tdeioslave',None,"directory for tdeioslave library files") ) - user_options.append( ('install-protocol',None,"directory for tdeioslave protocol files") ) - - sub_commands = install.sub_commands[:] - sub_commands.insert(0, ('checkpytde',None) ) - sub_commands.insert(0, ('checkpyqt',None) ) - sub_commands.append( ('install_executable_links',has_executable_links) ) - sub_commands.append( ('install_messages',has_messages) ) - sub_commands.append( ('install_html',has_docbook_html) ) - sub_commands.append( ('install_kcm',has_kcms) ) - sub_commands.append( ('install_tdeioslave',has_tdeioslaves) ) - sub_commands.append( ('install_application_data',has_application_data) ) - - def initialize_options(self): - self.kde_prefix = None - self.install_messages = None - self.install_html = None - self.install_cmd = None - self.install_xdg_apps = None - self.install_kcm = None - self.install_tdeioslave = None - self.install_protocol = None - self.install_application_data = None - install.initialize_options(self) - - def finalize_options(self): - # If no install prefix was provided, then we try to detect the KDE install prefix. - self.user_supplied_kde_prefix = True - - if self.install_scripts is None: - if self.kde_prefix is not None: - self.install_scripts = os.path.join(self.kde_prefix,'bin') - else: - self.announce("Detecting TDE 'bin' directory...") - self.install_scripts = ask_kde_config('--install exe --expandvars').strip() - self.announce(" ...TDE 'bin' directory is %s" % self.install_scripts) - - if self.install_application_data is None: - if self.kde_prefix is not None: - self.install_application_data = os.path.join(self.kde_prefix,'share/apps',self.distribution.metadata.name) - else: - self.announce("Detecting TDE application directory...") - kdeappdir = ask_kde_config('--install data --expandvars').strip() - self.announce(" ...TDE application directory is %s" % self.install_application_data) - self.install_application_data = os.path.join(kdeappdir,self.distribution.metadata.name) - - if self.install_messages is None: - if self.kde_prefix is not None: - self.install_messages = os.path.join(self.kde_prefix,'share/locale') - else: - self.announce("Detecting TDE messages directory...") - self.install_messages = ask_kde_config('--install locale --expandvars').strip() - self.announce(" ...TDE messages directory is %s" % self.install_messages) - - if self.install_html is None: - if self.kde_prefix is not None: - self.install_html = os.path.join(self.kde_prefix,'share/doc/tde/HTML') - else: - self.announce("Detecting TDE HTML directory...") - self.install_html = ask_kde_config('--install html --expandvars').strip() - self.announce(" ...TDE HTML directory is %s" % self.install_html) - - if self.kde_prefix is None: - self.announce("Detecting TDE install prefix...") - self.kde_prefix = ask_kde_config('--prefix').strip() - self.announce(" ...TDE install prefix is %s" % self.kde_prefix) - self.user_supplied_kde_prefix = False - - if self.install_cmd is None: - self.announce("Detecting 'install' command...") - # Ok, time to find the install command. - self.install_cmd = find_executable('install') - if self.install_cmd is None: - raise SystemExit, "Unable to find the 'install' command, needed to install libraries." - self.announce(" ...'install' command is %s" % self.install_cmd) - - if self.install_xdg_apps is None: - self.announce("Detecting XDG apps directory...") - self.install_xdg_apps = ask_kde_config('--install xdgdata-apps --expandvars').strip() - self.announce(" ...XDG apps directory is %s" % self.install_xdg_apps) - - if self.install_kcm is None: - self.announce("Detecting kcm library directory...") - self.install_kcm = os.path.join(ask_kde_config('--install lib --expandvars').strip(),'trinity') - self.announce(" ...kcm library directory is %s" % self.install_kcm) - - if self.install_tdeioslave is None: - self.announce("Detecting tdeioslave library directory...") - self.install_tdeioslave = os.path.join(ask_kde_config('--install lib --expandvars').strip(),'trinity') - self.announce(" ...tdeioslave library directory is %s" % self.install_tdeioslave) - - if self.install_protocol is None: - self.announce("Detecting tdeioslave protocol directory...") - self.install_protocol = ask_kde_config('--install services --expandvars').strip() - self.announce(" ...tdeioslave protocol directory is %s" % self.install_protocol) - - install.finalize_options(self) - - if self.root is not None: - self.change_roots('application_data','html','messages','xdg_apps','kcm') - - def get_command_name(self): - return 'install' - - def run(self): - global INSTALL_LIST - install.run(self) - - # Write out the uninstall list. - fhandle = open(INSTALL_LIST,'w') - for item in self.get_outputs(): - fhandle.write(item) - fhandle.write('\n') - fhandle.close() - -########################################################################### -class InstallApplicationDataAndLinks(install_data): - def get_command_name(self): - return 'install_application_data' - - def initialize_options(self): - install_data.initialize_options(self) - - self.data_files = self.distribution.application_data - - def finalize_options(self): - self.set_undefined_options('install', - ('install_application_data', 'install_dir'), - ('root', 'root'), - ('force', 'force'), - ) - - def run(self): - self.outfiles.extend(self.mkpath(self.install_dir)) - for f in self.data_files: - if type(f) is StringType: - # it's a simple file, so copy it - f = convert_path(f) - if self.warn_dir: - self.warn("setup script did not provide a directory for " - "'%s' -- installing right in '%s'" % - (f, self.install_dir)) - if os.path.isfile(f): - (out, _) = self.copy_file(f, self.install_dir) - self.outfiles.append(out) - elif os.path.isdir(f): - out = self.copy_tree(f,os.path.join(self.install_dir,f)) - self.outfiles.extend(out) - else: - self.warn("Setup script can't find file or directory %s needed for installation." % f) - else: - # it's a tuple with path to install to and a list of files - dir = convert_path(f[0]) - if not os.path.isabs(dir): - dir = change_root(self.install_dir, dir) - elif self.root: - dir = change_root(self.root, dir) - self.outfiles.extend(self.mkpath(dir)) - - if f[1] == []: - # If there are no files listed, the user must be - # trying to create an empty directory, so add the - # directory to the list of output files. - self.outfiles.append(dir) - else: - # Copy files, adding them to the list of output files. - for data in f[1]: - data = convert_path(data) - if os.path.islink(data): - # Transplant the link to the new location without changing - # where it points to. (ie it is _not_ relocated). - dest = os.path.join(dir, os.path.basename(data)) - if os.path.exists(dest): - os.remove(dest) - os.symlink(os.readlink(data),dest) - log.info("moving link %s -> %s" % (data,dest) ) - #os.chmod(dest, os.stat(data)[stat.ST_MODE]) - elif os.path.isdir(data): - out = self.copy_tree(data,dir) - self.outfiles.extend(out) - else: - (out, _) = self.copy_file(data, dir) - self.outfiles.append(out) - - # Compile the .ui files - install_cmd = self.get_finalized_command('install') - prefix = self.install_dir - if prefix[-1] != os.sep: - prefix = prefix + os.sep - self.outfiles.extend(compile_qtdesigner(self.outfiles, force=1, prefix=prefix, base_dir=install_cmd.prefix, dry_run=self.dry_run)) - - # Byte compile the .py files - from distutils.util import byte_compile - byte_compile(self.outfiles, optimize=0, force=1, prefix=prefix, base_dir=install_cmd.prefix, dry_run=self.dry_run) - - # Add the .pyc files to the list of outfiles. - self.outfiles.extend( [item+'c' for item in self.outfiles if item.endswith('.py')] ) - - def mkpath(self, name, mode=0777): - return dir_util.mkpath(name, mode, dry_run=self.dry_run) - -########################################################################### -class InstallExecutableLinks(Command): - description = "Install symlinks" - - user_options = [] - - def initialize_options(self): - self.outfiles = [] - - def finalize_options(self): - pass - - def get_command_name(self): - return 'install_executable_links' - - def run(self): - # FIXME add cmd options? - install_script_cmd = self.get_finalized_command('install_scripts') - install_data_cmd = self.get_finalized_command('install_application_data') - - destination_dir = install_data_cmd.install_dir - - if not os.path.exists(install_script_cmd.install_dir): - self.outfiles.extend(self.mkpath(install_script_cmd.install_dir)) - - if self.distribution.executable_links is not None: - for link in self.distribution.executable_links: - symname = os.path.join(install_script_cmd.install_dir,link[0]) - target = os.path.join(destination_dir,link[1]) - log.info("symlinking %s -> %s", symname, target) - if not self.dry_run: - if os.path.islink(symname): - os.remove(symname) - os.symlink(target,symname) - self.outfiles.append(symname) - - def get_outputs(self): - return self.outfiles or [] - - def mkpath(self, name, mode=0777): - return dir_util.mkpath(name, mode, dry_run=self.dry_run) - -########################################################################### -# Fix the --root option for the install_lib command. -class InstallLibWithRoot(install_lib): - user_options = install_lib.user_options[:] - user_options.append( ('root=',None,"install everything relative to this alternate root directory") ) - - def initialize_options(self): - install_lib.initialize_options(self) - self.root = None - - def finalize_options(self): - own_install_dir = self.install_dir is not None - - install_lib.finalize_options(self) - self.set_undefined_options('install', ('root', 'root')) - - if self.root is not None and own_install_dir: - self.install_dir = change_root(self.root, self.install_dir) - -########################################################################### -class Uninstall(Command): - description = "Remove all installed files" - - user_options = [] - - def initialize_options(self): - pass - - def finalize_options(self): - pass - - def get_command_name(self): - return 'uninstall' - - def run(self): - global INSTALL_LIST - - if not os.path.isfile(INSTALL_LIST): - self.announce("Unable to uninstall, can't find the file list %s." % INSTALL_LIST) - return - - # Suck in the file list. - fhandle = open(INSTALL_LIST,'r') - file_list = fhandle.readlines() - fhandle.close() - - # Remove the files first. - for item in file_list: - item = item.strip() - if os.path.isfile(item) or os.path.islink(item): - self.announce("removing '%s'" % item) - if not self.dry_run: - try: - os.remove(item) - except OSError, details: - self.warn("Could not remove file: %s" % details) - elif not os.path.isdir(item): - self.announce("skipping removal of '%s' (does not exist)" % item) - - # Remove the directories. - file_list.sort() - file_list.reverse() - # Starting with the longest paths first. - for item in file_list: - item = item.strip() - if os.path.isdir(item): - self.announce("removing '%s'" % item) - if not self.dry_run: - try: - os.rmdir(item) - except OSError, details: - self.warn("Could not remove directory: %s" % details) - -########################################################################### -class BuildKControlModule(Command): - description = "Build KControl extensions" - - user_options = [('no-kcontrol',None,"Don't build kcontrol extensions"), - ('build-dir=','b', "build directory (where to install from)"), - ('python-dir=',None,'Directory containing the Python installation'), - ('python-inc-dir=',None,'Directory containing C Header files for Python'), - ('kde-inc-dir=',None,'Directory containing C++ header files for KDE'), - ('kde-lib-dir=',None,'Directory containing library files for KDE'), - ('kde-kcm-lib-dir=',None,'Directory for KDE kcm library files'), - ('qt-inc-dir=',None,'Directory containing C++ header files for Qt'), - ('qt-lib-dir=',None,'Directory containing library files for Qt'), - ('sip-dir=',None,'Directory containing the sip library files'), - ('clib=',None,'gcc library and path'), - ('pyqt-dir=',None,'PyQt module directory'), - ('pytde-dir=',None,'PyTDE module directory'), - ('data-dir=',None,'installation directory for data (script) files')] - - def initialize_options(self): - self.no_kcontrol = 0 - self.build_dir = None - self.python_inc_dir = None - self.python_dir = None - self.kde_inc_dir = None - self.kde_lib_dir = None - self.kde_kcm_lib_dir = None - self.qt_inc_dir = None - self.qt_lib_dir = None - self.sip_dir = None - self.clib = None - self.pyqt_dir = None - self.pytde_dir = None - self.data_dir = None - - def finalize_options(self): - if self.no_kcontrol==0: - self.set_undefined_options('install', ('build_base', 'build_dir'),('install_application_data','data_dir')) - - install = self.get_finalized_command('install') - self.install_prefix = ask_kde_config('--prefix').strip() - - # KDE inc dir: find it! - if self.kde_inc_dir is None: - canidatepaths = [] - tdedir = os.getenv("TDEDIR") - if tdedir!=None: - canidatepaths.append(os.path.join(tdedir,"include")) - canidatepaths.append(os.path.join(install.prefix,"include")) - canidatepaths.append(os.path.join(self.install_prefix,'include')) - canidatepaths.append(os.path.join(self.install_prefix,'include','tde')) - self.kde_inc_dir = FindFileInPaths('tdeapplication.h',canidatepaths) - if self.kde_inc_dir is None: - raise SystemExit, "Failed to find the KDE header file directory." - if FindFileInPaths('tdeapplication.h',[self.kde_inc_dir]) is None: - raise SystemExit, "Failed to find KDE header files in: %s" % self.kde_inc_dir - self.announce("Using %s for KDE header files" % self.kde_inc_dir) - - # KDE lib dir - if self.kde_lib_dir is None: - self.kde_lib_dir = os.path.join(self.install_prefix,"lib") - self.announce("Using %s for KDE library files" % self.kde_lib_dir) - - # KDE KCM lib dir - if self.kde_kcm_lib_dir is None: - self.kde_kcm_lib_dir = os.path.join(self.kde_lib_dir,"trinity") - if FindFileInPaths('*kcm*.so',[self.kde_kcm_lib_dir]) is None: - raise SystemExit, "Failed to find KDE KCM files in: %s" % self.kde_kcm_lib_dir - self.announce("Using %s for KDE KCM library files" % self.kde_kcm_lib_dir) - - # Qt inc dir - if self.qt_inc_dir is None: - canidatepaths = [] - qtinc = os.getenv("QTINC") - if qtinc != None: - canidatepaths.append(qtinc) - qtdir = os.getenv("QTDIR") - if qtdir != None: - canidatepaths.append(os.path.join(qtdir,"include")) - canidatepaths.append(os.path.join(install.prefix,"lib/tqt3/include")) - canidatepaths.append(os.path.join(install.prefix,"lib/qt3/include")) - canidatepaths.append(os.path.join(install.prefix,"include")) - canidatepaths.append("/opt/tqt3/include") - canidatepaths.append("/opt/qt/include") - canidatepaths.append("/opt/qt/lib/include") - canidatepaths.append("/opt/qt3/lib/include") - canidatepaths.append("/usr/include/tqt3") - canidatepaths.append("/usr/include/qt3") - self.qt_inc_dir = FindFileInPaths('ntqstring.h',canidatepaths) - if self.qt_inc_dir is None: - self.qt_inc_dir = FindFileInPaths('qstring.h',canidatepaths) - if self.qt_inc_dir is None: - raise SystemExit,"Failed to find the Qt header file directory" - if FindFileInPaths('ntqstring.h',[self.qt_inc_dir]) is None: - if FindFileInPaths('qstring.h',[self.qt_inc_dir]) is None: - raise SystemExit, "Failed to find Qt header files in: %s" % self.qt_inc_dir - self.announce("Using %s for Qt header files" % self.qt_inc_dir) - - # Qt lib dir - if self.qt_lib_dir is None: - canidatepaths = [] - qtlib = os.getenv("TQTLIB") - if qtlib != None: - canidatepaths.append(qtlib) - qtdir = os.getenv("TQTDIR") - if qtdir != None: - canidatepaths.append(os.path.join(qtdir,get_libdir_name())) - canidatepaths.append(os.path.join(install.prefix,"lib/tqt3/"+get_libdir_name())) - canidatepaths.append(os.path.join(install.prefix,"lib/tqt3/"+get_libdir_name())) - canidatepaths.append(os.path.join(install.prefix,get_libdir_name())) - canidatepaths.append("/opt/tqt3/"+get_libdir_name()) - canidatepaths.append("/opt/tqt/"+get_libdir_name()) - canidatepaths.append("/opt/tqt/lib/"+get_libdir_name()) - canidatepaths.append("/opt/tqt3/lib/"+get_libdir_name()) - self.qt_lib_dir = FindFileInPaths('libtqt*',canidatepaths) - if self.qt_lib_dir is None: - canidatepaths = [] - qtlib = os.getenv("QTLIB") - if qtlib != None: - canidatepaths.append(qtlib) - qtdir = os.getenv("QTDIR") - if qtdir != None: - canidatepaths.append(os.path.join(qtdir,get_libdir_name())) - canidatepaths.append(os.path.join(install.prefix,"lib/tqt3/"+get_libdir_name())) - canidatepaths.append(os.path.join(install.prefix,"lib/qt3/"+get_libdir_name())) - canidatepaths.append(os.path.join(install.prefix,get_libdir_name())) - canidatepaths.append("/opt/tqt3/"+get_libdir_name()) - canidatepaths.append("/opt/qt/"+get_libdir_name()) - canidatepaths.append("/opt/qt/lib/"+get_libdir_name()) - canidatepaths.append("/opt/qt3/lib/"+get_libdir_name()) - self.qt_lib_dir = FindFileInPaths('libqt*',canidatepaths) - if self.qt_lib_dir is None: - raise SystemExit, "Failed to find Qt library files" - self.announce("Using %s for Qt library files" % self.qt_lib_dir) - - # Python dir - if self.python_dir is None: - self.python_dir = os.path.split(sysconfig.get_config_var("LIBP"))[0] - self.announce("Using %s for the python directory" % self.python_dir) - - # Python include dir. - if self.python_inc_dir is None: - # Find the Python include directory. - self.python_inc_dir = sysconfig.get_config_var("INCLUDEPY") - self.announce("Using %s for Python header files" % self.python_inc_dir) - - # PyQt dir - if self.pyqt_dir is None: - self.pyqt_dir = m_pyqt_dir - if self.pyqt_dir is None: - self.pyqt_dir = os.path.join(sysconfig.get_python_lib(), 'python_tqt') - if (FindFileInPaths("libqtcmodule*",[self.pyqt_dir]) is None) and (FindFileInPaths("qt*",[self.pyqt_dir]) is None): - raise SystemExit, "Failed to find the PyQt directory: %s" % self.pyqt_dir - self.announce("Using %s for PyQt modules" % self.pyqt_dir) - - # PyTDE dir - if self.pytde_dir is None: - self.pytde_dir = sysconfig.get_python_lib() - if (FindFileInPaths("libtdecorecmodule*",[self.pytde_dir]) is None) and (FindFileInPaths("tdecore*",[self.pytde_dir]) is None): - raise SystemExit, "Failed to find the PyTDE directory: %s" % self.pytde_dir - self.announce("Using %s for PyTDE modules" % self.pytde_dir) - - # Sip dir - if self.sip_dir is None: - self.sip_dir = m_sip_dir - if self.sip_dir is None: - self.sip_dir = os.path.join(sysconfig.get_python_lib(), 'sip4_tqt') - if (FindFileInPaths("libsip*", [self.sip_dir]) is None) and (FindFileInPaths("sip*", [self.sip_dir]) is None): - raise SystemExit, "Failed to find libsip files in directory: %s" % self.sip_dir - self.announce("Using %s for libsip files" % self.sip_dir) - - # Find the C library (libgcc, libgcc_s or some other variation). - if self.clib is None: - canidatepaths = ["/usr/"+get_libdir_name(), "/usr/local/"+get_libdir_name(), "/usr/lib" ] - self.clib = FindFileInPaths("libgcc*.so",canidatepaths) - if self.clib!=None: - self.clib = glob.glob(os.path.join(self.clib,'libgcc*.so'))[0] - else: - self.clib = FindFileInPaths("libgcc*.a",canidatepaths) - if self.clib!=None: - self.clib = glob.glob(os.path.join(self.clib,'libgcc*.a'))[0] - if self.clib is None: - raise SystemExit, "kdedistutils.py (1): Failed to find a suitable libgcc library" - self.announce("Using %s for clib" % self.clib) - - # Make a list of places to look for python .so modules - self.python_sub_dirs = sysconfig.get_config_var("LIBSUBDIRS").split() - base = sysconfig.get_config_var("LIBP") - self.python_sub_dirs = [ os.path.join(base,item) for item in self.python_sub_dirs ] - self.python_sub_dirs.append(base) - - def get_command_name(self): - return 'build_kcm' - - def run(self): - if self.no_kcontrol: - self.announce("Skipping KControl modules") - return - - if not os.path.isdir(self.build_dir): - os.mkdir(self.build_dir) - - for moduletuple in self.distribution.kcontrol_modules: - self.announce("Building KControl module from desktop file %s." % moduletuple[0]) - - # Read the desktop file - factoryfunction = None - libraryname = None - cmodulecategory = None - try: - fhandle = open(moduletuple[0],'r') - for line in fhandle.readlines(): - parts = line.strip().split('=') - try: - if parts[0]=="X-TDE-Library": - libraryname = parts[1] - elif parts[0]=="Exec": - shellcmd = parts[1].split() - modulepath = shellcmd[-1] - if '/' in modulepath: - cmodulecategory = os.path.dirname(modulepath) - else: - cmodulecategory = "" - elif parts[0]=="X-TDE-FactoryName": - factoryfunction = 'create_'+parts[1] - except IndexError: - pass - fhandle.close() - except IOError: - raise SystemExit, "Failed to find kcontrol desktop file: %s" % moduletuple[0] - - # Sanity check. - if factoryfunction is None: - raise SystemExit, "Failed to find factory name (Was there a X-TDE-FactoryName entry in the desktop file?)" - if libraryname is None: - raise SystemExit, "Failed to find library name (Was there a X-TDE-Library entry in the desktop file?)" - if cmodulecategory is None: - raise SystemExit, "Failed to find the kcontrol category name (Was there a Exec entry in the desktop file?)" - - modulename = os.path.basename(moduletuple[1]) - if modulename.endswith('.py'): - modulename = modulename[:-3] - desktopfilename = moduletuple[0] - - stub_cpp_name = 'kcm_'+libraryname+'.cpp' - stub_so_name = 'kcm_'+libraryname+'.so' - stub_la_name = 'kcm_'+libraryname+'.la' - python_version = '%i.%i' % (sys.version_info[0],sys.version_info[1]) - - # Build the 'stub' code. - cppcode = self.cpptemplate % {"moduledir": self.data_dir, - "extramodule": os.getenv("EXTRA_MODULE_DIR"), - "modulename": modulename, - "factoryfunction": factoryfunction, - "python_version": python_version} - - # Put it on disk. - cppfile = os.path.join(os.path.dirname(moduletuple[0]),stub_cpp_name) - try: - fhandle = open(cppfile,'w') - fhandle.write(cppcode) - fhandle.close() - except IOError: - raise SystemExit, "Could not write the C++ stub: %s" % cppfile - - # Compile the stub library. - cmdlist = ['libtool'] - - # Couldn't get it to pass without this ... - cmdlist.append("--mode=compile") - cmdlist.append("--tag=CXX") - - # Find the compiler flags and options - # CXX is empty on some Systems, let's do it 'the hard way'. - # FIXME :: get CXX from make.conf for Gentoo. - if len(sysconfig.get_config_var("CXX").split()) >= 2: - cmdlist.extend(sysconfig.get_config_var("CXX").split()) - else: - cmdlist.extend(['g++', '-pthread']) - - #cmdlist.extend(sysconfig.get_config_var("CXX").split()) - - # cc_flags - cmdlist.append("-c") - cmdlist.append("-g") - - # The 4 is randomly chosen! - # FIXME :: get CFLAGS from make.conf for Gentoo. - if len(sysconfig.get_config_var("CFLAGS").split()) >=4: - cmdlist.extend(sysconfig.get_config_var("CFLAGS").split()) - else: - # On Gentoo systems, CFLAGS are not in the environment. - raw = os.popen('emerge info 2> /dev/null|grep CFLAGS') - lines = raw.readlines() - if len(lines): - cflags = lines[0].split('"')[1].split() - print "Got CFLAGS from emerge info." - cmdlist.extend(cflags) - else: - # Still no CFLAGS found, use these ... - cmdlist.extend(['-fno-strict-aliasing', '-DNDEBUG', '-g', '-O3', '-Wall', '-Wstrict-prototypes']) - - #sysconfig.get_config_var("CFLAGS").split() - # includes - cmdlist.append("-I" + sysconfig.get_config_var("INCLUDEDIR")) - cmdlist.append("-I" + sysconfig.get_config_var("INCLUDEDIR")) - cmdlist.append("-I" + sysconfig.get_config_var("INCLUDEPY")) - cmdlist.append("-I" + self.python_inc_dir) - cmdlist.append("-I" + self.kde_inc_dir) - cmdlist.append("-I" + self.kde_inc_dir + "/tde") - cmdlist.append("-I" + self.qt_inc_dir) - cmdlist.append("-I/usr/include/tqt") - cmdlist.append("-I.") - # input - cmdlist.append(cppfile) - # output - outputfile = os.path.join(self.build_dir,libraryname+'.lo') - cmdlist.append("-o") - cmdlist.append(outputfile) - spawn(cmdlist) # Execute!!! - print - - # Link the resulting object file to create a shared library. - cmdlist = ['libtool'] - cmdlist.append("--mode=link") - cmdlist.append("--tag=LD") - - # Grab the linker command name - cmdlist.append(sysconfig.get_config_var("LDSHARED").split()[0]) - # link_flags - cmdlist.append("-module") - cmdlist.append("-avoid-version") - cmdlist.append("-shared") - cmdlist.append("-export-dynamic") - # object - cmdlist.append(outputfile) - cmdlist.append("-rpath"); cmdlist.append(self.kde_kcm_lib_dir) - cmdlist.append("-o"); cmdlist.append(os.path.join(self.build_dir,stub_la_name)) - # Link libs - linklist = [] - linklist.append("-lpython%s" % python_version) - linklist.extend(sysconfig.get_config_var("LIBS").split()) - - # FIXME I doubt half of these libraries need to be here. - linklist.append(self.sip_dir+"/sip.so") - # PyQt libs - linklist.append(self.pyqt_dir+"/qt.so") - # PyTDE libs - linklist.append(self.pytde_dir+"/tdecore.so") - linklist.append(self.pytde_dir+"/tdeui.so") - -# linklist.append("-L"+self.sip_dir); linklist.append("-lsip") -# # PyQt libs -# linklist.append("-L"+self.pyqt_dir); linklist.append("-lqtcmodule") -# # PyTDE libs -# linklist.append("-L"+self.pytde_dir); linklist.append("-ltdecorecmodule"); linklist.append("-ltdeuicmodule") - - linklist.append("-L"+self.kde_lib_dir); linklist.append("-L/opt/trinity/lib"); linklist.append("-ltdecore"); linklist.append("-lpythonize") - linklist.append("-L"+self.qt_lib_dir); linklist.append("-ltqt-mt") - linklist.append("-lm") - linklist.append("-lc") - linklist.append(self.clib) - - linklist.append("-R"); linklist.append(self.python_dir) - linklist.append("-R"); linklist.append(self.qt_lib_dir) - linklist.append("-R"); linklist.append(self.sip_dir) - linklist.append("-R"); linklist.append(self.pyqt_dir) - linklist.append("-R"); linklist.append(self.pytde_dir) - linklist.append("-R"); linklist.append(self.kde_lib_dir) - - cmdlist.extend(linklist) - spawn(cmdlist) # Execute!! - print - - cpptemplate = r""" -/* - * pykcm_launcher.cpp - * - * Launch Control Centre modules written in Python using an embedded Python - * interpreter. - * Based on David Boddie's PyTDE-components. - */ - -// pythonize.h must be included first. -#include <pythonize.h> -#include <tdecmodule.h> -#include <tdeglobal.h> -#include <tdelocale.h> -#include <klibloader.h> -#include <kstandarddirs.h> -#include <ksimpleconfig.h> -#include <tqstring.h> -#include <sip.h> - -#define MODULE_DIR "%(moduledir)s" -#define EXTRA_MODULE_DIR "%(extramodule)s" -#define MODULE_NAME "%(modulename)s" -#define FACTORY "%(factoryfunction)s" -#define CPP_FACTORY %(factoryfunction)s -#define LIB_PYTHON "libpython%(python_version)s.so" -#define debug 1 - -static TDECModule *report_error(char *msg) { - if (debug) printf ("error: %%s\n", msg); - return NULL; -} - -static TDECModule* return_instance( TQWidget *parent, const char *name ) { - TDECModule* tdecmodule; - PyObject *pyTDECModuleTuple; - PyObject *pyTDECModule; - Pythonize *pyize; // Pythonize object to manage the Python interpreter. - int isErr; - - // Try to determine what py script we're loading. Note that "name" - // typically appears to be NULL. - TQString script(MODULE_NAME); - - // Reload libpython, but this time tell the runtime linker to make the - // symbols global and available for later loaded libraries/module. - KLibLoader::self()->globalLibrary(LIB_PYTHON); - - // Start the interpreter. - pyize = initialize(); - if (!pyize) { - return report_error ("***Failed to start interpreter\n"); - } - - // Add the path to the python script to the interpreter search path. - TQString path = TQString(MODULE_DIR); - if(path == TQString::null) { - return report_error ("***Failed to locate script path"); - } - if(!pyize->appendToSysPath (path.latin1 ())) { - return report_error ("***Failed to set sys.path\n"); - } - - // Add the extra path to the python script to the interpreter search path. - TQString extrapath = TQString(EXTRA_MODULE_DIR); - if(!pyize->appendToSysPath (extrapath.latin1 ())) { - return report_error ("***Failed to set extra sys.path\n"); - } - - // Load the Python script. - PyObject *pyModule = pyize->importModule ((char *)script.latin1 ()); - if(!pyModule) { - PyErr_Print(); - return report_error ("***failed to import module\n"); - } - - // Inject a helper function - TQString bridge = TQString("from sip4_tqt import sip\n" - "from python_tqt import qt\n" - "def kcontrol_bridge_" FACTORY "(parent,name):\n" - " if parent!=0:\n" -#if SIP_VERSION >= 0x040200 - " wparent = sip.wrapinstance(parent,qt.TQWidget)\n" -#else - " wparent = sip.wrapinstance(parent,'TQWidget')\n" -#endif - " else:\n" - " wparent = None\n" - " inst = " FACTORY "(wparent, name)\n" - " return (inst,sip.unwrapinstance(inst))\n"); - PyRun_String(bridge.latin1(),Py_file_input,PyModule_GetDict(pyModule),PyModule_GetDict(pyModule)); - - // Get the Python module's factory function. - PyObject *kcmFactory = pyize->getNewObjectRef(pyModule, "kcontrol_bridge_" FACTORY); - if(!kcmFactory) { - return report_error ("***failed to find module factory\n"); - } - - // Call the factory function. Set up the args. - PyObject *pyParent = PyLong_FromVoidPtr(parent); - PyObject *pyName = PyString_FromString(MODULE_NAME); - // Using NN here is effect gives our references to the arguement away. - PyObject *args = Py_BuildValue ("NN", pyParent, pyName); - if(pyName && pyParent && args) { - // run the factory function - pyTDECModuleTuple = pyize->runFunction(kcmFactory, args); - if(!pyTDECModuleTuple) { - PyErr_Print(); - return report_error ("*** runFunction failure\n;"); - } - } else { - return report_error ("***failed to create args\n"); - } - // cleanup a bit - pyize->decref(args); - pyize->decref(kcmFactory); - - // Stop this from getting garbage collected. - Py_INCREF(PyTuple_GET_ITEM(pyTDECModuleTuple,0)); - - // convert the TDECModule PyObject to a real C++ TDECModule *. - isErr = 0; - pyTDECModule = PyTuple_GET_ITEM(pyTDECModuleTuple,1); - tdecmodule = (TDECModule *)PyLong_AsVoidPtr(pyTDECModule); - if(!tdecmodule) { - return report_error ("***failed sip conversion to C++ pointer\n"); - } - pyize->decref(pyTDECModuleTuple); - - // PyTDE can't run the module without this - Pythonize - // grabs the lock at initialization and we have to give - // it back before exiting. At this point, we no longer need - // it. - //pyize->releaseLock (); - - // take care of any translation info - TDEGlobal::locale()->insertCatalogue(script); - - // Return the pointer to our new TDECModule - return tdecmodule; -} - -extern "C" { - // Factory function that kcontrol will call. - TDECModule* CPP_FACTORY(TQWidget *parent, const char *name) { - return return_instance(parent, name); - } -} -""" - -########################################################################### -class InstallKControlModule(Command): - description = "Install Kcontrol module files" - - user_options = [ - ('install-dir=', 'd', "base directory for installing kcontrol module files"), - ('install-cmd=', None, "Command to use to install the files"), - ('xdg-apps-dir=',None,"directory for XDG app files"), - ('build-dir=','b', "build directory (where to install from)"), - ('root=', None, "install everything relative to this alternate root directory"), - ('force', 'f', "force installation (overwrite existing files)"), - ('skip-build', None, "skip the build steps"), - ] - boolean_options = ['force', 'skip-build'] - - def initialize_options(self): - self.build_dir = None - self.install_dir = None - self.install_cmd = None - self.xdg_apps_dir = None - self.outfiles = [] - self.root = None - self.force = 0 - self.warn_dir = 1 - self.skip_build = None - - def finalize_options(self): - own_install_dir = self.install_dir is not None - own_xdg_apps_dir = self.xdg_apps_dir is not None - - self.set_undefined_options('install', - ('build_base', 'build_dir'), - ('install_kcm', 'install_dir'), - ('install_xdg_apps','xdg_apps_dir'), - ('root', 'root'), - ('force', 'force'), - ('skip_build', 'skip_build'), - ('install_cmd', 'install_cmd') - ) - - if own_install_dir and self.root is not None: - self.install_dir = change_root(self.root,self.installdir) - if own_xdg_apps_dir and self.root is not None: - self.xdg_apps_dir = change_root(self.root,self.xdg_apps_dir) - - def get_command_name(self): - return 'install_kcm' - - def run(self): - if not self.skip_build: - self.run_command('build_kcm') - - self.announce("Installing Kcontrol module files...") - - for moduletuple in self.distribution.kcontrol_modules: - self.announce("Building KControl module from desktop file %s." % moduletuple[0]) - - # Read the desktop file - libraryname = None - cmodulecategory = None - try: - fhandle = open(moduletuple[0],'r') - for line in fhandle.readlines(): - parts = line.strip().split('=') - try: - if parts[0]=="X-TDE-Library": - libraryname = parts[1] - elif parts[0]=="Exec": - shellcmd = parts[1].split() - modulepath = shellcmd[-1] - if '/' in modulepath: - cmodulecategory = os.path.dirname(modulepath) - else: - cmodulecategory = "" - except IndexError: - pass - fhandle.close() - except IOError: - raise SystemExit, "Failed to find kcontrol desktop file: %s" % moduletuple[0] - - if libraryname is None: - raise SystemExit, "Failed to find library name (Was there a X-TDE-Library entry in the desktop file?)" - if cmodulecategory is None: - raise SystemExit, "Failed to find the kcontrol category name (Was there a Exec entry in the desktop file?)" - - desktopfilename = moduletuple[0] - self.outfiles.extend(self.mkpath(self.xdg_apps_dir)) - desktopfile_dest = os.path.join(self.xdg_apps_dir,os.path.basename(desktopfilename)) - self.copy_file(desktopfilename, desktopfile_dest) - - stub_la_name = 'kcm_'+libraryname+'.la' - - self.outfiles.extend(self.mkpath(self.install_dir)) - - # Install the library. - cmdlist = ['libtool'] - cmdlist.append("--mode=install") - cmdlist.append(self.install_cmd) - cmdlist.append("-c") - cmdlist.append(os.path.join(self.build_dir,stub_la_name)) - cmdlist.append(os.path.join(self.install_dir,stub_la_name)) - spawn(cmdlist) # Execute!! - print - - self.outfiles = [os.path.join(self.install_dir,os.path.basename(file)) for file in glob.glob(os.path.join(self.build_dir,'.libs','kcm_'+libraryname+'*'))] - self.outfiles.append(desktopfile_dest) - - self.announce("Done installing Kcontrol module files.") - - def get_outputs(self): - return self.outfiles or [] - - def mkpath(self, name, mode=0777): - return dir_util.mkpath(name, mode, dry_run=self.dry_run) - -########################################################################### -class BuildDocbookHTML(Command): - description = "Build Docbook HTML documentation" - - user_options = [('meinproc-exe=',None,"Path to the meinproc executable")] - - def initialize_options(self): - self.html_prefix = None - self.meinproc_exe = None - - def finalize_options(self): - self.set_undefined_options('build', ('meinproc_exe', 'meinproc_exe') ) - - def get_command_name(self): - return 'build_docbook' - - def run(self): - for docbook_tuple in self.distribution.docbooks: - input_dir = docbook_tuple[0] - language_code = docbook_tuple[1] - - self.announce("Building Docbook documentation from directory %s." % input_dir) - - indexdoc_file_name = os.path.join(input_dir,'index.docbook') - if not os.path.exists(indexdoc_file_name): - raise SystemExit, "File %s is missing." % indexdoc_file_name - - cwd = os.getcwd() - os.chdir(input_dir) - try: - spawn([self.meinproc_exe,"--check","--cache",'index.cache.bz2', 'index.docbook']) - spawn([self.meinproc_exe, 'index.docbook']) - finally: - os.chdir(cwd) - -########################################################################### -class InstallDocbookHTML(Command): - description = "Install Docbook HTML files" - - user_options = [ - ('install-dir=', 'd',"base directory for installing docbook HTML files"), - ('root=', None, "install everything relative to this alternate root directory"), - ('force', 'f', "force installation (overwrite existing files)"), - ('skip-build', None, "skip the build steps"), - ] - boolean_options = ['force', 'skip-build'] - - def initialize_options(self): - self.install_dir = None - self.outfiles = [] - self.root = None - self.force = 0 - self.warn_dir = 1 - self.skip_build = None - - def finalize_options(self): - own_install_dir = self.install_dir is not None - - self.set_undefined_options('install', - ('install_html', 'install_dir'), - ('root', 'root'), - ('force', 'force'), - ('skip_build', 'skip_build'), - ) - - if own_install_dir and self.root is not None: - self.install_dir = change_root(self.root,self.installdir) - - def get_command_name(self): - return 'install_html' - - def run(self): - if not self.skip_build: - self.run_command('build_html') - - self.announce("Installing HTML files...") - counter = 0 - for docbook_tuple in self.distribution.docbooks: - input_dir = docbook_tuple[0] - language_code = docbook_tuple[1] - - self.announce("Install Docbook documentation from directory %s." % input_dir) - source_file = os.path.join(input_dir,'index.cache.bz2') - if not os.path.exists(source_file): - raise SystemExit, "File %s is missing." % source_file - - dest_path = os.path.join(self.install_dir, language_code, self.distribution.metadata.name) - self.outfiles.extend(self.mkpath(dest_path)) - dest_file = os.path.join(dest_path,'index.cache.bz2') - - self.copy_file(source_file, dest_file) - self.outfiles.append(dest_file) - counter += 1 - - # Also install any lose HTML files. - for source_file in glob.glob(os.path.join(input_dir,'*.html')): - htmlfile = os.path.basename(source_file) - dest_file = os.path.join(dest_path,htmlfile) - self.copy_file(source_file, dest_file) - self.outfiles.append(dest_file) - counter += 1 - - if len(docbook_tuple)==3: - extra_files = docbook_tuple[2] - for file in extra_files: - source_file = os.path.join(input_dir,file) - dest_file = os.path.join(self.install_dir, language_code, self.distribution.metadata.name,file) - self.copy_file(source_file, dest_file) - self.outfiles.append(dest_file) - counter += 1 - - self.announce("Done installing %i HTML files." % counter) - - def get_outputs(self): - return self.outfiles or [] - - def mkpath(self, name, mode=0777): - return dir_util.mkpath(name, mode, dry_run=self.dry_run) - -########################################################################### -class UpdateI18NMessages(Command): - description = "Extract and update messages for translation" - - user_options = [('xgettext-exe=',None,'Full path to the xgetext executable'),\ - ('kde-pot=',None,'Location of the the KDE pot file'),\ - ('msgmerge-exe=',None,'Full path to the msgmerge executable')] - - def initialize_options(self): - self.xgettext_exe = None - self.msgmerge_exe = None - self.kde_pot = None - - def finalize_options(self): - if self.xgettext_exe is None: - install = self.get_finalized_command('install') - - canidate_paths = [] - if install.user_supplied_kde_prefix: - canidate_paths.append(os.path.join(install.kde_prefix,'bin')) - - self.announce("Detecting xgettext...") - canidate_paths.append(ask_kde_config('--install exe --expandvars').strip()) - self.xgettext_exe = FindExeOnPath('xgettext',canidate_paths) - if self.xgettext_exe is None: - raise SystemExit, "Unable to find 'xgettext'." - self.announce(" ...xgettext found at %s" % self.xgettext_exe) - - if self.msgmerge_exe is None: - install = self.get_finalized_command('install') - - canidate_paths = [] - if install.user_supplied_kde_prefix: - canidate_paths.append(os.path.join(install.kde_prefix,'bin')) - - self.announce("Detecting msgmerge...") - canidate_paths.append(ask_kde_config('--install exe --expandvars').strip()) - self.msgmerge_exe = FindExeOnPath('msgmerge',canidate_paths) - if self.msgmerge_exe is None: - raise SystemExit, "Unable to find 'xgettext'." - self.announce(" ...msgmerge found at %s" % self.msgmerge_exe) - - if self.kde_pot is None: - self.announce("Detecting kde.pot...") - canidatepaths = [] - tdedir = os.getenv("TDEDIR") - if tdedir!=None: - canidatepaths.append(os.path.join(tdedir,"include")) - install = self.get_finalized_command('install') - canidatepaths.append(os.path.join(install.kde_prefix,"include")) - canidatepaths.append('/opt/trinity/include') - canidatepaths.append('/opt/kde/include') - kde_pot_dir = FindFileInPaths('kde.pot',canidatepaths) - - if kde_pot_dir is None: - raise SystemExit, "Failed to find the kde.pot file." - - self.kde_pot = os.path.join(kde_pot_dir,'kde.pot') - self.announce(" ...kde.pot found at %s" % self.kde_pot) - - def get_command_name(self): - return 'update_messages' - - def run(self): - if self.distribution.i18n is None: return - - self.announce("Extracting and merging i18n messages...") - po_dir = self.distribution.i18n[0] - - # FIXME : .rc and .ui files - input_files = [] - - # Compile any UI files - for dir in self.distribution.i18n[1]: - for file in glob.glob(os.path.join(dir,'*.ui')): - qtuicompiler.UpdateUI(file,kde=True) - - # Fetch all of the python files. - for dir in self.distribution.i18n[1]: - input_files.extend(glob.glob(os.path.join(dir,'*.py'))) - - target_pot = os.path.join(po_dir,self.distribution.metadata.name+".pot") - - cmd = [self.xgettext_exe, '-o', target_pot, '-ki18n', '-ktr2i18n', \ - '-kI18N_NOOP', '-ktranslate', '-kaliasLocale','-x',self.kde_pot] - cmd.extend(input_files) - spawn(cmd) - - for po_file in glob.glob(os.path.join(po_dir,'*.po')): - temp_po = po_file + '.temp' - cmd = [self.msgmerge_exe,'-q','-o',temp_po,po_file,target_pot] - spawn(cmd) - os.rename(temp_po,po_file) - - self.announce("Finished with i18n messages.") - -########################################################################### -class BuildI18NMessages(Command): - description = "Build i18n messages" - - user_options = [('msgfmt-exe=',None,'Path to the msgfmt executable')] - - def initialize_options(self): - self.msgfmt_exe = None - - def finalize_options(self): - self.set_undefined_options('build', ('msgfmt_exe', 'msgfmt_exe')) - - def get_command_name(self): - return 'build_messages' - - def run(self): - if self.distribution.i18n is None: return - - self.announce("Building i18n messages...") - po_dir = self.distribution.i18n[0] - - i = 0 - for po_file in [file for file in os.listdir(po_dir) if file.endswith('.po')]: - source = os.path.join(po_dir,po_file) - target = source[:-3]+'.gmo' - cmd = [self.msgfmt_exe,'-o',target, source] - spawn(cmd) - i += 1 - self.announce("Done building %i i18n messages." % i) - -########################################################################### -class InstallI18NMessages(Command): - description = "Install messages" - - user_options = [ - ('install-dir=', 'd',"base directory for installing message files (default: installation base dir)"), - ('root=', None, "install everything relative to this alternate root directory"), - ('force', 'f', "force installation (overwrite existing files)"), - ('skip-build', None, "skip the build steps"), - ] - - boolean_options = ['force', 'skip-build'] - - def initialize_options(self): - self.install_dir = None - self.outfiles = [] - self.root = None - self.force = 0 - self.warn_dir = 1 - self.skip_build = None - - def finalize_options(self): - own_install_dir = self.install_dir is not None - - self.set_undefined_options('install', - ('install_messages', 'install_dir'), - ('root', 'root'), - ('force', 'force'), - ('skip_build', 'skip_build'), - ) - - if own_install_dir and self.root is not None: - self.install_dir = change_root(self.root,self.installdir) - - def get_command_name(self): - return 'install_messages' - - def run(self): - if not self.skip_build: - self.run_command('build_messages') - - self.announce("Installing i18n messages...") - po_dir = self.distribution.i18n[0] - - counter = 0 - for po_file in os.listdir(po_dir): - if po_file.endswith('.po'): - source_file = os.path.join(po_dir,po_file[:-3]) + '.gmo' - - # Setup installation of the translation file. - dest_path = os.path.join(self.install_dir, po_file[:-3],'LC_MESSAGES') - self.outfiles.extend(self.mkpath(dest_path)) - dest_file = os.path.join(dest_path, self.distribution.metadata.name+'.mo') - - self.copy_file(source_file, dest_file) - self.outfiles.append(dest_file) - counter += 1 - self.announce("Done installing %i i18n messages." % counter) - - def get_outputs(self): - return self.outfiles - - def mkpath(self, name, mode=0777): - return dir_util.mkpath(name, mode, dry_run=self.dry_run) - - -########################################################################### -class BuildTdeioslave(Command): - description = "Build Tdeioslaves" - - user_options = [('no-tdeioslave',None,"Don't build tdeioslaves"), - ('build-dir=','b', "build directory (where to install from)"), - ('python-dir=',None,'Directory containing the Python installation'), - ('python-inc-dir=',None,'Directory containing C Header files for Python'), - ('kde-inc-dir=',None,'Directory containing C++ header files for KDE'), - ('kde-lib-dir=',None,'Directory containing library files for KDE'), - ('kde-tdeioslave-lib-dir=',None,'Directory for KDE tdeioslave library files'), - ('kde-protocol-dir=',None,'Directory for KDE tdeioslave protocol files'), - ('qt-inc-dir=',None,'Directory containing C++ header files for Qt'), - ('qt-lib-dir=',None,'Directory containing library files for Qt'), - ('sip-dir=','/usr/lib/pyshared/python*','Directory containing the sip library files'), - ('clib=',None,'gcc library and path'), - ('pyqt-dir=','/usr/lib/pyshared/python*','PyQt module directory'), - ('pytde-dir=',None,'PyTDE module directory'), - ('data-dir=',None,'installation directory for data (script) files')] - - def initialize_options(self): - self.no_tdeioslave = 0 - self.build_dir = None - self.python_inc_dir = None - self.python_dir = None - self.kde_inc_dir = None - self.kde_lib_dir = None - self.kde_tdeioslave_lib_dir = None - self.kde_protocol_dir = None - self.qt_inc_dir = None - self.qt_lib_dir = None - self.sip_dir = None - self.clib = None - self.pyqt_dir = None - self.pytde_dir = None - self.data_dir = None - - def finalize_options(self): - if self.no_tdeioslave==0: - self.set_undefined_options('install', ('build_base', 'build_dir'),('install_application_data','data_dir')) - - install = self.get_finalized_command('install') - self.install_prefix = ask_kde_config('--prefix').strip() - - # KDE inc dir: find it! - if self.kde_inc_dir is None: - canidatepaths = [] - tdedir = os.getenv("TDEDIR") - if tdedir!=None: - canidatepaths.append(os.path.join(tdedir,"include")) - canidatepaths.append(os.path.join(install.prefix,"include")) - canidatepaths.append(os.path.join(self.install_prefix,'include')) - canidatepaths.append(os.path.join(self.install_prefix,'include','tde')) - self.kde_inc_dir = FindFileInPaths('tdeapplication.h',canidatepaths) - if self.kde_inc_dir is None: - raise SystemExit, "Failed to find the KDE header file directory." - if FindFileInPaths('tdeapplication.h',[self.kde_inc_dir]) is None: - raise SystemExit, "Failed to find KDE header files in: %s" % self.kde_inc_dir - self.announce("Using %s for KDE header files" % self.kde_inc_dir) - - # KDE lib dir - if self.kde_lib_dir is None: - self.kde_lib_dir = os.path.join(self.install_prefix,"lib") - self.announce("Using %s for KDE library files" % self.kde_lib_dir) - - # KDE tdeioslave lib dir - if self.kde_tdeioslave_lib_dir is None: - self.kde_tdeioslave_lib_dir = os.path.join(self.kde_lib_dir,"trinity") - if FindFileInPaths('tdeio_*.so',[self.kde_tdeioslave_lib_dir]) is None: - raise SystemExit, "Failed to find KDE Tdeioslave library files in: %s" % self.kde_tdeioslave_lib_dir - self.announce("Using %s for KDE Tdeioslave library files" % self.kde_tdeioslave_lib_dir) - - # Qt inc dir - if self.qt_inc_dir is None: - canidatepaths = [] - qtinc = os.getenv("QTINC") - if qtinc != None: - canidatepaths.append(qtinc) - qtdir = os.getenv("QTDIR") - if qtdir != None: - canidatepaths.append(os.path.join(qtdir,"include")) - canidatepaths.append(os.path.join(install.prefix,"lib/tqt3/include")) - canidatepaths.append(os.path.join(install.prefix,"lib/qt3/include")) - canidatepaths.append(os.path.join(install.prefix,"include")) - canidatepaths.append("/opt/tqt3/include") - canidatepaths.append("/opt/qt/include") - canidatepaths.append("/opt/qt/lib/include") - canidatepaths.append("/opt/qt3/lib/include") - self.qt_inc_dir = FindFileInPaths('ntqstring.h',canidatepaths) - if self.qt_inc_dir is None: - self.qt_inc_dir = FindFileInPaths('qstring.h',canidatepaths) - if self.qt_inc_dir is None: - raise SystemExit,"Failed to find the Qt header file directory" - if FindFileInPaths('ntqstring.h',[self.qt_inc_dir]) is None: - if FindFileInPaths('qstring.h',[self.qt_inc_dir]) is None: - raise SystemExit, "Failed to find Qt header files in: %s" % self.qt_inc_dir - self.announce("Using %s for Qt header files" % self.qt_inc_dir) - - # Qt lib dir - if self.qt_lib_dir is None: - canidatepaths = [] - qtlib = os.getenv("TQTLIB") - if qtlib != None: - canidatepaths.append(qtlib) - qtdir = os.getenv("TQTDIR") - if qtdir != None: - canidatepaths.append(os.path.join(qtdir,get_libdir_name())) - canidatepaths.append(os.path.join(install.prefix,"lib/tqt3/"+get_libdir_name())) - canidatepaths.append(os.path.join(install.prefix,"lib/tqt3/"+get_libdir_name())) - canidatepaths.append(os.path.join(install.prefix,get_libdir_name())) - canidatepaths.append("/opt/tqt3/"+get_libdir_name()) - canidatepaths.append("/opt/tqt/"+get_libdir_name()) - canidatepaths.append("/opt/tqt/lib/"+get_libdir_name()) - canidatepaths.append("/opt/tqt3/lib/"+get_libdir_name()) - self.qt_lib_dir = FindFileInPaths('libtqt*',canidatepaths) - if self.qt_lib_dir is None: - canidatepaths = [] - qtlib = os.getenv("QTLIB") - if qtlib != None: - canidatepaths.append(qtlib) - qtdir = os.getenv("QTDIR") - if qtdir != None: - canidatepaths.append(os.path.join(qtdir,get_libdir_name())) - canidatepaths.append(os.path.join(install.prefix,"lib/tqt3/"+get_libdir_name())) - canidatepaths.append(os.path.join(install.prefix,"lib/qt3/"+get_libdir_name())) - canidatepaths.append(os.path.join(install.prefix,get_libdir_name())) - canidatepaths.append("/opt/tqt3/"+get_libdir_name()) - canidatepaths.append("/opt/qt/"+get_libdir_name()) - canidatepaths.append("/opt/qt/lib/"+get_libdir_name()) - canidatepaths.append("/opt/qt3/lib/"+get_libdir_name()) - self.qt_lib_dir = FindFileInPaths('libqt*',canidatepaths) - if self.qt_lib_dir is None: - raise SystemExit, "Failed to find Qt library files" - self.announce("Using %s for Qt library files" % self.qt_lib_dir) - - # Python dir - if self.python_dir is None: - self.python_dir = os.path.split(sysconfig.get_config_var("LIBP"))[0] - self.announce("Using %s for the python directory" % self.python_dir) - - # Python include dir. - if self.python_inc_dir is None: - # Find the Python include directory. - self.python_inc_dir = sysconfig.get_config_var("INCLUDEPY") - self.announce("Using %s for Python header files" % self.python_inc_dir) - - # PyQt dir - if self.pyqt_dir is None: - self.pyqt_dir = m_pyqt_dir - if self.pyqt_dir is None: - self.pyqt_dir = os.path.join(sysconfig.get_python_lib(), 'python_tqt') - if (FindFileInPaths("libqtcmodule*",[self.pyqt_dir]) is None) and (FindFileInPaths("qt*",[self.pyqt_dir]) is None): - raise SystemExit, "Failed to find the PyQt directory: %s" % self.pyqt_dir - self.announce("Using %s for PyQt modules" % self.pyqt_dir) - - # PyTDE dir - if self.pytde_dir is None: - self.pytde_dir = sysconfig.get_python_lib() - if (FindFileInPaths("libtdecorecmodule*",[self.pytde_dir]) is None) and (FindFileInPaths("tdecore*",[self.pytde_dir]) is None): - raise SystemExit, "Failed to find the PyTDE directory: %s" % self.pytde_dir - self.announce("Using %s for PyTDE modules" % self.pytde_dir) - - # Sip dir - if self.sip_dir is None: - self.sip_dir = m_sip_dir - if self.sip_dir is None: - self.sip_dir = os.path.join(sysconfig.get_python_lib(), 'sip4_tqt') - if (FindFileInPaths("libsip*", [self.sip_dir]) is None) and (FindFileInPaths("sip*", [self.sip_dir]) is None): - raise SystemExit, "Failed to find libsip files in directory: %s" % self.sip_dir - self.announce("Using %s for libsip files" % self.sip_dir) - - # Find the C library (libgcc, libgcc_s or some other variation). - if self.clib is None: - canidatepaths = ["/usr/"+get_libdir_name(), "/usr/local/"+get_libdir_name() ] - self.clib = FindFileInPaths("libgcc*.so",canidatepaths) - if self.clib!=None: - self.clib = glob.glob(os.path.join(self.clib,'libgcc*.so'))[0] - else: - self.clib = FindFileInPaths("libgcc*.a",canidatepaths) - if self.clib!=None: - self.clib = glob.glob(os.path.join(self.clib,'libgcc*.a'))[0] - if self.clib is None: - raise SystemExit, "kdedistutils.py (2): Failed to find a suitable libgcc library" - self.announce("Using %s for clib" % self.clib) - - # Make a list of places to look for python .so modules - self.python_sub_dirs = sysconfig.get_config_var("LIBSUBDIRS").split() - base = sysconfig.get_config_var("LIBP") - self.python_sub_dirs = [ os.path.join(base,item) for item in self.python_sub_dirs ] - self.python_sub_dirs.append(base) - - def get_command_name(self): - return 'build_tdeioslave' - - def run(self): - if self.no_tdeioslave: - self.announce("Skipping TDEIO Slaves") - return - - if not os.path.isdir(self.build_dir): - os.mkdir(self.build_dir) - - for moduletuple in self.distribution.tdeioslaves: - self.announce("Building TDEIO Slave from protocol file %s." % moduletuple[0]) - - protocolfilename = moduletuple[0] - - # Read the protocol file - libraryname = None - try: - fhandle = open(protocolfilename,'r') - for line in fhandle.readlines(): - parts = line.strip().split('=') - try: - if parts[0]=="exec": - libraryname = parts[1] - except IndexError: - pass - fhandle.close() - except IOError: - raise SystemExit, "Failed to find tdeioslave protocol file: %s" % moduletuple[0] - - # Sanity check. - if libraryname is None: - raise SystemExit, "Failed to find library name (Was there a exec entry in the protocol file?)" - - modulename = os.path.basename(moduletuple[1]) - if modulename.endswith('.py'): - modulename = modulename[:-3] - - stub_cpp_name = libraryname+'.cpp' - stub_so_name = libraryname+'.so' - stub_la_name = libraryname+'.la' - python_version = '%i.%i' % (sys.version_info[0],sys.version_info[1]) - - # Build the 'stub' code. - cppcode = self.cpptemplate % {"moduledir": self.data_dir, - "modulename": modulename, - "python_version": python_version} - - # Put it on disk. - cppfile = os.path.join(os.path.dirname(moduletuple[0]),stub_cpp_name) - try: - fhandle = open(cppfile,'w') - fhandle.write(cppcode) - fhandle.close() - except IOError: - raise SystemExit, "Could not write the C++ stub: %s" % cppfile - - # Compile the stub library. - cmdlist = ['libtool'] - - # Couldn't get it to pass without this ... - cmdlist.append("--mode=compile") - cmdlist.append("--tag=CXX") - - # Find the compiler flags and options - # CXX is empty on some Systems, let's do it 'the hard way'. - # FIXME :: get CXX from make.conf for Gentoo. - if len(sysconfig.get_config_var("CXX").split()) >= 2: - cmdlist.extend(sysconfig.get_config_var("CXX").split()) - else: - cmdlist.extend(['g++', '-pthread']) - - #cmdlist.extend(sysconfig.get_config_var("CXX").split()) - - # cc_flags - cmdlist.append("-c") - cmdlist.append("-g") - - # The 4 is randomly chosen! - # FIXME :: get CFLAGS from make.conf for Gentoo. - if len(sysconfig.get_config_var("CFLAGS").split()) >=4: - cmdlist.extend(sysconfig.get_config_var("CFLAGS").split()) - else: - # On Gentoo systems, CFLAGS are not in the environment. - raw = os.popen('emerge info 2> /dev/null|grep CFLAGS') - lines = raw.readlines() - if len(lines): - cflags = lines[0].split('"')[1].split() - print "Got CFLAGS from emerge info." - cmdlist.extend(cflags) - else: - # Still no CFLAGS found, use these ... - cmdlist.extend(['-fno-strict-aliasing', '-DNDEBUG', '-g', '-O3', '-Wall', '-Wstrict-prototypes']) - - #sysconfig.get_config_var("CFLAGS").split() - # includes - cmdlist.append("-I" + sysconfig.get_config_var("INCLUDEDIR")) - cmdlist.append("-I" + sysconfig.get_config_var("INCLUDEDIR")) - cmdlist.append("-I" + sysconfig.get_config_var("INCLUDEPY")) - cmdlist.append("-I" + self.python_inc_dir) - cmdlist.append("-I" + self.kde_inc_dir) - cmdlist.append("-I" + self.kde_inc_dir + "/tde") - cmdlist.append("-I" + self.qt_inc_dir) - cmdlist.append("-I/usr/include/tqt") - cmdlist.append("-I.") - # input - cmdlist.append(cppfile) - # output - outputfile = os.path.join(self.build_dir,libraryname+'.lo') - cmdlist.append("-o") - cmdlist.append(outputfile) - spawn(cmdlist) # Execute!!! - print - - # Link the resulting object file to create a shared library. - cmdlist = ['libtool'] - cmdlist.append("--mode=link") - cmdlist.append("--tag=LD") - - # Grab the linker command name - cmdlist.append(sysconfig.get_config_var("LDSHARED").split()[0]) - # link_flags - cmdlist.append("-module") - cmdlist.append("-avoid-version") - cmdlist.append("-shared") - cmdlist.append("-export-dynamic") - # object - cmdlist.append(outputfile) - cmdlist.append("-rpath"); cmdlist.append(self.kde_tdeioslave_lib_dir) - cmdlist.append("-o"); cmdlist.append(os.path.join(self.build_dir,stub_la_name)) - # Link libs - linklist = [] - linklist.append("-lpython%s" % python_version) - linklist.extend(sysconfig.get_config_var("LIBS").split()) - - # FIXME I doubt half of these libraries need to be here. - linklist.append(self.sip_dir+"/sip.so") - # PyQt libs - linklist.append(self.pyqt_dir+"/qt.so") - # PyTDE libs - linklist.append(self.pytde_dir+"/tdecore.so") - -# linklist.append("-L"+self.sip_dir); linklist.append("-lsip") -# # PyQt libs -# linklist.append("-L"+self.pyqt_dir); linklist.append("-lqtcmodule") -# # PyTDE libs -# linklist.append("-L"+self.pytde_dir); linklist.append("-ltdecorecmodule"); linklist.append("-ltdeuicmodule") - - linklist.append("-L"+self.kde_lib_dir); linklist.append("-L/opt/trinity/lib"); linklist.append("-ltdecore"); linklist.append("-lpythonize") - linklist.append("-L"+self.qt_lib_dir); linklist.append("-lqt-mt") - linklist.append("-lm") - linklist.append("-lc") - linklist.append(self.clib) - - linklist.append("-R"); linklist.append(self.python_dir) - linklist.append("-R"); linklist.append(self.qt_lib_dir) - linklist.append("-R"); linklist.append(self.sip_dir) - linklist.append("-R"); linklist.append(self.pyqt_dir) - linklist.append("-R"); linklist.append(self.pytde_dir) - linklist.append("-R"); linklist.append(self.kde_lib_dir) - - cmdlist.extend(linklist) - spawn(cmdlist) # Execute!! - print - - cpptemplate = r""" -/* - * Launch Control Centre modules written in Python using an embedded Python - * interpreter. - * Based on David Boddie's PyTDE-components. - */ - -#include <stdio.h> -#include <Python.h> -#include <kinstance.h> -#define MODULE_DIR "%(moduledir)s" -#define MODULE_NAME "%(modulename)s" -#define FACTORY "SlaveFactory" - -const char modname[] = MODULE_NAME; -#define MAIN_METHOD "dispatchLoop" - -FILE *d = NULL; - -PyObject* call_function(PyObject *callable, PyObject *args) { - PyObject *result, *pArgs; - - if (callable == NULL) { - printf(MODULE_NAME " tdeioslave error: callable == NULL in call_function\n"); - return NULL; - } - - if (PyCallable_Check(callable)) { - if(args == NULL) { - pArgs = PyTuple_New(0); - } else { - pArgs = args; - } - result = PyObject_CallObject(callable, pArgs); - - /* If the arguments were created is this function then decrease - their reference count. */ - if(args == NULL) { - Py_XDECREF(pArgs); - /* pDict and pFunc are borrowed and must not be Py_DECREF-ed */ - } - - if(result == NULL) { - PyErr_Print(); - PyErr_Clear(); - } - } - - return result; -} - -extern "C" { - int kdemain( int argc, char **argv) { - PyObject *pModule, *pName, *pDict; - TDEInstance slave(MODULE_NAME); - - Py_SetProgramName(argv[0]); - Py_Initialize(); - //PyEval_InitThreads(); - PySys_SetArgv(1, argv); - - PyRun_SimpleString("import sys\n"); - PyRun_SimpleString("sys.path.append('"MODULE_DIR"')\n"); - - pName = PyString_FromString(modname); - pModule = PyImport_Import(pName); - - Py_XDECREF(pName); - - if(pModule == NULL) { - printf(MODULE_NAME " tdeioslave error: pModule == NULL\n"); - return 1; - } else { - PyObject *pClass, *pMethod, *pArgs, *pArg1, *pArg2, *pInstance; - int i; - - pDict = PyModule_GetDict(pModule); - /* pDict is a borrowed reference */ - - pClass = PyDict_GetItemString(pDict, FACTORY); - - if(pClass == NULL) { - printf(MODULE_NAME " tdeioslave error: pClass == NULL\n"); - return 1; - } else { - pArgs = PyTuple_New(2); - - pArg1 = PyString_FromString(argv[2]); - pArg2 = PyString_FromString(argv[3]); - - PyTuple_SetItem(pArgs, 0, pArg1); - PyTuple_SetItem(pArgs, 1, pArg2); - - call_function(pClass, pArgs); - - /* Some time later... */ - Py_XDECREF(pClass); - Py_XDECREF(pArgs); - } - - Py_XDECREF(pModule); - } - - Py_Finalize(); - return 0; - } -} -""" -########################################################################### -class InstallTdeioslave(Command): - description = "Install Tdeioslave files" - - user_options = [ - ('install-dir=', 'd', "base directory for installing tdeioslave module files"), - ('install-cmd=', None, "Command to use to install the files"), - ('install-protocol-dir=',None,"directory for tdeioslave protocol files"), - ('build-dir=','b', "build directory (where to install from)"), - ('root=', None, "install everything relative to this alternate root directory"), - ('force', 'f', "force installation (overwrite existing files)"), - ('skip-build', None, "skip the build steps"), - ] - boolean_options = ['force', 'skip-build'] - - def initialize_options(self): - self.build_dir = None - self.install_dir = None - self.install_cmd = None - self.install_protocol_dir = None - self.outfiles = [] - self.root = None - self.force = 0 - self.warn_dir = 1 - self.skip_build = None - - def finalize_options(self): - own_install_dir = self.install_dir is not None - own_install_protocol_dir = self.install_protocol_dir is not None - - self.set_undefined_options('install', - ('build_base', 'build_dir'), - ('install_tdeioslave', 'install_dir'), - ('root', 'root'), - ('force', 'force'), - ('skip_build', 'skip_build'), - ('install_cmd', 'install_cmd'), - ('install_protocol','install_protocol_dir') - ) - - if own_install_dir and self.root is not None: - self.install_dir = change_root(self.root,self.installdir) - - if own_install_protocol_dir and self.root is not None: - self.install_protocol_dir = change_root(self.root,self.install_protocol_dir) - - def get_command_name(self): - return 'install_tdeioslave' - - def run(self): - if not self.skip_build: - self.run_command('build_tdeioslave') - - self.announce("Installing Tdeioslave files...") - - for moduletuple in self.distribution.tdeioslaves: - self.announce("Building Tdeioslave module from protocol file %s." % moduletuple[0]) - - protocolfilename = moduletuple[0] - - # Read the protocol file - libraryname = None - try: - fhandle = open(protocolfilename,'r') - for line in fhandle.readlines(): - parts = line.strip().split('=') - try: - if parts[0]=="exec": - libraryname = parts[1] - except IndexError: - pass - fhandle.close() - except IOError: - raise SystemExit, "Failed to find tdeioslave protocol file: %s" % moduletuple[0] - - if libraryname is None: - raise SystemExit, "Failed to find library name (Was there a exec entry in the protocol file?)" - - self.outfiles.extend(self.mkpath(self.install_protocol_dir)) - protocolfile_dest = os.path.join(self.install_protocol_dir,os.path.basename(protocolfilename)) - self.copy_file(protocolfilename, protocolfile_dest) - - stub_la_name = libraryname+'.la' - - self.outfiles.extend(self.mkpath(self.install_dir)) - - # Install the library. - cmdlist = ['libtool'] - cmdlist.append("--mode=install") - cmdlist.append(self.install_cmd) - cmdlist.append("-c") - cmdlist.append(os.path.join(self.build_dir,stub_la_name)) - cmdlist.append(os.path.join(self.install_dir,stub_la_name)) - spawn(cmdlist) # Execute!! - print - - self.outfiles = [os.path.join(self.install_dir,os.path.basename(file)) for file in glob.glob(os.path.join(self.build_dir,'.libs',libraryname+'*'))] - self.outfiles.append(protocolfile_dest) - - self.announce("Done installing Tdeioslave files.") - - def get_outputs(self): - return self.outfiles or [] - - def mkpath(self, name, mode=0777): - return dir_util.mkpath(name, mode, dry_run=self.dry_run) - -########################################################################### -class CheckPyQt(Command): - description = "Checks for the presence of a working PyQt installation" - - user_options = [] - - def initialize_options(self): - pass - - def finalize_options(self): - self.min_qt_version = self.distribution.min_qt_version - - def run(self): - if self.min_qt_version!=None: - qtver,kdever = get_qt_kde_versions() - if compare_versions(self.min_qt_version,qtver)==1: - raise SystemExit, "Your Qt version is too old. Version %s or higher is required, found %s." % (self.min_qt_version,qtver) - self.announce("Found Qt version %s." % qtver) - try: - self.announce("Checking for a working PyQt...") - import qt - self.announce(" ...PyQt is working") - except: - raise SystemExit, "Couldn't import Qt! Please make sure that PyQt is installed and working." - - def get_outputs(self): return [] - -########################################################################### -class CheckPyTDE(Command): - description = "Checks for the presence of a working PyTDE installation" - - user_options = [] - - def initialize_options(self): - pass - - def finalize_options(self): - self.min_kde_version = self.distribution.min_kde_version - - def run(self): - if self.min_kde_version!=None: - qtver,kdever = get_qt_kde_versions() - if compare_versions(self.min_kde_version,kdever)==1: - raise SystemExit, "Your KDE version is too old. Version %s or higher is required, found %s." % (self.min_kde_version,kdever) - self.announce("Found KDE version %s." % kdever) - self.announce("Checking for a working PyTDE...") - - # Try to import modules one by one. - for k_module in ('dcop', 'tdecore', 'tdeui', 'tdeio', 'tdefile', 'tdeparts', 'tdehtml', 'tdespell'): - self.announce(k_module) - try: - exec('import ' + k_module) - except: - raise SystemExit, "Error: Couldn't find module '" + k_module + "'. \n" + \ - "Couldn't import KDE! Please make sure that PyTDE is installed and working.\n" + \ - "PyTDE is available here: http://www.trinitydesktop.org" - self.announce(" ...PyTDE is working") - - def get_outputs(self): return [] - -########################################################################### -def FindFileInPaths2(globpattern,canidatepaths): - if canidatepaths is None or len(canidatepaths)==0: - return (None,None) - - # Look for the globpattern on the path. - for path in canidatepaths: - if path!=None: - files = glob.glob(os.path.join(path, globpattern)) - if len(files)!=0: - return (path,os.path.basename(files[0])) - - # Continue searching with a breadth first search. - dirs = [] - for path in canidatepaths: - # Examine any directories on this path. - dirlist = glob.glob(os.path.join(path, "*")) - for item in dirlist: - if os.path.isdir(item): - # Examine each subdirectory. - dirs.append(item) - # Examine all subdirectories. - return FindFileInPaths2(globpattern, dirs) - -########################################################################### -def FindFileInPaths(globpattern,canidatepaths): - x,y = FindFileInPaths2(globpattern,canidatepaths) - return x - -########################################################################### -# FIXME replace this with spawn.find_executable(). -def FindExeOnPath(exe_name,high_prio_dirs=None,low_prio_dirs=None): - candiate_paths = [] - - if high_prio_dirs is not None: - candiate_paths.extend(high_prio_dirs) - - path_var = os.getenv("PATH") - candiate_paths.extend(path_var.split(':')) - - if low_prio_dirs is not None: - candiate_paths.extend(low_prio_dirs) - - for dir in candiate_paths: - if dir is not None: - candiate = os.path.join(dir,exe_name) - if os.path.isfile(candiate): - if os.access(candiate,os.X_OK): - return candiate - return None - -########################################################################### - -def ask_kde_config(question): - # Look for the tde-config program - kdeconfig = find_executable("tde-config", os.environ['PATH'] + os.pathsep + \ - os.pathsep.join(['/bin','/usr/bin','/opt/trinity/bin','/opt/kde/bin','/usr/local/bin'])) - if kdeconfig!=None: - # Ask the tde-config program for the - fhandle = os.popen(kdeconfig+' ' + question,'r') - result = fhandle.read() - fhandle.close() - return result - else: - return None - -########################################################################### -# Convert for example, "3.1.1a" => [3,1,1,'a'] -# -def split_version_name(name): - result = [] - accu = '' - type = 0 - for c in name: - if type==0: - if c.isdigit(): - type = 1 - else: - type = 2 - accu += c - elif c=='.': - if type==1: - result.append(int(accu)) - else: - result.append(accu) - accu = '' - type = 0 - elif type==1: - # Digits - if c.isdigit(): - accu += c - else: - result.append(int(accu)) - type = 2 - accu = c - else: - if c.isdigit(): - result.append(accu) - type = 1 - accu = c - else: - accu += c - if accu!='': - result.append(accu) - return result - -########################################################################### -# -# Returns: -# -1 if a < b -# 0 if a and b are equal -# 1 if a > b -def compare_versions(a,b): - aparts = split_version_name(a) - bparts = split_version_name(b) - if len(aparts)>len(bparts): - compmax = len(aparts) - else: - compmax = len(bparts) - i = 0 - for i in range(compmax): - abit = 0 - if i<len(aparts): - abit = aparts[i] - bit = 0 - if i<len(bparts): - bbit = bparts[i] - if isinstance(abit,str) and not isinstance(bbit,str): - return 1 - elif not isinstance(abit,str) and isinstance(bbit,str): - return -1 - else: - if abit>bbit: - return 1 - elif abit<bbit: - return -1 - return 0 - -########################################################################### -def get_qt_kde_versions(): - versioninfo = ask_kde_config('--version') - qtver = None - kdever = None - if versioninfo!=None: - for line in versioninfo.splitlines(): - if line.startswith("Qt: "): - qtver = line[4:] - elif line.startswith("TDE: "): - kdever = line[5:] - return qtver,kdever - -########################################################################### -def compile_qtdesigner(ui_files, - force=0, - prefix=None, base_dir=None, - verbose=1, dry_run=0): - """Compile a collection of QT Designer UI files to .py - - If 'dry_run' is true, doesn't actually do anything that would - affect the filesystem. - """ - generated_files = [] - for file in ui_files: - if not file.endswith(".ui"): - continue - - # Terminology from the py_compile module: - # cfile - byte-compiled file - # dfile - purported source filename (same as 'file' by default) - if base_dir: - file = os.path.join(base_dir ,file) - - pyfile = file[:-3] + '.py' - uifile = file - - pyfile_base = os.path.basename(pyfile) - if force or newer(uifile, pyfile): - log.info("compiling Qt-Designer UI %s to %s", file, pyfile_base) - if not dry_run: - qtuicompiler.CompileUI(uifile, pyfile) - generated_files.append(pyfile) - else: - log.debug("skipping Qt-Designer compilation of %s to %s", - file, pyfile_base) - return generated_files - -########################################################################### -def get_libdir_name(): - if os.uname()[4] in ['x86_64','mips64','ppc64','sparc64','s390x']: - return 'lib64' - else: - return 'lib' |