X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/f9b46bcb178dca18e77b5a9b5959951b222d6a4e..0dabb2a2c6ae27df135da4752b00579346bb74fc:/wxPython/setup.py diff --git a/wxPython/setup.py b/wxPython/setup.py index 0c42993d77..a1b23a3185 100755 --- a/wxPython/setup.py +++ b/wxPython/setup.py @@ -7,30 +7,32 @@ from distutils.file_util import copy_file from distutils.dir_util import mkpath from distutils.dep_util import newer from distutils.spawn import spawn -from distutils.command.install_data import install_data + +import distutils.command.install_data +import distutils.command.clean #---------------------------------------------------------------------- # flags and values that affect this script #---------------------------------------------------------------------- -VER_MAJOR = 2 # The first three must match wxWindows +VER_MAJOR = 2 # The first three must match wxWidgets VER_MINOR = 5 VER_RELEASE = 1 -VER_SUBREL = 0 # wxPython release num for x.y.z release of wxWindows -VER_FLAGS = "p6" # release flags, such as prerelease num, unicode, etc. +VER_SUBREL = 2 # wxPython release num for x.y.z release of wxWidgets +VER_FLAGS = "p" # release flags, such as prerelease num, unicode, etc. DESCRIPTION = "Cross platform GUI toolkit for Python" AUTHOR = "Robin Dunn" AUTHOR_EMAIL = "Robin Dunn " URL = "http://wxPython.org/" DOWNLOAD_URL = "http://wxPython.org/download.php" -LICENSE = "wxWindows Library License (LGPL derivative)" +LICENSE = "wxWidgets Library License (LGPL derivative)" PLATFORMS = "WIN32,OSX,POSIX" -KEYWORDS = "GUI,wx,wxWindows,cross-platform" +KEYWORDS = "GUI,wx,wxWindows,wxWidgetscross-platform" 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 +wxWidgets C++ GUI library. wxPython provides a large variety of window types and controls, all implemented with a native look and feel (by using the native widgets) on the platforms it is supported on. @@ -50,7 +52,7 @@ Programming Language :: Python Topic :: Software Development :: User Interfaces """ -## License :: OSI Approved :: wxWindows Library Licence +## License :: OSI Approved :: wxWidgets Library Licence # Config values below this point can be reset on the setup.py command line. @@ -64,7 +66,8 @@ BUILD_DLLWIDGET = 0# Build a module that enables unknown wx widgets # to be loaded from a DLL and to be used from Python. # Internet Explorer wrapper (experimental) -BUILD_IEWIN = 0 #(os.name == 'nt') +BUILD_IEWIN = (os.name == 'nt') +BUILD_ACTIVEX = (os.name == 'nt') # new version of IEWIN CORE_ONLY = 0 # if true, don't build any of the above @@ -85,9 +88,9 @@ UNICODE = 0 # This will pass the 'wxUSE_UNICODE' flag to SWIG and UNDEF_NDEBUG = 1 # Python 2.2 on Unix/Linux by default defines NDEBUG, # and distutils will pick this up and use it on the # compile command-line for the extensions. This could - # conflict with how wxWindows was built. If NDEBUG is - # set then wxWindows' __WXDEBUG__ setting will be turned - # off. If wxWindows was actually built with it turned + # conflict with how wxWidgets was built. If NDEBUG is + # set then wxWidgets' __WXDEBUG__ setting will be turned + # off. If wxWidgets was actually built with it turned # on then you end up with mismatched class structures, # and wxPython will crash. @@ -100,13 +103,18 @@ WX_CONFIG = None # Usually you shouldn't need to touch this, but you can set # version, port, etc. and it will be looked for on the # default $PATH. -WXPORT = 'gtk' # On Linux/Unix there are several ports of wxWindows available. +WXPORT = 'gtk' # On Linux/Unix there are several ports of wxWidgets available. # Setting this value lets you select which will be used for # the wxPython build. Possibilites are 'gtk', 'gtk2' and # 'x11'. Curently only gtk and gtk2 works. -BUILD_BASE = "build" # Directory to use for temporary build files. +BUILD_BASE = "build" # Directory to use for temporary build files. + # This name will be appended to if the WXPORT or + # the UNICODE flags are set to non-standard + # values. See below. + +CONTRIBS_INC = "" # A dir to add as an -I flag when compiling the contribs # Some MSW build settings @@ -118,11 +126,11 @@ FINAL = 0 # Mirrors use of same flag in wx makefiles, HYBRID = 1 # 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 + # debugging symbols for wxWidgets and wxPython. + # wxWidgets must have been built with /MD, not /MDd # (using FINAL=hybrid will do it.) - # Version part of wxWindows LIB/DLL names + # Version part of wxWidgets LIB/DLL names WXDLLVER = '%d%d' % (VER_MAJOR, VER_MINOR) @@ -157,6 +165,7 @@ def libFlag(): PKGDIR = 'wx' wxpExtensions = [] DATA_FILES = [] +CLEANUP = [] force = '--force' in sys.argv or '-f' in sys.argv debug = '--debug' in sys.argv or '-g' in sys.argv @@ -178,7 +187,7 @@ if os.name == 'nt': # Boolean (int) flags for flag in ['BUILD_GLCANVAS', 'BUILD_OGL', 'BUILD_STC', 'BUILD_XRC', - 'BUILD_GIZMOS', 'BUILD_DLLWIDGET', 'BUILD_IEWIN', + 'BUILD_GIZMOS', 'BUILD_DLLWIDGET', 'BUILD_IEWIN', 'BUILD_ACTIVEX', 'CORE_ONLY', 'PREP_ONLY', 'USE_SWIG', 'UNICODE', 'UNDEF_NDEBUG', 'NO_SCRIPTS', 'BUILD_RENAMERS', 'FINAL', 'HYBRID', ]: @@ -190,7 +199,8 @@ for flag in ['BUILD_GLCANVAS', 'BUILD_OGL', 'BUILD_STC', 'BUILD_XRC', sys.argv[x] = '' # String options -for option in ['WX_CONFIG', 'WXDLLVER', 'BUILD_BASE', 'WXPORT', 'SWIG']: +for option in ['WX_CONFIG', 'WXDLLVER', 'BUILD_BASE', 'WXPORT', 'SWIG', + 'CONTRIBS_INC']: for x in range(len(sys.argv)): if sys.argv[x].find(option) == 0: pos = sys.argv[x].find('=') + 1 @@ -214,7 +224,7 @@ def Verify_WX_CONFIG(): # if WX_CONFIG hasn't been set to an explicit value then construct one. global WX_CONFIG if WX_CONFIG is None: - if debug: # TODO: Fix this. wxPython's --debug shouldn't be tied to wxWindows... + if debug: # TODO: Fix this. wxPython's --debug shouldn't be tied to wxWidgets... df = 'd' else: df = '' @@ -223,7 +233,10 @@ def Verify_WX_CONFIG(): else: uf = '' ver2 = "%s.%s" % (VER_MAJOR, VER_MINOR) - WX_CONFIG = 'wx%s%s%s-%s-config' % (WXPORT, uf, df, ver2) + port = WXPORT + if port == "x11": + port = "x11univ" + WX_CONFIG = 'wx%s%s%s-%s-config' % (port, uf, df, ver2) searchpath = os.environ["PATH"] for p in searchpath.split(':'): @@ -243,10 +256,10 @@ def Verify_WX_CONFIG(): def run_swig(files, dir, gendir, package, USE_SWIG, force, swig_args, swig_deps=[]): """Run SWIG the way I want it done""" - if not os.path.exists(os.path.join(dir, gendir)): + if USE_SWIG and not os.path.exists(os.path.join(dir, gendir)): os.mkdir(os.path.join(dir, gendir)) - if not os.path.exists(os.path.join("docs", "xml-raw")): + if USE_SWIG and not os.path.exists(os.path.join("docs", "xml-raw")): os.mkdir(os.path.join("docs", "xml-raw")) sources = [] @@ -274,7 +287,7 @@ def run_swig(files, dir, gendir, package, USE_SWIG, force, swig_args, swig_deps= if BUILD_RENAMERS: #tempfile.tempdir = sourcePath xmltemp = tempfile.mktemp('.xml') - + # First run swig to produce the XML file, adding # an extra -D that prevents the old rename # directives from being used @@ -286,7 +299,7 @@ def run_swig(files, dir, gendir, package, USE_SWIG, force, swig_args, swig_deps= # Next run build_renamers to process the XML cmd = [ sys.executable, '-u', - './distrib/build_renamers.py', dir, basefile, xmltemp] + './distrib/build_renamers.py', dir, basefile, xmltemp] msg(' '.join(cmd)) spawn(cmd) os.remove(xmltemp) @@ -300,26 +313,56 @@ def run_swig(files, dir, gendir, package, USE_SWIG, force, swig_args, swig_deps= # copy the generated python file to the package directory copy_file(py_file, package, update=not force, verbose=0) + CLEANUP.append(opj(package, os.path.basename(py_file))) return sources -def contrib_copy_tree(src, dest, verbose=0): - """Update local copies of wxWindows contrib files""" - from distutils.dir_util import mkpath, copy_tree +# Specializations of some distutils command classes +class smart_install_data(distutils.command.install_data.install_data): + """need to change self.install_dir to the actual library dir""" + def run(self): + install_cmd = self.get_finalized_command('install') + self.install_dir = getattr(install_cmd, 'install_lib') + return distutils.command.install_data.install_data.run(self) - mkpath(dest, verbose=verbose) - copy_tree(src, dest, update=1, verbose=verbose) +class extra_clean(distutils.command.clean.clean): + """Also cleans stuff that setup.py copies itself. If the --all + flag was used also searches for .pyc, .pyd, .so files""" + def run(self): + from distutils import log + from distutils.filelist import FileList + global CLEANUP + + distutils.command.clean.clean.run(self) + + if self.all: + fl = FileList() + fl.include_pattern("*.pyc", 0) + fl.include_pattern("*.pyd", 0) + fl.include_pattern("*.so", 0) + CLEANUP += fl.files + + for f in CLEANUP: + if os.path.isdir(f): + try: + if not self.dry_run and os.path.exists(f): + os.rmdir(f) + log.info("removing '%s'", f) + except IOError: + log.warning("unable to remove '%s'", f) + + else: + try: + if not self.dry_run and os.path.exists(f): + os.remove(f) + log.info("removing '%s'", f) + except IOError: + log.warning("unable to remove '%s'", f) -class smart_install_data(install_data): - def run(self): - #need to change self.install_dir to the actual library dir - install_cmd = self.get_finalized_command('install') - self.install_dir = getattr(install_cmd, 'install_lib') - return install_data.run(self) def build_locale_dir(destdir, verbose=1): @@ -330,6 +373,8 @@ def build_locale_dir(destdir, verbose=1): dest = opj(destdir, lang, 'LC_MESSAGES') mkpath(dest, verbose=verbose) copy_file(src, opj(dest, 'wxstd.mo'), update=1, verbose=verbose) + CLEANUP.append(opj(dest, 'wxstd.mo')) + CLEANUP.append(dest) def build_locale_list(srcdir): @@ -419,6 +464,7 @@ if CORE_ONLY: BUILD_GIZMOS = 0 BUILD_DLLWIDGET = 0 BUILD_IEWIN = 0 + BUILD_ACTIVEX = 0 if debug: FINAL = 0 @@ -437,7 +483,7 @@ if UNICODE and WXPORT not in ['msw', 'gtk2']: if os.name == 'nt': # Set compile flags and such for MSVC. These values are derived - # from the wxWindows makefiles for MSVC, other compilers settings + # from the wxWidgets makefiles for MSVC, other compilers settings # will probably vary... if os.environ.has_key('WXWIN'): WXDIR = os.environ['WXWIN'] @@ -466,6 +512,8 @@ if os.name == 'nt': if UNDEF_NDEBUG: defines.append( ('NDEBUG',) ) # using a 1-tuple makes it do an undef + if HYBRID: + defines.append( ('__NO_VC_CRTDBG__', None) ) if not FINAL or HYBRID: defines.append( ('__WXDEBUG__', None) ) @@ -505,7 +553,7 @@ if os.name == 'nt': #---------------------------------------------------------------------- elif os.name == 'posix': - WXDIR = '..' + WXDIR = '..' includes = ['include', 'src'] defines = [('SWIG_GLOBAL', None), ('HAVE_CONFIG_H', None), @@ -586,7 +634,7 @@ elif os.name == 'posix': #---------------------------------------------------------------------- else: - raise 'Sorry Charlie, platform not supported...' + raise 'Sorry, platform not supported...' #---------------------------------------------------------------------- @@ -607,7 +655,7 @@ VERSION = "%s.%s.%s.%s%s" % (VER_MAJOR, VER_MINOR, VER_RELEASE, # Unconditionally updated since the version string can change based # on the UNICODE flag -open('src/__version__.py', 'w').write("""\ +open('wx/__version__.py', 'w').write("""\ # This file was generated by setup.py... VERSION_STRING = '%(VERSION)s' @@ -617,11 +665,12 @@ RELEASE_VERSION = %(VER_RELEASE)s SUBREL_VERSION = %(VER_SUBREL)s VERSION = (MAJOR_VERSION, MINOR_VERSION, RELEASE_VERSION, - SUBREL_VERSION, '%(VER_FLAGS)s') + SUBREL_VERSION, '%(VER_FLAGS)s') RELEASE_NUMBER = RELEASE_VERSION # for compatibility """ % globals()) +CLEANUP.append('wx/__version__.py') @@ -635,8 +684,6 @@ swig_args = ['-c++', '-Wall', '-nodefault', -## '-xml', - '-python', '-keyword', '-new_repr', @@ -689,16 +736,19 @@ swig_sources = run_swig(['core.i'], 'src', GENDIR, PKGDIR, 'src/_streams.i', 'src/_validator.i', 'src/_window.i', + 'src/_control.i', ]) copy_file('src/__init__.py', PKGDIR, update=1, verbose=0) -copy_file('src/__version__.py', PKGDIR, update=1, verbose=0) +CLEANUP.append(opj(PKGDIR, '__init__.py')) # update the license files mkpath('licence') for file in ['preamble.txt', 'licence.txt', 'licendoc.txt', 'lgpl.txt']: copy_file(opj(WXDIR, 'docs', file), opj('licence',file), update=1, verbose=0) + CLEANUP.append(opj('licence',file)) +CLEANUP.append('licence') if os.name == 'nt': @@ -737,17 +787,23 @@ wxpExtensions.append(ext) swig_sources = run_swig(['gdi.i'], 'src', GENDIR, PKGDIR, USE_SWIG, swig_force, swig_args, swig_deps + ['src/_gdi_rename.i', - 'src/_bitmap.i', 'src/_brush.i', - 'src/_colour.i', 'src/_cursor.i', - 'src/_dc.i', 'src/_font.i', - 'src/_gdiobj.i', 'src/_icon.i', - 'src/_imaglist.i', 'src/_pen.i', - 'src/_region.i', 'src/_palette.i', - 'src/_stockobjs.i', + 'src/_bitmap.i', + 'src/_colour.i', + 'src/_dc.i', + 'src/_gdiobj.i', + 'src/_imaglist.i', + 'src/_region.i', + 'src/_stockobjs.i', 'src/_effects.i', - 'src/_intl.i', - 'src/_intl_ex.py', - ]) + 'src/_intl.i', + 'src/_intl_ex.py', + 'src/_brush.i', + 'src/_cursor.i', + 'src/_font.i', + 'src/_icon.i', + 'src/_pen.i', + 'src/_palette.i', + ]) ext = Extension('_gdi', ['src/drawlist.cpp'] + swig_sources, include_dirs = includes, define_macros = defines, @@ -767,15 +823,22 @@ wxpExtensions.append(ext) # Extension for the windows module swig_sources = run_swig(['windows.i'], 'src', GENDIR, PKGDIR, USE_SWIG, swig_force, swig_args, swig_deps + - ['src/_windows_rename.i', 'src/_windows_reverse.txt', + ['src/_windows_rename.i', + 'src/_windows_reverse.txt', 'src/_panel.i', - 'src/_toplvl.i', 'src/_statusbar.i', - 'src/_splitter.i', 'src/_sashwin.i', - 'src/_popupwin.i', 'src/_tipwin.i', - 'src/_vscroll.i', 'src/_taskbar.i', - 'src/_cmndlgs.i', 'src/_mdi.i', - 'src/_pywindows.i', 'src/_printfw.i', - ]) + 'src/_toplvl.i', + 'src/_statusbar.i', + 'src/_splitter.i', + 'src/_sashwin.i', + 'src/_popupwin.i', + 'src/_tipwin.i', + 'src/_vscroll.i', + 'src/_taskbar.i', + 'src/_cmndlgs.i', + 'src/_mdi.i', + 'src/_pywindows.i', + 'src/_printfw.i', + ]) ext = Extension('_windows', swig_sources, include_dirs = includes, define_macros = defines, @@ -793,18 +856,29 @@ wxpExtensions.append(ext) # Extension for the controls module swig_sources = run_swig(['controls.i'], 'src', GENDIR, PKGDIR, USE_SWIG, swig_force, swig_args, swig_deps + - [ 'src/_controls_rename.i', 'src/_controls_reverse.txt', - 'src/_control.i', 'src/_toolbar.i', - 'src/_button.i', 'src/_checkbox.i', - 'src/_choice.i', 'src/_combobox.i', - 'src/_gauge.i', 'src/_statctrls.i', - 'src/_listbox.i', 'src/_textctrl.i', - 'src/_scrolbar.i', 'src/_spin.i', - 'src/_radio.i', 'src/_slider.i', - 'src/_tglbtn.i', 'src/_notebook.i', - 'src/_listctrl.i', 'src/_treectrl.i', - 'src/_dirctrl.i', 'src/_pycontrol.i', - 'src/_cshelp.i', 'src/_dragimg.i', + [ 'src/_controls_rename.i', + 'src/_controls_reverse.txt', + 'src/_toolbar.i', + 'src/_button.i', + 'src/_checkbox.i', + 'src/_choice.i', + 'src/_combobox.i', + 'src/_gauge.i', + 'src/_statctrls.i', + 'src/_listbox.i', + 'src/_textctrl.i', + 'src/_scrolbar.i', + 'src/_spin.i', + 'src/_radio.i', + 'src/_slider.i', + 'src/_tglbtn.i', + 'src/_notebook.i', + 'src/_listctrl.i', + 'src/_treectrl.i', + 'src/_dirctrl.i', + 'src/_pycontrol.i', + 'src/_cshelp.i', + 'src/_dragimg.i', ]) ext = Extension('_controls', swig_sources, include_dirs = includes, @@ -823,14 +897,22 @@ wxpExtensions.append(ext) # Extension for the misc module swig_sources = run_swig(['misc.i'], 'src', GENDIR, PKGDIR, USE_SWIG, swig_force, swig_args, swig_deps + - [ 'src/_settings.i', 'src/_functions.i', - 'src/_misc.i', 'src/_tipdlg.i', - 'src/_timer.i', 'src/_log.i', - 'src/_process.i', 'src/_joystick.i', - 'src/_wave.i', 'src/_mimetype.i', - 'src/_artprov.i', 'src/_config.i', - 'src/_datetime.i', 'src/_dataobj.i', + [ 'src/_settings.i', + 'src/_functions.i', + 'src/_misc.i', + 'src/_tipdlg.i', + 'src/_timer.i', + 'src/_log.i', + 'src/_process.i', + 'src/_joystick.i', + 'src/_sound.i', + 'src/_mimetype.i', + 'src/_artprov.i', + 'src/_config.i', + 'src/_datetime.i', + 'src/_dataobj.i', 'src/_dnd.i', + 'src/_display.i', 'src/_clipbrd.i', ]) ext = Extension('_misc', swig_sources, @@ -908,7 +990,12 @@ ext = Extension('_wizard', swig_sources, wxpExtensions.append(ext) +#---------------------------------------------------------------------- +if CONTRIBS_INC: + CONTRIBS_INC = [ CONTRIBS_INC ] +else: + CONTRIBS_INC = [] #---------------------------------------------------------------------- @@ -934,7 +1021,7 @@ if BUILD_GLCANVAS: ext = Extension('_glcanvas', swig_sources, - include_dirs = includes, + include_dirs = includes + CONTRIBS_INC, define_macros = defines, library_dirs = libdirs, @@ -967,7 +1054,7 @@ if BUILD_OGL: ext = Extension('_ogl', swig_sources, - include_dirs = includes + [ location ], + include_dirs = includes + [ location ] + CONTRIBS_INC, define_macros = defines + [('wxUSE_DEPRECATED', '0')], library_dirs = libdirs, @@ -993,7 +1080,7 @@ if BUILD_STC: else: STC_H = opj(WXPREFIX, 'include/wx/stc') -## NOTE: need to add this to the stc.bkl... +## NOTE: need to add something like this to the stc.bkl... ## # Check if gen_iface needs to be run for the wxSTC sources ## if (newer(opj(CTRB_SRC, 'stc/stc.h.in'), opj(CTRB_INC, 'stc/stc.h' )) or @@ -1017,7 +1104,7 @@ if BUILD_STC: ext = Extension('_stc', swig_sources, - include_dirs = includes, + include_dirs = includes + CONTRIBS_INC, define_macros = defines, library_dirs = libdirs, @@ -1045,11 +1132,44 @@ if BUILD_IEWIN: USE_SWIG, swig_force, swig_args, swig_deps) - ext = Extension('iewinc', ['%s/IEHtmlWin.cpp' % location, + ext = Extension('_iewin', ['%s/IEHtmlWin.cpp' % location, '%s/wxactivex.cpp' % location, ] + swig_sources, - include_dirs = includes, + include_dirs = includes + CONTRIBS_INC, + define_macros = defines, + + library_dirs = libdirs, + libraries = libs, + + extra_compile_args = cflags, + extra_link_args = lflags, + ) + + wxpExtensions.append(ext) + + +#---------------------------------------------------------------------- +# Define the ACTIVEX extension module (experimental) +#---------------------------------------------------------------------- + +if BUILD_ACTIVEX: + msg('Preparing ACTIVEX...') + location = 'contrib/activex' + axloc = opj(location, "wxie") + + swig_files = ['activex.i', ] + + swig_sources = run_swig(swig_files, location, '', PKGDIR, + USE_SWIG, swig_force, swig_args, swig_deps + + [ '%s/_activex_ex.py' % location]) + + + ext = Extension('_activex', ['%s/IEHtmlWin.cpp' % axloc, + '%s/wxactivex.cpp' % axloc, + ] + swig_sources, + + include_dirs = includes + [ axloc ], define_macros = defines, library_dirs = libdirs, @@ -1083,7 +1203,7 @@ if BUILD_XRC: ext = Extension('_xrc', swig_sources, - include_dirs = includes, + include_dirs = includes + CONTRIBS_INC, define_macros = defines, library_dirs = libdirs, @@ -1111,7 +1231,7 @@ if BUILD_GIZMOS: ext = Extension('_gizmos', [ '%s/treelistctrl.cpp' % location ] + swig_sources, - include_dirs = includes + [ location ], + include_dirs = includes + [ location ] + CONTRIBS_INC, define_macros = defines, library_dirs = libdirs, @@ -1139,12 +1259,13 @@ if BUILD_DLLWIDGET: # copy a contrib project specific py module to the main package dir copy_file(opj(location, 'dllwidget.py'), PKGDIR, update=1, verbose=0) + CLEANUP.append(opj(PKGDIR, 'dllwidget.py')) ext = Extension('dllwidget_c', [ '%s/dllwidget.cpp' % location, ] + swig_sources, - include_dirs = includes, + include_dirs = includes + CONTRIBS_INC, define_macros = defines, library_dirs = libdirs, @@ -1180,8 +1301,8 @@ else: ] -DATA_FILES += find_data_files('wxPython/tools/XRCed', '*.txt', '*.xrc') -DATA_FILES += find_data_files('wxPython/py', '*.txt', '*.ico', '*.css', '*.html') +DATA_FILES += find_data_files('wx/tools/XRCed', '*.txt', '*.xrc') +DATA_FILES += find_data_files('wx/py', '*.txt', '*.ico', '*.css', '*.html') DATA_FILES += find_data_files('wx', '*.txt', '*.css', '*.html') @@ -1217,7 +1338,6 @@ if __name__ == "__main__": 'wx.lib.editor', 'wx.lib.mixins', 'wx.py', - 'wx.py.wxd', 'wx.tools', 'wx.tools.XRCed', ], @@ -1229,7 +1349,9 @@ if __name__ == "__main__": scripts = SCRIPTS, - cmdclass = { 'install_data': smart_install_data}, + cmdclass = { 'install_data': smart_install_data, + 'clean': extra_clean, + }, data_files = DATA_FILES, )