diff options
Diffstat (limited to 'python/pyqt/configure.py')
-rw-r--r-- | python/pyqt/configure.py | 1438 |
1 files changed, 0 insertions, 1438 deletions
diff --git a/python/pyqt/configure.py b/python/pyqt/configure.py deleted file mode 100644 index b8b6f076..00000000 --- a/python/pyqt/configure.py +++ /dev/null @@ -1,1438 +0,0 @@ -# This script generates the PyQt configuration and generates the Makefiles. -# -# Copyright (c) 2007 -# Riverbank Computing Limited <info@riverbankcomputing.co.uk> -# -# This file is part of PyQt. -# -# This copy of PyQt 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. -# -# PyQt 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 -# PyQt; 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 - -import sipconfig - - -# Initialise the globals. -pyqt_version = 0x031102 -pyqt_version_str = "3.17.2" - -sip_min_version = 0x040600 - - -# Try and find a Qt installation to use as the default. -try: - qt_dir = os.environ["QTDIR"] -except KeyError: - qt_dir = "" - - -qt_version = 0 -qt_edition = "" -qt_incdir = None -qt_libdir = None -qt_threaded = 0 -qt_winconfig = "" - -pyqt = None -pyqt_modules = [] -qt_sip_flags = [] -qtext_sip_flags = [] -qtpe_sip_flags = [] -qsci_version = 0 -disabled_classes = [] - -if sys.platform == "win32": - qsci_define = "QEXTSCINTILLA_DLL" -else: - qsci_define = "" - -# Get the SIP configuration. -sipcfg = sipconfig.Configuration() - -# Command line options. -opt_qtlib = None -opt_qconfigdir = None -opt_pyqtbindir = sipcfg.default_bin_dir -opt_pyqtmoddir = sipcfg.default_mod_dir -opt_pyqtsipdir = sipcfg.default_sip_dir -opt_qtpetag = None -opt_qsciincdir = None -opt_qscilibdir = None -opt_static = 0 -opt_debug = 0 -opt_concat = 0 -opt_split = 1 -opt_tracing = 0 -opt_verbose = 0 -opt_keepfeatures = 0 - -opt_vendorcheck = 0 -opt_vendincdir = sipcfg.py_inc_dir -opt_vendlibdir = sipcfg.py_lib_dir - - -def usage(rcode = 2): - """Display a usage message and exit. - - rcode is the return code passed back to the calling process. - """ - if qt_dir: - def_qt_dir = qt_dir - else: - def_qt_dir = "none" - - print "Usage:" - print " python configure.py [-h] [-a tag] [-b dir] [-c] [-d dir] [-f] [-g dir] [-i] [-j #] [-k] [-l dir] [-m dir] [-n dir] [-o dir] [-q dir] [-r] [-s] [-u] [-v dir] [-w] [-y lib] option=value option+=value ..." - print "where:" - print " -h display this help message" - print " -a tag explicitly enable the qtpe module" - print " -b dir where pyuic and pylupdate will be installed [default %s]" % opt_pyqtbindir - print " -c concatenate each module's C/C++ source files" - print " -d dir where the PyQt modules will be installed [default %s]" % opt_pyqtmoddir - print " -f keep any existing features file (when cross-compiling) [default remove]" - print " -g dir where the Qt qconfig.h file can be found [default Qt include directory]" - print " -i enable checking of signed interpreters using the VendorID package [default disabled]" - print " -j # split the concatenated C++ source files into # pieces [default 1]" - print " -k build the PyQt modules as static libraries" - print " -l dir the directory containing the VendorID header file [default %s]" % opt_vendincdir - print " -m dir the directory containing the VendorID library [default %s]" % opt_vendlibdir - print " -n dir the directory containing the QScintilla header files [default Qt include directory]" - print " -o dir the directory containing the QScintilla library [default Qt lib directory]" - print " -q dir the root directory of the Qt installation [default %s]" % def_qt_dir - print " -r generate code with tracing enabled [default disabled]" - print " -s QScintilla is a static library and not a DLL (Windows only)" - print " -u build with debugging symbols (requires a debug build of Python on Windows" - print " -v dir where the PyQt .sip files will be installed [default %s]" % opt_pyqtsipdir - print " -w don't suppress compiler output during configuration" - print " -y lib explicitly specify the type of Qt library, either qt, qt-mt, qte, qte-mt or qtmt" - - sys.exit(rcode) - - -class ConfigureBase: - """This is the base class for all PyQt version specific configurer classes. - Anything here is common to all configurers. - """ - def check_modules(self): - """Check which modules should be built and add them to the global list. - - Returns the name of any additional library that needs to be linked with - the main module. - """ - return None - - def sip_flags(self): - """Get the configuration specific SIP flags. - - Returns a list of flags. - """ - return [] - - def qt_version_tags(self): - """Get the versions tags for the configuration. - - Returns a dictionary of versions and corresponding tags. - """ - return {} - - def code(self, extra_include_dirs, extra_lib_dir, extra_libs): - """Generate the code for a configuration. - - extra_include_dirs is a list of directories to add to those supplied by - the SIP configuration. - extra_lib_dir is an optional directory to add to those supplied by the - SIP configuration. - extra_lib_dirs is an optional list of directories to add to those - supplied by the SIP configuration. - """ - pass - - def tools(self): - """Create the Makefiles for any other sub-directories and return a list - of those directories. - - Returns a list of sub-directories with Makefile. - """ - return [] - - def module_dir(self): - """Return the configuration's module directory. - """ - return opt_pyqtmoddir - - def module_installs(self): - """Return a list of files to install in the module directory other than - the modules themselves. - """ - return ["pyqtconfig.py"] - - def sip_dir(self): - """Return the configuration's .sip files directory. - """ - return opt_pyqtsipdir - - -class ConfigurePyQt3(ConfigureBase): - """This class defines the methods to configure PyQt v3. - """ - def check_modules(self): - pyqt_modules.append("qt") - - check_module("qtcanvas", "qcanvas.h", "QCanvas()") - check_module("qtnetwork", "qsocket.h", "QSocket()") - check_module("qttable", "qtable.h", "QTable()") - check_module("qtxml", "qdom.h", "QDomImplementation()") - check_module("qtgl", "qgl.h", "QGLWidget()", opengl=1) - - if qt_version >= 0x030000: - check_module("qtui", "qwidgetfactory.h", "QWidgetFactory()", lib="qui") - - if qt_edition in ("enterprise", "free"): - check_module("qtsql", "qsql.h", "QSql()") - - if sys.platform == "win32" and sipcfg.sip_version >= 0x040200: - check_module("qtaxcontainer", "qaxobject.h", "QAxObject()", lib="qaxcontainer") - - if qsci_version: - check_module("qtext", "qextscintillabase.h", "QextScintillaBase()", define=qsci_define, include_dir=opt_qsciincdir, lib_dir=opt_qscilibdir, lib="qscintilla") - - if opt_qtpetag: - pyqt_modules.append("qtpe") - - qtmod_lib = None - - if qt_version >= 0x030100: - sipconfig.inform("Checking to see if the QAssistantClient class is available...") - - if check_class("qassistantclient.h", "QAssistantClient(\"foo\")", lib="qassistantclient"): - qtmod_lib = "qassistantclient" - else: - disabled_classes.append("QAssistantClient") - - return qtmod_lib - - def sip_flags(self): - return get_feature_flags() - - def qt_version_tags(self): - return { - 0x010403: None, - 0x020000: "Qt_1_43", - 0x020100: "Qt_2_00", - 0x020200: "Qt_2_1_0", - 0x020300: "Qt_2_2_0", - 0x020301: "Qt_2_3_0", - 0x030000: "Qt_2_3_1", - 0x030001: "Qt_3_0_0", - 0x030002: "Qt_3_0_1", - 0x030004: "Qt_3_0_2", - 0x030005: "Qt_3_0_4", - 0x030006: "Qt_3_0_5", - 0x030100: "Qt_3_0_6", - 0x030101: "Qt_3_1_0", - 0x030102: "Qt_3_1_1", - 0x030200: "Qt_3_1_2", - 0x030300: "Qt_3_2_0", - 0x030305: "Qt_3_3_0", - 0x030306: "Qt_3_3_5", - 0x040000: "Qt_3_3_6" - } - - def code(self, extra_include_dirs, extra_lib_dir, extra_libs): - generate_code("qt", extra_include_dirs=extra_include_dirs, extra_lib_dir=extra_lib_dir, extra_libs=extra_libs) - - if "qtext" in pyqt_modules: - generate_code("qtext", extra_define=qsci_define, extra_include_dirs=[opt_qsciincdir], extra_lib_dir=opt_qscilibdir, extra_libs=["qscintilla"], sip_flags=qtext_sip_flags) - - if "qtgl" in pyqt_modules: - generate_code("qtgl", opengl=1) - - if "qtpe" in pyqt_modules: - generate_code("qtpe", extra_libs=["qpe"], sip_flags=qtpe_sip_flags) - - if "qtui" in pyqt_modules: - generate_code("qtui", extra_libs=["qui"]) - - if "qtaxcontainer" in pyqt_modules: - generate_code("qtaxcontainer", extra_libs=["qaxcontainer"]) - - # The rest don't need special handling. - for m in ("qtcanvas", "qtnetwork", "qtsql", "qttable", "qtxml"): - if m in pyqt_modules: - generate_code(m) - - def tools(self): - tool_dirs = [] - - if qt_version >= 0x030000: - # The Professional Edition needs special handling. - prof = (qt_edition == "professional") - - sipconfig.inform("Creating pyuic Makefile...") - - if prof or "qtxml" not in pyqt_modules: - buildfile= "pyuic-prof.sbf" - - for xml in ("qdom.cpp", "qxml.cpp"): - shutil.copyfile(qt_dir + "/src/xml/" + xml, "pyuic3/" + xml) - else: - buildfile= "pyuic.sbf" - - makefile = sipconfig.ProgramMakefile( - configuration=sipcfg, - build_file=buildfile, - dir="pyuic3", - install_dir=opt_pyqtbindir, - console=1, - qt=1, - warnings=1 - ) - - makefile.extra_defines.append("UIC") - makefile.extra_defines.append("QT_INTERNAL_XML") - - if prof or "qtxml" not in pyqt_modules: - makefile.extra_defines.append("QT_MODULE_XML") - - if qt_version < 0x030100: - makefile.extra_include_dirs.append(qt_dir + "/src/3rdparty/zlib") - - makefile.generate() - tool_dirs.append("pyuic3") - - sipconfig.inform("Creating pylupdate Makefile...") - - if prof or "qtxml" not in pyqt_modules: - buildfile= "pylupdate-prof.sbf" - - shutil.copyfile(qt_dir + "/src/xml/qxml.cpp", "pylupdate3/qxml.cpp") - else: - buildfile= "pylupdate.sbf" - - makefile = sipconfig.ProgramMakefile( - configuration=sipcfg, - build_file=buildfile, - dir="pylupdate3", - install_dir=opt_pyqtbindir, - console=1, - qt=1, - warnings=1 - ) - - makefile.extra_defines.append("QT_INTERNAL_XML") - - if prof or "qtxml" not in pyqt_modules: - makefile.extra_defines.append("QT_MODULE_XML") - - makefile.generate() - tool_dirs.append("pylupdate3") - elif qt_version >= 0x020000: - sipconfig.inform("Creating pyuic Makefile...") - - makefile = sipconfig.ProgramMakefile( - configuration=sipcfg, - build_file="pyuic.sbf", - dir="pyuic2", - install_dir=opt_pyqtbindir, - console=1, - qt=1, - warnings=1 - ) - - makefile.extra_defines.append("UIC") - makefile.extra_include_dirs.append(qt_dir + "/src/3rdparty/zlib") - - makefile.generate() - tool_dirs.append("pyuic2") - - return tool_dirs - - -def inform_user(): - """Tell the user the option values that are going to be used. - """ - if qt_edition: - edstr = qt_edition + " edition " - else: - edstr = "" - - sipconfig.inform("Qt v%s %sis being used." % (sipconfig.version_to_string(qt_version), edstr)) - sipconfig.inform("SIP %s is being used." % sipcfg.sip_version_str) - sipconfig.inform("These PyQt modules will be built: %s." % string.join(pyqt_modules)) - - if disabled_classes: - sipconfig.inform("Support for these Qt classes has been disabled: %s." % string.join(disabled_classes)) - - sipconfig.inform("The PyQt modules will be installed in %s." % opt_pyqtmoddir) - sipconfig.inform("The PyQt .sip files will be installed in %s." % opt_pyqtsipdir) - - sipconfig.inform("The Qt header files are in %s." % qt_incdir) - sipconfig.inform("The %s Qt library is in %s." % (opt_qtlib, qt_libdir)) - - if qt_version >= 0x020000: - sipconfig.inform("pyuic will be installed in %s." % opt_pyqtbindir) - - if qt_version >= 0x030000: - sipconfig.inform("pylupdate will be installed in %s." % opt_pyqtbindir) - - if opt_vendorcheck: - sipconfig.inform("PyQt will only be usable with signed interpreters.") - - -def create_config(module, template, macros): - """Create the PyQt configuration module so that it can be imported by build - scripts. - - module is the module file name. - template is the template file name. - macros is the dictionary of platform specific build macros. - """ - sipconfig.inform("Creating %s..." % module) - - content = { - "pyqt_config_args": sys.argv[1:], - "pyqt_version": pyqt_version, - "pyqt_version_str": pyqt_version_str, - "pyqt_bin_dir": opt_pyqtbindir, - "pyqt_mod_dir": opt_pyqtmoddir, - "pyqt_sip_dir": opt_pyqtsipdir, - "pyqt_modules": pyqt_modules, - "pyqt_qt_sip_flags": qt_sip_flags, - "qt_version": qt_version, - "qt_edition": qt_edition, - "qt_winconfig": qt_winconfig, - "qt_framework": 0, - "qt_threaded": qt_threaded, - "qt_dir": qt_dir, - "qt_inc_dir": qt_incdir, - "qt_lib": opt_qtlib, - "qt_lib_dir": qt_libdir - } - - if "qtaxcontainer" in pyqt_modules: - content["pyqt_qtaxcontainer_sip_flags"] = qt_sip_flags - - if "qtcanvas" in pyqt_modules: - content["pyqt_qtcanvas_sip_flags"] = qt_sip_flags - - if "qtext" in pyqt_modules: - content["pyqt_qtext_sip_flags"] = qtext_sip_flags - - # These are internal. - content["_pyqt_qscintilla_defines"] = qsci_define - content["_pyqt_qscintilla_inc_dir"] = opt_qsciincdir - content["_pyqt_qscintilla_lib_dir"] = opt_qscilibdir - - if "qtgl" in pyqt_modules: - content["pyqt_qtgl_sip_flags"] = qt_sip_flags - - if "qtnetwork" in pyqt_modules: - content["pyqt_qtnetwork_sip_flags"] = qt_sip_flags - - if "qtpe" in pyqt_modules: - content["pyqt_qtpe_sip_flags"] = qtpe_sip_flags - - if "qtsql" in pyqt_modules: - content["pyqt_qtsql_sip_flags"] = qt_sip_flags - - if "qttable" in pyqt_modules: - content["pyqt_qttable_sip_flags"] = qt_sip_flags - - if "qtui" in pyqt_modules: - content["pyqt_qtui_sip_flags"] = qt_sip_flags - - if "qtxml" in pyqt_modules: - content["pyqt_qtxml_sip_flags"] = qt_sip_flags - - sipconfig.create_config_module(module, template, content, macros) - - -def compile_qt_program(name, define=None, include_dir=None, lib_dir=None, lib=None, opengl=0, python=0, debug=0): - """Compile a simple Qt application. - - name is the name of the single source file. - define is a name to add to the list of preprocessor defines. - include_dir is the name of a directory to add to the list of include - directories. - lib_dir is the name of a directory to add to the list of library - directories. - lib is the name of a library to add to the list of libraries. - opengl is set if the application uses OpenGL. - python is set if the application #includes Python.h. - debug is set if this is a debug build. - - Returns the name of the executable suitable for running or None if it - wasn't created. - """ - makefile = sipconfig.ProgramMakefile(sipcfg, console=1, qt=1, warnings=0, opengl=opengl, python=python, debug=debug) - - if define: - makefile.extra_defines.append(define) - - if include_dir: - makefile.extra_include_dirs.append(include_dir) - - if lib_dir: - makefile.extra_lib_dirs.append(lib_dir) - - if lib: - makefile.extra_libs.append(lib) - - exe, build = makefile.build_command(name) - - # Make sure the executable file doesn't exist. - try: - os.remove(exe) - except OSError: - pass - - if not opt_verbose and hasattr(os, "popen4"): - fin, fout = os.popen4(build) - - # Read stdout and stderr until there is no more output. - lout = fout.readline() - while lout: - lout = fout.readline() - - fin.close() - fout.close() - - try: - os.wait() - except: - pass - else: - os.system(build) - - if not os.access(exe, os.X_OK): - return None - - if sys.platform != "win32": - exe = "./" + exe - - return exe - - -def check_qscintilla(): - """See if QScintilla can be found and what its version is. - """ - # Set the defaults if they haven't been explicitly specified. - global opt_qsciincdir, opt_qscilibdir - - if opt_qsciincdir is None: - opt_qsciincdir = qt_incdir - - if opt_qscilibdir is None: - opt_qscilibdir = qt_libdir - - # Find the QScintilla header files. - sciglobal = os.path.join(opt_qsciincdir, "qextscintillaglobal.h") - - if os.access(sciglobal, os.F_OK): - # Get the QScintilla version number. - global qsci_version - - qsci_version, sciversstr = sipconfig.read_version(sciglobal, "QScintilla", "QSCINTILLA_VERSION", "QSCINTILLA_VERSION_STR") - - if glob.glob(os.path.join(opt_qscilibdir, "*qscintilla*")): - sipconfig.inform("QScintilla %s is being used." % sciversstr) - - # If we find a snapshot then set a negative version number as a - # special case. - if string.find(sciversstr, "snapshot") >= 0: - qsci_version = -1 - else: - sipconfig.inform("The QScintilla library could not be found in %s and so the qtext module will not be built. If QScintilla is installed then use the -o argument to explicitly specify the correct directory." % opt_qscilibdir) - else: - sipconfig.inform("qextscintillaglobal.h could not be found in %s and so the qtext module will not be built. If QScintilla is installed then use the -n argument to explicitly specify the correct directory." % opt_qsciincdir) - - -def check_vendorid(): - """See if the VendorID library and include file can be found. - """ - global opt_vendorcheck - - if opt_vendorcheck: - if os.access(os.path.join(opt_vendincdir, "vendorid.h"), os.F_OK): - if glob.glob(os.path.join(opt_vendlibdir, "*vendorid*")): - sipconfig.inform("The VendorID package was found.") - else: - opt_vendorcheck = 0 - sipconfig.inform("The VendorID library could not be found in %s and so signed interpreter checking will be disabled. If the VendorID library is installed then use the -m argument to explicitly specify the correct directory." % opt_vendlibdir) - else: - opt_vendorcheck = 0 - sipconfig.inform("vendorid.h could not be found in %s and so signed interpreter checking will be disabled. If the VendorID package is installed then use the -l argument to explicitly specify the correct directory." % opt_vendincdir) - - -def check_module(mname, incfile, ctor, define=None, include_dir=None, lib_dir=None, lib=None, opengl=0): - """See if a module can be built and, if so, add it to the global list of - modules. - - mname is the name of the module. - incfile is the name of the include file needed for the test. - ctor is the C++ constructor of the class being used for the test. - define is a name to add to the list of preprocessor defines. - include_dir is the name of a directory to add to the list of include - directories. - lib_dir is the name of a directory to add to the list of library - directories. - lib is the name of a library to add to the list of libraries. - opengl is set if the application uses OpenGL. - """ - # Check the module's main .sip file exists. - if os.access(os.path.join("sip", mname, mname + "mod.sip"), os.F_OK): - sipconfig.inform("Checking to see if the %s module should be built..." % mname) - - if check_class(incfile, ctor, define, include_dir, lib_dir, lib, opengl): - pyqt_modules.append(mname) - - -def check_class(incfile, ctor, define=None, include_dir=None, lib_dir=None, lib=None, opengl=0): - """Return non-zero if a class is available. - - incfile is the name of the include file needed for the test. - ctor is the C++ constructor of the class. - define is a name to add to the list of preprocessor defines. - include_dir is the name of a directory to add to the list of include - directories. - lib_dir is the name of a directory to add to the list of library - directories. - lib is the name of a library to add to the list of libraries. - opengl is set if the application uses OpenGL. - """ - cfgtest = "cfgtest.cpp" - - f = open(cfgtest, "w") - - f.write("""#include <%s> - -int main(int argc, char **argv) -{ - new %s; -} -""" % (incfile, ctor)) - - f.close() - - return compile_qt_program(cfgtest, define, include_dir, lib_dir, lib, opengl) - - -def check_plugin(cname, incfile): - """Return non-zero if a class that might be a plugin is in the main Qt - library. - - cname is the name of the class. - incfile is the name of the include file needed for the test. - """ - sipconfig.inform("Checking to see if the %s class is built in..." % cname) - - return check_class(incfile, cname + "()") - - -def create_features_file(name): - """Create the features file. - - name is the name of the features file in the current directory. - """ - # The features that a given Qt configuration may or may not support. Note - # that STYLE_WINDOWSXP and ASSISTANTCLIENT require special handling. - flist = ["ACTION", "CLIPBOARD", "CODECS", "COLORDIALOG", "DATASTREAM", - "DIAL", "DNS", "DOM", "DRAGANDDROP", "ICONVIEW", "IMAGE_TEXT", - "INPUTDIALOG", "FILEDIALOG", "FONTDATABASE", "FONTDIALOG", - "MESSAGEBOX", "MIMECLIPBOARD", - "NETWORKPROTOCOL", "NETWORKPROTOCOL_FTP", "NETWORKPROTOCOL_HTTP", - "PICTURE", "PRINTDIALOG", "PRINTER", "PROGRESSDIALOG", - "PROPERTIES", - "SEMIMODAL", "SIZEGRIP", "SOUND", "SPLITTER", "STYLE_CDE", - "STYLE_INTERLACE", "STYLE_MOTIF", "STYLE_MOTIFPLUS", - "STYLE_PLATINUM", "STYLE_SGI", "STYLE_WINDOWS", - "TABDIALOG", "TABLE", "TABLEVIEW", "TRANSFORMATIONS", - "TRANSLATION", "WIZARD", "WORKSPACE"] - - # Generate the program which will generate the features file. - f = open("mkfeatures.cpp", "w") - - f.write( -"""#include <Python.h> -#include <stdio.h> -#include <qglobal.h> -#include <qapplication.h> - -int main(int argc,char **argv) -{ - FILE *fp; - QApplication app(argc,argv,0); - - if ((fp = fopen("%s","w")) == NULL) - { - printf("Unable to create '%s'\\n"); - return 1; - } - -#if !defined(WITH_THREAD) || !defined(QT_THREAD_SUPPORT) - fprintf(fp,"-x Qt_THREAD_SUPPORT\\n"); -#endif - -#if !defined(Q_WS_WIN) || QT_VERSION < 0x030000 || defined(QT_NO_STYLE_WINDOWSXP) - fprintf(fp,"-x Qt_STYLE_WINDOWSXP\\n"); -#endif - -#if defined(Q_OS_WIN64) - fprintf(fp,"-x Qt_Q_LONG_IS_long\\n"); -#endif -""" % (name, name)) - - for feat in flist: - f.write( -""" -#if defined(QT_NO_%s) - fprintf(fp,"-x Qt_%s\\n"); -#endif -""" % (feat, feat)) - - # Disable QAssistantClient for the Professional Edition. - if "QAssistantClient" in disabled_classes: - f.write( -""" - fprintf(fp,"-x Qt_ASSISTANTCLIENT\\n"); -""") - - f.write( -""" - fclose(fp); - - return 0; -} -""") - - f.close() - - # Build the program. - exe = compile_qt_program("mkfeatures.cpp", include_dir=sipcfg.py_inc_dir, python=1) - if not exe: - sipconfig.error("Unable to build mkfeatures utility.") - - os.system(exe) - - # Check the file was created. - if not os.access(name, os.F_OK): - sipconfig.error("There was an error creating the features file.") - - # Check what features have been implemented as plugins and disable them. - plugins = [("STYLE_CDE", "qcdestyle.h", "QCDEStyle"), - ("STYLE_INTERLACE", "qinterlacestyle.h", "QInterlaceStyle"), - ("STYLE_MOTIF", "qmotifstyle.h", "QMotifStyle"), - ("STYLE_MOTIFPLUS", "qmotifplusstyle.h", "QMotifPlusStyle"), - ("STYLE_PLATINUM", "qplatinumstyle.h", "QPlatinumStyle"), - ("STYLE_SGI", "qsgistyle.h", "QSGIStyle"), - ("STYLE_WINDOWSXP", "qwindowsxpstyle.h", "QWindowsXPStyle"), - ("STYLE_WINDOWS", "qwindowsstyle.h", "QWindowsStyle")] - - f = open(name, "a") - - for (feat, incfile, cname) in plugins: - if not check_plugin(cname, incfile): - f.write("-x Qt_%s\n" % feat) - disabled_classes.append(cname) - - f.close() - - -def get_feature_flags(): - """Return the list of SIP flags that exclude unsupported Qt features. - """ - featfile = "features" - - # Create the features file if it doesn't exist and we are not keeping it. - if opt_keepfeatures and os.access(featfile,os.F_OK): - sipconfig.inform("Using existing features file.") - else: - sipconfig.inform("Creating features file...") - create_features_file(featfile) - - # Parse the features file. - ff = open(featfile, "r") - - flags = [] - - line = ff.readline() - while line: - flags.extend(string.split(line)) - line = ff.readline() - - return flags - - -def set_sip_flags(): - """Set the SIP platform, version and feature flags. - """ - qt_sip_flags.extend(pyqt.sip_flags()) - - # If we don't check for signed interpreters, we exclude the 'VendorID' - # feature - if not opt_vendorcheck: - qt_sip_flags.append("-x") - qt_sip_flags.append("VendorID") - - # Handle the platform tag. - if opt_qtpetag: - plattag = "WS_QWS" - elif sys.platform == "win32": - plattag = "WS_WIN" - elif sys.platform == "darwin": - if "__DARWIN_X11__" in sipcfg.build_macros()["DEFINES"]: - plattag = "WS_X11" - else: - plattag = "WS_MACX" - else: - plattag = "WS_X11" - - qt_sip_flags.append("-t") - qt_sip_flags.append(plattag) - - # Handle the Qt version tag. - verstag = sipconfig.version_to_sip_tag(qt_version, pyqt.qt_version_tags(), "Qt") - - if verstag: - qt_sip_flags.append("-t") - qt_sip_flags.append(verstag) - - # The flags so far are common. - for f in qt_sip_flags: - qtext_sip_flags.append(f) - qtpe_sip_flags.append(f) - - # Handle the QScintilla version tag. - if qsci_version: - qscitags = { - 0x010100: None, - 0x010200: "QScintilla_1_1", - 0x010300: "QScintilla_1_2", - 0x010400: "QScintilla_1_3", - 0x010500: "QScintilla_1_4", - 0x010600: "QScintilla_1_5", - 0x010700: "QScintilla_1_6", - 0x020000: "QScintilla_1_7" - } - - verstag = sipconfig.version_to_sip_tag(qsci_version, qscitags, "QScintilla") - - if verstag: - qtext_sip_flags.append("-t") - qtext_sip_flags.append(verstag) - - # Handle the Qtopia tag. - if opt_qtpetag: - qtpe_sip_flags.append("-t") - qtpe_sip_flags.append(opt_qtpetag) - - -def generate_code(mname, extra_cflags=None, extra_cxxflags=None, extra_define=None, extra_include_dirs=None, extra_lflags=None, extra_lib_dir=None, extra_libs=None, opengl=0, sip_flags=None): - """Generate the code for a module. - - mname is the name of the module. - 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_dirs is a list of directories 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_libs is a list of the names of extra libraries 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) - - 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 + '"'] - - if sip_flags is None: - sip_flags = qt_sip_flags - - argv.extend(sip_flags) - - if opt_concat: - argv.append("-j") - argv.append(str(opt_split)) - - if opt_tracing: - argv.append("-r") - - argv.append("-c") - argv.append(mname) - - buildfile = os.path.join(mname, mname + ".sbf") - argv.append("-b") - argv.append(buildfile) - - argv.append("-I") - argv.append("sip") - - # SIP assumes POSIX style path separators. - argv.append(string.join(["sip", mname, mname + "mod.sip"], "/")) - - os.system(string.join(argv)) - - # Check the result. - if not os.access(buildfile, os.F_OK): - sipconfig.error("Unable to create the C++ code.") - - # Generate the Makefile. - sipconfig.inform("Creating the Makefile for the %s module..." % mname) - - installs = [] - sipfiles = [] - - for s in glob.glob("sip/" + mname + "/*.sip"): - sipfiles.append(os.path.join("..", "sip", mname, os.path.basename(s))) - - installs.append([sipfiles, os.path.join(pyqt.sip_dir(), mname)]) - - makefile = sipconfig.SIPModuleMakefile( - configuration=sipcfg, - build_file=mname + ".sbf", - dir=mname, - install_dir=pyqt.module_dir(), - installs=installs, - qt=1, - opengl=opengl, - warnings=1, - 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 extra_define: - makefile.extra_defines.append(extra_define) - - if extra_include_dirs: - makefile.extra_include_dirs.extend(extra_include_dirs) - - if extra_lflags: - makefile.extra_lflags.append(extra_lflags) - - if extra_lib_dir: - makefile.extra_lib_dirs.append(extra_lib_dir) - - if extra_libs: - makefile.extra_libs.extend(extra_libs) - - makefile.generate() - - -def check_license(): - """Handle the validation of the PyQt license. - """ - try: - import license - ltype = license.LicenseType - lname = license.LicenseName - - try: - lfile = license.LicenseFile - except AttributeError: - lfile = None - except ImportError: - ltype = None - - if ltype is None: - ltype = "GPL" - lname = "GNU General Public License" - lfile = None - - sipconfig.inform("This is the %s version of PyQt %s (licensed under the %s) for Python %s on %s." % (ltype, pyqt_version_str, lname, string.split(sys.version)[0], sys.platform)) - - # Common checks. - if ltype == "GPL" and sys.platform == "win32": - error("You cannot use the GPL version of PyQt under Windows.") - - try: - qted = qt_edition - except AttributeError: - qted = None - - if qted and ltype != "internal": - if (qted == "free" and ltype != "GPL") or (qted != "free" and ltype == "GPL"): - sipconfig.error("This version of PyQt and the %s edition of Qt have incompatible licenses." % qted) - - # Confirm the license. - print - print "Type 'L' to view the license." - print "Type 'yes' to accept the terms of the license." - print "Type 'no' to decline the terms of the license." - print - - while 1: - try: - resp = raw_input("Do you accept the terms of the license? ") - except: - resp = "" - - resp = string.lower(string.strip(resp)) - - if resp == "yes": - break - - if resp == "no": - sys.exit(0) - - if resp == "l": - os.system("more LICENSE") - - # If there should be a license file then check it is where it should be. - if lfile: - if os.access(os.path.join("sip", lfile), os.F_OK): - sipconfig.inform("Found the license file %s." % lfile) - else: - sipconfig.error("Please copy the license file %s to the sip directory." % lfile) - - -def get_build_macros(overrides): - """Return the dictionary of platform specific build macros from the Qt - installation. Return None if any of the overrides was invalid. - - overrides is a list of macros overrides from the user. - """ - # Get the name of the qmake configuration file to take the macros from. - if "QMAKESPEC" in os.environ.keys(): - fname = os.path.join(qt_dir, "mkspecs", os.environ["QMAKESPEC"], "qmake.conf") - else: - fname = os.path.join(qt_dir, "mkspecs", "default", "qmake.conf") - - if not os.access(fname, os.F_OK): - sipconfig.error("Unable to find the default configuration file %s. You can use the QMAKESPEC environment variable to specify the correct platform instead of \"default\"." % fname) - - # Add the Qt specific macros to the default. - names = sipcfg.build_macros().keys() - names.append("INCDIR_QT") - names.append("LIBDIR_QT") - names.append("MOC") - - # Make sure $QTDIR reflects any directory passed on the command line. - os.environ["QTDIR"] = qt_dir - - properties = { - "QT_INSTALL_BINS": os.path.join(qt_dir, "bin"), - "QT_INSTALL_HEADERS": os.path.join(qt_dir, "include"), - "QT_INSTALL_LIBS": os.path.join(qt_dir, "lib") - } - - return sipconfig.parse_build_macros(fname, names, overrides, properties) - - -def check_qt_installation(macros): - """Check the Qt installation and get the version number and edition. - - macros is the dictionary of build macros. - """ - # Get the Makefile generator. - generator = macros["MAKEFILE_GENERATOR"] - - # Set the Qt include and lib directories. - global qt_incdir, qt_libdir - - qt_incdir = macros["INCDIR_QT"] - - if not qt_incdir: - qt_incdir = os.path.join(qt_dir, "include") - macros["INCDIR_QT"] = qt_incdir - - qt_libdir = macros["LIBDIR_QT"] - - if not qt_libdir: - qt_libdir = os.path.join(qt_dir, "lib") - macros["LIBDIR_QT"] = qt_libdir - - # Check the Qt header files have been installed. Quietly check for Qt v4. - qt4_d = os.path.join(qt_incdir, "QtCore") - - qglobal = os.path.join(qt4_d, "qglobal.h") - - if not os.access(qglobal, os.F_OK): - qglobal = os.path.join(qt_incdir, "qglobal.h") - - if not os.access(qglobal, os.F_OK): - sipconfig.error("qglobal.h could not be found in %s." % qt_incdir) - - # Get the Qt version number. - global qt_version - - qt_version, ignore = sipconfig.read_version(qglobal, "Qt", "QT_VERSION") - - # Early versions of Qt for the Mac didn't include everything. Rather than - # maintain these in the future we just mandate a later version. - if sys.platform == "darwin" and qt_version < 0x030100: - sipconfig.error("PyQt for MacOS/X requires Qt v3.1.0 or later.") - - # The way SIP v4.2 and later handle connections between signals and Python - # slots only works with Qt v3 and later. Therefore Qt v2 and earlier needs - # SIP v3. - if qt_version < 0x030000: - sipconfig.error("Qt v2.x and earlier require SIP v3.x.") - - if qt_version >= 0x040000: - sipconfig.error("Qt v4.x requires PyQt v4.x.") - - # Try and work out which edition it is. - global qt_edition - - if qt_version >= 0x030000: - if opt_qconfigdir: - qconfigdir = opt_qconfigdir - else: - qconfigdir = qt_incdir - - qconfig = os.path.join(qconfigdir, "qconfig.h") - - if not os.access(qconfig,os.F_OK): - sipconfig.error("qconfig.h could not be found in %s." % qconfigdir) - - f = open(qconfig) - l = f.readline() - - while l: - wl = string.split(l) - if len(wl) == 3 and wl[0] == "#define" and wl[1] == "QT_PRODUCT_LICENSE": - qt_edition = wl[2][4:-1] - break - - l = f.readline() - - f.close() - - if not qt_edition: - sipconfig.error("The Qt edition could not be determined by parsing %s." % qconfig) - elif qt_version == 0x020300 and sys.platform == "win32": - # See if we have the Qt v2 non-commercial version. - if os.access(os.path.join(qt_libdir, "qt-mt230nc.lib"), os.F_OK): - qt_edition = "non-commercial" - - if sys.platform == "win32": - # Work out how Qt was built on Windows. - - global qt_winconfig - - try: - f = open(os.path.join(qt_dir, ".qtwinconfig"), "r") - except IOError: - f = None - - if f: - cfg = f.readline() - f.close() - - val = string.find(cfg, "=") - - if val >= 0: - qt_winconfig = string.strip(cfg[val + 1:]) - else: - # Assume it was built as a DLL. - qt_winconfig = "shared" - - # Determine the Qt library to link against and if it has thread support. - global qt_threaded - - resolve_qt3_library(generator) - - if opt_qtlib in ("qt-mt", "qt-mtedu", "qt-mteval", "qte-mt", "qtmt", "qtmtedu", "qtmteval"): - qt_threaded = 1 - - global pyqt - - pyqt = ConfigurePyQt3() - - # We haven't yet factored out sipconfig's knowledge of how to build Qt - # binaries and it is expecting to find these in the configuration when it - # generates the Makefiles. - sipcfg.qt_version = qt_version - sipcfg.qt_edition = qt_edition - sipcfg.qt_winconfig = qt_winconfig - sipcfg.qt_framework = 0 - sipcfg.qt_threaded = qt_threaded - sipcfg.qt_dir = qt_dir - sipcfg.qt_lib = opt_qtlib - sipcfg.qt_lib_dir = qt_libdir - - -def resolve_qt3_library(generator): - """See which version of the Qt v3 library can be found. (We can't trust - the configuration files.) - - generator is the name of the Makefile generator. - """ - global opt_qtlib - - if opt_qtlib: - if not is_qt_library(generator, opt_qtlib): - sipconfig.error("The %s Qt library could not be found in %s." % (opt_qtlib, qt_libdir)) - else: - stlib = is_qt_library(generator, "qt") - mtlib = is_qt_library(generator, "qt-mt") - edlib = is_qt_library(generator, "qt-mtedu") - evlib = is_qt_library(generator, "qt-mteval") - emlib = is_qt_library(generator, "qte") - etlib = is_qt_library(generator, "qte-mt") - - # Borland likes to be a little different. - bmtlib = is_qt_library(generator, "qtmt") - bedlib = is_qt_library(generator, "qtmtedu") - bevlib = is_qt_library(generator, "qtmteval") - - names = [] - - if stlib: - opt_qtlib = "qt" - names.append(opt_qtlib) - - if mtlib: - opt_qtlib = "qt-mt" - names.append(opt_qtlib) - - if edlib: - opt_qtlib = "qt-mtedu" - names.append(opt_qtlib) - - if evlib: - opt_qtlib = "qt-mteval" - names.append(opt_qtlib) - - if emlib: - opt_qtlib = "qte" - names.append(opt_qtlib) - - if etlib: - opt_qtlib = "qte-mt" - names.append(opt_qtlib) - - if bmtlib: - opt_qtlib = "qtmt" - names.append(opt_qtlib) - - if bedlib: - opt_qtlib = "qtmtedu" - names.append(opt_qtlib) - - if bevlib: - opt_qtlib = "qtmteval" - names.append(opt_qtlib) - - if not names: - sipconfig.error("No Qt libraries could be found in %s." % qt_libdir) - - if len(names) > 1: - sipconfig.error("These Qt libraries were found: %s. Use the -y argument to explicitly specify which you want to use." % string.join(names)) - - -def is_qt_library(generator, lib): - """See if a particular Qt library is installed. - - generator is the name of the Makefile generator. - lib is the name of the library. - """ - if generator in ("MSVC", "MSVC.NET", "BMAKE"): - lpatts = [lib + "[0-9]*.lib", lib + ".lib"] - else: - lpatts = ["lib" + lib + ".*"] - - for lpatt in lpatts: - lmatch = glob.glob(os.path.join(qt_libdir, lpatt)) - - if lmatch: - return lmatch - - return [] - - -def main(argv): - """Create the configuration module module. - - argv is the list of command line arguments. - """ - # Check SIP is new enough. - if sipcfg.sip_version_str[:8] != "snapshot": - if sipcfg.sip_version < sip_min_version: - sipconfig.error("This version of PyQt requires SIP v%s or later" % sipconfig.version_to_string(sip_min_version)) - - # Parse the command line. - try: - optlist, args = getopt.getopt(argv[1:], "ha:b:cd:fg:ij:kl:m:n:o:q:rsuv:wy:") - except getopt.GetoptError: - usage() - - global qt_dir, opt_qtlib, opt_qconfigdir - global opt_pyqtbindir, opt_pyqtmoddir, opt_pyqtsipdir - global opt_qtpetag, opt_static, opt_debug, opt_concat - global opt_split, opt_tracing, opt_verbose, opt_keepfeatures - global opt_qsciincdir, opt_qscilibdir, qsci_define - global opt_vendorcheck, opt_vendincdir, opt_vendlibdir - - for opt, arg in optlist: - if opt == "-h": - usage(0) - elif opt == "-a": - opt_qtpetag = arg - elif opt == "-b": - opt_pyqtbindir = os.path.abspath(arg) - elif opt == "-c": - opt_concat = 1 - elif opt == "-d": - opt_pyqtmoddir = os.path.abspath(arg) - elif opt == "-f": - opt_keepfeatures = 1 - elif opt == "-g": - opt_qconfigdir = os.path.abspath(arg) - elif opt == "-i": - opt_vendorcheck = 1 - elif opt == "-j": - try: - opt_split = int(arg) - except: - usage() - elif opt == "-k": - opt_static = 1 - elif opt == "-l": - opt_vendincdir = arg - elif opt == "-m": - opt_vendlibdir = arg - elif opt == "-n": - opt_qsciincdir = arg - elif opt == "-o": - opt_qscilibdir = arg - elif opt == "-q": - qt_dir = os.path.abspath(arg) - elif opt == "-r": - opt_tracing = 1 - elif opt == "-s": - qsci_define = "" - elif opt == "-u": - opt_debug = 1 - elif opt == "-v": - opt_pyqtsipdir = os.path.abspath(arg) - elif opt == "-w": - opt_verbose = 1 - elif opt == "-y": - if arg in ("qt", "qt-mt", "qt-mtedu", "qt-mteval", "qte", "qte-mt", "qtmt", "qtmtedu"): - opt_qtlib = arg - else: - usage() - - # Check that we know the name of the Qt root directory. - if not qt_dir: - sipconfig.error("A Qt installation could not be found. Use use the -q argument or the QTDIR environment variable to explicitly specify the correct directory.") - - # When building static libraries, signed interpreter checking makes no - # sense. - if opt_vendorcheck and opt_static: - sipconfig.error("Using the VendorID package when building static libraries makes no sense.") - - # Replace the existing build macros with the ones from the Qt installation. - macros = get_build_macros(args) - - if macros is None: - usage() - - sipcfg.set_build_macros(macros) - - # Check Qt is what we need. - check_qt_installation(macros) - - # Check the licenses are compatible. - check_license() - - # Check for QScintilla. - check_qscintilla() - - # Check which modules to build. - qtmod_lib = pyqt.check_modules() - - # Check for the VendorID package. - check_vendorid() - - # Set the SIP platform, version and feature flags. - set_sip_flags() - - # Tell the user what's been found. - inform_user() - - # Generate the code. - - extra_include_dirs = [] - extra_libs = [] - - if qtmod_lib: - extra_libs.append(qtmod_lib) - - if opt_vendorcheck: - extra_include_dirs.append(opt_vendincdir) - extra_lib_dir = opt_vendlibdir - extra_libs.append("vendorid") - else: - extra_lib_dir = None - - pyqt.code(extra_include_dirs, extra_lib_dir, extra_libs) - - # Create the additional Makefiles. - sipconfig.inform("Creating top level Makefile...") - - sipconfig.ParentMakefile( - configuration=sipcfg, - subdirs=pyqt_modules + pyqt.tools(), - installs=(pyqt.module_installs(), pyqt.module_dir()) - ).generate() - - # Install the configuration module. - create_config("pyqtconfig.py", "pyqtconfig.py.in", macros) - - -############################################################################### -# The script starts here. -############################################################################### - -if __name__ == "__main__": - try: - main(sys.argv) - except SystemExit: - raise - except: - print \ -"""An internal error occured. Please report all the output from the program, -including the following traceback, to support@riverbankcomputing.co.uk. -""" - raise |