annotate Demo/scripts/freeze.py @ 4566:6403c94de50d legacy-trunk

Added safeguard against failure in __del__.
author Guido van Rossum <guido@python.org>
date Wed, 27 Nov 1996 19:39:58 +0000
parents b454dc9247b0
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1506
ef082c1072a7 remove references to /ufs/guido/bin/sgi/python
Guido van Rossum <guido@python.org>
parents: 1503
diff changeset
1 #! /usr/local/bin/python
1265
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3 # Given a Python script, create a binary that runs the script.
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
4 # The binary is 100% independent of Python libraries and binaries.
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
5 # It will not contain any Python source code -- only "compiled" Python
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
6 # (as initialized static variables containing marshalled code objects).
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
7 # It even does the right thing for dynamically loaded modules!
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
8 # The module search path of the binary is set to the current directory.
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
9 #
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
10 # Some problems remain:
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
11 # - It's highly non-portable, since it knows about paths and libraries
1301
39c766a6ed5f Small imporvements, added mpz and md5 to list of modules,
Guido van Rossum <guido@python.org>
parents: 1265
diff changeset
12 # (there's a customization section though, and it knows how to
39c766a6ed5f Small imporvements, added mpz and md5 to list of modules,
Guido van Rossum <guido@python.org>
parents: 1265
diff changeset
13 # distinguish an SGI from a Sun SPARC system -- adding knowledge
39c766a6ed5f Small imporvements, added mpz and md5 to list of modules,
Guido van Rossum <guido@python.org>
parents: 1265
diff changeset
14 # about more systems is left as an exercise for the reader).
1265
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
15 # - You need to have the Python source tree lying around as well as
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
16 # the "libpython.a" used to generate the Python binary.
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
17 # - For scripts that use many modules it generates absurdly large
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
18 # files (frozen.c and config.o as well as the final binary),
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
19 # and is consequently rather slow.
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
20 #
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
21 # Caveats:
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
22 # - The search for modules sometimes finds modules that are never
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
23 # actually imported since the code importing them is never executed.
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
24 # - If an imported module isn't found, you get a warning but the
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
25 # process of freezing continues. The binary will fail if it
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
26 # actually tries to import one of these modules.
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
27 # - This often happens with the module 'mac', which module 'os' tries
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
28 # to import (to determine whether it is running on a Macintosh).
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
29 # You can ignore the warning about this.
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
30 # - If the program dynamically reads or generates Python code and
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
31 # executes it, this code may reference built-in or library modules
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
32 # that aren't present in the frozen binary, and this will fail.
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
33 # - Your program may be using external data files, e.g. compiled
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
34 # forms definitions (*.fd). These aren't incorporated. Since
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
35 # sys.path in the resulting binary only contains '.', if your
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
36 # program searches its data files along sys.path (as the 'flp'
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
37 # modules does to find its forms definitions), you may need to
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
38 # change the program to extend the search path or instruct its users
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
39 # to set the environment variable PYTHONPATH to point to your data
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
40 # files.
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
41 #
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
42 # Usage hints:
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
43 # - If you have a bunch of scripts that you want to freeze, instead
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
44 # of freezing each of them separately, you might consider writing
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
45 # a tiny main script that looks at sys.argv[0] and then imports
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
46 # the corresponding module. You can then make links to the
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
47 # frozen binary named after the various scripts you support.
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
48 # Pass the additional scripts as arguments after the main script.
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
49 # A minimal script to do this is the following.
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
50 # import sys, posixpath
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
51 # exec('import ' + posixpath.basename(sys.argv[0]) + '\n')
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
52
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
53
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
54 import os
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
55 import sys
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
56 import regex
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
57 import getopt
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
58 import regsub
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
59 import string
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
60 import marshal
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
61
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
62 # Function to join two pathnames with a slash in between
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
63 j = os.path.join
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
64
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
65 ##################################
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
66 # START OF CONFIGURATION SECTION #
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
67 ##################################
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
68
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
69 # Attempt to guess machine architecture
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
70 if os.path.exists('/usr/lib/libgl_s'): ARCH = 'sgi'
1587
b454dc9247b0 Jaap V's changes plus a few of my own -- now it seems to work.
Guido van Rossum <guido@python.org>
parents: 1506
diff changeset
71 elif os.path.exists('/etc/issue'): ARCH = 'sequent'
1265
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
72 else: ARCH = 'sun4'
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
73
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
74 # Site parametrizations (change to match your site)
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
75 CC = 'cc' # C compiler
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
76 TOP = '/ufs/guido/src' # Parent of all source trees
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
77 PYTHON = j(TOP, 'python') # Top of the Python source tree
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
78 SRC = j(PYTHON, 'src') # Python source directory
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
79 BLD = j(PYTHON, 'build.' + ARCH) # Python build directory
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
80 #BLD = SRC # Use this if you build in SRC
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
81
1587
b454dc9247b0 Jaap V's changes plus a few of my own -- now it seems to work.
Guido van Rossum <guido@python.org>
parents: 1506
diff changeset
82 LIBINST = '/ufs/guido/src/python/irix4/tmp/lib/python/lib' # installed libraries
b454dc9247b0 Jaap V's changes plus a few of my own -- now it seems to work.
Guido van Rossum <guido@python.org>
parents: 1506
diff changeset
83 INCLINST = '/ufs/guido/src/python/irix4/tmp/include/Py' # installed include files
b454dc9247b0 Jaap V's changes plus a few of my own -- now it seems to work.
Guido van Rossum <guido@python.org>
parents: 1506
diff changeset
84
1265
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
85 # Other packages (change to match your site)
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
86 DL = j(TOP, 'dl') # Top of the dl source tree
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
87 DL_DLD = j(TOP, 'dl-dld') # The dl-dld source directory
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
88 DLD = j(TOP, 'dld-3.2.3') # The dld source directory
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
89 FORMS = j(TOP, 'forms') # Top of the FORMS source tree
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
90 STDWIN = j(TOP, 'stdwin') # Top of the STDWIN source tree
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
91 READLINE = j(TOP, 'readline.' + ARCH) # Top of the GNU Readline source tree
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
92 SUN_X11 = '/usr/local/X11R5/lib/libX11.a'
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
93
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
94 # File names (usually no need to change)
1587
b454dc9247b0 Jaap V's changes plus a few of my own -- now it seems to work.
Guido van Rossum <guido@python.org>
parents: 1506
diff changeset
95 LIBP = [ # Main Python libraries
b454dc9247b0 Jaap V's changes plus a few of my own -- now it seems to work.
Guido van Rossum <guido@python.org>
parents: 1506
diff changeset
96 j(LIBINST, 'libPython.a'),
b454dc9247b0 Jaap V's changes plus a few of my own -- now it seems to work.
Guido van Rossum <guido@python.org>
parents: 1506
diff changeset
97 j(LIBINST, 'libParser.a'),
b454dc9247b0 Jaap V's changes plus a few of my own -- now it seems to work.
Guido van Rossum <guido@python.org>
parents: 1506
diff changeset
98 j(LIBINST, 'libObjects.a'),
b454dc9247b0 Jaap V's changes plus a few of my own -- now it seems to work.
Guido van Rossum <guido@python.org>
parents: 1506
diff changeset
99 j(LIBINST, 'libModules.a')
b454dc9247b0 Jaap V's changes plus a few of my own -- now it seems to work.
Guido van Rossum <guido@python.org>
parents: 1506
diff changeset
100 ]
b454dc9247b0 Jaap V's changes plus a few of my own -- now it seems to work.
Guido van Rossum <guido@python.org>
parents: 1506
diff changeset
101 CONFIG_IN = j(LIBINST, 'config.c.in') # Configuration source file
b454dc9247b0 Jaap V's changes plus a few of my own -- now it seems to work.
Guido van Rossum <guido@python.org>
parents: 1506
diff changeset
102 FMAIN = j(LIBINST, 'frozenmain.c') # Special main source file
1265
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
103
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
104 # Libraries needed when linking. First tuple item is built-in module
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
105 # for which it is needed (or '*' for always), rest are ld arguments.
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
106 # There is a separate list per architecture.
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
107 libdeps_sgi = [ \
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
108 ('stdwin', j(STDWIN, 'Build/' + ARCH + '/x11/lib/lib.a')), \
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
109 ('fl', j(FORMS, 'FORMS/libforms.a'), '-lfm_s'), \
1301
39c766a6ed5f Small imporvements, added mpz and md5 to list of modules,
Guido van Rossum <guido@python.org>
parents: 1265
diff changeset
110 ('*', j(READLINE, 'libreadline.a'), '-ltermcap'), \
1265
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
111 ('al', '-laudio'), \
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
112 ('sv', '-lsvideo', '-lXext'), \
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
113 ('cd', '-lcdaudio', '-lds'), \
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
114 ('cl', '-lcl'), \
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
115 ('imgfile', '-limage', '-lgutil', '-lm'), \
1587
b454dc9247b0 Jaap V's changes plus a few of my own -- now it seems to work.
Guido van Rossum <guido@python.org>
parents: 1506
diff changeset
116 ('mpz', '/ufs/guido/src/gmp/libgmp.a'), \
1301
39c766a6ed5f Small imporvements, added mpz and md5 to list of modules,
Guido van Rossum <guido@python.org>
parents: 1265
diff changeset
117 ('*', '-lsun'), \
1265
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
118 ('*', j(DL, 'libdl.a'), '-lmld'), \
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
119 ('*', '-lmpc'), \
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
120 ('fm', '-lfm_s'), \
1301
39c766a6ed5f Small imporvements, added mpz and md5 to list of modules,
Guido van Rossum <guido@python.org>
parents: 1265
diff changeset
121 ('gl', '-lgl_s', '-lX11_s'), \
39c766a6ed5f Small imporvements, added mpz and md5 to list of modules,
Guido van Rossum <guido@python.org>
parents: 1265
diff changeset
122 ('stdwin', '-lX11_s'), \
39c766a6ed5f Small imporvements, added mpz and md5 to list of modules,
Guido van Rossum <guido@python.org>
parents: 1265
diff changeset
123 ('*', '-lm'), \
1265
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
124 ('*', '-lc_s'), \
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
125 ]
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
126 libdeps_sun4 = [ \
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
127 ('*', '-Bstatic'), \
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
128 ('stdwin', j(STDWIN, 'Build/' + ARCH + '/x11/lib/lib.a')), \
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
129 ('*', j(READLINE, 'libreadline.a')), \
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
130 ('*', '-lm'), \
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
131 ('*', j(DL_DLD,'libdl.a'), j(DLD,'libdld.a')), \
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
132 ('*', SUN_X11), \
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
133 ('*', '-ltermcap'), \
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
134 ('*', '-lc'), \
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
135 ]
1587
b454dc9247b0 Jaap V's changes plus a few of my own -- now it seems to work.
Guido van Rossum <guido@python.org>
parents: 1506
diff changeset
136 libdeps_sequent = [ \
b454dc9247b0 Jaap V's changes plus a few of my own -- now it seems to work.
Guido van Rossum <guido@python.org>
parents: 1506
diff changeset
137 ('*', j(LIBINST, 'libreadline.a'), '-ltermcap'), \
b454dc9247b0 Jaap V's changes plus a few of my own -- now it seems to work.
Guido van Rossum <guido@python.org>
parents: 1506
diff changeset
138 ('*', '-lsocket'), \
b454dc9247b0 Jaap V's changes plus a few of my own -- now it seems to work.
Guido van Rossum <guido@python.org>
parents: 1506
diff changeset
139 ('*', '-linet'), \
b454dc9247b0 Jaap V's changes plus a few of my own -- now it seems to work.
Guido van Rossum <guido@python.org>
parents: 1506
diff changeset
140 ('*', '-lnsl'), \
b454dc9247b0 Jaap V's changes plus a few of my own -- now it seems to work.
Guido van Rossum <guido@python.org>
parents: 1506
diff changeset
141 ('*', '-lm'), \
b454dc9247b0 Jaap V's changes plus a few of my own -- now it seems to work.
Guido van Rossum <guido@python.org>
parents: 1506
diff changeset
142 ('*', '-lc'), \
b454dc9247b0 Jaap V's changes plus a few of my own -- now it seems to work.
Guido van Rossum <guido@python.org>
parents: 1506
diff changeset
143 ]
1265
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
144 libdeps = eval('libdeps_' + ARCH)
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
145
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
146 ################################
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
147 # END OF CONFIGURATION SECTION #
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
148 ################################
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
149
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
150 # Exception used when scanfile fails
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
151 NoSuchFile = 'NoSuchFile'
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
152
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
153 # Global options
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
154 quiet = 0 # -q
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
155 verbose = 0 # -v
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
156 noexec = 0 # -n
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
157 nowrite = 0 # -N
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
158 ofile = 'a.out' # -o file
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
159
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
160 # Main program -- argument parsing etc.
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
161 def main():
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
162 global quiet, verbose, noexec, nowrite, ofile
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
163 try:
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
164 opts, args = getopt.getopt(sys.argv[1:], 'nNo:qv')
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
165 except getopt.error, msg:
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
166 usage(str(msg))
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
167 sys.exit(2)
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
168 for o, a in opts:
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
169 if o == '-n': noexec = 1
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
170 if o == '-N': nowrite = 1
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
171 if o == '-o': ofile = a
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
172 if o == '-q': verbose = 0; quiet = 1
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
173 if o == '-v': verbose = verbose + 1; quiet = 0
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
174 if len(args) < 1:
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
175 usage('please pass at least one file argument')
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
176 sys.exit(2)
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
177 process(args[0], args[1:])
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
178
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
179 # Print usage message to stderr
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
180 def usage(*msgs):
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
181 sys.stdout = sys.stderr
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
182 for msg in msgs: print msg
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
183 print 'Usage: freeze [options] scriptfile [modulefile ...]'
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
184 print '-n : generate the files but don\'t compile and link'
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
185 print '-N : don\'t write frozen.c (do compile unless -n given)'
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
186 print '-o file : binary output file (default a.out)'
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
187 print '-q : quiet (no messages at all except errors)'
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
188 print '-v : verbose (lots of extra messages)'
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
189
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
190 # Process the script file
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
191 def process(filename, addmodules):
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
192 global noexec
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
193 #
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
194 if not quiet: print 'Computing needed modules ...'
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
195 todo = {}
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
196 todo['__main__'] = filename
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
197 for name in addmodules:
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
198 mod = os.path.basename(name)
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
199 if mod[-3:] == '.py': mod = mod[:-3]
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
200 todo[mod] = name
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
201 try:
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
202 dict = closure(todo)
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
203 except NoSuchFile, filename:
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
204 sys.stderr.write('Can\'t open file %s\n' % filename)
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
205 sys.exit(1)
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
206 #
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
207 mods = dict.keys()
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
208 mods.sort()
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
209 #
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
210 if verbose:
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
211 print '%-15s %s' % ('Module', 'Filename')
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
212 for mod in mods:
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
213 print '%-15s %s' % (`mod`, dict[mod])
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
214 #
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
215 if not quiet: print 'Looking for dynamically linked modules ...'
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
216 dlmodules = []
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
217 objs = []
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
218 libs = []
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
219 for mod in mods:
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
220 if dict[mod][-2:] == '.o':
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
221 if verbose: print 'Found', mod, dict[mod]
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
222 dlmodules.append(mod)
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
223 objs.append(dict[mod])
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
224 libsname = dict[mod][:-2] + '.libs'
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
225 try:
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
226 f = open(libsname, 'r')
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
227 except IOError:
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
228 f = None
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
229 if f:
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
230 libtext = f.read()
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
231 f.close()
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
232 for lib in string.split(libtext):
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
233 if lib in libs: libs.remove(lib)
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
234 libs.append(lib)
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
235 #
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
236 if not nowrite:
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
237 if not quiet: print 'Writing frozen.c ...'
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
238 writefrozen('frozen.c', dict)
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
239 else:
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
240 if not quiet: print 'NOT writing frozen.c ...'
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
241 #
1587
b454dc9247b0 Jaap V's changes plus a few of my own -- now it seems to work.
Guido van Rossum <guido@python.org>
parents: 1506
diff changeset
242 ## if not dlmodules:
b454dc9247b0 Jaap V's changes plus a few of my own -- now it seems to work.
Guido van Rossum <guido@python.org>
parents: 1506
diff changeset
243 if 0:
1265
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
244 config = CONFIG
1301
39c766a6ed5f Small imporvements, added mpz and md5 to list of modules,
Guido van Rossum <guido@python.org>
parents: 1265
diff changeset
245 if not quiet: print 'Using existing', config, '...'
1265
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
246 else:
1301
39c766a6ed5f Small imporvements, added mpz and md5 to list of modules,
Guido van Rossum <guido@python.org>
parents: 1265
diff changeset
247 config = 'tmpconfig.c'
1265
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
248 if nowrite:
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
249 if not quiet: print 'NOT writing config.c ...'
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
250 else:
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
251 if not quiet:
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
252 print 'Writing config.c with dl modules ...'
1587
b454dc9247b0 Jaap V's changes plus a few of my own -- now it seems to work.
Guido van Rossum <guido@python.org>
parents: 1506
diff changeset
253 f = open(CONFIG_IN, 'r')
1265
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
254 g = open(config, 'w')
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
255 m1 = regex.compile('-- ADDMODULE MARKER 1 --')
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
256 m2 = regex.compile('-- ADDMODULE MARKER 2 --')
1587
b454dc9247b0 Jaap V's changes plus a few of my own -- now it seems to work.
Guido van Rossum <guido@python.org>
parents: 1506
diff changeset
257 builtinmodules = []
b454dc9247b0 Jaap V's changes plus a few of my own -- now it seems to work.
Guido van Rossum <guido@python.org>
parents: 1506
diff changeset
258 stdmodules = ('sys', '__main__', '__builtin__',
b454dc9247b0 Jaap V's changes plus a few of my own -- now it seems to work.
Guido van Rossum <guido@python.org>
parents: 1506
diff changeset
259 'marshal')
b454dc9247b0 Jaap V's changes plus a few of my own -- now it seems to work.
Guido van Rossum <guido@python.org>
parents: 1506
diff changeset
260 todomodules = builtinmodules + dlmodules
b454dc9247b0 Jaap V's changes plus a few of my own -- now it seems to work.
Guido van Rossum <guido@python.org>
parents: 1506
diff changeset
261 for mod in dict.keys():
b454dc9247b0 Jaap V's changes plus a few of my own -- now it seems to work.
Guido van Rossum <guido@python.org>
parents: 1506
diff changeset
262 if dict[mod] == '<builtin>' and \
b454dc9247b0 Jaap V's changes plus a few of my own -- now it seems to work.
Guido van Rossum <guido@python.org>
parents: 1506
diff changeset
263 mod not in stdmodules:
b454dc9247b0 Jaap V's changes plus a few of my own -- now it seems to work.
Guido van Rossum <guido@python.org>
parents: 1506
diff changeset
264 builtinmodules.append(mod)
1265
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
265 while 1:
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
266 line = f.readline()
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
267 if not line: break
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
268 g.write(line)
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
269 if m1.search(line) >= 0:
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
270 if verbose: print 'Marker 1 ...'
1587
b454dc9247b0 Jaap V's changes plus a few of my own -- now it seems to work.
Guido van Rossum <guido@python.org>
parents: 1506
diff changeset
271 for mod in todomodules:
1265
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
272 g.write('extern void init' + \
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
273 mod + '();\n')
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
274 if m2.search(line) >= 0:
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
275 if verbose: print 'Marker 2 ...'
1587
b454dc9247b0 Jaap V's changes plus a few of my own -- now it seems to work.
Guido van Rossum <guido@python.org>
parents: 1506
diff changeset
276 for mod in todomodules:
1265
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
277 g.write('{"' + mod + \
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
278 '", init' + mod + '},\n')
1301
39c766a6ed5f Small imporvements, added mpz and md5 to list of modules,
Guido van Rossum <guido@python.org>
parents: 1265
diff changeset
279 g.close()
1265
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
280 #
1301
39c766a6ed5f Small imporvements, added mpz and md5 to list of modules,
Guido van Rossum <guido@python.org>
parents: 1265
diff changeset
281 if not quiet:
39c766a6ed5f Small imporvements, added mpz and md5 to list of modules,
Guido van Rossum <guido@python.org>
parents: 1265
diff changeset
282 if noexec: print 'Generating compilation commands ...'
39c766a6ed5f Small imporvements, added mpz and md5 to list of modules,
Guido van Rossum <guido@python.org>
parents: 1265
diff changeset
283 else: print 'Starting compilation ...'
1587
b454dc9247b0 Jaap V's changes plus a few of my own -- now it seems to work.
Guido van Rossum <guido@python.org>
parents: 1506
diff changeset
284 defs = ['-DNO_MAIN', '-DUSE_FROZEN', '-DPYTHONPATH=\'"."\'']
1265
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
285 #
1587
b454dc9247b0 Jaap V's changes plus a few of my own -- now it seems to work.
Guido van Rossum <guido@python.org>
parents: 1506
diff changeset
286 incs = ['-I.', '-I' + INCLINST]
1265
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
287 if dict.has_key('stdwin'):
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
288 incs.append('-I' + j(STDWIN, 'H'))
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
289 #
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
290 srcs = [config, FMAIN]
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
291 #
1587
b454dc9247b0 Jaap V's changes plus a few of my own -- now it seems to work.
Guido van Rossum <guido@python.org>
parents: 1506
diff changeset
292 if type(LIBP) == type(''):
b454dc9247b0 Jaap V's changes plus a few of my own -- now it seems to work.
Guido van Rossum <guido@python.org>
parents: 1506
diff changeset
293 libs.append(LIBP)
b454dc9247b0 Jaap V's changes plus a few of my own -- now it seems to work.
Guido van Rossum <guido@python.org>
parents: 1506
diff changeset
294 else:
b454dc9247b0 Jaap V's changes plus a few of my own -- now it seems to work.
Guido van Rossum <guido@python.org>
parents: 1506
diff changeset
295 for lib in LIBP:
b454dc9247b0 Jaap V's changes plus a few of my own -- now it seems to work.
Guido van Rossum <guido@python.org>
parents: 1506
diff changeset
296 libs.append(lib)
1265
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
297 for item in libdeps:
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
298 m = item[0]
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
299 if m == '*' or dict.has_key(m):
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
300 for l in item[1:]:
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
301 if l in libs: libs.remove(l)
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
302 libs.append(l)
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
303 #
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
304 sts = 0
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
305 #
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
306 cmd = CC + ' -c'
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
307 cmd = cmd + ' ' + string.join(defs)
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
308 cmd = cmd + ' ' + string.join(incs)
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
309 cmd = cmd + ' ' + string.join(srcs)
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
310 print cmd
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
311 #
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
312 if not noexec:
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
313 sts = os.system(cmd)
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
314 if sts:
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
315 print 'Exit status', sts, '-- turning on -n'
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
316 noexec = 1
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
317 #
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
318 for s in srcs:
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
319 s = os.path.basename(s)
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
320 if s[-2:] == '.c': s = s[:-2]
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
321 o = s + '.o'
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
322 objs.insert(0, o)
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
323 #
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
324 cmd = CC
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
325 cmd = cmd + ' ' + string.join(objs)
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
326 cmd = cmd + ' ' + string.join(libs)
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
327 cmd = cmd + ' -o ' + ofile
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
328 print cmd
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
329 #
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
330 if not noexec:
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
331 sts = os.system(cmd)
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
332 if sts:
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
333 print 'Exit status', sts
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
334 else:
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
335 print 'Done.'
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
336 #
1503
3664cb88a030 Minor output format change
Guido van Rossum <guido@python.org>
parents: 1301
diff changeset
337 if not quiet and not noexec and sts == 0:
3664cb88a030 Minor output format change
Guido van Rossum <guido@python.org>
parents: 1301
diff changeset
338 print 'Note: consider this:'; print '\tstrip', ofile
1265
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
339 #
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
340 sys.exit(sts)
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
341
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
342
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
343 # Generate code for a given module
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
344 def makecode(filename):
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
345 if filename[-2:] == '.o':
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
346 return None
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
347 try:
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
348 f = open(filename, 'r')
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
349 except IOError:
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
350 return None
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
351 if verbose: print 'Making code from', filename, '...'
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
352 text = f.read()
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
353 code = compile(text, filename, 'exec')
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
354 f.close()
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
355 return marshal.dumps(code)
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
356
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
357
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
358 # Write the C source file containing the frozen Python code
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
359 def writefrozen(filename, dict):
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
360 f = open(filename, 'w')
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
361 codelist = []
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
362 for mod in dict.keys():
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
363 codestring = makecode(dict[mod])
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
364 if codestring is not None:
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
365 codelist.append((mod, codestring))
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
366 write = sys.stdout.write
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
367 save_stdout = sys.stdout
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
368 try:
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
369 sys.stdout = f
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
370 for mod, codestring in codelist:
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
371 if verbose:
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
372 write('Writing initializer for %s\n'%mod)
1587
b454dc9247b0 Jaap V's changes plus a few of my own -- now it seems to work.
Guido van Rossum <guido@python.org>
parents: 1506
diff changeset
373 print 'static unsigned char M_' + mod + '[' + \
1265
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
374 str(len(codestring)) + '+1] = {'
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
375 for i in range(0, len(codestring), 16):
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
376 for c in codestring[i:i+16]:
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
377 print str(ord(c)) + ',',
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
378 print
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
379 print '};'
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
380 print 'struct frozen {'
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
381 print ' char *name;'
1587
b454dc9247b0 Jaap V's changes plus a few of my own -- now it seems to work.
Guido van Rossum <guido@python.org>
parents: 1506
diff changeset
382 print ' unsigned char *code;'
1265
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
383 print ' int size;'
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
384 print '} frozen_modules[] = {'
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
385 for mod, codestring in codelist:
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
386 print ' {"' + mod + '",',
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
387 print 'M_' + mod + ',',
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
388 print str(len(codestring)) + '},'
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
389 print ' {0, 0, 0} /* sentinel */'
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
390 print '};'
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
391 finally:
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
392 sys.stdout = save_stdout
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
393 f.close()
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
394
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
395
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
396 # Determine the names and filenames of the modules imported by the
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
397 # script, recursively. This is done by scanning for lines containing
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
398 # import statements. (The scanning has only superficial knowledge of
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
399 # Python syntax and no knowledge of semantics, so in theory the result
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
400 # may be incorrect -- however this is quite unlikely if you don't
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
401 # intentionally obscure your Python code.)
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
402
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
403 # Compute the closure of scanfile() -- special first file because of script
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
404 def closure(todo):
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
405 done = {}
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
406 while todo:
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
407 newtodo = {}
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
408 for modname in todo.keys():
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
409 if not done.has_key(modname):
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
410 filename = todo[modname]
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
411 if filename is None:
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
412 filename = findmodule(modname)
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
413 done[modname] = filename
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
414 if filename in ('<builtin>', '<unknown>'):
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
415 continue
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
416 modules = scanfile(filename)
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
417 for m in modules:
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
418 if not done.has_key(m):
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
419 newtodo[m] = None
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
420 todo = newtodo
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
421 return done
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
422
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
423 # Scan a file looking for import statements
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
424 importstr = '\(^\|:\)[ \t]*import[ \t]+\([a-zA-Z0-9_, \t]+\)'
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
425 fromstr = '\(^\|:\)[ \t]*from[ \t]+\([a-zA-Z0-9_]+\)[ \t]+import[ \t]+'
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
426 isimport = regex.compile(importstr)
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
427 isfrom = regex.compile(fromstr)
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
428 def scanfile(filename):
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
429 allmodules = {}
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
430 try:
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
431 f = open(filename, 'r')
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
432 except IOError, msg:
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
433 raise NoSuchFile, filename
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
434 while 1:
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
435 line = f.readline()
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
436 if not line: break # EOF
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
437 while line[-2:] == '\\\n': # Continuation line
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
438 line = line[:-2] + ' '
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
439 line = line + f.readline()
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
440 if isimport.search(line) >= 0:
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
441 rawmodules = isimport.group(2)
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
442 modules = string.splitfields(rawmodules, ',')
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
443 for i in range(len(modules)):
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
444 modules[i] = string.strip(modules[i])
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
445 elif isfrom.search(line) >= 0:
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
446 modules = [isfrom.group(2)]
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
447 else:
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
448 continue
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
449 for mod in modules:
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
450 allmodules[mod] = None
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
451 f.close()
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
452 return allmodules.keys()
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
453
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
454 # Find the file containing a module, given its name; None if not found
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
455 builtins = sys.builtin_module_names + ['sys']
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
456 def findmodule(modname):
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
457 if modname in builtins: return '<builtin>'
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
458 for dirname in sys.path:
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
459 dlfullname = os.path.join(dirname, modname + 'module.o')
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
460 try:
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
461 f = open(dlfullname, 'r')
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
462 except IOError:
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
463 f = None
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
464 if f:
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
465 f.close()
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
466 return dlfullname
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
467 fullname = os.path.join(dirname, modname + '.py')
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
468 try:
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
469 f = open(fullname, 'r')
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
470 except IOError:
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
471 continue
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
472 f.close()
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
473 return fullname
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
474 if not quiet:
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
475 sys.stderr.write('Warning: module %s not found\n' % modname)
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
476 return '<unknown>'
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
477
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
478
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
479 # Call the main program
1811e96080d4 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
480 main()