blob: 5befaf08ca6fe772592d42d35f382a77b767857c [file] [log] [blame]
Guido van Rossumd8336c21994-10-05 16:13:01 +00001THE FREEZE SCRIPT
2=================
3
4
5What is Freeze?
6---------------
7
8Freeze make it possible to ship arbitrary Python programs to people
9who don't have Python. The shipped file (called a "frozen" version of
10your Python program) is an executable, so this only works if your
11platform is compatible with that on the receiving end (this is usually
12a matter of having the same major operating system revision and CPU
13type).
14
15The shipped file contains a Python interpreter and large portions of
16the Python run-time. Some measures have been taken to avoid linking
17unneeded modules, but the resulting binary is usually not small.
18
19The Python source code of your program (and of the library modules
20written in Python that it uses) is not included in the binary --
21instead, the compiled byte-code (the instruction stream used
22internally by the interpreter) is incorporated. This gives some
23protection of your Python source code, though not much -- a
24disassembler for Python byte-code is available in the standard Python
25library. At least someone running "strings" on your binary won't see
26the source.
27
28
29How does Freeze know which modules to include?
30----------------------------------------------
31
32Freeze uses a pretty simple-minded algorithm to find the modules that
33your program uses: given a file containing Python source code, it
34scans for lines beginning with the word "import" or "from" (possibly
35preceded by whitespace) and then it knows where to find the module
36name(s) in those lines. It then recursively scans the source for
37those modules (if found, and not already processed) in the same way.
38
39Freeze will not see import statements hidden behind another statement,
40like this:
41
42 if some_test: import M # M not seen
43
44or like this:
45
46 import A; import B; import C # B and C not seen
47
48nor will it see import statements constructed using string
49operations and passed to 'exec', like this:
50
51 exec "import %s" % "M" # M not seen
52
53On the other hand, Freeze will think you are importing a module even
54if the import statement it sees will never be executed, like this:
55
56 if 0:
57 import M # M is seen
58
59One tricky issue: Freeze assumes that the Python interpreter and
60environment you're using to run Freeze is the same one that would be
61used to run your program, which should also be the same whose sources
62and installed files you will learn about in the next section. In
63particular, your PYTHONPATH setting should be the same as for running
64your program locally. (Tip: if the program doesn't run when you type
65"python hello.py" there's little chance of getting the frozen version
66to run.)
67
68
69How do I use Freeze?
70--------------------
71
72Ideally, you should be able to use it as follows:
73
74 python freeze.py hello.py
75
76where hello.py is your program and freeze.py is the main file of
77Freeze (in actuality, you'll probably specify an absolute pathname
Guido van Rossum309e8ac1995-03-02 15:54:21 +000078such as /ufs/guido/src/python/Tools/freeze/freeze.py).
Guido van Rossumd8336c21994-10-05 16:13:01 +000079
80Unfortunately, this doesn't work. Well, it might, but somehow it's
81extremely unlikely that it'll work on the first try. (If it does,
82skip to the next section.) Most likely you'll get this error message:
83
84 needed directory /usr/local/lib/python/lib not found
85
86The reason is that Freeze require that some files that are normally
87kept inside the Python build tree are installed, and it searches for
88it in the default install location. (The default install prefix is
89/usr/local; these particular files are installed at lib/python/lib
90under the install prefix.)
91
92The particular set of files needed is installed only if you run "make
93libainstall" (note: "liba", not "lib") in the Python build tree (which
94is the tree where you build Python -- often, but not necessarily, this
95is also the Python source tree). If you have in fact done a "make
96libainstall" but used a different prefix, all you need to do is pass
97that same prefix to Freeze with the -p option:
98
99 python freeze.py -p your-prefix hello.py
100
Guido van Rossumbf6bdb01995-04-05 10:59:20 +0000101If you haven't run "make libainstall" yet, you should do it now
102(perhaps figuring out first *where* you want everything to be
103installed).
Guido van Rossumd8336c21994-10-05 16:13:01 +0000104
105
106How do I configure Freeze?
107--------------------------
108
Guido van Rossumbf6bdb01995-04-05 10:59:20 +0000109It's a good idea to change the first line marked with XXX in freeze.py
110(an assignment to variable PACK) to point to the absolute pathname of
111the directory where Freeze lives (Tools/freeze in the Python source
112tree.) This makes it possible to call Freeze from other directories.
Guido van Rossumd8336c21994-10-05 16:13:01 +0000113
Guido van Rossumbf6bdb01995-04-05 10:59:20 +0000114You can also edit the assignment to variable PREFIX (also marked with
115XXX) -- this saves a lot of -p options.
Guido van Rossumd8336c21994-10-05 16:13:01 +0000116
117
118How do I use Freeze with extensions modules?
119--------------------------------------------
120
121XXX to be written. (In short: pass -e extensionbuilddir.)
122
123
124How do I use Freeze with dynamically loaded extension modules?
125--------------------------------------------------------------
126
127XXX to be written. (In short: pass -e modulebuilddir -- this even
128works if you built the modules in Python's own Modules directory.)
129
130
Guido van Rossumd8336c21994-10-05 16:13:01 +0000131What do I do next?
132------------------
133
134Freeze creates three files: frozen.c, config.c and Makefile. To
135produce the frozen version of your program, you can simply type
136"make". This should produce a binary file. If the filename argument
137to Freeze was "hello.py", the binary will be called "hello". On the
138other hand, if the argument was "hello", the binary will be called
139"hello.bin". If you passed any other filename, all bets are off. :-)
140In any case, the name of the file will be printed as the last message
141from Freeze.
142
143
Guido van Rossumbf6bdb01995-04-05 10:59:20 +0000144Troubleshooting
145---------------
Guido van Rossumd8336c21994-10-05 16:13:01 +0000146
Guido van Rossumbf6bdb01995-04-05 10:59:20 +0000147If you have trouble using Freeze for a large program, it's probably
148best to start playing with a really simple program first (like the
149file hello.py). If you can't get that to work there's something
150fundamentally wrong -- read the text above to find out how to install
151relevant parts of Python properly and how to configure Freeze to find
152them.
Guido van Rossumd8336c21994-10-05 16:13:01 +0000153
Guido van Rossumbf6bdb01995-04-05 10:59:20 +0000154A common problem is having installed an old version -- rerunning "make
155libainstall" often clears up problems with missing modules or
156libraries at link time.
157
158
159What is nfreeze.py?
160-------------------
161
162The script nfreeze.py is an unsupported variant on freeze.py which
163creates all files in a temporary directory and runs "make" there. It
164has the advantage that it doesn't overwrite files in the current
165directory, but the disadvantage is that it removes all files when it
166is finished.
Guido van Rossumd8336c21994-10-05 16:13:01 +0000167
168
169--Guido van Rossum, CWI, Amsterdam <mailto:Guido.van.Rossum@cwi.nl>
170<http://www.cwi.nl/cwi/people/Guido.van.Rossum.html>