summaryrefslogtreecommitdiffstats
path: root/python/sip/configure.py
diff options
context:
space:
mode:
Diffstat (limited to 'python/sip/configure.py')
-rw-r--r--python/sip/configure.py417
1 files changed, 417 insertions, 0 deletions
diff --git a/python/sip/configure.py b/python/sip/configure.py
new file mode 100644
index 00000000..e5c55295
--- /dev/null
+++ b/python/sip/configure.py
@@ -0,0 +1,417 @@
+# This script handles the SIP configuration and generates the Makefiles.
+#
+# Copyright (c) 2007
+# Riverbank Computing Limited <info@riverbankcomputing.co.uk>
+#
+# This file is part of SIP.
+#
+# This copy of SIP is licensed for use under the terms of the SIP License
+# Agreement. See the file LICENSE for more details.
+#
+# SIP is supplied WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+
+import sys
+import os
+import string
+import glob
+import getopt
+
+import siputils
+
+
+# Initialise the globals.
+sip_version = 0x040600
+sip_version_str = "4.6"
+py_version = sys.hexversion >> 8
+plat_py_site_dir = None
+plat_py_inc_dir = None
+plat_py_conf_inc_dir = None
+plat_py_lib_dir = None
+plat_sip_dir = None
+plat_bin_dir = None
+platform_specs = []
+default_platform = None
+
+# Command line options.
+opt_platform = None
+opt_sipbindir = None
+opt_sipmoddir = None
+opt_sipincdir = None
+opt_sipsipdir = None
+opt_static = 0
+opt_debug = 0
+opt_export_all = 0
+opt_universal = ''
+
+# The names of build macros extracted from the platform specific configuration
+# files.
+build_macro_names = [
+ "DEFINES", "CONFIG",
+ "CC",
+ "CFLAGS",
+ "CFLAGS_RELEASE", "CFLAGS_DEBUG",
+ "CFLAGS_CONSOLE", "CFLAGS_SHLIB", "CFLAGS_THREAD",
+ "CFLAGS_MT", "CFLAGS_MT_DBG", "CFLAGS_MT_DLL", "CFLAGS_MT_DLLDBG",
+ "CFLAGS_EXCEPTIONS_ON", "CFLAGS_EXCEPTIONS_OFF",
+ "CFLAGS_RTTI_ON", "CFLAGS_RTTI_OFF",
+ "CFLAGS_STL_ON", "CFLAGS_STL_OFF",
+ "CFLAGS_WARN_ON", "CFLAGS_WARN_OFF",
+ "CHK_DIR_EXISTS", "COPY",
+ "CXX",
+ "CXXFLAGS",
+ "CXXFLAGS_RELEASE", "CXXFLAGS_DEBUG",
+ "CXXFLAGS_CONSOLE", "CXXFLAGS_SHLIB", "CXXFLAGS_THREAD",
+ "CXXFLAGS_MT", "CXXFLAGS_MT_DBG", "CXXFLAGS_MT_DLL", "CXXFLAGS_MT_DLLDBG",
+ "CXXFLAGS_EXCEPTIONS_ON", "CXXFLAGS_EXCEPTIONS_OFF",
+ "CXXFLAGS_RTTI_ON", "CXXFLAGS_RTTI_OFF",
+ "CXXFLAGS_STL_ON", "CXXFLAGS_STL_OFF",
+ "CXXFLAGS_WARN_ON", "CXXFLAGS_WARN_OFF",
+ "DEL_FILE",
+ "EXTENSION_SHLIB", "EXTENSION_PLUGIN",
+ "INCDIR", "INCDIR_X11", "INCDIR_OPENGL",
+ "LIBS_CORE", "LIBS_GUI", "LIBS_NETWORK", "LIBS_OPENGL",
+ "LINK", "LINK_SHLIB", "AIX_SHLIB", "LINK_SHLIB_CMD",
+ "LFLAGS", "LFLAGS_CONSOLE", "LFLAGS_CONSOLE_DLL", "LFLAGS_DEBUG",
+ "LFLAGS_DLL",
+ "LFLAGS_PLUGIN", "LFLAGS_RELEASE", "LFLAGS_SHLIB", "LFLAGS_SONAME",
+ "LFLAGS_THREAD", "LFLAGS_WINDOWS", "LFLAGS_WINDOWS_DLL", "LFLAGS_OPENGL",
+ "LIBDIR", "LIBDIR_X11", "LIBDIR_OPENGL",
+ "LIBS", "LIBS_CONSOLE", "LIBS_OPENGL", "LIBS_OPENGL", "LIBS_RT",
+ "LIBS_RTMT", "LIBS_THREAD", "LIBS_WINDOWS", "LIBS_X11",
+ "MAKEFILE_GENERATOR",
+ "MKDIR",
+ "RPATH",
+ "AR", "RANLIB", "LIB", "STRIP"
+]
+
+
+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] [-b dir] [-d dir] [-e dir] [-k] [-n] [-p plat] [-u] [-v dir] option=value option+=value ..."
+ print "where:"
+ print " -h display this help message"
+ print " -b dir where the SIP code generator will be installed [default %s]" % opt_sipbindir
+ print " -d dir where the SIP module will be installed [default %s]" % opt_sipmoddir
+ print " -e dir where the SIP header file will be installed [default %s]" % opt_sipincdir
+ print " -k build the SIP module as a static library"
+ print " -n build the SIP code generator and module as universal binaries on MacOS/X"
+ print " -p plat the platform/compiler configuration [default %s]" % default_platform
+ print " -u build with debugging symbols"
+ print " -v dir where .sip files are normally installed [default %s]" % opt_sipsipdir
+
+ # Display the different platform/compilers.
+ print
+ print "The following platform/compiler configurations are supported:"
+ print
+
+ platform_specs.sort()
+
+ ss = ""
+ sep = ""
+ for s in platform_specs:
+ ss = ss + sep + s
+ sep = ", "
+
+ print siputils.format(ss, 2)
+
+ # Display the different build macros.
+ print
+ print "The following options may be used to adjust the compiler configuration:"
+ print
+
+ build_macro_names.sort()
+
+ ss = ""
+ sep = ""
+ for s in build_macro_names:
+ ss = ss + sep + s
+ sep = " "
+
+ print siputils.format(ss, 2)
+
+ sys.exit(rcode)
+
+
+def set_defaults():
+ """Set up the defaults for values that can be set on the command line.
+ """
+ global default_platform
+ global opt_sipbindir, opt_sipmoddir, opt_sipincdir, opt_sipsipdir
+
+ # Set the platform specific default specification.
+ platdefaults = {
+ "aix": "aix-xlc",
+ "bsd": "bsdi-g++",
+ "cygwin": "cygwin-g++",
+ "darwin": "macx-g++",
+ "dgux": "dgux-g++",
+ "freebsd": "freebsd-g++",
+ "gnu": "hurd-g++",
+ "hp-ux": "hpux-acc",
+ "irix": "irix-cc",
+ "linux": "linux-g++",
+ "lynxos": "lynxos-g++",
+ "netbsd": "netbsd-g++",
+ "openbsd": "openbsd-g++",
+ "openunix": "unixware-cc",
+ "osf1": "tru64-cxx",
+ "qnx": "qnx-g++",
+ "reliantunix": "reliant-cds",
+ "sco_sv": "sco-cc",
+ "sinix": "reliant-cds",
+ "sunos5": "solaris-cc",
+ "ultrix": "ultrix-g++",
+ "unix_sv": "unixware-g++",
+ "unixware": "unixware-cc"
+ }
+
+ default_platform = "none"
+
+ if sys.platform == "win32":
+ if py_version >= 0x020400:
+ default_platform = "win32-msvc.net"
+ else:
+ default_platform = "win32-msvc"
+ else:
+ for pd in platdefaults.keys():
+ if sys.platform[:len(pd)] == pd:
+ default_platform = platdefaults[pd]
+ break
+
+ opt_sipbindir = plat_bin_dir
+ opt_sipmoddir = plat_py_site_dir
+ opt_sipincdir = plat_py_inc_dir
+ opt_sipsipdir = plat_sip_dir
+
+
+def inform_user():
+ """Tell the user the option values that are going to be used.
+ """
+ siputils.inform("The SIP code generator will be installed in %s." % opt_sipbindir)
+ siputils.inform("The SIP module will be installed in %s." % opt_sipmoddir)
+ siputils.inform("The SIP header file will be installed in %s." % opt_sipincdir)
+ siputils.inform("The default directory to install .sip files in is %s." % opt_sipsipdir)
+ siputils.inform("The platform/compiler configuration is %s." % opt_platform)
+
+ if opt_universal:
+ siputils.inform("MacOS/X universal binaries will be created.")
+
+
+def set_platform_directories():
+ """Initialise the global variables relating to platform specific
+ directories.
+ """
+ global plat_py_site_dir, plat_py_inc_dir, plat_py_conf_inc_dir
+ global plat_bin_dir, plat_py_lib_dir, plat_sip_dir
+
+ if sys.platform == "win32":
+ plat_py_site_dir = sys.prefix + "\\Lib"
+ if py_version >= 0x020200:
+ plat_py_site_dir = plat_py_site_dir + "\\site-packages"
+
+ plat_py_inc_dir = sys.prefix + "\\include"
+ plat_py_conf_inc_dir = sys.exec_prefix + "\\include"
+ plat_py_lib_dir = sys.prefix + "\\libs"
+ plat_bin_dir = sys.exec_prefix
+ plat_sip_dir = sys.prefix + "\\sip"
+ else:
+ vers = "%d.%d" % ((py_version >> 16) & 0xff, (py_version >> 8) & 0xff)
+
+ # Some 64 bit Linux distros (Mandriva, SuSE) seem to add sys.lib as a
+ # non-standard extension presumably to allow 32 and 64 bit versions to
+ # be installed side by side. Use it if it seems to be available.
+ try:
+ lib_dir = sys.lib
+ except AttributeError:
+ lib_dir = "lib"
+
+ lib_dir = sys.prefix + "/" + lib_dir + "/python" + vers
+
+ plat_py_site_dir = lib_dir
+ if py_version >= 0x020000:
+ plat_py_site_dir = plat_py_site_dir + "/site-packages"
+
+ plat_py_inc_dir = sys.prefix + "/include/python" + vers
+ plat_py_conf_inc_dir = sys.exec_prefix + "/include/python" + vers
+ plat_py_lib_dir = lib_dir + "/config"
+ plat_bin_dir = sys.exec_prefix + "/bin"
+ plat_sip_dir = sys.prefix + "/share/sip"
+
+
+def create_config(module, template, macros):
+ """Create the SIP 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 build macros.
+ """
+ siputils.inform("Creating %s..." % module)
+
+ content = {
+ "sip_config_args": sys.argv[1:],
+ "sip_version": sip_version,
+ "sip_version_str": sip_version_str,
+ "platform": opt_platform,
+ "sip_bin": os.path.join(opt_sipbindir, "sip"),
+ "sip_inc_dir": opt_sipincdir,
+ "sip_mod_dir": opt_sipmoddir,
+ "default_bin_dir": plat_bin_dir,
+ "default_mod_dir": plat_py_site_dir,
+ "default_sip_dir": opt_sipsipdir,
+ "export_all": opt_export_all,
+ "py_version": py_version,
+ "py_inc_dir": plat_py_inc_dir,
+ "py_conf_inc_dir": plat_py_conf_inc_dir,
+ "py_lib_dir": plat_py_lib_dir,
+ "universal": opt_universal
+ }
+
+ siputils.create_config_module(module, template, content, macros)
+
+
+def create_makefiles(macros):
+ """Create the Makefiles.
+
+ macros is the dictionary of platform specific build macros.
+ """
+ # Bootstrap.
+ import sipconfig
+
+ cfg = sipconfig.Configuration()
+
+ cfg.set_build_macros(macros)
+
+ sipconfig.inform("Creating top level Makefile...")
+
+ sipconfig.ParentMakefile(
+ configuration=cfg,
+ subdirs=["sipgen", "siplib"],
+ installs=(["sipconfig.py", "sipdistutils.py"], cfg.sip_mod_dir)
+ ).generate()
+
+ sipconfig.inform("Creating sip code generator Makefile...")
+
+ sipconfig.ProgramMakefile(
+ configuration=cfg,
+ build_file="sipgen.sbf",
+ dir="sipgen",
+ install_dir=os.path.dirname(cfg.sip_bin),
+ console=1,
+ warnings=0,
+ universal=opt_universal
+ ).generate()
+
+ sipconfig.inform("Creating sip module Makefile...")
+
+ makefile = sipconfig.ModuleMakefile(
+ configuration=cfg,
+ build_file="siplib.sbf",
+ dir="siplib",
+ install_dir=cfg.sip_mod_dir,
+ installs=(["sip.h"], cfg.sip_inc_dir),
+ console=1,
+ warnings=0,
+ static=opt_static,
+ debug=opt_debug,
+ universal=opt_universal
+ )
+
+ makefile.generate()
+
+
+def main(argv):
+ """Create the configuration module module.
+
+ argv is the list of command line arguments.
+ """
+ siputils.inform("This is SIP %s for Python %s on %s." % (sip_version_str, string.split(sys.version)[0], sys.platform))
+
+ if py_version < 0x020300:
+ siputils.error("This version of SIP requires Python v2.3 or later.")
+
+ # Basic initialisation.
+ set_platform_directories()
+
+ # Build up the list of valid specs.
+ for s in os.listdir("specs"):
+ platform_specs.append(s)
+
+ # Handle the command line.
+ set_defaults()
+
+ try:
+ optlist, args = getopt.getopt(argv[1:], "hab:d:e:knp:uv:")
+ except getopt.GetoptError:
+ usage()
+
+ global opt_sipbindir, opt_sipmoddir, opt_sipincdir, opt_sipsipdir
+ global opt_platform, opt_static, opt_debug, opt_export_all, opt_universal
+
+ for opt, arg in optlist:
+ if opt == "-h":
+ usage(0)
+ elif opt == "-a":
+ opt_export_all = 1
+ elif opt == "-b":
+ opt_sipbindir = os.path.abspath(arg)
+ elif opt == "-d":
+ opt_sipmoddir = os.path.abspath(arg)
+ elif opt == "-e":
+ opt_sipincdir = os.path.abspath(arg)
+ elif opt == "-k":
+ opt_static = 1
+ elif opt == "-n":
+ # This should probably be determined dynamically or passed as an
+ # argument.
+ opt_universal = '/Developer/SDKs/MacOSX10.4u.sdk'
+ elif opt == "-p":
+ if arg not in platform_specs:
+ usage()
+
+ opt_platform = arg
+ elif opt == "-u":
+ opt_debug = 1
+ elif opt == "-v":
+ opt_sipsipdir = os.path.abspath(arg)
+
+ if opt_platform is None:
+ opt_platform = default_platform
+
+ # Get the platform specific macros for building.
+ macros = siputils.parse_build_macros(os.path.join("specs", opt_platform), build_macro_names, args)
+
+ if macros is None:
+ usage()
+
+ # Tell the user what's been found.
+ inform_user()
+
+ # Install the configuration module.
+ create_config("sipconfig.py", "siputils.py", macros)
+
+ # Create the Makefiles.
+ create_makefiles(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