wxWidgets/wxPython/setup.py
Robin Dunn 1e7ecb7be0 Massive code changes and cleanup to allow wxPython to be split into
multiple extension modules again.  A Python CObject is used to allow
the "export" of SWIG and other common helper functions from the wxc
module to other modules, even if they are in separate shared
libraries.  Should also be usable from 3rd party code, just include
wxPython/src/export.h

Changed the default setup so the following are built as separate
extension modules:  calendar, glcanvas, grid, html, ogl, stc, and
utils.  Will probably add more later.


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@8984 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
2000-12-22 00:06:04 +00:00

665 lines
24 KiB
Python
Executable File

#!/usr/bin/env python
#----------------------------------------------------------------------
import sys, os, string
from distutils.core import setup, Extension
from distutils.file_util import copy_file
from distutils.dir_util import mkpath
from distutils.dep_util import newer
from my_distutils import run_swig, contrib_copy_tree
#----------------------------------------------------------------------
# flags and values that affect this script
#----------------------------------------------------------------------
VERSION = "2.3b2"
DESCRIPTION = "Cross platform GUI toolkit for Python"
AUTHOR = "Robin Dunn"
AUTHOR_EMAIL = "robin@alldunn.com"
URL = "http://wxPython.org/"
LICENCE = "wxWindows (LGPL derivative)"
LONG_DESCRIPTION = """\
wxPython is a GUI toolkit for Python that is a wrapper around the
wxWindows C++ GUI library. wxPython provides a large variety of
window types and controls, all imlemented with a native look and
feel (and native runtime speed) on the platforms it is supported
on.
"""
BUILD_GLCANVAS = 1 # If true, build the contrib/glcanvas extension module
BUILD_OGL = 1 # If true, build the contrib/ogl extension module
BUILD_STC = 1 # If true, build the contrib/stc extension module
CORE_ONLY = 0 # if true, don't build any of the above
USE_SWIG = 0 # Should we actually execute SWIG, or just use the
# files already in the distribution?
IN_CVS_TREE = 0 # Set to true if building in a full wxWindows CVS
# tree, otherwise will assume all needed files are
# available in the wxPython source distribution
# Some MSW build settings
FINAL = 1 # Mirrors use of same flag in wx makefiles,
# (0 or 1 only) should probably find a way to
# autodetect this...
HYBRID = 0 # If set and not debug or FINAL, then build a
# hybrid extension that can be used by the
# non-debug version of python, but contains
# debugging symbols for wxWindows and wxPython.
# wxWindows must have been built with /MD, not /MDd
# (using FINAL=hybrid will do it.)
WXDLLVER = '23_0' # Version part of DLL name
#----------------------------------------------------------------------
# Some other globals
#----------------------------------------------------------------------
PKGDIR = 'wxPython'
wxpExtensions = []
force = '--force' in sys.argv or '-f' in sys.argv
debug = '--debug' in sys.argv or '-g' in sys.argv
#----------------------------------------------------------------------
# Check for build flags on the command line
#----------------------------------------------------------------------
for flag in ['BUILD_GLCANVAS', 'BUILD_OGL', 'BUILD_STC', 'CORE_ONLY',
'USE_SWIG', 'IN_CVS_TREE', 'FINAL', 'HYBRID',
'WXDLLVER', ]:
for x in range(len(sys.argv)):
if string.find(sys.argv[x], flag) == 0:
pos = string.find(sys.argv[x], '=') + 1
if pos > 0:
vars()[flag] = eval(sys.argv[x][pos:])
sys.argv[x] = ''
sys.argv = filter(None, sys.argv)
if CORE_ONLY:
BUILD_GLCANVAS = 0
BUILD_OGL = 0
BUILD_STC = 0
#----------------------------------------------------------------------
# Setup some platform specific stuff
#----------------------------------------------------------------------
if os.name == 'nt':
# Set compile flags and such for MSVC. These values are derived
# from the wxWindows makefiles for MSVC, others will probably
# vary...
WXDIR = os.environ['WXWIN']
WXPLAT = '__WXMSW__'
GENDIR = 'msw'
if debug:
FINAL = 0
HYBRID = 0
if HYBRID:
FINAL = 0
includes = ['src',
os.path.join(WXDIR, 'include'),
]
defines = [ ('WIN32', None), # Some of these are no longer
('__WIN32__', None), # necessary. Anybody know which?
('_WINDOWS', None),
('__WINDOWS__', None),
('WINVER', '0x0400'),
('__WIN95__', None),
('STRICT', None),
(WXPLAT, None),
('WXUSINGDLL', '1'),
('SWIG_GLOBAL', None),
('HAVE_CONFIG_H', None),
('WXP_USE_THREAD', '1'),
]
if not FINAL or HYBRID:
defines.append( ('__WXDEBUG__', None) )
libdirs = [os.path.join(WXDIR, 'lib'), 'build\\ilib']
if FINAL:
wxdll = 'wx' + WXDLLVER
elif HYBRID:
wxdll = 'wx' + WXDLLVER + 'h'
else:
wxdll = 'wx' + WXDLLVER + 'd'
libs = [wxdll, 'kernel32', 'user32', 'gdi32', 'comdlg32',
'winspool', 'winmm', 'shell32', 'oldnames', 'comctl32',
'ctl3d32', 'odbc32', 'ole32', 'oleaut32', 'uuid', 'rpcrt4',
'advapi32', 'wsock32']
cflags = ['/GX-'] # workaround for internal compiler error in MSVC 5
lflags = None
if not FINAL and HYBRID:
cflags = cflags + ['/Od', '/Z7']
lflags = ['/DEBUG', ]
elif os.name == 'posix':
# Set flags for Unix type platforms
WXDIR = '..' # assumes IN_CVS_TREE
WXPLAT = '__WXGTK__' # and assumes GTK...
GENDIR = 'gtk' # Need to allow for Motif eventually too
includes = ['src']
defines = [('SWIG_GLOBAL', None),
('HAVE_CONFIG_H', None),
('WXP_USE_THREAD', '1'),
]
libdirs = []
libs = []
cflags = os.popen('wx-config --cflags', 'r').read()[:-1] + ' ' + \
os.popen('gtk-config --cflags', 'r').read()[:-1]
cflags = string.split(cflags)
lflags = os.popen('wx-config --libs', 'r').read()[:-1]
lflags = string.split(lflags)
else:
raise 'Sorry Charlie...'
#----------------------------------------------------------------------
# Check if the version file needs updated
#----------------------------------------------------------------------
if IN_CVS_TREE and newer('setup.py', 'src/__version__.py'):
open('src/__version__.py', 'w').write("ver = '%s'\n" % VERSION)
#----------------------------------------------------------------------
# Define the CORE extension module
#----------------------------------------------------------------------
print 'Preparing CORE...'
swig_force = force
swig_args = ['-c++', '-shadow', '-python', '-keyword', '-dnone', #'-dascii',
'-I./src', '-D'+WXPLAT]
swig_deps = ['src/my_typemaps.i']
swig_files = [ 'wx.i', 'windows.i', 'windows2.i', 'windows3.i', 'events.i',
'misc.i', 'misc2.i', 'gdi.i', 'mdi.i', 'controls.i',
'controls2.i', 'cmndlgs.i', 'stattool.i', 'frames.i', 'image.i',
'printfw.i', 'sizers.i', 'clip_dnd.i',
'filesys.i', 'streams.i',
# 'grid.i', 'html.i', 'htmlhelp.i', 'calendar.i', 'utils.i',
]
swig_sources = run_swig(swig_files, 'src', GENDIR, PKGDIR,
USE_SWIG, swig_force, swig_args, swig_deps)
copy_file('src/__init__.py', PKGDIR, update=1, verbose=0)
copy_file('src/__version__.py', PKGDIR, update=1, verbose=0)
if IN_CVS_TREE: # update the licence files
mkpath('licence')
for file in ['preamble.txt', 'licence.txt', 'licendoc.txt', 'lgpl.txt']:
copy_file(WXDIR+'/docs/'+file, 'licence/'+file, update=1, verbose=0)
if os.name == 'nt':
rc_file = ['src/wxc.rc']
else:
rc_file = []
ext = Extension('wxc', ['src/helpers.cpp',
'src/libpy.c',
] + rc_file + swig_sources,
include_dirs = includes,
define_macros = defines,
library_dirs = libdirs,
libraries = libs,
extra_compile_args = cflags,
extra_link_args = lflags,
)
wxpExtensions.append(ext)
# Extension for the grid module
swig_sources = run_swig(['grid.i'], 'src', GENDIR, PKGDIR,
USE_SWIG, swig_force, swig_args, swig_deps)
ext = Extension('gridc', swig_sources,
include_dirs = includes,
define_macros = defines,
library_dirs = libdirs,
libraries = libs,
extra_compile_args = cflags,
extra_link_args = lflags,
)
wxpExtensions.append(ext)
# Extension for the html modules
swig_sources = run_swig(['html.i', 'htmlhelp.i'], 'src', GENDIR, PKGDIR,
USE_SWIG, swig_force, swig_args, swig_deps)
ext = Extension('htmlc', swig_sources,
include_dirs = includes,
define_macros = defines,
library_dirs = libdirs,
libraries = libs,
extra_compile_args = cflags,
extra_link_args = lflags,
)
wxpExtensions.append(ext)
# Extension for the utils module
swig_sources = run_swig(['utils.i'], 'src', GENDIR, PKGDIR,
USE_SWIG, swig_force, swig_args, swig_deps)
ext = Extension('utilsc', swig_sources,
include_dirs = includes,
define_macros = defines,
library_dirs = libdirs,
libraries = libs,
extra_compile_args = cflags,
extra_link_args = lflags,
)
wxpExtensions.append(ext)
# Extension for the calendar module
swig_sources = run_swig(['calendar.i'], 'src', GENDIR, PKGDIR,
USE_SWIG, swig_force, swig_args, swig_deps)
ext = Extension('calendarc', swig_sources,
include_dirs = includes,
define_macros = defines,
library_dirs = libdirs,
libraries = libs,
extra_compile_args = cflags,
extra_link_args = lflags,
)
wxpExtensions.append(ext)
#----------------------------------------------------------------------
# Define the GLCanvas extension module
#----------------------------------------------------------------------
if BUILD_GLCANVAS:
print 'Preparing GLCANVAS...'
location = 'contrib/glcanvas'
swig_files = ['glcanvas.i']
swig_sources = run_swig(swig_files, location, GENDIR, PKGDIR,
USE_SWIG, swig_force, swig_args)
gl_libs = []
if os.name == 'posix':
if '-D__WXDEBUG__' in cflags:
gl_libs = ['wx_gtkd_gl', 'GL', 'GLU']
else:
gl_libs = ['wx_gtk_gl', 'GL', 'GLU']
ext = Extension('glcanvasc',
swig_sources,
include_dirs = includes,
define_macros = defines,
library_dirs = libdirs,
libraries = libs + gl_libs,
extra_compile_args = cflags,
extra_link_args = lflags,
)
wxpExtensions.append(ext)
#----------------------------------------------------------------------
# Define the OGL extension module
#----------------------------------------------------------------------
if BUILD_OGL:
print 'Preparing OGL...'
location = 'contrib/ogl'
OGLLOC = location + '/contrib/src/ogl'
OGLINC = location + '/contrib/include'
swig_files = ['ogl.i', 'oglbasic.i', 'oglshapes.i', 'oglshapes2.i',
'oglcanvas.i']
swig_sources = run_swig(swig_files, location, '', PKGDIR,
USE_SWIG, swig_force, swig_args)
# make sure local copy of contrib files are up to date
if IN_CVS_TREE:
contrib_copy_tree(WXDIR + '/contrib/include/wx/ogl', OGLINC+'/wx/ogl')
contrib_copy_tree(WXDIR + '/contrib/src/ogl', OGLLOC)
ext = Extension('oglc', ['%s/basic.cpp' % OGLLOC,
'%s/bmpshape.cpp' % OGLLOC,
'%s/composit.cpp' % OGLLOC,
'%s/divided.cpp' % OGLLOC,
'%s/lines.cpp' % OGLLOC,
'%s/misc.cpp' % OGLLOC,
'%s/basic2.cpp' % OGLLOC,
'%s/canvas.cpp' % OGLLOC,
'%s/constrnt.cpp' % OGLLOC,
'%s/drawn.cpp' % OGLLOC,
'%s/mfutils.cpp' % OGLLOC,
'%s/ogldiag.cpp' % OGLLOC,
] + swig_sources,
include_dirs = [OGLINC] + includes,
define_macros = defines,
library_dirs = libdirs,
libraries = libs,
extra_compile_args = cflags,
extra_link_args = lflags,
)
wxpExtensions.append(ext)
#----------------------------------------------------------------------
# Define the STC extension module
#----------------------------------------------------------------------
if BUILD_STC:
print 'Preparing STC...'
location = 'contrib/stc'
STCLOC = location + '/contrib/src/stc'
STCINC = location + '/contrib/include'
STC_H = location + '/contrib/include/wx/stc'
# make sure local copy of contrib files are up to date
if IN_CVS_TREE:
contrib_copy_tree(WXDIR + '/contrib/include/wx/stc', STCINC+'/wx/stc')
contrib_copy_tree(WXDIR + '/contrib/src/stc', STCLOC)
swig_files = ['stc_.i']
swig_sources = run_swig(swig_files, location, '', PKGDIR,
USE_SWIG, swig_force,
swig_args + ['-I'+STC_H, '-I'+location],
[STC_H+'/stc.h'])
# copy a project specific py module to the main package dir
copy_file(location+'/stc.py', PKGDIR, update=1, verbose=1)
# add some include dirs to the standard set
stc_includes = includes[:]
stc_includes.append('%s/scintilla/include' % STCLOC)
stc_includes.append('%s/scintilla/src' % STCLOC)
stc_includes.append(STCINC)
# and some macro definitions
stc_defines = defines[:]
stc_defines.append( ('__WX__', None) )
stc_defines.append( ('SCI_LEXER', None) )
ext = Extension('stc_c',
['%s/scintilla/src/AutoComplete.cxx' % STCLOC,
'%s/scintilla/src/CallTip.cxx' % STCLOC,
'%s/scintilla/src/CellBuffer.cxx' % STCLOC,
'%s/scintilla/src/ContractionState.cxx' % STCLOC,
'%s/scintilla/src/Document.cxx' % STCLOC,
'%s/scintilla/src/Editor.cxx' % STCLOC,
'%s/scintilla/src/Indicator.cxx' % STCLOC,
'%s/scintilla/src/KeyMap.cxx' % STCLOC,
'%s/scintilla/src/KeyWords.cxx' % STCLOC,
'%s/scintilla/src/LineMarker.cxx' % STCLOC,
'%s/scintilla/src/PropSet.cxx' % STCLOC,
'%s/scintilla/src/ScintillaBase.cxx' % STCLOC,
'%s/scintilla/src/Style.cxx' % STCLOC,
'%s/scintilla/src/ViewStyle.cxx' % STCLOC,
'%s/scintilla/src/LexCPP.cxx' % STCLOC,
'%s/scintilla/src/LexHTML.cxx' % STCLOC,
'%s/scintilla/src/LexLua.cxx' % STCLOC,
'%s/scintilla/src/LexOthers.cxx' % STCLOC,
'%s/scintilla/src/LexPerl.cxx' % STCLOC,
'%s/scintilla/src/LexPython.cxx' % STCLOC,
'%s/scintilla/src/LexSQL.cxx' % STCLOC,
'%s/scintilla/src/LexVB.cxx' % STCLOC,
'%s/scintilla/src/DocumentAccessor.cxx' % STCLOC,
'%s/scintilla/src/UniConversion.cxx' % STCLOC,
'%s/scintilla/src/WindowAccessor.cxx' % STCLOC,
'%s/scintilla/src/PosRegExp.cxx' % STCLOC,
'%s/PlatWX.cpp' % STCLOC,
'%s/ScintillaWX.cpp' % STCLOC,
'%s/stc.cpp' % STCLOC,
] + swig_sources,
include_dirs = stc_includes,
define_macros = stc_defines,
library_dirs = libdirs,
libraries = libs,
extra_compile_args = cflags,
extra_link_args = lflags,
)
wxpExtensions.append(ext)
#----------------------------------------------------------------------
# Do the Setup/Build/Install/Whatever
#----------------------------------------------------------------------
setup(name = PKGDIR,
version = VERSION,
description = DESCRIPTION,
long_description = LONG_DESCRIPTION,
author = AUTHOR,
author_email = AUTHOR_EMAIL,
url = URL,
licence = LICENCE,
packages = [PKGDIR,
PKGDIR+'.lib',
PKGDIR+'.lib.editor',
],
ext_package = PKGDIR,
ext_modules = wxpExtensions,
)
#----------------------------------------------------------------------
#----------------------------------------------------------------------
#----------------------------------------------------------------------
# The pre-distutils binary distributions of wxPython included the demo
# as a subdirectory of the package dir. This doesn't really make sense
# for Linux/Unix platforms as it's not part of the package, and the user
# may want to tweak and learn without having to become root first.
#
# For now I am going to start distributing the demo as a separate tarball,
# but if I ever want to go back to the old way, this is how to do it the
# distutils way:
## from my_install_data import *
## Add this to the setup() call
## # Overridden command classes
## cmdclass = {'install_data': my_install_data},
## # non python files of examples
## data_files = [
## Data_Files(
## base_dir='install_lib',
## copy_to = 'wxPython',
## #strip_dirs = 2,
## template=[ 'graft demo',
## 'global-exclude CVS/*'
## ],
## preserve_path=1
## )
## ],
#----------------------------------------------------------------------
#----------------------------------------------------------------------
#----------------------------------------------------------------------
## if not BUILD_GLCANVAS:
## wxext.sources = wxext.sources + ['contrib/glcanvas/stub.cpp']
## else:
## print 'Preparing GLCANVAS...'
## location = 'contrib/glcanvas'
## swig_files = ['glcanvas.i']
## swig_sources = run_swig(swig_files, location, GENDIR, PKGDIR,
## USE_SWIG, swig_force, swig_args, swig_deps)
## gl_libs = []
## if os.name == 'posix':
## if '-D__WXDEBUG__' in cflags:
## gl_libs = ['wx_gtkd_gl', 'GL', 'GLU']
## else:
## gl_libs = ['wx_gtk_gl', 'GL', 'GLU']
## wxext.sources = wxext.sources + swig_sources
## wxext.libraries = wxext.libraries + gl_libs
## if not BUILD_OGL:
## wxext.sources = wxext.sources + ['contrib/ogl/stub.cpp']
## else:
## print 'Preparing OGL...'
## location = 'contrib/ogl'
## OGLLOC = location + '/contrib/src/ogl'
## OGLINC = location + '/contrib/include'
## swig_files = ['ogl.i', 'oglbasic.i', 'oglshapes.i', 'oglshapes2.i',
## 'oglcanvas.i']
## swig_sources = run_swig(swig_files, location, '', PKGDIR,
## USE_SWIG, swig_force, swig_args, swig_deps)
## # make sure local copy of contrib files are up to date
## if IN_CVS_TREE:
## contrib_copy_tree(WXDIR + '/contrib/include/wx/ogl', OGLINC+'/wx/ogl')
## contrib_copy_tree(WXDIR + '/contrib/src/ogl', OGLLOC)
## # add items to the core extension module definition
## wxext.sources = wxext.sources + [location + '/oglhelpers.cpp',
## '%s/basic.cpp' % OGLLOC,
## '%s/bmpshape.cpp' % OGLLOC,
## '%s/composit.cpp' % OGLLOC,
## '%s/divided.cpp' % OGLLOC,
## '%s/lines.cpp' % OGLLOC,
## '%s/misc.cpp' % OGLLOC,
## '%s/basic2.cpp' % OGLLOC,
## '%s/canvas.cpp' % OGLLOC,
## '%s/constrnt.cpp' % OGLLOC,
## '%s/drawn.cpp' % OGLLOC,
## '%s/mfutils.cpp' % OGLLOC,
## '%s/ogldiag.cpp' % OGLLOC,
## ] + swig_sources
## wxext.include_dirs = wxext.include_dirs + [OGLINC]
## if not BUILD_STC:
## wxext.sources = wxext.sources + ['contrib/stc/stub.cpp']
## else:
## print 'Preparing STC...'
## location = 'contrib/stc'
## STCLOC = location + '/contrib/src/stc'
## STCINC = location + '/contrib/include'
## STC_H = location + '/contrib/include/wx/stc'
## # make sure local copy of contrib files are up to date
## if IN_CVS_TREE:
## contrib_copy_tree(WXDIR + '/contrib/include/wx/stc', STCINC+'/wx/stc')
## contrib_copy_tree(WXDIR + '/contrib/src/stc', STCLOC)
## swig_files = ['stc_.i']
## swig_sources = run_swig(swig_files, location, '', PKGDIR,
## USE_SWIG, swig_force,
## swig_args + ['-I'+STC_H, '-I'+location],
## swig_deps + [STC_H+'/stc.h'])
## # copy a project specific py module to the main package dir
## copy_file(location+'/stc.py', PKGDIR, update=1, verbose=1)
## # add some include dirs to the standard set
## stc_includes = [ '%s/scintilla/include' % STCLOC,
## '%s/scintilla/src' % STCLOC,
## STCINC ]
## # and some macro definitions
## stc_defines = [ ('__WX__', None),
## ('SCI_LEXER', None) ]
## # add items to the core extension module definition
## wxext.sources = wxext.sources + [
## '%s/scintilla/src/AutoComplete.cxx' % STCLOC,
## '%s/scintilla/src/CallTip.cxx' % STCLOC,
## '%s/scintilla/src/CellBuffer.cxx' % STCLOC,
## '%s/scintilla/src/ContractionState.cxx' % STCLOC,
## '%s/scintilla/src/Document.cxx' % STCLOC,
## '%s/scintilla/src/Editor.cxx' % STCLOC,
## '%s/scintilla/src/Indicator.cxx' % STCLOC,
## '%s/scintilla/src/KeyMap.cxx' % STCLOC,
## '%s/scintilla/src/KeyWords.cxx' % STCLOC,
## '%s/scintilla/src/LineMarker.cxx' % STCLOC,
## '%s/scintilla/src/PropSet.cxx' % STCLOC,
## '%s/scintilla/src/ScintillaBase.cxx' % STCLOC,
## '%s/scintilla/src/Style.cxx' % STCLOC,
## '%s/scintilla/src/ViewStyle.cxx' % STCLOC,
## '%s/scintilla/src/LexCPP.cxx' % STCLOC,
## '%s/scintilla/src/LexHTML.cxx' % STCLOC,
## '%s/scintilla/src/LexLua.cxx' % STCLOC,
## '%s/scintilla/src/LexOthers.cxx' % STCLOC,
## '%s/scintilla/src/LexPerl.cxx' % STCLOC,
## '%s/scintilla/src/LexPython.cxx' % STCLOC,
## '%s/scintilla/src/LexSQL.cxx' % STCLOC,
## '%s/scintilla/src/LexVB.cxx' % STCLOC,
## '%s/scintilla/src/DocumentAccessor.cxx' % STCLOC,
## '%s/scintilla/src/UniConversion.cxx' % STCLOC,
## '%s/scintilla/src/WindowAccessor.cxx' % STCLOC,
## '%s/scintilla/src/PosRegExp.cxx' % STCLOC,
## '%s/PlatWX.cpp' % STCLOC,
## '%s/ScintillaWX.cpp' % STCLOC,
## '%s/stc.cpp' % STCLOC,
## ] + swig_sources
## wxext.include_dirs = wxext.include_dirs + stc_includes
## wxext.define_macros = wxext.define_macros + stc_defines