]> git.saurik.com Git - wxWidgets.git/blob - wxPython/distrib/mac/wxPythonOSX/build
Don't uninstall common files if there is more than one wxPython installed
[wxWidgets.git] / wxPython / distrib / mac / wxPythonOSX / build
1 #!/bin/sh -e
2 #----------------------------------------------------------------------
3 # Build wxMac and wxPythonOSX from the tarball and then make an
4 # Installer package out of it.
5
6 spectemplate=distrib/wxPythonFull.spec.in
7
8 if [ ! -d wxPython -o ! -e ${spectemplate} ]; then
9 echo "Please run this script from the root wxPython directory."
10 exit 1
11 fi
12
13 if [ "$UID" != "0" ]; then
14 echo "-------------------------------------------------------"
15 echo " WARNING: will be unable to change ownership of files"
16 echo " unless this script is run as root or via sudo"
17 echo "-------------------------------------------------------"
18 fi
19
20 #----------------------------------------------------------------------
21 # Check Parameters
22
23 function usage {
24 echo ""
25 echo "Usage: $0 [panther|jaguar] [command flags...]"
26 echo ""
27 echo " panther Build for Apple's python in /usr/bin, such as on Panther"
28 echo " jaguar Build for a python in /usr/local/bin, such as on Jaguar"
29 echo ""
30 echo "optional command flags:"
31 echo " skiptar Don't unpack the tarball"
32 echo " inplace Don't use the tarball, build from the CVS tree instead"
33 echo " (The Docs and Demo tarballs are still required for a full build.)"
34 echo " unicode Make a unicode build"
35 echo " skipconfig Don't run configure"
36 echo " skipbuild Don't build wxWidgets or wxPython"
37 echo " skipinstall Don't do the installation step"
38 echo " skipdmg Don't make the package or diskimage"
39 echo " skipclean Don't do the cleanup at the end"
40 echo ""
41 }
42
43
44 if [ $# -lt 1 ]; then
45 usage
46 exit 1
47 fi
48
49 KIND=$1
50 case $KIND in
51 panther) PYTHON=/usr/bin/python ;;
52 jaguar) PYTHON=/usr/local/bin/python ;;
53 *) usage; exit 1 ;;
54 esac
55 PYTHONW=${PYTHON}w
56 shift
57
58 skiptar=no
59 skipconfig=no
60 skipbuild=no
61 skipinstall=no
62 skipdmg=no
63 skipclean=no
64 inplace=no
65 unicode=no
66
67 for flag in $*; do
68 case ${flag} in
69 skiptar) skiptar=yes ;;
70 skipconfig) skipconfig=yes; skiptar=yes ;;
71 skipbuild) skipbuild=yes; skipconfig=yes; skiptar=yes ;;
72 skipinstall) skipinstall=yes ;;
73 skipdmg) skipdmg=yes ;;
74 skipclean) skipclean=yes ;;
75 inplace) inplace=yes; skiptar=yes ;;
76 unicode) unicode=yes ;;
77
78 *) echo "Unknown flag \"${flag}\""
79 usage
80 exit 1
81 esac
82 done
83
84
85 VERSION=`$PYTHON -c "import setup;print setup.VERSION"`
86 PYVER=`$PYTHON -c "import sys; print sys.version[:3]"`
87 PYPREFIX=`$PYTHON -c "import sys; print sys.exec_prefix"`
88 PYLIB=$PYPREFIX/lib/python$PYVER
89 SITEPACKAGES=$PYLIB/site-packages
90 SHORTVER=`echo $VERSION | cut -c 1,2,3`
91
92 if [ $unicode == yes ]; then
93 CHARTYPE=unicode
94 UNICODEOPT=--enable-unicode
95 PYUNICODEOPT=1
96 else
97 CHARTYPE=ansi
98 UNICODEOPT=--disable-unicode
99 PYUNICODEOPT=0
100 fi
101
102
103 if [ -z "$TARBALLDIR" ]; then
104 # this is a spot on my fileserver where the tarballs go, adjust
105 # as needed for where you put the wxPython tarball, or set
106 # TARBALLDIR before invoking this script...
107 TARBALLDIR=/stuff/Development/wxPython/dist/$VERSION
108 fi
109 TARBALL=$TARBALLDIR/wxPython-src-$VERSION.tar.gz
110
111 if [ ! -e $TARBALLDIR/wxPython-demo-$VERSION.tar.gz ]; then
112 echo "-------------------------------------------------------"
113 echo " WARNING: Demo tarball not found, will skip building "
114 echo " the Demo app bundle and etc."
115 echo " $TARBALLDIR/wxPython-demo-$VERSION.tar.gz"
116 echo "-------------------------------------------------------"
117 fi
118
119 if [ ! -e $TARBALLDIR/wxPython-docs-$VERSION.tar.gz ]; then
120 echo "-------------------------------------------------------"
121 echo " WARNING: Docs tarball not found, will skip building "
122 echo " the the wxDocsViewer app bundle and etc."
123 echo " $TARBALLDIR/wxPython-docs-$VERSION.tar.gz"
124 echo "-------------------------------------------------------"
125 fi
126
127
128
129
130 PREFIX=/usr/local/lib/wxPython-$CHARTYPE-$VERSION
131 BINPREFIX=/usr/local/bin
132
133 WXROOT=`dirname $PWD`
134 PROGDIR="`dirname \"$0\"`"
135 TMPDIR=$PWD/_build_dmg
136
137 BUILDROOT=$TMPDIR/build
138
139 INSTALLROOT=$TMPDIR/install-root
140 INSTALLCOMMON=$TMPDIR/install-common
141 INSTALLAPPS=$TMPDIR/install-apps
142
143 DMGDIR=$TMPDIR/dmg
144 DMGROOT=$DMGDIR/root
145 DMGAPPS=$DMGDIR/apps
146
147 RESOURCEDIR=$PROGDIR/resources
148 DESTDIR=$PWD/dist
149 SRCROOT=$BUILDROOT/wxPython-src-$VERSION
150
151
152 #----------------------------------------------------------------------
153 # Setup builddirs
154
155 mkdir -p $BUILDROOT
156 mkdir -p $INSTALLROOT
157 mkdir -p $INSTALLCOMMON
158 mkdir -p $INSTALLAPPS
159
160 rm -rf $DMGDIR
161 mkdir -p $DMGROOT
162 mkdir -p $DMGAPPS/Docs
163 mkdir -p $DMGAPPS/Samples
164
165
166 pushd $BUILDROOT
167
168
169 #----------------------------------------------------------------------
170 # Unpack the tarball
171
172 if [ $skiptar != yes ]; then
173 echo Unarchiving tarball...
174 tar xzf $TARBALL
175 fi
176
177 if [ $inplace = no ]; then
178 # make a build dir and cd to it.
179 cd wxPython-src-$VERSION
180 WXDIR=`pwd`
181 mkdir -p $WXDIR/bld
182 cd $WXDIR/bld
183 WXBLD=$WXDIR/bld
184 else
185 # If building "inplace" then our build dir will be BUILDROOT,
186 # adjust the variables to find things that way.
187 WXDIR=$WXROOT
188 SRCROOT=$WXROOT
189 WXBLD=$BUILDROOT
190 fi
191
192 echo "Using source tree: $WXDIR"
193 echo "Using build dir: $WXBLD"
194
195 #----------------------------------------------------------------------
196
197
198 # Configure wxWidgets
199 if [ $skipconfig != yes ]; then
200 $WXDIR/configure \
201 --prefix=$PREFIX \
202 --with-mac \
203 --enable-monolithic \
204 --with-opengl \
205 --enable-sound \
206 --enable-display \
207 --enable-geometry \
208 --enable-debug_flag \
209 --enable-precomp=no \
210 --enable-optimise \
211 $UNICODEOPT
212
213
214 fi
215
216 # Build wxWidgets and wxPython
217 if [ $skipbuild != yes ]; then
218
219 # Make wxWidgets and some contribs
220
221 # For some reason Rez and DeRez have started locking up if run as
222 # root, figure out why, but in the meantime...
223 if [ "$UID" = "0" ]; then
224 chmod a+w lib
225 if [ "$CHARTYPE" = "ansi" ]; then
226 su robind -c "make lib/libwx_macd-2.5.3.r"
227 else
228 su robind -c "make lib/libwx_macud-2.5.3.r"
229 fi
230 fi
231
232 make
233 make -C contrib/src/gizmos
234 make -C contrib/src/ogl CXXFLAGS="-DwxUSE_DEPRECATED=0"
235 make -C contrib/src/stc
236
237 # Build wxPython
238 cd $WXDIR/wxPython
239 $PYTHON setup.py \
240 UNICODE=$PYUNICODEOPT \
241 NO_SCRIPTS=1 \
242 EP_ADD_OPTS=1 \
243 WX_CONFIG="$WXBLD/wx-config --inplace" \
244 BUILD_BASE=$WXBLD/wxPython \
245 build
246 fi
247
248 #----------------------------------------------------------------------
249
250 if [ $skipinstall != yes ]; then
251 # Install wxWidgets
252 cd $WXBLD
253 make prefix=$INSTALLROOT$PREFIX install
254 make -C contrib/src/gizmos prefix=$INSTALLROOT$PREFIX install
255 make -C contrib/src/ogl CXXFLAGS="-DwxUSE_DEPRECATED=0" prefix=$INSTALLROOT/$PREFIX install
256 make -C contrib/src/stc prefix=$INSTALLROOT$PREFIX install
257
258
259 # relink wx-config with a relative link
260 cd $INSTALLROOT$PREFIX/bin
261 rm wx-config
262 ln -s ../lib/wx/config/* wx-config
263
264 # and wxPython
265 cd $WXDIR/wxPython
266 $PYTHON setup.py \
267 UNICODE=$PYUNICODEOPT \
268 NO_SCRIPTS=1 \
269 EP_ADD_OPTS=1 \
270 WX_CONFIG="$INSTALLROOT/$PREFIX/bin/wx-config --prefix=$INSTALLROOT/$PREFIX" \
271 BUILD_BASE=$WXBLD/wxPython \
272 install \
273 --root=$INSTALLROOT
274
275
276 # Apple's Python (on Panther) sym-links the site-packages dir to
277 # /Library/Python/$PYVER so we need to move the files so they are
278 # installed in the physical location, not the virtual one.
279 if [ "$KIND" = "panther" ]; then
280 if [ -e $INSTALLROOT/Library/Python/$PYVER ]; then
281 rm -r $INSTALLROOT/Library/Python/$PYVER
282 fi
283 mkdir -p $INSTALLROOT/Library/Python/$PYVER
284 mv $INSTALLROOT/$SITEPACKAGES/* $INSTALLROOT/Library/Python/$PYVER
285 rm -r $INSTALLROOT/System
286 SITEPACKAGES=/Library/Python/$PYVER
287 fi
288
289 # move the common files to $INSTALLCOMMON
290 mkdir -p $INSTALLCOMMON$SITEPACKAGES
291 mv $INSTALLROOT$SITEPACKAGES/wx.pth $INSTALLCOMMON$SITEPACKAGES
292 mv $INSTALLROOT$SITEPACKAGES/wxversion.py $INSTALLCOMMON$SITEPACKAGES
293
294 # install wxPython's tool scripts in COMMON too
295 mkdir -p $INSTALLCOMMON$BINPREFIX
296 cd $WXDIR/wxPython/scripts
297 python$PYVER CreateMacScripts.py $INSTALLCOMMON $BINPREFIX
298
299
300 # Remove the .pyc/.pyo files they just take up space and can be recreated
301 # during the install.
302 pushd $WXDIR/wxPython
303 $PYTHON $PROGDIR/../zappycfiles.py $INSTALLROOT > /dev/null
304 popd
305
306 # Set premissions for files in $INSTALLROOT and $INSTALLCOMMON
307 if [ "$UID" = "0" ]; then
308 chown -R root:admin $INSTALLROOT $INSTALLCOMMON
309 chmod -R g+w $INSTALLROOT $INSTALLCOMMON
310 fi
311 fi
312
313 if [ "$KIND" = "panther" ]; then
314 SITEPACKAGES=/Library/Python/$PYVER
315 fi
316 PKGDIR=`cat $INSTALLCOMMON$SITEPACKAGES/wx.pth`
317
318 popd
319
320 #----------------------------------------------------------------------
321
322 # Make the Installer packages and disk image
323 if [ $skipdmg != yes ]; then
324
325 #-----------------------------------------------
326 # The main runtime installer package
327
328 # Make the welcome message
329 case $KIND in
330 panther) W_MSG="the Panther (OS X 10.3.x) version of" ;;
331 jaguar) W_MSG="the Jaguar (OS X 10.2.x) version of" ;;
332 esac
333
334
335 cat > $RESOURCEDIR/Welcome.txt <<EOF
336 Welcome!
337
338 This Installer package will install the wxPython $CHARTYPE runtime $VERSION for $W_MSG MacPython-OSX $PYVER. This includes:
339
340 * The wxPython packages and modules
341 * The wxWidgets shared libraries and headers
342
343 You must install onto your current boot disk, eventhough the installer does not enforce this, otherwise things will not work.
344
345 You can install more than one version of the wxPython runtime if you desire. You also need to install one instance of the wxPython-common package, which will determine which of the installed runtimes will be the default.
346
347 Build date: `date`
348 EOF
349
350 # make the preflight script
351 cat > $RESOURCEDIR/preflight <<EOF
352 #!/bin/sh
353 # Cleanup any old install of the wxPython package
354 rm -rf \$2$SITEPACKAGES/wxPython
355 rm -rf \$2$SITEPACKAGES/wx
356 rm -rf \$2$SITEPACKAGES/$PKGDIR
357 exit 0
358 EOF
359 chmod +x $RESOURCEDIR/preflight
360
361 # make the postflight script
362 cat > $RESOURCEDIR/postflight <<EOF
363 #!/bin/sh -e
364 # Compile the .py files in the wxPython pacakge
365 $PYTHON \$2$PYLIB/compileall.py \$2$SITEPACKAGES/$PKGDIR
366 $PYTHON -O \$2$PYLIB/compileall.py \$2$SITEPACKAGES/$PKGDIR
367
368 # and all of the wxPython pacakge should be group writable
369 chgrp -R admin \$2$SITEPACKAGES/$PKGDIR
370 chmod -R g+w \$2$SITEPACKAGES/$PKGDIR
371
372 exit 0
373 EOF
374 chmod +x $RESOURCEDIR/postflight
375
376
377
378 # Build the main Installer Package...
379 rm -rf wxPython${SHORTVER}-osx-$CHARTYPE-$KIND.pkg
380 python $PROGDIR/../buildpkg.py \
381 --Title=wxPython${SHORTVER}-osx-$CHARTYPE-$KIND \
382 --Version=$VERSION \
383 --Description="wxPython $CHARTYPE runtime $VERSION for $W_MSG MacPython-OSX $PYVER" \
384 --NeedsAuthorization="YES" \
385 --Relocatable="NO" \
386 --InstallOnly="YES" \
387 $INSTALLROOT \
388 $RESOURCEDIR
389
390 mv wxPython${SHORTVER}-osx-$CHARTYPE-$KIND.pkg $DMGROOT
391
392 rm $RESOURCEDIR/postflight
393 rm $RESOURCEDIR/preflight
394 rm $RESOURCEDIR/Welcome.txt
395
396
397 #-----------------------------------------------
398 # The common files package
399
400 # Make the welcome message
401 cat > $RESOURCEDIR/Welcome.txt <<EOF
402 Welcome!
403
404 This package contains the common files that are shared between versions of the wxPython runtime. This includes some command line scripts installed to /usr/local/bin as well as a Python .pth file for site-packages that will determine which version of the installed runtimes is the default version.
405
406 EOF
407
408 # Build the common Installer Package...
409 rm -rf wxPython-common-osx-$KIND.pkg
410 python $PROGDIR/../buildpkg.py \
411 --Title=wxPython-common-osx-$KIND \
412 --Version=$VERSION \
413 --Description="Common files for the wxPython runtime ($CHARTYPE-$VERSION)" \
414 --NeedsAuthorization="YES" \
415 --Relocatable="NO" \
416 --InstallOnly="YES" \
417 $INSTALLCOMMON \
418 $RESOURCEDIR
419
420 mv wxPython-common-osx-$KIND.pkg $DMGROOT
421
422 rm $RESOURCEDIR/Welcome.txt
423
424
425
426 #-----------------------------------------------
427 # Make a README to go on the disk image
428 cat > "$DMGROOT/README 1st.txt" <<EOF
429 Welcome to wxPython!
430
431 This disk image contains the following items:
432
433 wxPython${SHORTVER}-osx-$CHARTYPE-$VERSION-$KIND
434
435 This is the main component of the wxPython runtime. It
436 includes the Python modules and extension modules, as well as
437 the wxWidgets libraries. It is possible to have more than one
438 version of the runtime installed at once if you wish, See
439 http://wkik.wxpython.org/index.cgi/MultiVersionInstalls
440 for details on how to choose which version is installed.
441
442
443 wxPython-common-osx-$CHARTYPE-$VERSION-$KIND
444
445 This is the common files for the runtime that are shared
446 between all versions of the runtime. You need to have one of
447 these installed and it will determine which of the runtimes is
448 the default one that is imported with "import wx", so it
449 should match the version and character type of one of the
450 installed runtimes. If you are wanting to have only one
451 wxPython installed then be sure to install both of the
452 packages in this disk image.
453
454 uninstall_wxPython.py
455
456 A simple tool to help you manage your installed versions of
457 wxPython. It will allow you to choose from the currently
458 installed wxPython packages and to select one for
459 uninstallation. It is a text-mode tool so you can either run
460 it from a Terminal command line, or you can open it with
461 PythonLauncher and let it create a Terminal to run it in.
462
463 EOF
464
465
466
467 cp $PROGDIR/../uninstall_wxPython.py $DMGROOT
468
469
470 #-----------------------------------------------
471 # Make a disk image to hold these files
472 dmgname=wxPython${SHORTVER}-osx-$CHARTYPE-$VERSION-$KIND-py$PYVER
473 $PROGDIR/../makedmg $DMGROOT $DMGDIR $dmgname
474
475 echo Moving $DMGDIR/$dmgname.dmg to $DESTDIR
476 mv $DMGDIR/$dmgname.dmg $DESTDIR
477
478
479 #---------------------------------------------------------------------------
480 # Now create app bundles for the demo, docs, and tools and make another
481 # disk image to hold it all.
482 #---------------------------------------------------------------------------
483
484 cat > "$DMGAPPS/README 1st.txt" <<EOF
485 Welcome to wxPython!
486
487 On this disk image you will find Demo, Tools, Docs, and etc. for
488 wxPython $VERSION. Everything here is optional and you can drag them
489 out of the disk image and drop them wherever you want. You will need
490 to have an installed wxPython runtime to be able to use any of them.
491
492
493 wxPython Demo An application bundle version of the demo.
494 (This has it's own copy of the demo sources
495 within the bundle.)
496
497 XRCed An application for editing wxPython resource
498 files (XRC files.)
499
500 PyCrust An application that provides an interactive
501 Python shell and also namespace inspectors.
502
503
504
505 Docs/wxDocsViewer An application that allows you to view the
506 wxWidgets documentation.
507
508 Docs/licence License files.
509
510 Docs/other A few readmes, change log, etc.
511
512
513 Samples/samples Several small sample applications that
514 demonstrate how to use wxPython.
515
516 Samples/demo A copy of the wxPython demo source code,
517 just open the folder and run demo.pyw.
518
519 Happy Hacking!
520 EOF
521
522 # PyAlaMode An extension of PyCrust that includes source
523 # file editing capabilities.
524
525
526 # wxDocs
527 if [ ! -e $TARBALLDIR/wxPython-docs-$VERSION.tar.gz ]; then
528 cat > "$DMGAPPS/Docs/Build ERROR.txt" <<EOF
529
530 The wxPython-docs tarball was not found when building this disk image!
531
532 EOF
533
534 else
535 pushd $BUILDROOT
536 tar xzvf $TARBALLDIR/wxPython-docs-$VERSION.tar.gz
537 popd
538
539 # Make an app to launch viewdocs.py
540 $PYTHONW $PROGDIR/../buildapp.py \
541 --builddir=$DMGAPPS/Docs \
542 --name=wxDocsViewer \
543 --mainprogram=$BUILDROOT/wxPython-$VERSION/docs/viewdocs.py \
544 --iconfile=$PROGDIR/Info.icns \
545 build
546
547 cp $BUILDROOT/wxPython-$VERSION/docs/*.zip $DMGAPPS/Docs/wxDocsViewer.app/Contents/Resources
548
549 cat > "$DMGAPPS/Docs/README 1st.txt" <<EOF
550
551 The wxDocsViewer application needs to be copied to your Desktop (or
552 someplace else you have write access to) before you can run it, so it
553 can cache some indexes within its bundle.
554
555 EOF
556
557 fi
558
559 # license files, docs, etc.
560 pushd $DMGAPPS/Docs
561 cp -pR $SRCROOT/wxPython/licence .
562 cp -pR $SRCROOT/wxPython/docs .
563 rm -rf docs/bin
564 rm -rf docs/xml-raw
565 mv docs other
566 popd
567
568
569 if [ ! -e $TARBALLDIR/wxPython-demo-$VERSION.tar.gz ]; then
570 cat > "$DMGAPPS/Samples/Build ERROR.txt" <<EOF
571
572 The wxPython-demo tarball was not found when building this disk image!
573
574 EOF
575 cp "$DMGAPPS/Samples/Build ERROR.txt" $DMGAPPS
576
577 else
578
579 # Copy the demo and samples to the disk image from the tarball
580 pushd $DMGAPPS/Samples
581 tar xzvf $TARBALLDIR/wxPython-demo-$VERSION.tar.gz
582 mv wxPython-$VERSION/* .
583 rm -rf wxPython-$VERSION
584 rm demo/b demo/.setup.sh
585 mv demo/demo.py demo/demo.pyw
586 popd
587
588 # Make an app bundle to run the demo
589 $PYTHONW $PROGDIR/../buildapp.py \
590 --builddir=$DMGAPPS \
591 --name="wxPython Demo" \
592 --mainprogram=$DMGAPPS/Samples/demo/demo.pyw \
593 --iconfile=$PROGDIR/RunDemo.icns \
594 build
595 cp -pR $DMGAPPS/Samples/demo/* "$DMGAPPS/wxPython Demo.app/Contents/Resources"
596 fi
597
598
599 # Make an app bundle to launch PyCrust
600 $PYTHONW $PROGDIR/../buildapp.py \
601 --builddir=$DMGAPPS \
602 --name=PyCrust \
603 --mainprogram=$INSTALLCOMMON$BINPREFIX/pycrust.py \
604 --iconfile=$PROGDIR/PieShell.icns \
605 build
606
607 # # and PyAlaMode
608 # $PYTHONW $PROGDIR/../buildapp.py \
609 # --builddir=$DMGAPPS \
610 # --name=PyAlaMode \
611 # --mainprogram=$INSTALLCOMMON$BINPREFIX/pyalamode.py \
612 # --iconfile=$PROGDIR/PieShell.icns \
613 # build
614
615 # Make an app to launch XRCed
616 $PYTHONW $PROGDIR/../buildapp.py \
617 --builddir=$DMGAPPS \
618 --name=XRCed \
619 --mainprogram=$INSTALLCOMMON$BINPREFIX/xrced.py \
620 --iconfile=$PROGDIR/XRCed.icns \
621 build
622
623
624
625 # and then finally make a disk image containing everything
626 dmgname=wxPython${SHORTVER}-osx-docs-demos-$VERSION
627 $PROGDIR/../makedmg $DMGAPPS $DMGDIR $dmgname
628
629 echo Moving $DMGDIR/$dmgname.dmg to $DESTDIR
630 mv $DMGDIR/$dmgname.dmg $DESTDIR
631 fi
632
633
634 # Cleanup build/install dirs
635 if [ $skipclean != yes ]; then
636 echo "Cleaning up..."
637 rm -rf $TMPDIR
638 else
639 echo "Cleanup is disabled. You should remove $TMPDIR when finished"
640 fi
641