diff options
Diffstat (limited to 'setup.py')
-rwxr-xr-x | setup.py | 323 |
1 files changed, 323 insertions, 0 deletions
diff --git a/setup.py b/setup.py new file mode 100755 index 0000000..f7d90f2 --- /dev/null +++ b/setup.py @@ -0,0 +1,323 @@ +#!/usr/bin/python +########################################################################### +# setup - 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. # +# # +########################################################################### +from distutils.cmd import Command +from distutils import sysconfig +from distutils.spawn import find_executable,spawn +from distutils import dir_util +import sys +import os +import glob +sys.path.insert(0,"src") # We need this for the import statement below. + +import kdedistutils + +def main(): + kdedistutils.setup(name="pykdeextensions", + version="0.4.0", + author="Simon Edwards", + author_email="[email protected]", + url="http://www.simonzone.com/software/pykdeextensions/", + min_kde_version = "3.0.0", + min_qt_version = "3.0.0", + license = "LGPL", + package_dir = {'': 'src'}, + py_modules = ["kdedistutils","qtuicompiler","qtdesigner","kdedesigner"], + application_data = ["app_templates","AUTHORS","ChangeLog","COPYING","INSTALL","NEWS"], + docbooks = [ ('doc/en','en') ], + cmdclass = { + 'install' : InstallPyKDEExtensions, + 'build_libpythonize' : BuildLibpythonize, + 'install_libpythonize' : InstallLibpythonize + } + ) + +########################################################################### +class InstallPyKDEExtensions(kdedistutils.InstallKDE): + sub_commands = kdedistutils.InstallKDE.sub_commands[:] + sub_commands.append( ('install_libpythonize',None) ) + + user_options = kdedistutils.InstallKDE.user_options + user_options.append( ('install-clib=', None, "installation directory for shared libraries") ) + user_options.append( ('install-cheaders=', None, "installation directory for C header files") ) + + def initialize_options(self): + self.install_clib = None + self.install_cheaders = None + kdedistutils.InstallKDE.initialize_options(self) + + def finalize_options(self): + if self.install_clib is None: + if self.prefix is not None: + self.install_clib = os.path.join(self.prefix,'lib') + else: + self.announce("Detecting KDE library directory...") + self.install_clib = kdedistutils.ask_kde_config('--install lib --expandvars').strip() + self.announce(" ...KDE library directory is %s" % self.install_clib) + + if self.install_cheaders is None: + if self.prefix is not None: + self.install_cheaders = os.path.join(self.prefix,'include') + else: + self.announce("Detecting KDE headers directory...") + self.install_cheaders = os.path.normpath(os.path.join(kdedistutils.ask_kde_config('--install lib --expandvars').strip(),"../include")) + self.announce(" ...KDE library headers is %s" % self.install_cheaders) + + kdedistutils.InstallKDE.finalize_options(self) + + if self.root is not None: + self.change_roots('clib','cheaders') + +########################################################################### +class BuildLibpythonize(Command): + description = "Build libpythonize" + + user_options = [ + ('install-dir=', 'd',"Directory for the libpythonize shared library."), + ('no-libpythonize',None,"Don't build libpythonize"), + ('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'), + ('clib=',None,'gcc library and path'), + ] + + def initialize_options(self): + self.build_dir = None + self.install_dir = None + self.no_libpythonize = 0 + self.python_inc_dir = None + self.python_dir = None + self.clib = None + + def finalize_options(self): + if self.no_libpythonize==0: + own_install_dir = self.install_dir is not None + + self.set_undefined_options('install',\ + ('build_base', 'build_dir'), + ('install_clib', 'install_dir') ) + + install = self.get_finalized_command('install') + self.install_prefix = install.prefix + + # 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) + + # Find the C library (libgcc, libgcc_s or some other variation). + if self.clib is None: + canidatepaths = ["/usr/"+kdedistutils.get_libdir_name(), "/usr/local/"+kdedistutils.get_libdir_name() ] + self.clib = kdedistutils.FindFileInPaths("libgcc*.so",canidatepaths) + if self.clib!=None: + self.clib = glob.glob(os.path.join(self.clib,'libgcc*.so'))[0] + else: + self.clib = kdedistutils.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, "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_libpythonize' + + def run(self): + if self.no_libpythonize: + self.announce("Skipping libpythonize") + return + + self.announce("Building libpythonize.") + + cppfile = "src/pythonize.cpp" + # Compile the 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']) + + # 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']) + + # includes + 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("-Isrc") + # input + cmdlist.append(cppfile) + # output + outputfile = os.path.join(self.build_dir,'libpythonize.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") + + # Grab the linker command name + cmdlist.append(sysconfig.get_config_var("LDSHARED").split()[0]) + # link_flags + cmdlist.append("-module") + cmdlist.append("-export-dynamic") + # object + cmdlist.append(outputfile) + cmdlist.append("-rpath"); cmdlist.append(self.install_dir) + cmdlist.append("-o"); cmdlist.append(os.path.join(self.build_dir,'libpythonize.la')) + # Link libs + linklist = [] + linklist.append("-lpython%i.%i" % (sys.version_info[0],sys.version_info[1]) ) + linklist.extend(sysconfig.get_config_var("LIBS").split()) + + linklist.append("-lm") + linklist.append("-lstdc++") + linklist.append("-lc") + linklist.append(self.clib) + + linklist.append("-R"); linklist.append(self.python_dir) + + cmdlist.extend(linklist) + spawn(cmdlist) # Execute!! + print + +########################################################################### +class InstallLibpythonize(Command): + description = "Install libpythonize" + + user_options = [ + ('install-dir=', 'd',"Directory for the libpythonize shared library."), + ('build-dir=','b', "build directory (where to install from)"), + ('cheader-dir=', 'h',"Directory for the pythonize.h C header file."), + ('install-cmd=', None, "Command to use to install the 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.build_dir = None + self.install_cmd = None + self.cheader_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_cheader_dir = self.cheader_dir is not None + + self.set_undefined_options('install', + ('build_base','build_dir'), + ('install_clib', 'install_dir'), + ('install_cheaders', 'cheader_dir'), + ('install_cmd', 'install_cmd'), + ('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.install_dir) + if own_cheader_dir and self.root is not None: + self.cheader_dir = change_root(self.root,self.cheader_dir) + + def get_command_name(self): + return 'install_libpythonize' + + def run(self): + if not self.skip_build: + self.run_command('build_libpythonize') + + self.announce("Installing libpythonize...") + + 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,"libpythonize.la")) + cmdlist.append(os.path.join(self.install_dir,"libpythonize.la")) + spawn(cmdlist) # Execute!! + print + + # Work the names of the files that were installed. + self.outfiles = [] + for file in glob.glob(os.path.join(self.build_dir,'.libs/libpythonize*')): + self.outfiles.append(os.path.join(self.install_dir,os.path.basename(file))) + + # Create a directory for the C header file. + self.outfiles.extend(self.mkpath(self.cheader_dir)) + + # Install the header file. + (out, _) = self.copy_file("src/pythonize.h", os.path.join(self.cheader_dir,'pythonize.h')) + self.outfiles.append(out) + + self.announce("Done installing libpythonize.") + + def get_outputs(self): + return self.outfiles + + def mkpath(self, name, mode=0777): + return dir_util.mkpath(name, mode, dry_run=self.dry_run) + +main() |