c9dea8f20ee594408474760da72b8b900d80aff1
[ibg.git] / chapters / 15.rst
1 ===================
2 Compiling your game
3 ===================
4
5 .. only:: html
6
7   .. image:: /images/picA.png
8      :align: left
9
10 .. raw:: latex
11
12    \dropcap{a}
13
14 lmost as rarely as an alchemist producing gold from base metal, the 
15 compilation process turns your source file into a story file (though the 
16 more usual outcome is a reproachful explanation of why -- *again* -- 
17 that hasn't happened). The magic is performed by the compiler program, 
18 which takes your more or less comprehensible code and translates it into 
19 a binary file: a collection of numbers following a specific format 
20 understood only by Z-code interpreters.
21
22 On the surface, compilation is a very simple trick. You just run the 
23 compiler program, indicating which is the source file from which you 
24 wish to generate a game and presto! The magic is done.
25
26 However, the ingredients for the spell must be carefully prepared. The 
27 compiler "reads" your source code, but not as flexibly as a human would. 
28 It needs the syntax to follow some very precise rules, or it will 
29 complain that it cannot do its job under these conditions. The compiler 
30 cares little for meaning, and a lot about orthography, like a most 
31 inflexible teacher; no moist Bambi eyes are going to save you here.
32
33 Although the spell made by the compiler is always the same one, you can 
34 indicate up to a point how you want the magic to happen. There are a few 
35 options to affect the process of compilation; some you define in the 
36 source code, some with *switches* and certain commands when you run 
37 the program. The compiler will work with some default options if you 
38 don’t define any, but you may change these if you need to. Many of these 
39 options are provided "just in case" special conditions apply; others are 
40 meant for use of experienced designers with advanced and complex 
41 requirements, and are best left (for now) to those proficient in the 
42 lore.
43
44 Ingredients
45 ===========
46
47 If the source file is not written correctly the compiler will protest, 
48 issuing either a *warning* message or an *error* message. Warnings are 
49 there to tell you that there may be a mistake that could affect the 
50 behaviour of the game at run-time; that won't stop the compiler from 
51 finishing the process and producing a story file. Errors, on the other 
52 hand, reflect mistakes that make it impossible for the compiler to 
53 output such a file. Of these, *fatal* errors stop compilation 
54 immediately, while *non-fatal* errors allow the compiler to continue 
55 reading the source file. (As you’ll see in a minute, this is perhaps a 
56 mixed blessing: while it can be useful to have the compiler tell you 
57 about as many non-fatal errors as it can, you'll often find that many of 
58 them are caused by the one simple slip-up.)
59
60 .. rubric:: Fatal errors
61
62 It's difficult – but not impossible – to cause a fatal error. If you 
63 indicate the wrong
64 file name as source file, the compiler won’t even be able to start, 
65 telling you:
66
67     :samp:`Couldn't open source file {filename}`
68
69 If the compiler detects a large number of non-fatal errors, it may 
70 abandon the whole process with:
71
72     :samp:`Too many errors: giving up`
73
74 Otherwise, fatal errors most commonly occur when the compiler runs out 
75 of memory or disk space; with today's computers, that's pretty unusual. 
76 However, you may hit problems if the story file, which must fit within 
77 the fairly limited resources specified by the Z-machine, becomes too 
78 large. Normally, Inform compiles your source code into a Version 5 file 
79 (that’s what the ``.z5`` extension you see in the output file 
80 indicates), with a maximum size of 256 Kbytes. If your game is larger 
81 than this, you’ll have to compile into Version 8 file (``.z8``), which 
82 can grow up to 512 Kbytes (and you do this very simply by setting the 
83 :option:`-v8` switch; more on that in a minute). It takes a surprising amount 
84 of code to exceed these limits; you won’t have to worry about game size 
85 for the next few months, if ever.
86
87 .. rubric:: Non-fatal errors
88
89 Non-fatal errors are much more common. You'll learn to be friends with:
90
91     :samp:`Expected {something} but found {something else}`
92
93 This is the standard way of reporting a punctuation or syntax mistake. 
94 If you type a comma instead of a semicolon, Inform will be looking for 
95 something in vain. The good news is that you are pointed to the 
96 offending line of code::
97
98   Tell.inf(76): Error: Expected directive, '[' or class name but found found_in
99   >        found_in
100   Compiled with 1 error (no output)
101
102 You see the line number (76) and what was found there, so you run to the 
103 source file and take a look; any decent editor will display numbers 
104 alongside your lines if you wish, and will usually let you jump to a 
105 given line number. In this case, the error was caused by a semicolon 
106 after the description string, instead of a comma:
107
108 .. code-block:: inform
109
110   Prop    "assorted stalls"
111     with  name 'assorted' 'stalls',
112           description "Food, clothing, mountain gear; the usual stuff.";
113           found_in street below_square,
114   pluralname;
115
116 Here's a rather misleading message which maybe suggests that things in 
117 our source file are in the wrong order, or that some expected 
118 punctuation is missing::
119
120   Fate.inf(459): Error: Expected name for new object or its textual short name
121   but found door
122   > Object door
123   Compiled with 1 error (no output)
124
125 .. Generated by autoindex
126 .. index::
127    pair: door; library attribute
128
129 In fact, there's nothing wrong with the ordering or punctuation. The 
130 problem is actually that we've tried to define a new object with an 
131 internal ID of :attr:`door` -- reasonably enough, you might think, since the 
132 object *is* a door -- but Inform already knows the word (it's the name 
133 of a library attribute). Unfortunately, the error message provides only 
134 the vaguest hint that you just need to choose another name: we used 
135 ``toilet_door`` instead.
136
137 Once the compiler is off track and can't find what was expected, it's 
138 common for the following lines to be misinterpreted, even if there's 
139 nothing wrong with them. Imagine a metronome ticking away in time with a 
140 playing record. If the record has a scratch and the stylus jumps, it may 
141 seem that the rest of the song is out of sync, when it's merely a bit 
142 "displaced" because of that single incident. This also happens with 
143 Inform, which at times will give you an enormous list of things Expected 
144 but not Found. The rule here is: correct the first mistake on the list 
145 and recompile. It may be that the rest of the song was perfect.
146
147 It would be pointless for us to provide a comprehensive list of errors, 
148 because mistakes are numerous and, anyhow, the explanatory text usually 
149 indicates what was amiss. You'll get errors if you forget a comma or a 
150 semicolon. You'll get errors if your quotes or brackets don't pair up 
151 properly. You'll get errors if you use the same name for two things. 
152 You'll get errors -- for many reasons. Just read the message, go to the 
153 line it mentions (and maybe check those just before and after it as 
154 well), and make whatever seems a sensible correction.
155
156 .. rubric:: Warnings
157
158 Warnings are not immediately catastrophic, but you should get rid of them
159 to ensure a good start at finding run-time mistakes (see :doc:`16`). You
160 may declare a variable and then not use it; you may mistake assignment and
161 arithmetic operators (``=`` instead of ``==``); you may forget the comma
162 that separates properties, etc. For all these and many other warnings,
163 Inform has found something which is legal but doubtful.
164
165 One common incident is to return in the middle of a statement block, 
166 before the rest of statements can be reached. This is not always as 
167 evident as it looks, for instance in a case like this:
168
169 .. code-block:: inform
170
171   if (steel_door has open) {
172       print_ret "The breeze blows out your lit match.";
173       give match ~light;
174   }
175
176 In the above example, the ``print_ret`` statement returns true after the 
177 string has been printed, and the ``give match ~light`` line will never 
178 happen. Inform detects the fault and warns you. Probably the designer's 
179 intention was:
180
181 .. code-block:: inform
182
183   if (steel_door has open) {
184       give match ~light;
185       print_ret "The breeze blows out your lit match.";
186   }
187
188 Compiling *à la carte*
189 ======================
190
191 One of the advantages of Inform is its portability between different 
192 systems and machines. Specific usage of the compiler varies accordingly, 
193 but some features should be in all environments. To obtain precise 
194 information about any particular version, run the compiler with the 
195 :option:`-h1` switch -- see :ref:`switches`.
196
197 .. Generated by autoindex
198 .. index::
199    single: Strict mode
200
201 Often the compiler is run with the name of your source file as its only
202 parameter. This tells the compiler to "read this file using Strict mode and
203 from it generate a Version 5 story file of the same name". The source file
204 is mostly full of statements which define how the game is to behave at
205 run-time, but will also include compile-time instructions directed at the
206 compiler itself (although such an instruction looks a lot like a
207 :term:`statement`, it's actually quite different in what it does, and is
208 known as a :term:`directive`). We have already seen the ``Include``
209 directive:
210
211   :samp:`Include "{filename}";`
212
213 When the compiler reaches a line like this, it looks for
214 :samp:`{filename}` -- another file also containing Inform code -- and
215 processes it as if the statements and directives included in
216 :samp:`{filename}` were in that precise spot where the ``Include`` 
217 directive is.
218
219 .. image:: /images/includes.png
220   :align: center
221
222 In every Inform game we Include the library files ``Parser``, 
223 ``VerbLib`` and ``Grammar``, but we may Include other files. For 
224 example, this is the way to incorporate library extensions contributed 
225 by other people, as you saw when we incorporated ``pname.h`` into our 
226 "Captain Fate" game.
227
228 .. note::
229
230   On some machines, a library file is actually called -- for example -- 
231   ``Parser.h``, on others just ``Parser``. The compiler automatically 
232   deals with such differences; you can *always* type simply ``Include 
233   "Parser";`` in your source file.
234
235 As you grow experienced in Inform, and your games become more complex, 
236 you may find that the source file becomes unmanageably large. One useful 
237 technique is then to divide it into a number of sections, each stored in 
238 a separate file, which you Include into a short master game file. For 
239 example:
240
241 .. code-block:: inform
242
243   !============================================================================
244   Constant Story "War and Peace";
245   Constant Headline
246               "^An extended Inform example
247                ^by me and Leo Tolstoy.^";
248
249   Include "Parser";
250   Include "VerbLib";
251
252   Include "1805";
253   Include "1806-11";
254   Include "1812A";
255   Include "1812B";
256   Include "1813-20";
257
258   Include "Grammar";
259
260   Include "Verbski";
261
262   !============================================================================
263
264 .. _switches:
265
266 Switches
267 ========
268
269 When you run the compiler you can set some optional controls; these are 
270 called *switches* because most of them are either on or off (although a 
271 few accept a numeric value 0–9). Switches affect compilation in a 
272 variety of ways, often just by changing the information displayed by the 
273 compiler when it’s running. A typical command line (although this may 
274 vary between machines) would be:
275
276   :samp:`inform {source_file story_file switches}`
277
278 where "``inform``" is the name of the compiler, the :samp:`{story_file}` is
279 optional (so that you can specify a different name from the
280 :samp:`{source_file}`) and the switches are also optional. Note that
281 switches must be preceded by a hyphen ``-``; if you want to set, for
282 instance, Strict mode, you'd write :option:`-S` , while if you want to
283 deactivate it, you’d write :option:`-~S`. The tilde sign can, as elsewhere,
284 be understood as "not". If you wish to set many switches, just write them
285 one after another separated by spaces and each with its own hyphen, or
286 merge them with one hyphen and no spaces::
287
288   inform MyGame.inf -S -s -X
289
290   inform MyGame.inf -Ssx
291
292 Although there's nothing wrong with this method, it isn't awfully 
293 convenient should you need to change the switch settings. A more 
294 flexible method is to define the switches at the very start of your 
295 source file, again in either format::
296
297   !% -S -s -X
298
299   !% -Ssx
300
301 Normally, all switches are off by default, except Strict mode
302 (:option:`-S`), which is on and checks the code for additional
303 mistakes. It's well worth adding Debug mode (:option:`-D`), thus making the
304 debugging verbs available at run time. This is the ideal setting while
305 coding, but you should turn Debug mode off (just remove the :option:`-D`)
306 when you release your game to the public. This is fortunately very easy to
307 check, since the game banner ends with the letter "D" if the game was
308 compiled in Debug mode:
309
310 .. code-block:: transcript
311
312   Captain Fate
313   A simple Inform example
314   by Roger Firth and Sonja Kesserich.
315   Release 3 / Serial number 040804 / Inform v6.30 Library 6/11 SD
316
317 Switches are case sensitive, so you get different effects from ``-x`` 
318 and ``-X``. Some of the more useful switches are:
319
320 .. option:: -S
321 .. option:: -~S
322
323    Set compiler Strict mode on or off, respectively.  Strict mode activates
324    some additional error checking features when it reads your source file.
325    Strict mode is on by default.
326
327 .. option:: -v5
328 .. option:: -v8
329
330    .. Generated by autoindex
331    .. index::
332       single: Infocom
333
334    Compile to this version of story file. Versions 5 (on by default) and 
335    8 are the only ones you should ever care about; they produce, 
336    respectively, story files with the extensions .z5 and .z8. Version 5 
337    was the Advanced Infocom design, and is the default produced by 
338    Inform. This is the version you'll normally be using, which allows 
339    file sizes up to 256 Kbytes. If your game grows beyond that size, 
340    you'll need to compile to the Version 8 story file, which is very 
341    similar to Version 5 but allows a 512 Kbytes file size.
342
343 .. option:: -D
344 .. option:: -X
345
346    Include respectively the debugging verbs and the Infix debugger in the 
347    story file (see :doc:`16`).
348
349 .. option:: -h1
350 .. option:: -h2
351
352    Display help information about the compiler. :option:`-h1` produces 
353    innformation about file naming, and :option:`-h2` about the available 
354    switches.
355
356 .. option:: -n
357 .. option:: -j
358
359    :option:`-n` displays the number of declared attributes, properties and 
360    actions. :option:`-j` lists objects as they are being read and constructed 
361    in the story file.
362
363 .. option:: -s
364 .. option:: -~s
365
366    Offer game statistics (or not). This provides a lot of information about
367    your game, including the number of objects, verbs, dictionary entries,
368    memory usage, etc., while at the same time indicating the maximum
369    allowed for each entry. This can be useful to check whether you are
370    nearing the limits of Inform.
371
372 .. option:: -r
373
374    Record all the text of the game into a temporary file, useful to check 
375    all your descriptions and messages by running them through a spelling 
376    checker.
377
378 If you run the compiler with the :option:`-h2` switch, you’ll find that
379 there are many more switches than these, offering mostly advanced or
380 obscure features which we consider to be of little interest to beginners.
381 However, feel free to try whatever switches catch your eye; nothing you try
382 here will affect your source file, which is strictly read-only as far as
383 the compiler is concerned.