]>
git.saurik.com Git - wxWidgets.git/blob - wxPython/config.py
83b378e42f066d2ba80faff100c01e471df8af1c
   1 #---------------------------------------------------------------------- 
   2 # Name:        wx.build.config 
   3 # Purpose:     Most of the contents of this module used to be located  
   4 #              in wxPython's setup.py script.  It was moved here so 
   5 #              it would be installed with the rest of wxPython and 
   6 #              could therefore be used by the setup.py for other 
   7 #              projects that needed this same info and functionality 
   8 #              (most likely in order to be compatible with wxPython.) 
  10 #              This split from setup.py is still fairly rough, and 
  11 #              some things may still get shuffled back and forth, 
  12 #              refactored, etc.  Please send me any comments and 
  13 #              suggestions about this. 
  17 # Created:     23-March-2004 
  19 # Copyright:   (c) 2004 by Total Control Software 
  20 # Licence:     wxWindows license 
  21 #---------------------------------------------------------------------- 
  23 import sys
, os
, glob
, fnmatch
, tempfile
 
  24 from distutils
.core      
import setup
, Extension
 
  25 from distutils
.file_util 
import copy_file
 
  26 from distutils
.dir_util  
import mkpath
 
  27 from distutils
.dep_util  
import newer
 
  28 from distutils
.spawn     
import spawn
 
  30 import distutils
.command
.install
 
  31 import distutils
.command
.install_data
 
  32 import distutils
.command
.install_headers
 
  33 import distutils
.command
.clean
 
  35 #---------------------------------------------------------------------- 
  36 # flags and values that affect this script 
  37 #---------------------------------------------------------------------- 
  39 VER_MAJOR        
= 2      # The first three must match wxWidgets 
  42 VER_SUBREL       
= 1      # wxPython release num for x.y.z release of wxWidgets 
  43 VER_FLAGS        
= ""  # release flags, such as prerelease or RC num, etc. 
  45 DESCRIPTION      
= "Cross platform GUI toolkit for Python" 
  47 AUTHOR_EMAIL     
= "Robin Dunn <robin@alldunn.com>" 
  48 URL              
= "http://wxPython.org/" 
  49 DOWNLOAD_URL     
= "http://wxPython.org/download.php" 
  50 LICENSE          
= "wxWidgets Library License (LGPL derivative)" 
  51 PLATFORMS        
= "WIN32,OSX,POSIX" 
  52 KEYWORDS         
= "GUI,wx,wxWindows,wxWidgets,cross-platform" 
  54 LONG_DESCRIPTION 
