2 #----------------------------------------------------------------------
3 # Build wxMac and wxPythonOSX from the tarball and then make an
4 # Installer package out of it.
8 spectemplate
=distrib
/wxPythonFull.spec.
in
10 if [ ! -d wxPython
-o ! -e ${spectemplate} ]; then
11 echo "Please run this script from the root wxPython directory."
15 if [ "$UID" != "0" ]; then
16 echo "-------------------------------------------------------"
17 echo " WARNING: I will be unable to change ownership of files"
18 echo " unless this script is run as root or via sudo"
19 echo "-------------------------------------------------------"
22 #----------------------------------------------------------------------
27 echo "Usage: $0 PYVER [command flags...]"
29 echo " PYVER Python version to use to do the build. A"
30 echo " matching python\$PYVER must be found on the PATH"
32 echo "optional command flags:"
33 echo " skiptar Don't unpack the tarball"
34 echo " inplace Don't use the tarball, build from the CVS tree instead"
35 echo " (The Docs and Demo tarballs are still required for a full build.)"
36 echo " reswig Regenerate SWIG wrappers"
37 echo " universal Generate Universal wxWidgets binary (requires Universal Python "
38 echo " to general Universal wxPython)."
39 echo " unicode Make a unicode build"
40 echo " skipconfig Don't run configure"
41 echo " skipbuild Don't build wxWidgets or wxPython"
42 echo " skipinstall Don't do the installation step"
43 echo " skipdmg Don't make the package or diskimage"
44 echo " skipclean Don't do the cleanup at the end"
50 if [ "$PYVER" != "" ] && which python
$PYVER && which pythonw
$PYVER; then
51 PYTHON
=`which python$PYVER`
52 PYTHONW
=`which pythonw$PYVER`
74 skiptar
) skiptar
=yes ;;
75 skipconfig
) skipconfig
=yes; skiptar
=yes ;;
76 skipbuild
) skipbuild
=yes; skipconfig
=yes; skiptar
=yes ;;
77 skipinstall
) skipinstall
=yes ;;
78 skipdmg
) skipdmg
=yes ;;
79 skipclean
) skipclean
=yes ;;
80 inplace
) inplace
=yes; skiptar
=yes ;;
81 unicode
) unicode
=yes ;;
85 universal
) universal
=yes ;;
86 *) echo "Unknown flag \"${flag}\""
94 OSX_VERSION
=`sw_vers -productVersion`
95 OSX_VERSION
=${OSX_VERSION:0:4}
98 10.4) TAG
=macosx10.4
;;
99 10.3) TAG
=macosx10.3
;;
100 10.2) TAG
=macosx10.2
;;
104 if [ $universal = yes ]; then
110 VERSION
=`$PYTHON -c "import setup;print setup.VERSION"`
111 SHORTVER
=`echo $VERSION | cut -c 1,2,3`
112 PYPREFIX
=`$PYTHON -c "import sys; print sys.exec_prefix"`
113 PYLIB
=$PYPREFIX/lib
/python
$PYVER
114 SITEPACKAGES
=$PYLIB/site
-packages
116 if [ $unicode == yes ]; then
118 UNICODEOPT
=--enable-unicode
122 UNICODEOPT
=--disable-unicode
126 if [ $debug == yes ]; then
127 DEBUG_FLAG
=--enable-debug
130 DEBUG_FLAG
=--enable-debug_flag
135 # Test if the python we are using is the System installed framework
136 # or one that was installed by the user. This changes where the
137 # site-packages (or its alias) is located in the installer tree.
139 if [ -e /Library
/Python
/$PYVER ] && [ `dirname $PYTHON` == "/usr/bin" ]; then
145 if [ -z "$TARBALLDIR" ]; then
146 # this is a spot on my fileserver where the tarballs go, adjust
147 # as needed for where you put the wxPython tarball, or set
148 # TARBALLDIR before invoking this script...
149 TARBALLDIR
=/stuff
/Development
/wxPython
/dist
/$VERSION
151 TARBALL
=$TARBALLDIR/wxPython
-src-$VERSION.
tar.bz2
153 if [ ! -e $TARBALLDIR/wxPython
-demo-$VERSION.
tar.bz2
]; then
154 echo "-------------------------------------------------------"
155 echo " WARNING: Demo tarball not found, will skip building "
156 echo " the Demo app bundle and etc."
157 echo " $TARBALLDIR/wxPython-demo-$VERSION.tar.bz2"
158 echo "-------------------------------------------------------"
161 if [ ! -e $TARBALLDIR/wxPython
-docs-$VERSION.
tar.bz2
]; then
162 echo "-------------------------------------------------------"
163 echo " WARNING: Docs tarball not found, will skip building "
164 echo " the the wxDocsViewer app bundle and etc."
165 echo " $TARBALLDIR/wxPython-docs-$VERSION.tar.bz2"
166 echo "-------------------------------------------------------"
172 PREFIX
=/usr
/local
/lib
/wxPython
-$CHARTYPE-$VERSION
173 BINPREFIX
=/usr
/local
/bin
175 SWIGBIN
=/opt
/swig
/bin
/swig
176 WXROOT
=`dirname $PWD`
177 PROGDIR
="`dirname \"$0\"`"
178 TMPDIR
=$PWD/_build_dmg
180 BUILDROOT
=$TMPDIR/build
182 INSTALLROOT
=$TMPDIR/install-root
183 INSTALLAPPS
=$TMPDIR/install-apps
189 RESOURCEDIR
=$PROGDIR/resources
191 SRCROOT
=$BUILDROOT/wxPython
-src-$VERSION
194 #----------------------------------------------------------------------
198 mkdir -p $INSTALLROOT
199 mkdir -p $INSTALLAPPS
203 mkdir -p $DMGAPPS/Docs
204 mkdir -p $DMGAPPS/Samples
206 if [ ! -d $DESTDIR ]; then
213 #----------------------------------------------------------------------
216 if [ $skiptar != yes ]; then
217 echo Unarchiving tarball...
221 if [ $inplace = no
]; then
222 # make a build dir and cd to it.
223 cd wxPython
-src-$VERSION
230 # If building "inplace" then our build dir will be off of the
231 # WXROOT like normal, adjust the variables to find things that
233 WXBLD
=$WXROOT/build
-$CHARTYPE
240 echo "Using wx root dir: $WXROOT"
241 echo "Using build dir: $WXBLD"
242 echo "Using source tree: $WXDIR"
244 #----------------------------------------------------------------------
246 if [ $OSX_VERSION = 10.3 -o $OSX_VERSION = 10.4 ]; then
247 OTHER_CFG_OPTS
=--enable-mediactrl
250 # Configure wxWidgets
251 if [ $skipconfig != yes -a $universal != yes ]; then
255 --enable-monolithic \
261 --enable-precomp=no \
263 --disable-debugreport \
264 --disable-precompiled-headers \
265 $UNICODEOPT $OTHER_CFG_OPTS
269 # Build wxWidgets and wxPython
270 if [ $skipbuild != yes ]; then
272 # Make wxWidgets and some contribs
273 WXBLD_CONFIG
="$WXBLD/wx-config"
274 if [ $universal = yes ]; then
276 export BUILDPREFIX
=$PREFIX
277 export INSTALLDIR
=$INSTALLROOT$PREFIX
278 $WXDIR/distrib
/scripts
/mac
/macbuild wxpython universal
$CHARTYPE
281 make $MAKEJOBS -C contrib
/src
/animate
282 make $MAKEJOBS -C contrib
/src
/gizmos
283 make $MAKEJOBS -C contrib
/src
/stc
287 if [ $reswig = yes ]; then
294 UNICODE
=$PYUNICODEOPT \
297 WX_CONFIG
="$WXBLD_CONFIG --inplace" \
298 BUILD_BASE
=$WXBLD/wxPython \
304 #----------------------------------------------------------------------
306 if [ $skipinstall != yes ]; then
309 if [ $universal != yes ]; then
310 make prefix
=$INSTALLROOT$PREFIX install
311 make -C contrib
/src
/animate prefix
=$INSTALLROOT$PREFIX install
312 make -C contrib
/src
/gizmos prefix
=$INSTALLROOT$PREFIX install
313 make -C contrib
/src
/stc prefix
=$INSTALLROOT$PREFIX install
316 # relink wx-config with a relative link
317 cd $INSTALLROOT$PREFIX/bin
319 ln -s ..
/lib
/wx
/config
/* wx
-config
324 UNICODE
=$PYUNICODEOPT \
327 WX_CONFIG
="$INSTALLROOT$PREFIX/bin/wx-config --prefix=$INSTALLROOT$PREFIX" \
328 BUILD_BASE
=$WXBLD/wxPython \
333 # Apple's Python Framework (such as what comes with Panther)
334 # sym-links the site-packages dir in the framework to
335 # /Library/Python/$PYVER so we need to move the files so they are
336 # installed in the physical location, not the virtual one.
337 if [ $APPLE_PYTHON == yes ]; then
338 if [ -e $INSTALLROOT/Library
/Python
/$PYVER ]; then
339 rm -r $INSTALLROOT/Library
/Python
/$PYVER
341 mkdir -p $INSTALLROOT/Library
/Python
/$PYVER
342 mv $INSTALLROOT/$SITEPACKAGES/* $INSTALLROOT/Library
/Python
/$PYVER
343 rm -r $INSTALLROOT/System
344 SITEPACKAGES
=/Library
/Python
/$PYVER
347 # install wxPython's tool scripts
348 mkdir -p $INSTALLROOT$BINPREFIX
349 cd $WXROOT/wxPython
/scripts
350 python
$PYVER CreateMacScripts.py
$INSTALLROOT $BINPREFIX
353 # Remove the .pyc/.pyo files they just take up space and can be recreated
354 # during the install.
355 pushd $WXROOT/wxPython
356 $PYTHON $PROGDIR/..
/zappycfiles.py
$INSTALLROOT > /dev
/null
359 # Set premissions for files in $INSTALLROOT
360 if [ "$UID" = "0" ]; then
361 chown
-R root
:admin
$INSTALLROOT
362 chmod -R g
+w
$INSTALLROOT
366 if [ $APPLE_PYTHON == yes ]; then
367 SITEPACKAGES
=/Library
/Python
/$PYVER
369 PKGDIR
=`cat $INSTALLROOT$SITEPACKAGES/wx.pth`
373 #----------------------------------------------------------------------
375 # Make the Installer packages and disk image
376 if [ $skipdmg != yes ]; then
378 #-----------------------------------------------
379 # The main runtime installer package
381 # Make the welcome message
383 10.4) W_MSG
="the Tiger (OS X 10.4.x Intel) version of" ;;
384 10.3) W_MSG
="the Panther (OS X 10.3.x) version of" ;;
385 10.2) W_MSG
="the Jaguar (OS X 10.2.x) version of" ;;
388 if [ $universal == yes ]; then
389 W_MSG
="the Universal (OS X 10.4.x and above) version of"
393 cat > $RESOURCEDIR/Welcome.txt
<<EOF
396 This Installer package will install the wxPython $CHARTYPE runtime $VERSION for $W_MSG MacPython-OSX $PYVER. This includes:
398 * The wxPython packages and modules
399 * The wxWidgets shared libraries and headers
400 * Some command line tool scripts, installed to /usr/local/bin.
402 You must install onto your current boot disk, eventhough the installer does not enforce this, otherwise things will not work.
404 You can install more than one version of the wxPython runtime if you desire. The most recently installed version will be the default wxPython, but you can choose another by setting the PYTHONPATH or by using the wxversion module. See http://wiki.wxpython.org/index.cgi/MultiVersionInstalls for more details.
409 # make the preflight script
410 cat > $RESOURCEDIR/preflight
<<EOF
412 # Cleanup any old install of the wxPython package
413 rm -rf \$2$SITEPACKAGES/wxPython
414 rm -rf \$2$SITEPACKAGES/wx
415 rm -rf \$2$SITEPACKAGES/$PKGDIR
418 chmod +x
$RESOURCEDIR/preflight
420 # make the postflight script
421 cat > $RESOURCEDIR/postflight
<<EOF
423 # Compile the .py files in the wxPython pacakge
424 $PYTHON \$2$PYLIB/compileall.py \$2$SITEPACKAGES/$PKGDIR
425 $PYTHON -O \$2$PYLIB/compileall.py \$2$SITEPACKAGES/$PKGDIR
427 # and all of the wxPython pacakge should be group writable
428 chgrp -R admin \$2$SITEPACKAGES/$PKGDIR
429 chmod -R g+w \$2$SITEPACKAGES/$PKGDIR
433 chmod +x
$RESOURCEDIR/postflight
437 # Build the main Installer Package...
438 PKGNAME
=wxPython
${SHORTVER}-osx-$CHARTYPE-$TAG
439 if [ $PYVER != 2.3 ]; then
440 PKGNAME
=wxPython
${SHORTVER}-osx-$CHARTYPE-$TAG-py$PYVER
443 $PYTHON $PROGDIR/..
/buildpkg.py \
446 --Description="wxPython $CHARTYPE runtime $VERSION for $W_MSG MacPython-OSX $PYVER" \
447 --NeedsAuthorization="YES" \
449 --InstallOnly="YES" \
453 mv $PKGNAME.pkg
$DMGROOT/$PKGNAME.pkg
455 rm $RESOURCEDIR/postflight
456 rm $RESOURCEDIR/preflight
457 rm $RESOURCEDIR/Welcome.txt
460 #-----------------------------------------------
461 # Make a README to go on the disk image
462 cat > "$DMGROOT/README 1st.txt" <<EOF
465 This disk image contains the following items:
467 wxPython${SHORTVER}-osx-$CHARTYPE-$VERSION-$KIND
469 This Installer contains the wxPython runtime, compiled on a
470 $KIND OS X system, using the $CHARTYPE build of the wxWidgets
471 library. It includes the Python modules and extension
472 modules, as well as the wxWidgets libraries.
474 It is possible to have more than one version of the runtime
475 installed at once if you wish. The most recently installed
476 version will be the default wxPython, but you can choose
477 another by setting the PYTHONPATH or by using the wxversion
478 module. For more details see:
479 http://wiki.wxpython.org/index.cgi/MultiVersionInstalls
482 uninstall_wxPython.py
484 A simple tool to help you manage your installed versions of
485 wxPython. It will allow you to choose from the currently
486 installed wxPython packages and to select one for
487 uninstallation. It is a text-mode tool so you can either run
488 it from a Terminal command line, or you can open it with
489 PythonLauncher and let it create a Terminal to run it in.
491 NOTE: If you have versions prior to 2.5.3.1 installed, please
492 do run this uninstall tool to remove the older version.
498 cp $PROGDIR/..
/uninstall_wxPython.py
$DMGROOT
501 #-----------------------------------------------
502 # Make a disk image to hold these files
503 dmgname
=wxPython
${SHORTVER}-osx-$CHARTYPE-$VERSION-$TAG-py$PYVER
504 $PROGDIR/..
/makedmg
$DMGROOT $DMGDIR $dmgname
506 echo Moving
$DMGDIR/$dmgname.dmg to
$DESTDIR
507 mv $DMGDIR/$dmgname.dmg
$DESTDIR/$dmgname.dmg
510 #---------------------------------------------------------------------------
511 # Now create app bundles for the demo, docs, and tools and make another
512 # disk image to hold it all.
513 #---------------------------------------------------------------------------
515 cat > "$DMGAPPS/README 1st.txt" <<EOF
518 On this disk image you will find Demo, Tools, Docs, and etc. for
519 wxPython $VERSION. Everything here is optional and you can drag them
520 out of the disk image and drop them wherever you want. You will need
521 to have an installed wxPython runtime to be able to use any of them.
524 wxPython Demo An application bundle version of the demo.
525 (This has it's own copy of the demo sources
528 XRCed An application for editing wxPython resource
531 PyCrust An application that provides an interactive
532 Python shell and also namespace inspectors.
536 Docs/wxDocsViewer An application that allows you to view the
537 wxWidgets documentation.
539 Docs/licence License files.
541 Docs/other A few readmes, change log, etc.
544 Samples/samples Several small sample applications that
545 demonstrate how to use wxPython.
547 Samples/demo A copy of the wxPython demo source code,
548 just open the folder and run demo.pyw.
553 # PyAlaMode An extension of PyCrust that includes source
554 # file editing capabilities.
558 if [ ! -e $TARBALLDIR/wxPython
-docs-$VERSION.
tar.bz2
]; then
559 cat > "$DMGAPPS/Docs/Build ERROR.txt" <<EOF
561 The wxPython-docs tarball was not found when building this disk image!
567 tar xjvf
$TARBALLDIR/wxPython
-docs-$VERSION.
tar.bz2
570 # Make an app to launch viewdocs.py
571 $PYTHONW $PROGDIR/..
/buildapp.py \
572 --builddir=$DMGAPPS/Docs \
573 --name=wxDocsViewer \
574 --mainprogram=$BUILDROOT/wxPython
-$VERSION/docs
/viewdocs.py \
575 --iconfile=$PROGDIR/Info.icns \
578 cp $BUILDROOT/wxPython
-$VERSION/docs
/*.
zip $DMGAPPS/Docs
/wxDocsViewer.app
/Contents
/Resources
580 cat > "$DMGAPPS/Docs/README 1st.txt" <<EOF
582 The wxDocsViewer application needs to be copied to your Desktop (or
583 someplace else you have write access to) before you can run it, so it
584 can cache some indexes within its bundle.
590 # license files, docs, etc.
592 cp -pR $SRCROOT/wxPython
/licence .
593 cp -pR $SRCROOT/wxPython
/docs .
600 if [ ! -e $TARBALLDIR/wxPython
-demo-$VERSION.
tar.bz2
]; then
601 cat > "$DMGAPPS/Samples/Build ERROR.txt" <<EOF
603 The wxPython-$VERSION-demo tarball was not found when building this disk image!
606 cp "$DMGAPPS/Samples/Build ERROR.txt" $DMGAPPS
610 # Copy the demo and samples to the disk image from the tarball
611 pushd $DMGAPPS/Samples
612 tar xjvf
$TARBALLDIR/wxPython
-demo-$VERSION.
tar.bz2
613 mv wxPython
-$VERSION/* .
614 rm -rf wxPython
-$VERSION
615 rm -f demo
/b demo
/.setup.sh
616 mv demo
/demo.py demo
/demo.pyw
619 # Make an app bundle to run the demo
620 $PYTHONW $PROGDIR/..
/buildapp.py \
621 --builddir=$DMGAPPS \
622 --name="wxPython Demo" \
623 --mainprogram=$DMGAPPS/Samples
/demo
/demo.pyw \
624 --iconfile=$PROGDIR/RunDemo.icns \
626 cp -pR $DMGAPPS/Samples
/demo
/* "$DMGAPPS/wxPython Demo.app/Contents/Resources"
630 # Make an app bundle to launch PyCrust
631 $PYTHONW $PROGDIR/..
/buildapp.py \
632 --builddir=$DMGAPPS \
634 --mainprogram=$INSTALLROOT$BINPREFIX/pycrust.py \
635 --iconfile=$PROGDIR/PieShell.icns \
638 ## TODO: PyAlaMode needs tweaked to be able to run from a bundle. It
639 ## needs to know to ignore command line parameters and etc...
641 # $PYTHONW $PROGDIR/../buildapp.py \
642 # --builddir=$DMGAPPS \
644 # --mainprogram=$INSTALLROOT$BINPREFIX/pyalamode.py \
645 # --iconfile=$PROGDIR/PieShell.icns \
648 # Make an app to launch XRCed
649 $PYTHONW $PROGDIR/..
/buildapp.py \
650 --builddir=$DMGAPPS \
652 --mainprogram=$INSTALLROOT$BINPREFIX/xrced.py \
653 --iconfile=$PROGDIR/XRCed.icns \
658 # and then finally make a disk image containing everything
659 dmgname
=wxPython
${SHORTVER}-osx-docs-demos-$VERSION-$TAG-py$PYVER
660 $PROGDIR/..
/makedmg
$DMGAPPS $DMGDIR $dmgname
662 echo Moving
$DMGDIR/$dmgname.dmg to
$DESTDIR
663 mv $DMGDIR/$dmgname.dmg
$DESTDIR/$dmgname.dmg
667 # Cleanup build/install dirs
668 if [ $skipclean != yes ]; then
669 echo "Cleaning up..."
672 echo "Cleanup is disabled. You should remove $TMPDIR when finished"