summaryrefslogtreecommitdiffstats
path: root/configure.py
diff options
context:
space:
mode:
Diffstat (limited to 'configure.py')
-rw-r--r--configure.py964
1 files changed, 964 insertions, 0 deletions
diff --git a/configure.py b/configure.py
new file mode 100644
index 0000000..55a32ad
--- /dev/null
+++ b/configure.py
@@ -0,0 +1,964 @@
+# This script generates the PyKDE configuration and generates the Makefiles.
+#
+# Copyright (c) 2004
+# Riverbank Computing Limited <info@riverbankcomputing.co.uk>
+# Jim Bublitz <jbublitz@nwinternet.com>
+#
+# This file is part of PyKDE.
+#
+# This copy of PyKDE 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.
+#
+# PyKDE is supplied 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
+# PyKDE; see the file LICENSE. If not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+
+import sys
+import os
+import string
+import glob
+import getopt
+import shutil
+import py_compile
+
+try:
+ import sipconfig
+except:
+ print ("Can't find sipconfig.py (expected in sys.path)")
+ print ("Have you built the correct version of sip?")
+ sys.exit (-1)
+
+try:
+ import pyqtconfig
+except:
+ sipconfig.error ("Can't find pyqtconfig.py in sys.path - exiting")
+
+topsrcdir = os.path.dirname(os.path.abspath(__file__))
+has_objdir = topsrcdir != os.path.abspath(os.path.curdir)
+if not has_objdir:
+ topsrcdir = None
+
+def srcPath(filename):
+ if topsrcdir is not None:
+ return os.path.join(topsrcdir, filename)
+ return filename
+
+topsrcdir = os.path.dirname(os.path.abspath(__file__))
+has_objdir = topsrcdir != os.path.abspath(os.path.curdir)
+if not has_objdir:
+ topsrcdir = None
+
+def srcPath(filename):
+ if topsrcdir is not None:
+ return os.path.join(topsrcdir, filename)
+ return filename
+
+# Get the SIP configuration.
+sipcfg = sipconfig.Configuration()
+pyqtcfg = pyqtconfig.Configuration ()
+
+# Initialise the globals.
+pykde_version = 0x031006
+pykde_version_str = "3.16.6"
+kde_version = None
+kde_version_str = None
+kde_version_sfx = None
+kde_version_extra = None
+kde_max_version = 0x030503
+
+sip_min_v4_version = 0x040900
+qt_min_version = 0x030200
+pyqt_min_version = 0x031000
+
+kde_sip_flags = []
+
+# Command line options.
+opt_pykdemoddir = sipcfg.default_mod_dir
+opt_pykdesipdir = sipcfg.default_sip_dir
+opt_debug = 0
+opt_concat = None
+opt_split = 1
+opt_releasegil = 0
+opt_tracing = 0
+opt_static = 0
+opt_kdebasedir = None
+opt_kdelibdir = None
+opt_kdeincdir = None
+opt_dep_warnings = 0
+opt_libdir = "lib"
+opt_dist_name = ""
+
+pykde_modules = ["dcop", "kdecore", "kdefx", "kdeui", "kio", "kresources", "kabc", "kutils", "kfile", "kparts",\
+ "khtml", "kspell", "kdeprint", "kmdi"] #, "kspell2"]
+
+pykde_imports = {
+ "dcop": ["qt"],
+ "kdecore": ["qt", "dcop"],
+# "kdesu": ["qt", "dcop", "kdecore"],
+ "kdefx": ["qt", "dcop", "kdecore"],
+ "kdeui": ["qt", "qtxml", "dcop", "kdecore", "kdefx"],
+ "kio": ["qt", "qtxml", "dcop", "kdecore", "kdefx", "kdeui"],
+ "kresources": ["qt", "qtxml", "dcop", "kdecore", "kdefx", "kdeui", "kio"],
+ "kabc": ["qt", "qtxml", "dcop", "kdecore", "kdefx", "kdeui", "kio", "kresources"],
+ "kutils": ["qt", "qtxml", "dcop", "kdecore", "kdefx", "kdeui", "kio"],
+ "kfile": ["qt", "qtxml", "dcop", "kdecore", "kdefx", "kdeui", "kio"],
+ "kparts": ["qt", "qtxml", "dcop", "kdecore", "kdefx", "kdeui", "kio"],
+ "khtml": ["qt", "qtxml", "dcop", "kdecore", "kdefx", "kdeui", "kutils", "kio", "kparts"],
+ "kspell": ["qt", "qtxml", "dcop", "kdecore", "kdefx", "kdeui", "kio", "kfile"],
+ "kdeprint": ["qt", "qtxml", "dcop", "kdecore", "kdefx", "kdeui"],
+ "kmdi": ["qt", "qtxml", "dcop", "kdecore", "kdefx", "kdeui", "kio", "kparts"],
+ "kspell2": ["qt", "qtxml", "dcop", "kdecore", "kdefx", "kdeui"]
+ }
+
+kde_includes = {
+ "dcop": None,
+ "kdecore": None,
+# "kdesu": ["kdesu"],
+ "kdefx": None,
+ "kdeui": None,
+ "kio": ["kio"],
+ "kresources": ["kio", "../kio", "kresources"],
+ "kabc": ["kio", "../kio", "kresources", "kabc"],
+ "kfile": ["kio", "../kio"],
+ "kparts": ["kio", "../kio", "kparts"],
+ "khtml": ["kio", "../kio", "kparts", "dom"],
+ "kspell": ["kio"],
+ "kdeprint": ["kdeprint"],
+ "kmdi": ["kmdi", "kio", "../kio", "kparts"],
+ "kutils": ["kio", "../kio"] #,
+# "kspell2": None
+ }
+
+postProcess = {
+ "dcop": None,
+ "kdecore": [["-p ", "kdecore", "-o", "appQuit", "kdecore.py"],
+ #["-p ", "kdecore", "-o", "fixQVariant", "kdecore.sbf"],
+ ["-p ", "kdecore", "-o", "fixSignal", "kdecorepart0.*"]],
+# "kdesu": None,
+ "kdefx": None,
+ "kdeui": None, #[["-p ", "kdeui", "-o", "shpix", "sipkdeuiKSharedPixmap.cpp"]],
+ "kresources": None,
+ "kabc": None,
+ "kio": None,
+ "kfile": None,
+ "kparts": None,
+ "khtml": None,
+ "kspell": None,
+ "kdeprint": None,
+ "kmdi": None,
+ "kutils": None #,
+# "kspell2": None
+ }
+
+opt_startModName = ""
+opt_startmod = 0
+opt_endmod = len (pykde_modules)
+
+def check_gcc ():
+ global opt_concat
+
+ os.system ("gcc -dumpversion > gccvers.txt")
+ m = open ('gccvers.txt', 'r')
+ vers = m.read ().strip ()
+ m.close ()
+ os.unlink ('gccvers.txt')
+ print "gcc version %s" % vers
+
+ if opt_concat == None:
+ if vers < "4.0.0" or vers >= "4.0.3":
+ opt_concat = 1
+ else:
+ opt_concat = 0
+
+ if opt_concat == 1:
+ print "concatenating files"
+ else:
+ print "no concatenation"
+ print
+
+def init_and_check_sanity ():
+ """ Do some initialization and check various versions and
+ attributes of sip and PyQt installations
+ """
+
+ check_gcc ()
+
+ # Check SIP is new enough.
+ if sipcfg.sip_version_str[:8] != "snapshot":
+ minv = None
+
+ if sipcfg.sip_version < sip_min_v4_version:
+ minv = sip_min_v4_version
+
+ if minv:
+ sipcfg.error("This version of PyKDE requires SIP v%s or later" % sipcfg.version_to_string(minv))
+
+ # Check SIP has Qt support enabled and check version
+ if pyqtcfg.qt_version == 0:
+ sipconfig.error("SIP has been built with Qt support disabled.")
+ if pyqtcfg.qt_version < qt_min_version:
+ sipconfig.error("SIP has been built with an unsupported Qt version (%s)"\
+ % sipcfg.version_to_string (sipcfg.qt_version))
+
+ # Check PyQt built with libqt-mt
+ if pyqtcfg.qt_threaded == 0:
+ sipconfig.error ("PyKDE requires a threaded Qt version (libqt-mt)")
+
+ # Check PyQt version
+ if pyqtcfg.pyqt_version < pyqt_min_version:
+ sipcfg.error("This version of PyKDE requires PyQt v%s or later"\
+ % pyqtcfg.version_to_string(pyqtcfg.pyqt_version))
+
+ # find the libs, includes, and version info
+ check_kde_installation ()
+
+def usage(rcode = 2):
+ """Display a usage message and exit.
+
+ rcode is the return code passed back to the calling process.
+ """
+ print "Usage:"
+ print " python configure.py [-h] [-c] [-d dir] [-g] [-j #] [-k] [-n dir] [-o dir] [-r] [-u] [-v dir] [-z file]"
+ print "where:"
+ print " -h displays this help message"
+ print " -c concatenates each module's C/C++ source files [default]"
+ print " -d dir where the PyKDE modules will be installed [default %s]" % opt_pykdemoddir
+ print " -g always release the GIL (SIP v3.x behaviour)"
+ print " -i no concatenation of each module's C/C++ source files"
+ print " -j # splits the concatenated C++ source files into # pieces [default 1]"
+ print " -k dir the KDE base directory"
+ print " -L dir the library directory name [default lib]"
+ print " -n dir the directory containing the KDE lib files"
+ print " -o dir the directory containing the KDE header files"
+ print " -r generates code with tracing enabled [default disabled]"
+ print " -u build with debugging symbols"
+ print " -v dir where the PyKDE .sip files will be installed [default %s]" % opt_pykdesipdir
+ print " -w turn on KDE deprecated object warnings when compiling [default off]"
+ print " -z file the name of a file containing command line flags"
+
+ sys.exit(rcode)
+
+
+def inform_user(stage):
+ """Tell the user the option values that are going to be used.
+ """
+ if stage == 0:
+ print
+ print " PyKDE version %s" % pykde_version_str
+ print " -------"
+ print
+ sipconfig.inform ("Python include directory is %s" % sipcfg.py_inc_dir)
+ sipconfig.inform ("Python version is %s" % sipconfig.version_to_string (sipcfg.py_version))
+ print
+ sipconfig.inform ("sip version is %s (%s)" % (sipcfg.sip_version_str,
+ sipconfig.version_to_string (sipcfg.sip_version)))
+ print
+ sipconfig.inform ("Qt directory is %s" % pyqtcfg.qt_dir)
+ sipconfig.inform ("Qt version is %s" % sipconfig.version_to_string (pyqtcfg.qt_version))
+ print
+ sipconfig.inform ("PyQt directory is %s" % pyqtcfg.pyqt_sip_dir)
+ sipconfig.inform ("PyQt version is %s (%s)" % (pyqtcfg.pyqt_version_str,
+ sipconfig.version_to_string (pyqtcfg.pyqt_version)))
+ print
+
+ elif stage == 1:
+ sipconfig.inform ("KDE base directory is %s" % opt_kdebasedir)
+ sipconfig.inform ("KDE include directory is %s" % opt_kdeincdir)
+ sipconfig.inform ("KDE lib directory is %s" % opt_kdelibdir)
+ sipconfig.inform ("lib directory is %s" % opt_libdir)
+
+ elif stage == 2:
+ sipconfig.inform ("KDE version is %s (0x%x)" % (kde_version_str, kde_version))
+ print
+
+ sipconfig.inform("PyKDE modules will be installed in %s" % opt_pykdemoddir)
+ sipconfig.inform("PyKDE .sip files will be installed in %s" % opt_pykdesipdir)
+ print
+
+
+
+def create_config(module, template):
+ """Create the PyKDE configuration module so that it can be imported by build
+ scripts.
+
+ module is the module file name.
+ template is the template file name.
+ """
+ sipconfig.inform("Creating %s..." % module)
+
+ content = {
+ "pykde_version": pykde_version,
+ "pykde_version_str": pykde_version_str,
+ "kde_version": kde_version,
+ "kde_version_str": kde_version_str,
+ "kde_version_sfx": kde_version_sfx,
+ "kde_version_extra": kde_version_extra,
+# "pykde_bin_dir": opt_pykdebindir,
+ "pykde_mod_dir": opt_pykdemoddir,
+ "pykde_sip_dir": opt_pykdesipdir,
+ "pykde_modules": pykde_modules,
+ "pykde_kde_sip_flags": kde_sip_flags,
+ "kdebasedir": opt_kdebasedir,
+ "kdelibdir": opt_kdelibdir,
+ "libdir": opt_libdir,
+ "kdeincdir": opt_kdeincdir,
+ "pykde_modules": pykde_modules,
+ "dist_name": opt_dist_name
+ }
+
+ sipconfig.create_config_module(module, template, content)
+
+def getKDEVersion (versFile):
+ if not os.path.isfile (versFile):
+ return
+
+ major = None
+ minor = None
+ micro = None
+
+ global kde_version, kde_version_str, kde_version_sfx, kde_version_extra
+
+ f = open (versFile)
+ l = f.readline ()
+ ok = 0
+
+ while not ok and l:
+ wl = string.split(l)
+ if len(wl) == 3 and wl[0] == "#define":
+ if wl[1] == "KDE_VERSION_MAJOR":
+ major = string.strip (wl[2])
+
+ if wl[1] == "KDE_VERSION_MINOR":
+ minor = string.strip (wl[2])
+
+ if wl[1] == "KDE_VERSION_RELEASE":
+ micro = string.strip (wl[2])
+
+ if major and minor and micro:
+ ok = 1
+
+ l = f.readline()
+
+ f.close()
+
+ if micro >= "90" and minor == "2":
+ micro = "0"
+ minor = "3"
+
+ kde_version = (int (major) << 16) + (int (minor) << 8) + int (micro)
+
+ if kde_version > kde_max_version:
+ print
+ sipconfig.inform ("*** True KDE version is %s -- building for KDE %s ***" % (hex (kde_version), hex (kde_max_version)))
+ print
+ kde_version = kde_max_version
+ major = hex ((kde_version & 0xff0000) >> 16) [ 2:]
+ minor = hex ((kde_version & 0x00ff00) >> 8) [ 2:]
+ micro = hex (kde_version & 0x0000ff) [ 2:]
+
+ if ok:
+ kde_version_str = string.join ([major, minor, micro], ".")
+ kde_version_sfx = string.join (["-kde", major, minor, micro, ".diff"], "")
+ kde_version_extra = string.join (["kde", major, minor, micro], "")
+ else:
+ sipconfig.error ("KDE version not found in %s" % versFile)
+
+ global postProcess
+
+def search (target, searchPath):
+ if not searchPath:
+ return
+
+ path = None
+ for searchEntry in searchPath:
+ if os.path.isdir (searchEntry)\
+ and (not target or os.path.isfile (os.path.join (searchEntry, target))):
+ path = searchEntry
+ break
+
+ return path
+
+def discoverKDE3 ():
+ global opt_kdeincdir, opt_kdebasedir, opt_kdelibdir, opt_libdir
+
+ if not opt_kdebasedir:
+ kdeSearchPaths = []
+ libSearchPaths = []
+ incSearchPaths = []
+
+ try:
+ kdeSearchPaths.append (os.environ ["KDEDIR"])
+ except:
+ pass
+ kdeSearchPaths.append (os.path.join ("/opt", "kde3"))
+ kdeSearchPaths.append ("/usr")
+
+ opt_kdebasedir = search (None, kdeSearchPaths)
+
+ if not opt_kdelibdir:
+ libSearchPaths = [os.path.join (opt_kdebasedir, "lib"), os.path.join (opt_kdebasedir, "lib64"), os.path.join (opt_kdebasedir, opt_libdir)]
+# print opt_libdir
+ opt_kdelibdir = search ("libkdecore.so", libSearchPaths)
+
+ if not opt_kdeincdir:
+ incSearchPaths = [os.path.join (opt_kdebasedir, "include")]
+ incSearchPaths.append (os.path.join (opt_kdebasedir, "include", "kde")) # Red Hat
+ opt_kdeincdir = search ("kapplication.h", incSearchPaths)
+
+def check_kde_installation():
+ """Check the KDE installation and get the version number
+
+ """
+ # Check the KDE header files have been installed.
+
+ discoverKDE3 ()
+
+ if not opt_kdebasedir:
+ sipconfig.error ("Couldn't locate KDE3 base directory")
+
+ if not opt_kdeincdir:
+ sipconfig.error ("Couldn't locate KDE3 include directory (%s is KDE base)" % opt_kdebasedir)
+
+ if not opt_kdelibdir:
+ sipconfig.error ("Couldn't locate KDE3 lib directory (%s is KDE base)" % opt_kdebasedir)
+
+ kdeversion_h = os.path.join(opt_kdeincdir, "kdeversion.h")
+
+ inform_user (1)
+
+ if not os.access(kdeversion_h, os.F_OK):
+ sipconfig.error("kdeversion.h could not be found in %s." % opt_kdeincdir)
+
+ # Get the KDE version number.
+ getKDEVersion(kdeversion_h)
+
+ inform_user (2)
+
+def create_top_level (mname):
+ """ Create the top level sip file <mname>mod.sip from <mname>mod.sip-in
+ and add/delete any %Included sip files per the current KDE version
+ """
+ diff = srcPath(os.path.join ("sip", mname, mname + kde_version_sfx))
+ plus = []
+ minus = []
+ if os.path.exists (diff):
+ d = open (diff)
+ line = d.readline()
+ while line:
+ if string.find (line, "+") == 0:
+ plus.append (line [2:])
+ elif string.find (line, "-") == 0:
+ minus.append (line [2:])
+
+ line = d.readline()
+
+ sipin = open (srcPath(os.path.join ("sip", mname, mname + "mod.sip.in")))
+ sipout = open (srcPath(os.path.join ("sip", mname, mname + "mod.sip")), "w")
+
+ line = sipin.readline()
+ while line:
+ if string.find (line, "%Include") == 0:
+ inclFound = 1
+ if minus and line in minus:
+ line = sipin.readline()
+ continue
+ sipout.write (line)
+ elif string.find (line, "@mark@") == 0:
+ for p in plus:
+ sipout.write (p)
+ elif mname == "kabc" and kde_version < 0x030200 and string.find (line, "kresourcesmod.sip") >= 0:
+ pass
+ else:
+ sipout.write (line)
+
+ line = sipin.readline()
+
+ sipin.close ()
+ sipout.close ()
+
+ if mname == "khtml":
+ # PyKDE < 3.3.0 doesn't provide kutils (and khtml doesn't need it)
+ sippath = srcPath(os.path.join ("sip", mname))
+ if kde_version < 0x030300:
+ sipin = open (os.path.join (sippath, mname + "mod.sip"))
+ sipout = open (os.path.join (sippath, mname + "mod.sip.new"), "w")
+ for line in sipin:
+ if line.find ("kutilsmod.sip") > 0:
+ continue
+ sipout.write (line)
+ sipin.close ()
+ sipout.close ()
+ os.unlink (os.path.join (sippath, mname + "mod.sip"))
+ os.rename (os.path.join (sippath, mname + "mod.sip.new"), os.path.join (sippath, mname + "mod.sip"))
+
+ os.system ("cp %s %s" % (os.path.join (sippath, "khtml_part.sip.323"), os.path.join (sippath, "khtml_part.sip")))
+
+ else:
+ os.system ("cp %s %s" % (os.path.join (sippath, "khtml_part.sip.330"), os.path.join (sippath, "khtml_part.sip")))
+
+
+def check_distribution ():
+ dist = glob.glob ("/etc/*-release")
+
+ kde_sip_flags.append ("-t")
+ kde_sip_flags.append ("ALL")
+
+ for file in dist:
+ if file.find ("andrake") > 0:
+ kde_sip_flags.remove ("ALL")
+ kde_sip_flags.append ("D_MANDRAKE")
+
+def set_sip_flags():
+ """Set the SIP platform, version and feature flags.
+ """
+ global kde_sip_flags
+
+ check_distribution ()
+
+ kde_sip_flags.append (pyqtcfg.pyqt_qt_sip_flags)
+
+ kdetags = {
+ 0x030001: "KDE_3_0_0",
+ 0x030003: "KDE_3_0_1",
+ 0x030100: "KDE_3_0_3",
+ 0x030101: "KDE_3_1_0",
+ 0x030102: "KDE_3_1_1",
+ 0x030103: "KDE_3_1_2",
+ 0x030104: "KDE_3_1_3",
+ 0x030105: "KDE_3_1_4",
+ 0x030200: "KDE_3_1_5",
+ 0x030201: "KDE_3_2_0",
+ 0x030202: "KDE_3_2_1",
+ 0x030203: "KDE_3_2_2",
+ 0x030300: "KDE_3_2_3",
+ 0x030301: "KDE_3_3_0",
+ 0x030302: "KDE_3_3_1",
+ 0x030400: "KDE_3_3_2",
+ 0x030401: "KDE_3_4_0",
+ 0x030402: "KDE_3_4_1",
+ 0x030403: "KDE_3_4_2",
+ 0x030500: "KDE_3_4_3",
+ 0x030501: "KDE_3_5_0",
+ 0x030502: "KDE_3_5_1",
+ 0x030503: "KDE_3_5_2",
+ 0x040000: "KDE_3_5_3"
+
+ }
+
+ kde_sip_flags.append("-t")
+ kde_sip_flags.append(sipconfig.version_to_sip_tag(kde_version, kdetags, "KDE"))
+
+
+def generate_code(mname, imports=None, extra_cflags=None, extra_cxxflags=None, extra_define=None, extra_include_dir=None, extra_lflags=None, extra_lib_dir=None, extra_lib=None, opengl=0, sip_flags=None):
+ """Generate the code for a module.
+
+ mname is the name of the module.
+ imports is the list of PyQt/PyKDE modules that this one %Imports.
+ extra_cflags is a string containing additional C compiler flags.
+ extra_cxxflags is a string containing additional C++ compiler flags.
+ extra_define is a name to add to the list of preprocessor defines.
+ extra_include_dir is the name of a directory to add to the list of include
+ directories.
+ extra_lflags is a string containing additional linker flags.
+ extra_lib_dir is the name of a directory to add to the list of library
+ directories.
+ extra_lib is the name of an extra library to add to the list of libraries.
+ opengl is set if the module needs OpenGL support.
+ sip_flags is the list of sip flags to use instead of the defaults.
+ """
+ sipconfig.inform("Generating the C++ source for the %s module..." % mname)
+
+ create_top_level (mname)
+ try:
+ #create_top_level (mname)
+ pass
+ except:
+ sipconfig.error ("Couldn't create top level sip file for %s" % mname)
+
+ try:
+ shutil.rmtree(mname)
+ except:
+ pass
+
+ try:
+ os.mkdir(mname)
+ except:
+ sipconfig.error("Unable to create the %s directory." % mname)
+
+ # Build the SIP command line.
+ argv = [sipcfg.sip_bin]
+ argv.extend(kde_sip_flags)
+
+ if opt_concat:
+ argv.append("-j")
+ if mname == "kdeui" and opt_split == 1:
+ splits = 2
+ else:
+ splits = opt_split
+ argv.append(str(splits))
+
+ if opt_tracing:
+ argv.append("-r")
+
+ if opt_releasegil:
+ argv.append("-g")
+
+ argv.append("-c")
+ argv.append(mname)
+
+ buildfile = os.path.join(mname, mname + ".sbf")
+ argv.append("-b")
+ argv.append(buildfile)
+
+ argv.append("-I")
+ argv.append(srcPath("sip"))
+
+ pyqtInclPathSeen = 0
+ for mod in pykde_imports [mname]:
+ if string.find (mod, "q") == 0 and not pyqtInclPathSeen:
+ argv.append ("-I")
+ argv.append (pyqtcfg.pyqt_sip_dir)
+ pyqtInclPathSeen = 1
+
+ elif mod == "dcop" or string.find (mod, "k") == 0:
+ subdir = os.path.join(srcPath("sip"), mod)
+ argv.append("-I")
+ argv.append(subdir)
+
+ # SIP assumes POSIX style path separators.
+ argv.append(srcPath(string.join(["sip", mname, mname + "mod.sip"], "/")))
+
+# print string.join (argv)
+ # finally, run SIP and generate the C++ code
+ os.system (string.join(argv))
+
+ # post process the C++ code for QT_NO_TRANSLATION
+ if os.system (string.join ([sys.executable, srcPath("postproc")] + ['-p', mname, "-o", "tr", "*.cpp"])) != 0:
+ sipconfig.error ("Post processing of C++ code failed %s (tr)" % mname)
+
+ # Check the result.
+ if not os.access(buildfile, os.F_OK):
+ sipconfig.error("Unable to create the C++ code.")
+
+ if mname == "kdecore" and not opt_concat:
+ postProcess ["kdecore"][-1][-1] = "kdecorecmodule.*"
+
+ # Compile the Python stub.
+ if sipcfg.sip_version < 0x040000:
+ sipconfig.inform("Compiling %s.py..." % mname)
+ py_compile.compile(os.path.join(mname, mname + ".py"), os.path.join(mname, mname + ".pyc"))
+ elif mname == "kdecore":
+ postProcess ["kdecore"][-1][-1] = "sip" + postProcess ["kdecore"][-1][-1]
+
+ # needs to be here (not earlier) to catch .py files if any
+ if postProcess [mname]:
+ for s in postProcess [mname]:
+ if os.system (string.join ([sys.executable, srcPath("postproc")] + s)) != 0:
+ sipconfig.error ("Post processing of C++ code failed %s (%s)" % (mname, s [3]))
+
+ # Generate the Makefile.
+ sipconfig.inform("Creating the Makefile for the %s module..." % mname)
+
+ installs = []
+ if mname == "dcop":
+ if has_objdir:
+ installs.append ([[srcPath("extensions/dcopext.py"), srcPath("extensions/dcopexport.py")], opt_pykdemoddir])
+ else:
+ installs.append ([["../extensions/dcopext.py", "../extensions/dcopexport.py"], opt_pykdemoddir])
+
+
+ if sipcfg.sip_version >= 0x040000:
+ warnings = 1
+ else:
+ warnings = 0
+ installs.append([[mname + ".py", mname + ".pyc"], opt_pykdemoddir])
+
+ sipfiles = []
+
+# for s in glob.glob("sip/*.sip"):
+# sipfiles.append(os.path.join("..", "sip", os.path.basename(s)))
+ for s in os.listdir (srcPath(os.path.join ("sip", mname))):
+ if s.endswith (".sip"):
+ if has_objdir:
+ sipfiles.append(srcPath(os.path.join("sip", mname, os.path.basename(s))))
+ else:
+ sipfiles.append(os.path.join("..", "sip", mname, os.path.basename(s)))
+
+
+
+ installs.append([sipfiles, os.path.join(opt_pykdesipdir, mname)])
+
+ makefile = sipconfig.SIPModuleMakefile(
+ configuration = pyqtcfg,
+ build_file = mname + ".sbf",
+ dir = mname,
+ install_dir = opt_pykdemoddir,
+ installs = installs,
+ qt = 1,
+ opengl = opengl,
+ warnings = warnings,
+ static = opt_static,
+ debug = opt_debug,
+ )
+
+ if extra_cflags:
+ makefile.extra_cflags.append(extra_cflags)
+
+ if extra_cxxflags:
+ makefile.extra_cxxflags.append(extra_cxxflags)
+
+ if opt_dep_warnings == 0:
+ makefile.extra_cflags.append ("-Wno-deprecated-declarations")
+ makefile.extra_cxxflags.append ("-Wno-deprecated-declarations")
+
+ if extra_define:
+ makefile.extra_defines.append(extra_define)
+
+ if has_objdir:
+ makefile.extra_include_dirs.append (srcPath(os.path.join("extra", kde_version_extra)))
+ else:
+ makefile.extra_include_dirs.append (os.path.join ("..", "extra", kde_version_extra))
+
+ makefile.extra_include_dirs.append (opt_kdeincdir)
+ if kde_includes [mname]:
+ for incdir in kde_includes [mname]:
+ if "/" not in incdir:
+ makefile.extra_include_dirs.append (os.path.join (opt_kdeincdir, incdir))
+ else:
+ makefile.extra_include_dirs.append (incdir)
+
+ if extra_include_dir:
+ makefile.extra_include_dirs.append(extra_include_dir)
+
+ if extra_lflags:
+ makefile.extra_lflags.append(extra_lflags)
+
+ makefile.extra_lib_dirs.append (opt_kdelibdir)
+ if extra_lib_dir:
+ makefile.extra_lib_dirs.append(extra_lib_dir)
+
+ if extra_lib == "dcop":
+ extra_lib = "DCOP"
+ elif extra_lib == "kfile":
+ extra_lib = "kio"
+
+ makefile.extra_libs.append(extra_lib)
+ if extra_lib == "kdefx":
+ makefile.extra_libs.append ("kdecore")
+ if extra_lib == "kspell":
+ makefile.extra_libs.append ("kdeui")
+ if extra_lib == "kabc" and kde_version >= 0x030200:
+ makefile.extra_libs.append ("kabc_file")
+ if extra_lib == "kparts" and kde_version >= 0x030500:
+ makefile.extra_lib_dirs.append (os.path.join (opt_kdelibdir, "kde3"))
+
+ if extra_lib == "kdeprint":
+ makefile.extra_cflags.append ("-fno-rtti")
+ makefile.extra_cxxflags.append ("-fno-rtti")
+
+
+ if sipcfg.sip_version < 0x040000 and imports:
+ # Inter-module links.
+ for im in imports:
+ makefile.extra_lib_dirs.insert(0, os.path.join("..", im))
+ makefile.extra_libs.insert(0, makefile.module_as_lib(im))
+
+ makefile.generate()
+ print
+
+
+def create_makefiles():
+ """Create the additional Makefiles.
+ """
+ subdirs = pykde_modules[:]
+
+ sipconfig.inform("Creating top level Makefile...")
+
+ sipconfig.ParentMakefile(
+ configuration = pyqtcfg,
+ subdirs = subdirs,
+ installs= [("pykdeconfig.py", opt_pykdemoddir), (srcPath("contrib/kdepyuic"), sipcfg.default_bin_dir)]
+ ).generate()
+
+
+def fileOpts (fn):
+ try:
+ optfile = open (fn, 'r')
+ except:
+ error ("Could not open option file %s" % (fn))
+
+ opts = []
+
+ for line in optfile.readlines ():
+ if (line [0] == '#') or (line == '\n'):
+ continue
+ elif line [0] == '-':
+ opts.append ((line [0:2], string.strip (line [2:])))
+ else:
+ opts.append (("-" + line [0:1], string.strip (line [1:])))
+
+ print 'Additional options: ',
+ for opt, arg in opts:
+ print "%s %s " %(opt, arg)
+ print
+
+ return opts
+
+def main(argv):
+ """Create the configuration module module.
+
+ argv is the list of command line arguments.
+ """
+ try:
+ optlist, args = getopt.getopt(argv[1:], "hcd:gij:k:L:l:n:o:ruv:wz:")
+ except getopt.GetoptError:
+ usage()
+
+ global opt_pykdemoddir, opt_pykdesipdir
+ global opt_debug, opt_concat, opt_releasegil
+ global opt_split, opt_tracing, opt_startModName
+ global opt_startmod, opt_endmod
+ global opt_kdebasedir, opt_kdelibdir, opt_kdeincdir, opt_libdir
+ global pykde_modules, opt_dep_warnings, opt_dist_name
+ global pykde_imports, kde_includes
+
+ # Look for '-z' first and process that switch
+ # (command line switches override file switches)
+ for opt, arg in optlist:
+ if opt == "-z":
+ optlist = fileOpts (arg) + optlist
+ break
+ elif opt == "-h":
+ usage (0)
+ else:
+ if args: usage()
+
+ for opt, arg in optlist:
+ if opt == "-h":
+ usage(0)
+
+ # turns on concatentation (on by default, here for consistency)
+ elif opt == "-c":
+ opt_concat = 1
+
+ elif opt == "-d":
+ opt_pykdemoddir = arg
+ elif opt == "-g":
+ opt_releasegil = 1
+
+ # turns off concatenation (on by default)
+ elif opt == "-i":
+ opt_concat = 0
+
+ elif opt == "-j":
+ try:
+ opt_split = int(arg)
+ except:
+ usage()
+
+ elif opt == "-k":
+ opt_kdebasedir = arg
+
+ elif opt == "-L":
+ opt_libdir = arg
+
+ # allows build of single module (-lmodule) or all modules
+ # beginning at specified module (-lmodule:)
+ elif opt == "-l":
+ opt_startModName = arg
+
+ elif opt == "-n":
+ opt_kdelibdir = arg
+ elif opt == "-o":
+ opt_kdeincdir = arg
+ elif opt == "-r":
+ opt_tracing = 1
+ elif opt == "-u":
+ opt_debug = 1
+ elif opt == "-v":
+ opt_pykdesipdir = arg
+ elif opt == "-w":
+ opt_dep_warnings = 1
+
+ inform_user (0)
+ init_and_check_sanity ()
+
+ # Set the SIP platform, version and feature flags.
+ if kde_version < 0x030200:
+ pykde_modules.remove ("kmdi")
+ pykde_modules.remove ("kresources")
+ pykde_imports ["kabc"].remove ("kresources")
+ kde_includes ["kabc"].remove ("kresources")
+
+ if kde_version < 0x030300:
+ pykde_modules.remove ("kutils")
+# pykde_modules.remove ("kspell2")
+ pykde_imports ["khtml"].remove ("kutils")
+
+ opt_endmod = len (pykde_modules)
+ if opt_startModName != "":
+ if opt_startModName in pykde_modules:
+ single = opt_startModName [-1] != ":"
+ if not single:
+ opt_startModName = opt_startModName [:-1]
+
+ try:
+ opt_startmod = pykde_modules.index (opt_startModName)
+ if single:
+ opt_endmod = opt_startmod + 1
+ except:
+ sipconfig.error ("%s is not a PyKDE module" % opt_startModName)
+
+ print "PyKDE modules to be built:\n %s\n" % string.join(pykde_modules [opt_startmod:opt_endmod])
+
+ set_sip_flags()
+
+ for module in pykde_modules [opt_startmod:opt_endmod]:
+ generate_code (module, pykde_imports [module], extra_lib = module)
+
+ # Create the additional Makefiles.
+ create_makefiles()
+
+ # Install the configuration module.
+ create_config("pykdeconfig.py", srcPath("pykdeconfig.py.in"))
+
+
+def reporting_msg ():
+ print """
+If reporting errors, paste all of the output above into your
+message and post to the PyKDE mailing list at:
+
+ mailto: PyKDE@mats.imk.fraunhofer.de
+ subscribe: http://mats.imk.fraunhofer.de/mailman/listinfo/pykde
+
+You can redirect the output into a file (> output.txt) if needed
+"""
+
+
+
+###############################################################################
+# The script starts here.
+###############################################################################
+
+if __name__ == "__main__":
+ try:
+ main(sys.argv)
+ except SystemExit:
+ reporting_msg ()
+ raise
+ except:
+ reporting_msg ()
+ print \
+"""
+An internal error occured. Please report all output from the program,
+including the following traceback, to the PyKDE mailing list
+"""
+ raise