= """\ 
  55 wxPython is a GUI toolkit for Python that is a wrapper around the 
  56 wxWidgets C++ GUI library.  wxPython provides a large variety of 
  57 window types and controls, all implemented with a native look and 
  58 feel (by using the native widgets) on the platforms upon which it is 
  63 Development Status :: 6 - Mature 
  64 Environment :: MacOS X :: Carbon 
  65 Environment :: Win32 (MS Windows) 
  66 Environment :: X11 Applications :: GTK 
  67 Intended Audience :: Developers 
  68 License :: OSI Approved 
  69 Operating System :: MacOS :: MacOS X 
  70 Operating System :: Microsoft :: Windows :: Windows 95/98/2000 
  71 Operating System :: POSIX 
  72 Programming Language :: Python 
  73 Topic :: Software Development :: User Interfaces 
  76 ## License :: OSI Approved :: wxWidgets Library Licence 
  79 # Config values below this point can be reset on the setup.py command line. 
  81 BUILD_GLCANVAS 
= 1 # If true, build the contrib/glcanvas extension module 
  82 BUILD_OGL 
= 0      # If true, build the contrib/ogl extension module 
  83 BUILD_STC 
= 1      # If true, build the contrib/stc extension module 
  84 BUILD_GIZMOS 
= 1   # Build a module for the gizmos contrib library 
  85 BUILD_DLLWIDGET 
= 0# Build a module that enables unknown wx widgets 
  86                    # to be loaded from a DLL and to be used from Python. 
  88                    # Internet Explorer wrapper (experimental) 
  89 BUILD_ACTIVEX 
= (os
.name 
== 'nt')  # new version of IEWIN and more 
  92 CORE_ONLY 
= 0      # if true, don't build any of the above 
  94 PREP_ONLY 
= 0      # Only run the prepatory steps, not the actual build. 
  96 USE_SWIG 
= 0       # Should we actually execute SWIG, or just use the 
  97                    # files already in the distribution? 
  99 SWIG 
= "swig"      # The swig executable to use. 
 101 BUILD_RENAMERS 
= 0 # Should we build the renamer modules too? 
 103 FULL_DOCS 
= 0      # Some docstrings are split into a basic docstring and a 
 104                    # details string.  Setting this flag to 1 will 
 105                    # cause the two strings to be combined and output 
 106                    # as the full docstring. 
 108 UNICODE 
= 0        # This will pass the 'wxUSE_UNICODE' flag to SWIG and 
 109                    # will ensure that the right headers are found and the 
 110                    # right libs are linked. 
 112 UNDEF_NDEBUG 
= 1   # Python 2.2 on Unix/Linux by default defines NDEBUG, 
 113                    # and distutils will pick this up and use it on the 
 114                    # compile command-line for the extensions.  This could 
 115                    # conflict with how wxWidgets was built.  If NDEBUG is 
 116                    # set then wxWidgets' __WXDEBUG__ setting will be turned 
 117                    # off.  If wxWidgets was actually built with it turned 
 118                    # on then you end up with mismatched class structures, 
 119                    # and wxPython will crash. 
 121 NO_SCRIPTS 
= 0     # Don't install the tool scripts 
 122 NO_HEADERS 
= 0     # Don't install the wxPython *.h and *.i files 
 124 INSTALL_MULTIVERSION 
= 1 # Install the packages such that multiple versions 
 125                    # can co-exist.  When turned on the wx and wxPython 
 126                    # pacakges will be installed in a versioned subdir 
 127                    # of site-packages, and a *.pth file will be 
 128                    # created that adds that dir to the sys.path.  In 
 129                    # addition, a wxselect.py module will be installed 
 130                    # to site-pacakges that will allow applications to 
 131                    # choose a specific version if more than one is 
 134 FLAVOUR 
= ""       # Optional flavour string to be appended to VERSION 
 135                    # in MULTIVERSION installs 
 137 EP_ADD_OPTS 
= 1    # When doing MULTIVERSION installs the wx port and 
 138                    # ansi/unicode settings can optionally be added to the 
 139                    # subdir path used in site-packages 
 141 EP_FULL_VER 
= 0    # When doing MULTIVERSION installs the default is to 
 142                    # put only 2 or 3 (depending on stable/unstable) of 
 143                    # the version compnonents into the "extra path" 
 144                    # subdir of site-packages.  Setting this option to 
 145                    # 1 will cause the full 4 components of the version 
 146                    # number to be used instead. 
 148 WX_CONFIG 
= None   # Usually you shouldn't need to touch this, but you can set 
 149                    # it to pass an alternate version of wx-config or alternate 
 150                    # flags, eg. as required by the .deb in-tree build.  By 
 151                    # default a wx-config command will be assembled based on 
 152                    # version, port, etc. and it will be looked for on the 
 155 SYS_WX_CONFIG 
= None # When installing an in tree build, setup.py uses wx-config 
 156                      # for two different purposes.  First, to determine the prefix 
 157                      # where files will be installed, and secondly, to initialise 
 158                      # build_options.py with the correct options for it. 
 159                      # WX_CONFIG is used for the first task.  SYS_WX_CONFIG may 
 160                      # be set independently, to the value that should appear in 
 161                      # build_options.py, if it is different to that.  The default 
 162                      # is to use the value of WX_CONFIG. 
 164 WXPORT 
= 'gtk2'    # On Linux/Unix there are several ports of wxWidgets available. 
 165                    # Setting this value lets you select which will be used for 
 166                    # the wxPython build.  Possibilites are 'gtk', 'gtk2' and 
 167                    # 'x11'.  Curently only gtk and gtk2 works. 
 169 BUILD_BASE 
= "build" # Directory to use for temporary build files. 
 170                      # This name will be appended to if the WXPORT or 
 171                      # the UNICODE flags are set to non-standard 
 175 CONTRIBS_INC 
= ""  # A dir to add as an -I flag when compiling the contribs 
 178 # Some MSW build settings 
 180 MONOLITHIC 
= 0     # The core wxWidgets lib can be built as either a 
 181                    # single monolithic DLL or as a collection of DLLs. 
 182                    # This flag controls which set of libs will be used 
 183                    # on Windows.  (For other platforms it is automatic 
 184                    # via using wx-config.) 
 186 FINAL 
= 0          # Will use the release version of the wxWidgets libs on MSW. 
 188 HYBRID 
= 1         # Will use the "hybrid" version of the wxWidgets 
 189                    # libs on MSW.  A "hybrid" build is one that is 
 190                    # basically a release build, but that also defines 
 191                    # __WXDEBUG__ to activate the runtime checks and 
 192                    # assertions in the library.  When any of these is 
 193                    # triggered it is turned into a Python exception so 
 194                    # this is a very useful feature to have turned on. 
 197                    # Version part of wxWidgets LIB/DLL names 
 198 WXDLLVER 
= '%d%d' % (VER_MAJOR
, VER_MINOR
) 
 200 WXPY_SRC 
= '.'  # Assume we're in the source tree already, but allow the 
 201                 # user to change it, particularly for extension building. 
 204 #---------------------------------------------------------------------- 
 207     if hasattr(sys
, 'setup_is_main') and sys
.setup_is_main
: 
 212     path 
= os
.path
.join(*args
) 
 213     return os
.path
.normpath(path
) 
 228 #---------------------------------------------------------------------- 
 230 #---------------------------------------------------------------------- 
 237 force 
= '--force' in sys
.argv 
or '-f' in sys
.argv
 
 238 debug 
= '--debug' in sys
.argv 
or '-g' in sys
.argv
 
 239 cleaning 
= 'clean' in sys
.argv
 
 242 # change the PORT default for wxMac 
 243 if sys
.platform
[:6] == "darwin": 
 246 # and do the same for wxMSW, just for consistency 
 250 WXPYTHON_TYPE_TABLE 
= '_wxPython_table' 
 252 #---------------------------------------------------------------------- 
 253 # Check for build flags on the command line 
 254 #---------------------------------------------------------------------- 
 256 # Boolean (int) flags 
 257 for flag 
in [ 'BUILD_ACTIVEX', 'BUILD_DLLWIDGET', 
 258               'BUILD_GIZMOS', 'BUILD_GLCANVAS',  
 259               'BUILD_OGL', 'BUILD_STC',      
 260              'CORE_ONLY', 'PREP_ONLY', 'USE_SWIG', 'UNICODE', 
 261              'UNDEF_NDEBUG', 'NO_SCRIPTS', 'NO_HEADERS', 'BUILD_RENAMERS', 
 262              'FULL_DOCS', 'INSTALL_MULTIVERSION', 'EP_ADD_OPTS', 'EP_FULL_VER', 
 263              'MONOLITHIC', 'FINAL', 'HYBRID', ]: 
 264     for x 
in range(len(sys
.argv
)): 
 265         if sys
.argv
[x
].find(flag
) == 0: 
 266             pos 
= sys
.argv
[x
].find('=') + 1 
 268                 vars()[flag
] = eval(sys
.argv
[x
][pos
:]) 
 272 for option 
in ['WX_CONFIG', 'SYS_WX_CONFIG', 'WXDLLVER', 'BUILD_BASE', 
 273                'WXPORT', 'SWIG', 'CONTRIBS_INC', 'WXPY_SRC', 'FLAVOUR', 
 276     for x 
in range(len(sys
.argv
)): 
 277         if sys
.argv
[x
].find(option
) == 0: 
 278             pos 
= sys
.argv
[x
].find('=') + 1 
 280                 vars()[option
] = sys
.argv
[x
][pos
:] 
 283 sys
.argv 
= filter(None, sys
.argv
) 
 286 #---------------------------------------------------------------------- 
 287 # some helper functions 
 288 #---------------------------------------------------------------------- 
 290 def Verify_WX_CONFIG(): 
 291     """ Called below for the builds that need wx-config, if WX_CONFIG 
 292         is not set then determines the flags needed based on build 
 293         options and searches for wx-config on the PATH.   
 295     # if WX_CONFIG hasn't been set to an explicit value then construct one. 
 297     if WX_CONFIG 
is None: 
 298         WX_CONFIG
='wx-config' 
 302         flags 
=  ' --toolkit=%s' % port
 
 303         flags 
+= ' --unicode=%s' % (UNICODE 
and 'yes' or 'no') 
 304         flags 
+= ' --version=%s.%s' % (VER_MAJOR
, VER_MINOR
) 
 306         searchpath 
= os
.environ
["PATH"] 
 307         for p 
in searchpath
.split(':'): 
 308             fp 
= os
.path
.join(p
, 'wx-config') 
 309             if os
.path
.exists(fp
) and os
.access(fp
, os
.X_OK
): 
 311                 msg("Found wx-config: " + fp
) 
 312                 msg("    Using flags: " + flags
) 
 313                 WX_CONFIG 
= fp 
+ flags
 
 314                 if hasattr(sys
, 'setup_is_main') and not sys
.setup_is_main
: 
 315                     WX_CONFIG 
+= " 2>/dev/null " 
 318             msg("ERROR: WX_CONFIG not specified and wx-config not found on the $PATH") 
 321         # TODO:  execute WX_CONFIG --list and verify a matching config is found 
 324 def run_swig(files
, dir, gendir
, package
, USE_SWIG
, force
, swig_args
, 
 325              swig_deps
=[], add_under
=False): 
 326     """Run SWIG the way I want it done""" 
 328     if USE_SWIG 
and not os
.path
.exists(os
.path
.join(dir, gendir
)): 
 329         os
.mkdir(os
.path
.join(dir, gendir
)) 
 333     if add_under
:  pre 
= '_' 
 337         basefile 
= os
.path
.splitext(file)[0] 
 338         i_file   
= os
.path
.join(dir, file) 
 339         py_file  
= os
.path
.join(dir, gendir
, pre
+basefile
+'.py') 
 340         cpp_file 
= os
.path
.join(dir, gendir
, pre
+basefile
+'_wrap.cpp') 
 343             interface 
= ['-interface', '_'+basefile
+'_'] 
 347         sources
.append(cpp_file
) 
 349         if not cleaning 
and USE_SWIG
: 
 350             for dep 
in swig_deps
: 
 351                 # this may fail for external builds, but it's not  
 352                 # a fatal error, so keep going. 
 354                     if newer(dep
, py_file
) or newer(dep
, cpp_file
): 
 360             if force 
or newer(i_file
, py_file
) or newer(i_file
, cpp_file
): 
 361                 ## we need forward slashes here, even on win32 
 362                 #cpp_file = opj(cpp_file) #'/'.join(cpp_file.split('\\')) 
 363                 #i_file = opj(i_file)     #'/'.join(i_file.split('\\')) 
 366                     xmltemp 
= tempfile
.mktemp('.xml') 
 368                     # First run swig to produce the XML file, adding 
 369                     # an extra -D that prevents the old rename 
 370                     # directives from being used 
 371                     cmd 
= [ swig_cmd 
] + swig_args 
+ \
 
 372                           [ '-DBUILDING_RENAMERS', '-xmlout', xmltemp 
] + \
 
 373                           ['-I'+dir, '-o', cpp_file
, i_file
] 
 377                     # Next run build_renamers to process the XML 
 378                     myRenamer 
= BuildRenamers() 
 379                     myRenamer
.run(dir, pre
+basefile
, xmltemp
) 
 382                 # Then run swig for real 
 383                 cmd 
= [ swig_cmd 
] + swig_args 
+ interface 
+ \
 
 384                       ['-I'+dir, '-o', cpp_file
, i_file
] 
 389         # copy the generated python file to the package directory 
 390         copy_file(py_file
, package
, update
=not force
, verbose
=0) 
 391         CLEANUP
.append(opj(package
, os
.path
.basename(py_file
))) 
 397     # It may come on either stdout or stderr, depending on the 
 398     # version, so read both. 
 399     i
, o
, e 
= os
.popen3(SWIG 
+ ' -version', 't') 
 400     stext 
= o
.read() + e
.read() 
 402     match 
= re
.search(r
'[0-9]+\.[0-9]+\.[0-9]+$', stext
, re
.MULTILINE
) 
 405     SVER 
= match
.group(0) 
 409 # Specializations of some distutils command classes 
 410 class wx_smart_install_data(distutils
.command
.install_data
.install_data
): 
 411     """need to change self.install_dir to the actual library dir""" 
 413         install_cmd 
= self
.get_finalized_command('install') 
 414         self
.install_dir 
= getattr(install_cmd
, 'install_lib') 
 415         return distutils
.command
.install_data
.install_data
.run(self
) 
 418 class wx_extra_clean(distutils
.command
.clean
.clean
): 
 420     Also cleans stuff that this setup.py copies itself.  If the 
 421     --all flag was used also searches for .pyc, .pyd, .so files 
 424         from distutils 
import log
 
 425         from distutils
.filelist 
import FileList
 
 428         distutils
.command
.clean
.clean
.run(self
) 
 432             fl
.include_pattern("*.pyc", 0) 
 433             fl
.include_pattern("*.pyd", 0) 
 434             fl
.include_pattern("*.so", 0) 
 440                     if not self
.dry_run 
and os
.path
.exists(f
): 
 442                     log
.info("removing '%s'", f
) 
 444                     log
.warning("unable to remove '%s'", f
) 
 448                     if not self
.dry_run 
and os
.path
.exists(f
): 
 450                     log
.info("removing '%s'", f
) 
 452                     log
.warning("unable to remove '%s'", f
) 
 456 class wx_install(distutils
.command
.install
.install
): 
 458     Turns off install_path_file 
 460     def initialize_options(self
): 
 461         distutils
.command
.install
.install
.initialize_options(self
) 
 462         self
.install_path_file 
= 0 
 465 class wx_install_headers(distutils
.command
.install_headers
.install_headers
): 
 467     Install the header files to the WXPREFIX, with an extra dir per 
 470     def initialize_options(self
): 
 472         distutils
.command
.install_headers
.install_headers
.initialize_options(self
) 
 474     def finalize_options(self
): 
 475         self
.set_undefined_options('install', ('root', 'root')) 
 476         distutils
.command
.install_headers
.install_headers
.finalize_options(self
) 
 481         headers 
= self
.distribution
.headers
 
 486         if root 
is None or WXPREFIX
.startswith(root
): 
 488         for header
, location 
in headers
: 
 489             install_dir 
= os
.path
.normpath(root 
+ 
 491                                            '/include/wx-%d.%d/wx' % (VER_MAJOR
, VER_MINOR
) + 
 493             self
.mkpath(install_dir
) 
 494             (out
, _
) = self
.copy_file(header
, install_dir
) 
 495             self
.outfiles
.append(out
) 
 500 def build_locale_dir(destdir
, verbose
=1): 
 501     """Build a locale dir under the wxPython package for MSW""" 
 502     moFiles 
= glob
.glob(opj(WXDIR
, 'locale', '*.mo')) 
 504         lang 
= os
.path
.splitext(os
.path
.basename(src
))[0] 
 505         #dest = opj(destdir, lang) 
 506         dest 
= opj(destdir
, lang
, 'LC_MESSAGES') 
 507         mkpath(dest
, verbose
=verbose
) 
 508         copy_file(src
, opj(dest
, 'wxstd.mo'), update
=1, verbose
=verbose
) 
 509         CLEANUP
.append(opj(dest
, 'wxstd.mo')) 
 513 def build_locale_list(srcdir
): 
 514     # get a list of all files under the srcdir, to be used for install_data 
 515     def walk_helper(lst
, dirname
, files
): 
 517             filename 
= opj(dirname
, f
) 
 518             if not os
.path
.isdir(filename
): 
 519                 lst
.append( (dirname
, [filename
]) ) 
 521     os
.path
.walk(srcdir
, walk_helper
, file_list
) 
 525 def find_data_files(srcdir
, *wildcards
): 
 526     # get a list of all files under the srcdir matching wildcards, 
 527     # returned in a format to be used for install_data 
 529     def walk_helper(arg
, dirname
, files
): 
 534                 filename 
= opj(dirname
, f
) 
 535                 if fnmatch
.fnmatch(filename
, wc
) and not os
.path
.isdir(filename
): 
 536                     names
.append(filename
) 
 538             lst
.append( (dirname
, names 
) ) 
 541     os
.path
.walk(srcdir
, walk_helper
, (file_list
, wildcards
)) 
 545 def makeLibName(name
): 
 546     if os
.name 
== 'posix': 
 547         libname 
= '%s_%s-%s' % (WXBASENAME
, name
, WXRELEASE
) 
 549         libname 
= 'wxmsw%s%s_%s' % (WXDLLVER
, libFlag(), name
) 
 551         libname 
= 'wxmsw%s%s' % (WXDLLVER
, libFlag()) 
 555 def findLib(name
, libdirs
): 
 556     name 
= makeLibName(name
)[0] 
 557     if os
.name 
== 'posix': 
 558         dirs 
= libdirs 
+ ['/usr/lib', '/usr/local/lib'] 
 563         p 
= os
.path
.join(d
, name
) 
 564         if glob
.glob(p
+'*') != []: 
 569 def adjustCFLAGS(cflags
, defines
, includes
): 
 570     '''Extract the raw -I, -D, and -U flags and put them into 
 571        defines and includes as needed.''' 
 575             includes
.append(flag
[2:]) 
 576         elif flag
[:2] == '-D': 
 578             if flag
.find('=') == -1: 
 579                 defines
.append( (flag
, None) ) 
 581                 defines
.append( tuple(flag
.split('=')) ) 
 582         elif flag
[:2] == '-U': 
 583             defines
.append( (flag
[2:], ) ) 
 585             newCFLAGS
.append(flag
) 
 590 def adjustLFLAGS(lflags
, libdirs
, libs
): 
 591     '''Extract the -L and -l flags and put them in libdirs and libs as needed''' 
 595             libdirs
.append(flag
[2:]) 
 596         elif flag
[:2] == '-l': 
 597             libs
.append(flag
[2:]) 
 599             newLFLAGS
.append(flag
) 
 601     # remove any flags for universal binaries, we'll get those from 
 603     return [flag 
for flag 
in newLFLAGS
 
 604             if flag 
not in ['-isysroot', '-arch', 'ppc', 'i386'] and 
 605             not flag
.startswith('/Developer') ] 
 609 def getExtraPath(shortVer
=True, addOpts
=False): 
 610     """Get the dirname that wxPython will be installed under.""" 
 613         # short version, just Major.Minor 
 614         ep 
= "wx-%d.%d" % (VER_MAJOR
, VER_MINOR
) 
 616         # plus release if minor is odd 
 617         if VER_MINOR 
% 2 == 1: 
 618             ep 
+= ".%d" % VER_RELEASE
 
 620         ##ep = "wx-%d.%d.%d" % (VER_MAJOR, VER_MINOR, VER_RELEASE) 
 623         # long version, full version  
 624         ep 
= "wx-%d.%d.%d.%d" % (VER_MAJOR
, VER_MINOR
, VER_RELEASE
, VER_SUBREL
) 
 628         if port 
== "msw": port 
= "win32" 
 629         ep 
+= "-%s-%s" % (WXPORT
, (UNICODE 
and 'unicode' or 'ansi')) 
 636 #---------------------------------------------------------------------- 
 654 if UNICODE 
and WXPORT 
not in ['msw', 'gtk2', 'mac']: 
 655     raise SystemExit, "UNICODE mode not currently supported on this WXPORT: "+WXPORT
 
 659     CONTRIBS_INC 
= [ CONTRIBS_INC 
] 
 664 #---------------------------------------------------------------------- 
 665 # Setup some platform specific stuff 
 666 #---------------------------------------------------------------------- 
 669     # Set compile flags and such for MSVC.  These values are derived 
 670     # from the wxWidgets makefiles for MSVC, other compilers settings 
 671     # will probably vary... 
 672     if os
.environ
.has_key('WXWIN'): 
 673         WXDIR 
= os
.environ
['WXWIN'] 
 675         msg("WARNING: WXWIN not set in environment.") 
 676         WXDIR 
= '..'  # assumes in CVS tree 
 680     includes 
= ['include', 'src', 
 681                 opj(WXDIR
, 'lib', 'vc_dll', 'msw'  + libFlag()), 
 682                 opj(WXDIR
, 'include'), 
 683                 opj(WXDIR
, 'contrib', 'include'), 
 686     defines 
= [ ('WIN32', None), 
 692                 ('SWIG_TYPE_TABLE', WXPYTHON_TYPE_TABLE
), 
 693                 ('SWIG_PYTHON_OUTPUT_TUPLE', None), 
 694                 ('WXP_USE_THREAD', '1'), 
 698         defines
.append( ('NDEBUG',) )  # using a 1-tuple makes it do an undef 
 701         defines
.append( ('__NO_VC_CRTDBG__', None) ) 
 703     if not FINAL 
or HYBRID
: 
 704         defines
.append( ('__WXDEBUG__', None) ) 
 707         defines
.append( ('wxUSE_UNICODE', 1) ) 
 709     libdirs 
= [ opj(WXDIR
, 'lib', 'vc_dll') ] 
 711         libs 
= makeLibName('') 
 713         libs 
= [ 'wxbase' + WXDLLVER 
+ libFlag(),  
 714                  'wxbase' + WXDLLVER 
+ libFlag() + '_net', 
 715                  'wxbase' + WXDLLVER 
+ libFlag() + '_xml', 
 716                  makeLibName('core')[0], 
 717                  makeLibName('adv')[0], 
 718                  makeLibName('html')[0], 
 721     libs 
= libs 
+ ['kernel32', 'user32', 'gdi32', 'comdlg32', 
 722             'winspool', 'winmm', 'shell32', 'oldnames', 'comctl32', 
 723             'odbc32', 'ole32', 'oleaut32', 'uuid', 'rpcrt4', 
 724             'advapi32', 'wsock32'] 
 728              # '/GX-'  # workaround for internal compiler error in MSVC on some machines 
 732     # Other MSVC flags... 
 733     # Too bad I don't remember why I was playing with these, can they be removed? 
 735         pass #cflags = cflags + ['/O1'] 
 737         pass #cflags = cflags + ['/Ox'] 
 739         pass # cflags = cflags + ['/Od', '/Z7'] 
 740              # lflags = ['/DEBUG', ] 
 744 #---------------------------------------------------------------------- 
 746 elif os
.name 
== 'posix': 
 748     includes 
= ['include', 'src'] 
 749     defines 
= [('SWIG_TYPE_TABLE', WXPYTHON_TYPE_TABLE
), 
 750                ('SWIG_PYTHON_OUTPUT_TUPLE', None), 
 751                ('WXP_USE_THREAD', '1'), 
 754         defines
.append( ('NDEBUG',) )  # using a 1-tuple makes it do an undef 
 761     # If you get unresolved symbol errors on Solaris and are using gcc, then 
 762     # uncomment this block to add the right flags to the link step and build 
 764     ## if os.uname()[0] == 'SunOS': 
 766     ##     libs.append('gcc') 
 767     ##     libdirs.append(commands.getoutput("gcc -print-search-dirs | grep '^install' | awk '{print $2}'")[:-1]) 
 769     cflags 
= os
.popen(WX_CONFIG 
+ ' --cxxflags', 'r').read()[:-1] 
 770     cflags 
= cflags
.split() 
 777     lflags 
= os
.popen(WX_CONFIG 
+ ' --libs', 'r').read()[:-1] 
 778     MONOLITHIC 
= (lflags
.find("_xrc") == -1) 
 779     lflags 
= lflags
.split() 
 781     WXBASENAME 
= os
.popen(WX_CONFIG 
+ ' --basename').read()[:-1] 
 782     WXRELEASE  
= os
.popen(WX_CONFIG 
+ ' --release').read()[:-1] 
 783     WXPREFIX   
= os
.popen(WX_CONFIG 
+ ' --prefix').read()[:-1] 
 786     if sys
.platform
[:6] == "darwin" and WXPORT 
== 'mac': 
 787         # Flags and such for a Darwin (Max OS X) build of Python 
 795         # Set flags for other Unix type platforms 
 800             portcfg 
= os
.popen('gtk-config --cflags', 'r').read()[:-1] 
 801         elif WXPORT 
== 'gtk2': 
 803             GENDIR 
= 'gtk' # no code differences so use the same generated sources 
 804             portcfg 
= os
.popen('pkg-config gtk+-2.0 --cflags', 'r').read()[:-1] 
 805             BUILD_BASE 
= BUILD_BASE 
+ '-' + WXPORT
 
 806         elif WXPORT 
== 'x11': 
 809             BUILD_BASE 
= BUILD_BASE 
+ '-' + WXPORT
 
 811             raise SystemExit, "Unknown WXPORT value: " + WXPORT
 
 813         cflags 
+= portcfg
.split() 
 815         # Some distros (e.g. Mandrake) put libGLU in /usr/X11R6/lib, but 
 816         # wx-config doesn't output that for some reason.  For now, just 
 817         # add it unconditionally but we should really check if the lib is 
 818         # really found there or wx-config should be fixed. 
 819         libdirs
.append("/usr/X11R6/lib") 
 822     # Move the various -I, -D, etc. flags we got from the *config scripts 
 823     # into the distutils lists. 
 824     cflags 
= adjustCFLAGS(cflags
, defines
, includes
) 
 825     lflags 
= adjustLFLAGS(lflags
, libdirs
, libs
) 
 828 #---------------------------------------------------------------------- 
 830     raise 'Sorry, platform not supported...' 
 833 #---------------------------------------------------------------------- 
 835 #---------------------------------------------------------------------- 
 837 if SYS_WX_CONFIG 
is None: 
 838     SYS_WX_CONFIG 
= WX_CONFIG
 
 840 build_options_template 
= """ 
 843 INSTALL_MULTIVERSION=%d 
 852 """ % (UNICODE
, UNDEF_NDEBUG
, INSTALL_MULTIVERSION
, FLAVOUR
, EP_ADD_OPTS
, 
 853        EP_FULL_VER
, SYS_WX_CONFIG
, WXPORT
, MONOLITHIC
, FINAL
, HYBRID
) 
 856     from build_options 
import * 
 858     build_options_file 
= os
.path
.join(os
.path
.dirname(__file__
), "build_options.py") 
 859     if not os
.path
.exists(build_options_file
): 
 861             myfile 
= open(build_options_file
, "w") 
 862             myfile
.write(build_options_template
) 
 865             print "WARNING: Unable to create build_options.py." 
 868 #---------------------------------------------------------------------- 
 869 # post platform setup checks and tweaks, create the full version string 
 870 #---------------------------------------------------------------------- 
 873     BUILD_BASE 
= BUILD_BASE 
+ '.unicode' 
 875 if os
.path
.exists('DAILY_BUILD'): 
 876     VER_FLAGS 
+= '.' + open('DAILY_BUILD').read().strip() 
 878 VERSION 
= "%s.%s.%s.%s%s" % (VER_MAJOR
, VER_MINOR
, VER_RELEASE
, 
 879                              VER_SUBREL
, VER_FLAGS
) 
 882 #---------------------------------------------------------------------- 
 884 #---------------------------------------------------------------------- 
 886 # *.i files could live in the wxWidgets/wxPython/src dir, or in  
 887 # a subdirectory of the devel package. Let's specify both  
 888 # dirs as includes so we don't have to guess which is correct. 
 891 i_subdir 
= opj("include", getExtraPath(), "wx", "wxPython", "i_files") 
 893     wxfilesdir 
= opj(WXPREFIX
, i_subdir
) 
 895     wxfilesdir 
= opj(WXPY_SRC
, i_subdir
) 
 897 i_files_includes 
= [ '-I' + opj(WXPY_SRC
, 'src'), 
 911     SVER 
= swig_version() 
 912     if int(SVER
[-2:]) >= 29: 
 913         swig_args 
+= [ '-fastdispatch', 
 917                        #'-outputtuple',  Currently setting this with a -D define above 
 921     swig_args
.append('-DwxUSE_UNICODE') 
 924     swig_args
.append('-D_DO_FULL_DOCS') 
 927 swig_deps 
= [ opj(WXPY_SRC
, 'src/my_typemaps.i'), 
 928               opj(WXPY_SRC
, 'src/pyfragments.swg'), 
 931 depends 
= [ #'include/wx/wxPython/wxPython.h', 
 932             #'include/wx/wxPython/wxPython_int.h', 
 936 #---------------------------------------------------------------------- 
 938 #################################### 
 940 #################################### 
 942 import pprint
, shutil
 
 947     FOUND_LIBXML2 
= False 
 949 #--------------------------------------------------------------------------- 
 951 renamerTemplateStart 
= """\ 
 952 // A bunch of %rename directives generated by BuildRenamers in config.py 
 953 // in order to remove the wx prefix from all global scope names. 
 955 #ifndef BUILDING_RENAMERS 
 959 renamerTemplateEnd 
= """ 
 963 wxPythonTemplateStart 
= """\ 
 964 ## This file reverse renames symbols in the wx package to give 
 965 ## them their wx prefix again, for backwards compatibility. 
 967 ## Generated by BuildRenamers in config.py 
 969 # This silly stuff here is so the wxPython.wx module doesn't conflict 
 970 # with the wx package.  We need to import modules from the wx package 
 971 # here, then we'll put the wxPython.wx entry back in sys.modules. 
 974 if sys.modules.has_key('wxPython.wx'): 
 975     _wx = sys.modules['wxPython.wx'] 
 976     del sys.modules['wxPython.wx'] 
 980 sys.modules['wxPython.wx'] = _wx 
 984 # Now assign all the reverse-renamed names: 
 987 wxPythonTemplateEnd 
= """ 
 993 #--------------------------------------------------------------------------- 
 995     def run(self
, destdir
, modname
, xmlfile
, wxPythonDir
="wxPython"):     
 997         assert FOUND_LIBXML2
, "The libxml2 module is required to use the BuildRenamers functionality." 
 999         if not os
.path
.exists(wxPythonDir
): 
1000             os
.mkdir(wxPythonDir
) 
1002         swigDest 
= os
.path
.join(destdir
, "_"+modname
+"_rename.i") 
1003         pyDest 
= os
.path
.join(wxPythonDir
, modname 
+ '.py') 
1005         swigDestTemp 
= tempfile
.mktemp('.tmp') 
1006         swigFile 
= open(swigDestTemp
, "w") 
1007         swigFile
.write(renamerTemplateStart
) 
1009         pyDestTemp 
= tempfile
.mktemp('.tmp') 
1010         pyFile 
= open(pyDestTemp
, "w") 
1011         pyFile
.write(wxPythonTemplateStart 
% modname
) 
1013         print "Parsing XML and building renamers..." 
1014         self
.processXML(xmlfile
, modname
, swigFile
, pyFile
) 
1016         self
.checkOtherNames(pyFile
, modname
, 
1017                         os
.path
.join(destdir
, '_'+modname
+'_reverse.txt')) 
1018         pyFile
.write(wxPythonTemplateEnd
)         
1021         swigFile
.write(renamerTemplateEnd
) 
1024         # Compare the files just created with the existing one and 
1025         # blow away the old one if they are different. 
1026         for dest
, temp 
in [(swigDest
, swigDestTemp
), 
1027                            (pyDest
, pyDestTemp
)]: 
1028             # NOTE: we don't use shutil.move() because it was introduced 
1029             # in Python 2.3. Eventually we can switch to it when people 
1030             # stop building using 2.2. 
1031             if not os
.path
.exists(dest
): 
1032                 shutil
.copyfile(temp
, dest
) 
1033             elif open(dest
).read() != open(temp
).read(): 
1035                 shutil
.copyfile(temp
, dest
) 
1037                 print dest 
+ " not changed." 
1040     #--------------------------------------------------------------------------- 
1043     def GetAttr(self
, node
, name
): 
1044         path 
= "./attributelist/attribute[@name='%s']/@value" % name
 
1045         n 
= node
.xpathEval2(path
) 
1052     def processXML(self
, xmlfile
, modname
, swigFile
, pyFile
): 
1054         topnode 
= libxml2
.parseFile(xmlfile
).children
 
1056         # remove any import nodes as we don't need to do renamers for symbols found therein 
1057         imports 
= topnode
.xpathEval2("*/import") 
1062         # do a depth first iteration over what's left 
1063         for node 
in topnode
: 
1069             if node
.name 
== "class": 
1070                 lastClassName 
= name 
= self
.GetAttr(node
, "name") 
1071                 lastClassSymName 
= sym_name 
= self
.GetAttr(node
, "sym_name") 
1073                 if sym_name 
!= name
: 
1077             # renamed constructors 
1078             elif node
.name 
== "constructor": 
1079                 name     
= self
.GetAttr(node
, "name") 
1080                 sym_name 
= self
.GetAttr(node
, "sym_name") 
1081                 if sym_name 
!= name
: 
1086             # only enumitems at the top level 
1087             elif node
.name 
== "enumitem" and node
.parent
.parent
.name 
== "include": 
1088                 name     
= self
.GetAttr(node
, "name") 
1089                 sym_name 
= self
.GetAttr(node
, "sym_name") 
1093             elif node
.name 
in ["cdecl", "constant"]: 
1094                 name      
= self
.GetAttr(node
, "name") 
1095                 sym_name  
= self
.GetAttr(node
, "sym_name") 
1096                 toplevel  
= node
.parent
.name 
== "include" 
1098                 # top-level functions 
1099                 if toplevel 
and self
.GetAttr(node
, "view") == "globalfunctionHandler": 
1102                 # top-level global vars 
1103                 elif toplevel 
and self
.GetAttr(node
, "feature_immutable") == "1": 
1107                 elif self
.GetAttr(node
, "view") == "staticmemberfunctionHandler": 
1108                     name     
= lastClassName 
+ '_' + name
 
1109                     sym_name 
= lastClassSymName 
+ '_' + sym_name
 
1110                     # only output the reverse renamer in this case 
1111                     doRename 
= revOnly 
= True 
1113                 if doRename 
and name 
!= sym_name
: 
1118             if doRename 
and name
: 
1120                 if old
.startswith('wx') and not old
.startswith('wxEVT_'): 
1121                     # remove all wx prefixes except wxEVT_ and write a %rename directive for it 
1124                         swigFile
.write("%%rename(%s)  %35s;\n" % (new
, old
)) 
1126                 # Write assignments to import into the old wxPython namespace 
1127                 if addWX 
and not old
.startswith('wx'): 
1129                 pyFile
.write("%s = wx.%s.%s\n" % (old
, modname
, new
)) 
1132     #--------------------------------------------------------------------------- 
1134     def checkOtherNames(self
, pyFile
, moduleName
, filename
): 
1135         if os
.path
.exists(filename
): 
1137             for line 
in file(filename
): 
1138                 if line
.endswith('\n'): 
1140                 if line 
and not line
.startswith('#'): 
1141                     if line
.endswith('*'): 
1142                         prefixes
.append(line
[:-1]) 
1143                     elif line
.find('=') != -1: 
1144                         pyFile
.write("%s\n" % line
) 
1146                         wxname 
= 'wx' + line
 
1147                         if line
.startswith('wx') or line
.startswith('WX') or line
.startswith('EVT'): 
1149                         pyFile
.write("%s = wx.%s.%s\n" % (wxname
, moduleName
, line
)) 
1153                     "\n\nd = globals()\nfor k, v in wx.%s.__dict__.iteritems():" 
1158                         pyFile
.write("\n    if ") 
1161                         pyFile
.write("\n    elif ") 
1162                     pyFile
.write("k.startswith('%s'):\n        d[k] = v" % p
) 
1163                 pyFile
.write("\ndel d, k, v\n\n") 
1166 #---------------------------------------------------------------------------