]> git.kernelconcepts.de Git - karo-tx-redboot.git/blob - doc/html/user-guide/editing-an-ecos-savefile.html
Initial revision
[karo-tx-redboot.git] / doc / html / user-guide / editing-an-ecos-savefile.html
1 <!-- Copyright (C) 2003 Red Hat, Inc.                                -->
2 <!-- This material may be distributed only subject to the terms      -->
3 <!-- and conditions set forth in the Open Publication License, v1.0  -->
4 <!-- or later (the latest version is presently available at          -->
5 <!-- http://www.opencontent.org/openpub/).                           -->
6 <!-- Distribution of the work or derivative of the work in any       -->
7 <!-- standard (paper) book form is prohibited unless prior           -->
8 <!-- permission is obtained from the copyright holder.               -->
9 <HTML
10 ><HEAD
11 ><TITLE
12 >Editing an eCos Savefile</TITLE
13 ><meta name="MSSmartTagsPreventParsing" content="TRUE">
14 <META
15 NAME="GENERATOR"
16 CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+
17 "><LINK
18 REL="HOME"
19 TITLE="eCos User Guide"
20 HREF="ecos-user-guide.html"><LINK
21 REL="UP"
22 TITLE="Manual Configuration"
23 HREF="manual-configuration.html"><LINK
24 REL="PREVIOUS"
25 TITLE="Fine-grained Configuration"
26 HREF="fine-grained-configuration.html"><LINK
27 REL="NEXT"
28 TITLE="Editing the Sources"
29 HREF="editing-the-sources.html"></HEAD
30 ><BODY
31 CLASS="SECT1"
32 BGCOLOR="#FFFFFF"
33 TEXT="#000000"
34 LINK="#0000FF"
35 VLINK="#840084"
36 ALINK="#0000FF"
37 ><DIV
38 CLASS="NAVHEADER"
39 ><TABLE
40 SUMMARY="Header navigation table"
41 WIDTH="100%"
42 BORDER="0"
43 CELLPADDING="0"
44 CELLSPACING="0"
45 ><TR
46 ><TH
47 COLSPAN="3"
48 ALIGN="center"
49 >eCos User Guide</TH
50 ></TR
51 ><TR
52 ><TD
53 WIDTH="10%"
54 ALIGN="left"
55 VALIGN="bottom"
56 ><A
57 HREF="fine-grained-configuration.html"
58 ACCESSKEY="P"
59 >Prev</A
60 ></TD
61 ><TD
62 WIDTH="80%"
63 ALIGN="center"
64 VALIGN="bottom"
65 >Chapter 28. Manual Configuration</TD
66 ><TD
67 WIDTH="10%"
68 ALIGN="right"
69 VALIGN="bottom"
70 ><A
71 HREF="editing-the-sources.html"
72 ACCESSKEY="N"
73 >Next</A
74 ></TD
75 ></TR
76 ></TABLE
77 ><HR
78 ALIGN="LEFT"
79 WIDTH="100%"></DIV
80 ><DIV
81 CLASS="SECT1"
82 ><H1
83 CLASS="SECT1"
84 ><A
85 NAME="EDITING-AN-ECOS-SAVEFILE">Editing an <SPAN
86 CLASS="PRODUCTNAME"
87 >eCos</SPAN
88 > Savefile</H1
89 ><P
90 >The <SPAN
91 CLASS="PRODUCTNAME"
92 >eCos</SPAN
93 > configuration information is held in a single
94           savefile, typically <TT
95 CLASS="FILENAME"
96 >ecos.ecc</TT
97 >, which can
98           be generated by either the GUI configuration tool or by the
99           command line <B
100 CLASS="COMMAND"
101 >ecosconfig</B
102 > tool. The file
103           normally exists at the top level of the build tree. It is a
104           text file, allowing the various configurations options to be
105           edited inside a suitable text editor or by other programs or
106           scripts, as well as in the GUI config tool.</P
107 ><P
108 >An <SPAN
109 CLASS="PRODUCTNAME"
110 >eCos</SPAN
111 > savefile is actually a script in the <SPAN
112 CLASS="emphasis"
113 ><I
114 CLASS="EMPHASIS"
115 >Tcl</I
116 ></SPAN
117 > programming
118 language, so any modifications to the file need to preserve Tcl
119 syntax. For most configuration options, any modifications will be
120 trivial and there is no need to worry about Tcl syntax. For example,
121 changing a 1 to a 0 to disable an option.  For more complicated
122 options, for example<TT
123 CLASS="LITERAL"
124 > CYGDAT_UITRON_TASK_EXTERNS</TT
125 >,
126 which involves some lines of C code, more care has
127 to be taken. If an edited savefile is no longer a valid Tcl script
128 then the configuration tools will be unable to read back the data
129 for further processing, for example to generate a build tree. An
130 outline of Tcl syntax is given below. One point worth noting here
131 is that a line that begins with a &#8220;#&#8221; is
132 usually a comment, and the bulk of an <SPAN
133 CLASS="PRODUCTNAME"
134 >eCos</SPAN
135 > savefile actually consists
136 of such comments, to make it easier to edit.</P
137 ><DIV
138 CLASS="SECT2"
139 ><H2
140 CLASS="SECT2"
141 ><A
142 NAME="AEN2721">Header</H2
143 ><P
144 >An <SPAN
145 CLASS="PRODUCTNAME"
146 >eCos</SPAN
147 > savefile begins with a header, which typically
148             looks something like this:</P
149 ><TABLE
150 BORDER="5"
151 BGCOLOR="#E0E0F0"
152 WIDTH="70%"
153 ><TR
154 ><TD
155 ><PRE
156 CLASS="SCREEN"
157 ># eCos saved configuration
158 # ---- commands -------------------------------------------------------- 
159 # This section contains information about the savefile format. 
160 # It should not be edited. Any modifications made to this section 
161 # may make it impossible for the configuration tools to read 
162 # the savefile.
163
164 cdl_savefile_version 1; 
165 cdl_savefile_command cdl_savefile_version {};
166 cdl_savefile_command cdl_savefile_command {}; 
167 cdl_savefile_command 
168 cdl_configuration { description hardware template package }; 
169 cdl_savefile_command cdl_package { value_source user_value wizard_value inferred_value }; 
170 cdl_savefile_command cdl_component { value_source user_value wizard_value inferred_value }; 
171 cdl_savefile_command cdl_option { value_source user_value wizard_value inferred_value }; 
172 cdl_savefile_command cdl_interface { value_source user_value wizard_value inferred_value }; 
173       </PRE
174 ></TD
175 ></TR
176 ></TABLE
177 ><P
178 >This section of the savefile is intended for use by the
179         configuration system, and should not be edited. If this
180         section is edited then the various configuration tools may no
181         longer be able to read in the modified savefile.</P
182 ></DIV
183 ><DIV
184 CLASS="SECT2"
185 ><H2
186 CLASS="SECT2"
187 ><A
188 NAME="AEN2727">Toplevel Section</H2
189 ><P
190 >The header is followed by a section that defines the
191             configuration as a whole. A typical example would
192             be:</P
193 ><TABLE
194 BORDER="5"
195 BGCOLOR="#E0E0F0"
196 WIDTH="70%"
197 ><TR
198 ><TD
199 ><PRE
200 CLASS="SCREEN"
201 ># ---- toplevel -------------------------------------------------------- 
202 # This section defines the toplevel configuration object. The only 
203 # values that can be changed are the name of the configuration and 
204 # the description field. It is not possible to modify the target, 
205 # the template or the set of packages simply by editing the lines 
206 # below because these changes have wide-ranging effects. Instead 
207 # the appropriate tools should be used to make such modifications.
208
209 cdl_configuration eCos {     
210 description &#8220;&#8220; ;         
211
212 # These fields should not be modified.     
213 hardware    pid ;     
214 template    uitron ;     
215 package -hardware CYGPKG_HAL_ARM current ;     
216 package -hardware CYGPKG_HAL_ARM_PID current ;     
217 package -hardware CYGPKG_IO_SERIAL current ;     
218 package -template CYGPKG_HAL current ;     
219 package -template CYGPKG_IO current ;     
220 package -template CYGPKG_INFRA current ;     
221 package -template CYGPKG_KERNEL current ;     
222 package -template CYGPKG_UITRON current ;     
223 package -template CYGPKG_LIBC current ;     
224 package -template CYGPKG_LIBM current ;     
225 package -template CYGPKG_DEVICES_WALLCLOCK current ;     
226 package -template CYGPKG_ERROR current ; 
227 }; 
228       </PRE
229 ></TD
230 ></TR
231 ></TABLE
232 ><P
233 >This section allows the configuration tools to reload the
234 various packages that make up the configuration. Most of the information
235 should not be edited. If it is necessary to add a new package or
236 to remove an existing one then the appropriate tools should be used
237 for this, for example:</P
238 ><TABLE
239 BORDER="5"
240 BGCOLOR="#E0E0F0"
241 WIDTH="70%"
242 ><TR
243 ><TD
244 ><PRE
245 CLASS="PROGRAMLISTING"
246 >$ ecosconfig remove CYGPKG_LIBM</PRE
247 ></TD
248 ></TR
249 ></TABLE
250 ><P
251 >There are two fields which can be edited. Configurations have
252 a name; in this case <SPAN
253 CLASS="PRODUCTNAME"
254 >eCos</SPAN
255 >. They can also have a description, which
256 is some arbitrary text. The configuration tools do not make use
257 of these fields, they exist so that users can store additional information
258 about a configuration.</P
259 ></DIV
260 ><DIV
261 CLASS="SECT2"
262 ><H2
263 CLASS="SECT2"
264 ><A
265 NAME="AEN2735">Conflicts Section</H2
266 ><P
267 >The toplevel section is followed by details of all the
268             conflicts (if any) in the configuration, for
269             example:</P
270 ><TABLE
271 BORDER="5"
272 BGCOLOR="#E0E0F0"
273 WIDTH="70%"
274 ><TR
275 ><TD
276 ><PRE
277 CLASS="SCREEN"
278 ># ---- conflicts ------------------------------------------------------- 
279 # There are 2 conflicts. 
280
281 # option CYGNUM_LIBC_TIME_DST_DEFAULT_OFFSET 
282 #   Property LegalValues 
283 #   Illegal current value 100000 
284 #   Legal values are: -90000 to 90000 
285
286 # option CYGSEM_LIBC_TIME_CLOCK_WORKING 
287 #   Property Requires 
288 #   Requires constraint not satisfied: CYGFUN_KERNEL_THREADS_TIMER 
289           </PRE
290 ></TD
291 ></TR
292 ></TABLE
293 ><P
294 >When editing a configuration you may end up with something
295 that is invalid. Any problems in the configuration will be reported
296 in the conflicts section. In this case there are two conflicts.
297 The option <TT
298 CLASS="LITERAL"
299 >CYGNUM_LIBC_TIME_DST_DEFAULT_OFFSET</TT
300 > has
301 been given an illegal value: typically this would be fixed by searching
302 for the definition of that option later on in the savefile and modifying
303 the value. The second conflict is more interesting, an unsatisfied <SPAN
304 CLASS="emphasis"
305 ><I
306 CLASS="EMPHASIS"
307 >requires</I
308 ></SPAN
309 > constraint.
310 Configuration options are not independent: disabling some functionality
311 in, say, the kernel, can have an impact elsewhere; in this case
312 the C library. The various dependencies between the options are
313 specified by the component developers and checked by the configuration
314 system. In this case there are two obvious ways in which the conflict could
315 be resolved: re-enabling <TT
316 CLASS="LITERAL"
317 >CYGFUN_KERNEL_THREADS_TIMER</TT
318 >,
319 or disabling <TT
320 CLASS="LITERAL"
321 >CYGSEM_LIBC_TIME_CLOCK_WORKING</TT
322 >.
323 Both of these options will be listed later on in the file.</P
324 ><P
325 >Some care has to be taken when modifying configuration options,
326 to avoid introducing new conflict. For instance it is possible that
327 there might be other options in the system which have a dependency
328 on <TT
329 CLASS="LITERAL"
330 >CYGSEM_LIBC_TIME_CLOCK_WORKING</TT
331 >,
332 so disabling that option may not be the best way to resolve the
333 conflict. Details of all such dependencies are provided in the appropriate
334 places in the savefile.</P
335 ><P
336 >It is not absolutely required that a configuration be conflict-free
337 before generating a build tree and building <SPAN
338 CLASS="PRODUCTNAME"
339 >eCos</SPAN
340 >. It is up to the
341 developers of each component to decide what would happen if an attempt
342 is made to build <SPAN
343 CLASS="PRODUCTNAME"
344 >eCos</SPAN
345 > while there are still conflicts. In serious
346 cases there is likely to be a compile-time failure, or possibly
347 a link-time failure. In less serious cases the system may build
348 happily and the application can be linked with the resulting library,
349 but the component may not quite function as intended - although
350 it may still be good enough for the specific needs of the application.
351 It is also possible that everything builds and links, but once in
352 a while the system will unaccountably crash. Using a configuration
353 that still has conflicts is done entirely at the user&#8217;s
354 risk.</P
355 ></DIV
356 ><DIV
357 CLASS="SECT2"
358 ><H2
359 CLASS="SECT2"
360 ><A
361 NAME="AEN2749">Data Section</H2
362 ><P
363 >The bulk of the savefile lists the various packages,
364             components, and options, including their values and the
365             various dependencies. A number of global options come
366             first, especially those related to the build process such
367             as compiler flags. These are followed by the various
368             packages, and the components and options within those
369             packages, in order.</P
370 ><P
371 >Packages, components and options are organized in a
372             hierarchy. If a particular component is disabled then all
373             options and sub-components below it will be inactive: any
374             changes made to these will have no effect. The savefile
375             contains information about the hierarchy in the form of
376             comments, for example:</P
377 ><TABLE
378 BORDER="5"
379 BGCOLOR="#E0E0F0"
380 WIDTH="70%"
381 ><TR
382 ><TD
383 ><PRE
384 CLASS="SCREEN"
385 >cdl_package CYGPKG_KERNEL ... 
386 # &gt; 
387 cdl_component CYGPKG_KERNEL_EXCEPTIONS ... 
388 # &gt; 
389 cdl_option CYGSEM_KERNEL_EXCEPTIONS_DECODE ... 
390 cdl_option CYGSEM_KERNEL_EXCEPTIONS_GLOBAL ... 
391 # &lt; 
392 cdl_component CYGPKG_KERNEL_SCHED ... 
393 # &gt; 
394 cdl_option CYGSEM_KERNEL_SCHED_MLQUEUE ... 
395 cdl_option CYGSEM_KERNEL_SCHED_BITMAP ... 
396 # &lt; 
397 # &lt; 
398           </PRE
399 ></TD
400 ></TR
401 ></TABLE
402 ><P
403 >This corresponds to the following hierarchy:</P
404 ><TABLE
405 BORDER="5"
406 BGCOLOR="#E0E0F0"
407 WIDTH="70%"
408 ><TR
409 ><TD
410 ><PRE
411 CLASS="SCREEN"
412 > CYGPKG_KERNEL
413    CYGPKG_KERNEL_EXCEPTIONS
414      CYGSEM_KERNEL_EXCEPTIONS_DECODE
415      CYGSEM_KERNEL_EXCEPTIONS_GLOBAL
416    CYGPKG_KERNEL_SCHED
417      CYGSEM_KERNEL_SCHED_MLQUEUE
418      CYGSEM_KERNEL_SCHED_BITMAP 
419           </PRE
420 ></TD
421 ></TR
422 ></TABLE
423 ><P
424 >Providing the hierarchy information in this way allows
425             programs or scripts to analyze the savefile and readily
426             determine the hierarchy. It could also be used by a
427             sufficiently powerful editor to support structured editing
428             of <SPAN
429 CLASS="PRODUCTNAME"
430 >eCos</SPAN
431 > savefiles. The information is not used by the
432             configuration tools themselves since they obtain the
433             hierarchy from the original CDL scripts.</P
434 ><P
435 >Each configurable entity is preceded by a comment, of
436             the following form:</P
437 ><TABLE
438 BORDER="5"
439 BGCOLOR="#E0E0F0"
440 WIDTH="70%"
441 ><TR
442 ><TD
443 ><PRE
444 CLASS="SCREEN"
445 ># Kernel schedulers 
446 # doc: ref/ecos-ref/ecos-kernel-overview.html#THE-SCHEDULER 
447 # The eCos kernel provides a choice of schedulers. In addition 
448 # there are a number of configuration options to control the 
449 # detailed behaviour of these schedulers. 
450 cdl_component CYGPKG_KERNEL_SCHED {     
451 ... 
452 }; 
453           </PRE
454 ></TD
455 ></TR
456 ></TABLE
457 ><P
458 >This provides a short textual alias
459             <TT
460 CLASS="LITERAL"
461 >Kernel schedulers</TT
462 > for the
463             component. If online documentation is available for the
464             configurable entity then this will come next. Finally
465             there is a short description of the entity as a whole. All
466             this information is provided by the component
467             developers.</P
468 ><P
469 >Each configurable entity takes the form:</P
470 ><TABLE
471 BORDER="5"
472 BGCOLOR="#E0E0F0"
473 WIDTH="70%"
474 ><TR
475 ><TD
476 ><PRE
477 CLASS="SCREEN"
478 >&lt;type&gt; &lt;name&gt; {
479      &lt;data&gt;
480 };</PRE
481 ></TD
482 ></TR
483 ></TABLE
484 ><P
485 >Configurable entities may not be active. This can be either
486 because the parent is disabled or inactive, or because there are
487 one or more <SPAN
488 CLASS="emphasis"
489 ><I
490 CLASS="EMPHASIS"
491 >active_if</I
492 ></SPAN
493 > properties. Modifying
494 the value of an inactive entity has no effect on the configuration,
495 so this information is provided first:</P
496 ><P
497 ></P
498 ><TABLE
499 BORDER="5"
500 BGCOLOR="#E0E0F0"
501 WIDTH="70%"
502 ><TR
503 ><TD
504 ><PRE
505 CLASS="SCREEN"
506 >cdl_option CYGSEM_KERNEL_EXCEPTIONS_DECODE {     
507 # This option is not active     
508 # The parent CYGPKG_KERNEL_EXCEPTIONS is disabled     
509 ... 
510 };
511  
512 ...
513
514 cdl_option CYGIMP_IDLE_THREAD_YIELD {     
515 # This option is not active     
516 # ActiveIf constraint: (CYGNUM_KERNEL_SCHED_PRIORITIES == 1)     
517 #     CYGNUM_KERNEL_SCHED_PRIORITIES == 32     
518 #   --&gt; 0     
519 ... 
520 }; &#13;</PRE
521 ></TD
522 ></TR
523 ></TABLE
524 ><P
525 >For <TT
526 CLASS="LITERAL"
527 >CYGIMP_IDLE_THREAD_YIELD</TT
528 > the
529 savefile lists the expression that must be satisfied if the option
530 is to be active, followed by the current value of all entities that
531 are referenced in the expression, and finally the result of evaluating
532 that expression.</P
533 ><P
534 >Not all options are directly modifiable in the savefile. First,
535 the value of packages (which is the version of that package loaded
536 into the configuration) cannot be modified here.</P
537 ><TABLE
538 BORDER="5"
539 BGCOLOR="#E0E0F0"
540 WIDTH="70%"
541 ><TR
542 ><TD
543 ><PRE
544 CLASS="SCREEN"
545 >&#13;cdl_package CYGPKG_KERNEL {     
546 # Packages cannot be added or removed, nor can their version be changed,     
547 # simply by editing their value. Instead the appropriate configuration     
548 # should be used to perform these actions.
549 ...
550 };&#13;</PRE
551 ></TD
552 ></TR
553 ></TABLE
554 ><P
555 >The version of a package can be changed using e.g.:    </P
556 ><TABLE
557 BORDER="5"
558 BGCOLOR="#E0E0F0"
559 WIDTH="70%"
560 ><TR
561 ><TD
562 ><PRE
563 CLASS="SCREEN"
564 >$ ecosconfig version 1.3 CYGPKG_KERNEL</PRE
565 ></TD
566 ></TR
567 ></TABLE
568 ><P
569 >Even though a package&#8217;s value cannot be modified
570 here, it is still important for the savefile to contain the details.
571 In particular packages may impose constraints on other configurable
572 entities and may be referenced by other configurable entities. Also
573 it would be difficult to understand or extract the configuration&#8217;s
574 hierarchy if the packages were not listed in the appropriate places
575 in the savefile.</P
576 ><P
577 >Some components (or, conceivably, options) do not have any
578 associated data. Typically they serve only to introduce another
579 level in the hierarchy, which can be useful in the context of the
580 GUI configuration tool.</P
581 ><TABLE
582 BORDER="5"
583 BGCOLOR="#E0E0F0"
584 WIDTH="70%"
585 ><TR
586 ><TD
587 ><PRE
588 CLASS="SCREEN"
589 >&#13;cdl_component CYGPKG_HAL_COMMON_INTERRUPTS {     
590 # There is no associated value. 
591 }; &#13;</PRE
592 ></TD
593 ></TR
594 ></TABLE
595 ><P
596 >Other components or options have a calculated value. These
597 are not user-modifiable, but typically the value will depend on
598 other options which can be modified. Such calculated options can
599 be useful when controlling what gets built or what ends up in the
600 generated configuration header files. A calculated value may also
601 effect other parts of the configuration, for instance, via a <SPAN
602 CLASS="emphasis"
603 ><I
604 CLASS="EMPHASIS"
605 >requires</I
606 ></SPAN
607 > constraint.</P
608 ><TABLE
609 BORDER="5"
610 BGCOLOR="#E0E0F0"
611 WIDTH="70%"
612 ><TR
613 ><TD
614 ><PRE
615 CLASS="SCREEN"
616 >&#13;cdl_option BUFSIZ {     
617 # Calculated value: CYGSEM_LIBC_STDIO_WANT_BUFFERED_IO ? CYGNUM_LIBC_STDIO_BUFSIZE : 0     
618 #     CYGSEM_LIBC_STDIO_WANT_BUFFERED_IO == 1     
619 #     CYGNUM_LIBC_STDIO_BUFSIZE == 256     
620 # Current_value: 256 
621 }; &#13;</PRE
622 ></TD
623 ></TR
624 ></TABLE
625 ><P
626 >A special type of calculated value is the <SPAN
627 CLASS="emphasis"
628 ><I
629 CLASS="EMPHASIS"
630 >interface</I
631 ></SPAN
632 >.
633 The value of an interface is the number of active and enabled options
634 which <SPAN
635 CLASS="emphasis"
636 ><I
637 CLASS="EMPHASIS"
638 >implement</I
639 ></SPAN
640 > that interface. Again the value
641 of an interface cannot be modified directly; only by modifying the
642 options which implement the interface. However, an interface can
643 be referenced by other parts of the configuration. </P
644 ><TABLE
645 BORDER="5"
646 BGCOLOR="#E0E0F0"
647 WIDTH="70%"
648 ><TR
649 ><TD
650 ><PRE
651 CLASS="SCREEN"
652 >cdl_interface CYGINT_KERNEL_SCHEDULER {     
653 # Implemented by CYGSEM_KERNEL_SCHED_MLQUEUE, active, enabled     
654 # Implemented by CYGSEM_KERNEL_SCHED_BITMAP, active, disabled     
655 # This value cannot be modified here.     
656 # Current_value: 1     
657 # Requires: 1 == CYGINT_KERNEL_SCHEDULER     
658 #     CYGINT_KERNEL_SCHEDULER == 1     
659 #   --&gt; 1&#13;</PRE
660 ></TD
661 ></TR
662 ></TABLE
663 ><TABLE
664 BORDER="5"
665 BGCOLOR="#E0E0F0"
666 WIDTH="70%"
667 ><TR
668 ><TD
669 ><PRE
670 CLASS="SCREEN"
671 ># The following properties are affected by this value     
672 # interface CYGINT_KERNEL_SCHEDULER     
673 #     Requires: 1 == CYGINT_KERNEL_SCHEDULER 
674 }; </PRE
675 ></TD
676 ></TR
677 ></TABLE
678 ><P
679 >If the configurable entity is modifiable then there will be
680 lines like the following:</P
681 ><TABLE
682 BORDER="5"
683 BGCOLOR="#E0E0F0"
684 WIDTH="70%"
685 ><TR
686 ><TD
687 ><PRE
688 CLASS="SCREEN"
689
690 cdl_option CYGSEM_KERNEL_SCHED_MLQUEUE {     
691 ...     
692 # Flavor: bool     
693 # No user value, uncomment the following line to provide one.     
694 # user_value 1     
695 # value_source default     
696 # Default value: 1     
697 ... 
698 }; &#13;</PRE
699 ></TD
700 ></TR
701 ></TABLE
702 ><P
703 >Configurable entities can have one of four different flavors:
704 none, bool, data and booldata. Flavor none indicates that there
705 is no data associated with the entity, typically it just acts as
706 a placeholder in the overall hierarchy. Flavor bool is the most
707 common, it is a simple yes-or-no choice. Flavor data is for more
708 complicated configuration choices, for instance the size of an array
709 or the name of a device. Flavor booldata is a combination of bool
710 and data: the option can be enabled or disabled, and there is some
711 additional data associated with the option as well.</P
712 ><P
713 >In the above example the user has not modified this particular
714 option, as indicated by the comment and by the commented-out <TT
715 CLASS="LITERAL"
716 >user_value</TT
717 > line.
718 To disable this option the file should be edited to:</P
719 ><TABLE
720 BORDER="5"
721 BGCOLOR="#E0E0F0"
722 WIDTH="70%"
723 ><TR
724 ><TD
725 ><PRE
726 CLASS="SCREEN"
727 >&#13;cdl_option CYGSEM_KERNEL_SCHED_MLQUEUE {     
728 ...     
729 # Flavor: bool     
730 # No user value, uncomment the following line to provide one.     
731 user_value 0     
732 # value_source default     
733 # Default value: 1     
734 ... 
735 } &#13;</PRE
736 ></TD
737 ></TR
738 ></TABLE
739 ><P
740 >The comment preceding the <TT
741 CLASS="LITERAL"
742 >user_value
743 0</TT
744 > line can be removed if desired, otherwise it
745 will be removed automatically the next time the file is read and
746 updated by the configuration tools.</P
747 ><P
748 >Much the same process should be used for options with the
749 data flavor, for example:</P
750 ><TABLE
751 BORDER="5"
752 BGCOLOR="#E0E0F0"
753 WIDTH="70%"
754 ><TR
755 ><TD
756 ><PRE
757 CLASS="SCREEN"
758
759 cdl_option CYGNUM_LIBC_TIME_DST_DEFAULT_OFFSET {     
760 # Flavor: data     
761 # No user value, uncomment the following line to provide one.     
762 # user_value 3600     
763 # value_source default     
764 # Default value: 3600     
765 # Legal values: -90000 to 90000 
766 }; &#13;</PRE
767 ></TD
768 ></TR
769 ></TABLE
770 ><P
771 >can be changed to:</P
772 ><TABLE
773 BORDER="5"
774 BGCOLOR="#E0E0F0"
775 WIDTH="70%"
776 ><TR
777 ><TD
778 ><PRE
779 CLASS="SCREEN"
780 >&#13;cdl_option CYGNUM_LIBC_TIME_DST_DEFAULT_OFFSET {     
781 # Flavor: data     
782 user_value 7200     
783 # value_source default     
784 # Default value: 3600     
785 # Legal values: -90000 to 90000 }; &#13;</PRE
786 ></TD
787 ></TR
788 ></TABLE
789 ><P
790 >Note that the original text provides the default value in
791 the <TT
792 CLASS="LITERAL"
793 >user_value</TT
794 > comment,
795 on the assumption that the desired new value is likely to be similar
796 to the default value. The <TT
797 CLASS="LITERAL"
798 >value_source</TT
799 > comment
800 does not need to be updated, it will be fixed up if the savefile
801 is fed back into the configuration system and regenerated.</P
802 ><P
803 >For options with the booldata flavor, the <TT
804 CLASS="LITERAL"
805 >user_value</TT
806 > line
807 needs take two arguments. The first argument is for the boolean
808 part, the second for the data part. For example:</P
809 ><TABLE
810 BORDER="5"
811 BGCOLOR="#E0E0F0"
812 WIDTH="70%"
813 ><TR
814 ><TD
815 ><PRE
816 CLASS="SCREEN"
817
818 cdl_component CYGNUM_LIBM_COMPATIBILITY {     
819 # Flavor: booldata     
820 # No user value, uncomment the following line to provide one.    
821 # user_value 1 POSIX     
822 # value_source default     
823 # Default value: 1 POSIX     
824 # Legal values:  &#8220;POSIX&#8221; &#8220;IEEE&#8221; &#8220;XOPEN&#8221; &#8220;SVID&#8221;     
825 ... 
826 }; &#13;</PRE
827 ></TD
828 ></TR
829 ></TABLE
830 ><P
831 >could be changed to:</P
832 ><TABLE
833 BORDER="5"
834 BGCOLOR="#E0E0F0"
835 WIDTH="70%"
836 ><TR
837 ><TD
838 ><PRE
839 CLASS="SCREEN"
840
841 cdl_component CYGNUM_LIBM_COMPATIBILITY {     
842 # Flavor: booldata     
843 user_value 1 IEEE     
844 # value_source default     
845 # Default value: 1 POSIX     
846 # Legal values:  &#8220;POSIX&#8221; &#8220;IEEE&#8221; &#8220;XOPEN&#8221; &#8220;SVID&#8221;     
847 ... 
848 }; &#13;</PRE
849 ></TD
850 ></TR
851 ></TABLE
852 ><P
853 >or alternatively, if the whole component should be disabled,
854 to:</P
855 ><TABLE
856 BORDER="5"
857 BGCOLOR="#E0E0F0"
858 WIDTH="70%"
859 ><TR
860 ><TD
861 ><PRE
862 CLASS="SCREEN"
863
864 cdl_component CYGNUM_LIBM_COMPATIBILITY {     
865 # Flavor: booldata     
866 user_value 0 POSIX     
867 # value_source default     
868 # Default value: 1 POSIX     
869 # Legal values:  &#8220;POSIX&#8221; &#8220;IEEE&#8221; &#8220;XOPEN&#8221; &#8220;SVID&#8221;     
870 ... 
871 }; &#13;</PRE
872 ></TD
873 ></TR
874 ></TABLE
875 ><P
876 >Some options take values that span multiple lines. An example
877 would be:</P
878 ><TABLE
879 BORDER="5"
880 BGCOLOR="#E0E0F0"
881 WIDTH="70%"
882 ><TR
883 ><TD
884 ><PRE
885 CLASS="SCREEN"
886 >&#13;cdl_option CYGDAT_UITRON_MEMPOOLVAR_INITIALIZERS {     
887 # Flavor: data     
888 # No user value, uncomment the following line to provide one.     
889 # user_value \     
890 # &#8220;CYG_UIT_MEMPOOLVAR( vpool1, 2000 ), \\     
891 #  CYG_UIT_MEMPOOLVAR( vpool2, 2000 ), \\     
892 #  CYG_UIT_MEMPOOLVAR( vpool3, 2000 ),&#8221;     
893 # value_source default     
894 # Default value: \     
895 #     &#8220;CYG_UIT_MEMPOOLVAR( vpool1, 2000 ), \\     
896 #      CYG_UIT_MEMPOOLVAR( vpool2, 2000 ), \\     
897 #      CYG_UIT_MEMPOOLVAR( vpool3, 2000 ),&#8221; 
898 }; &#13;</PRE
899 ></TD
900 ></TR
901 ></TABLE
902 ><P
903 >Setting a user value for this option involves uncommenting
904 and modifying all relevant lines, for example:</P
905 ><TABLE
906 BORDER="5"
907 BGCOLOR="#E0E0F0"
908 WIDTH="70%"
909 ><TR
910 ><TD
911 ><PRE
912 CLASS="SCREEN"
913 >&#13;cdl_option CYGDAT_UITRON_MEMPOOLVAR_INITIALIZERS {     
914 # Flavor: data     
915 user_value \     
916 &#8220;CYG_UIT_MEMPOOLVAR( vpool1, 4000 ), \\      
917 CYG_UIT_MEMPOOLVAR( vpool2, 4000 ),&#8221;     
918 # value_source default     
919 # Default value: \     
920 #     &#8220;CYG_UIT_MEMPOOLVAR( vpool1, 2000 ), \\     
921 #      CYG_UIT_MEMPOOLVAR( vpool2, 2000 ), \\     
922 #      CYG_UIT_MEMPOOLVAR( vpool3, 2000 ),&#8221; 
923 }; &#13;</PRE
924 ></TD
925 ></TR
926 ></TABLE
927 ><P
928 >In such cases appropriate care has to be taken to preserve
929 Tcl syntax, as discussed below.</P
930 ><P
931 >The configuration system has the ability to keep track of
932           several different values for any given option. All options
933           start off with a default value, in other words their value
934           source is set to <TT
935 CLASS="LITERAL"
936 >default</TT
937 >. If a
938           configuration involves conflicts and the configuration
939           system&#8217;s inference engine is allowed to resolve these
940           automatically then it may provide an
941           <TT
942 CLASS="LITERAL"
943 >inferred</TT
944 > value instead, for
945           example:</P
946 ><TABLE
947 BORDER="5"
948 BGCOLOR="#E0E0F0"
949 WIDTH="70%"
950 ><TR
951 ><TD
952 ><PRE
953 CLASS="SCREEN"
954 >&#13;cdl_option CYGMFN_KERNEL_SYNCH_CONDVAR_TIMED_WAIT {     
955 # Flavor: bool     
956 # No user value, uncomment the following line to provide one.     
957 # user_value 1     
958 # The inferred value should not be edited directly.     
959 inferred_value 0     
960 # value_source inferred     
961 # Default value: 1     
962 ... 
963 }; &#13;</PRE
964 ></TD
965 ></TR
966 ></TABLE
967 ><P
968 >Inferred values are calculated by the configuration system
969 and should not be edited by the user. If the inferred value is not
970 correct then a user value should be substituted instead:</P
971 ><TABLE
972 BORDER="5"
973 BGCOLOR="#E0E0F0"
974 WIDTH="70%"
975 ><TR
976 ><TD
977 ><PRE
978 CLASS="SCREEN"
979 >&#13;cdl_option CYGMFN_KERNEL_SYNCH_CONDVAR_TIMED_WAIT {     
980 # Flavor: bool     
981 user_value 1     
982 # The inferred value should not be edited directly.     
983 inferred_value 0     
984 # value_source inferred     
985 # Default value: 1     
986 ... 
987 }; </PRE
988 ></TD
989 ></TR
990 ></TABLE
991 ><P
992 >The inference engine will not override a user value with an
993 inferred one. Making a change like this may well re-introduce a
994 conflict, since the inferred value was only calculated to resolve
995 a conflict. Another run of the inference engine may find a different
996 and more acceptable way of resolving the conflict, but this is not guaranteed
997 and it may be up to the user to examine the various dependencies
998 and work out an acceptable solution.</P
999 ><P
1000 >Inferred values are listed in the savefile because the exact
1001 inferred value may depend on the order in which changes were made
1002 and conflicts were resolved. If the inferred values were absent
1003 then it is possible that reloading a savefile would not exactly
1004 restore the configuration. Default values on the other hand are
1005 entirely deterministic so there is no actual need for the values
1006 to be listed in the savefile. However, the default value can be
1007 very useful information so it is provided in a comment.</P
1008 ><P
1009 >Occasionally the user will want to do some experimentation,
1010 and temporarily switch an option from a user value back to a default
1011 or inferred one to see what the effect would be. This could be achieved
1012 by simply commenting out the user value. For instance, if the current
1013 savefile contains:</P
1014 ><TABLE
1015 BORDER="5"
1016 BGCOLOR="#E0E0F0"
1017 WIDTH="70%"
1018 ><TR
1019 ><TD
1020 ><PRE
1021 CLASS="SCREEN"
1022
1023 cdl_option CYGMFN_KERNEL_SYNCH_CONDVAR_TIMED_WAIT {     
1024 # Flavor: bool     
1025 user_value 1     
1026 # The inferred value should not be edited directly.     
1027 inferred_value 0     
1028 # value_source user     
1029 # Default value: 1     
1030 ... 
1031 }; &#13;</PRE
1032 ></TD
1033 ></TR
1034 ></TABLE
1035 ><P
1036 >then the inferred value could be restored by commenting out
1037 or removing the <TT
1038 CLASS="LITERAL"
1039 >user_value</TT
1040 > line:</P
1041 ><TABLE
1042 BORDER="5"
1043 BGCOLOR="#E0E0F0"
1044 WIDTH="70%"
1045 ><TR
1046 ><TD
1047 ><PRE
1048 CLASS="SCREEN"
1049
1050 cdl_option CYGMFN_KERNEL_SYNCH_CONDVAR_TIMED_WAIT {     
1051 # Flavor: bool     
1052 # user_value 1     
1053 # The inferred value should not be edited directly.     
1054 inferred_value 0     
1055 # value_source user     
1056 # Default value: 1     
1057 ... 
1058 }; &#13;</PRE
1059 ></TD
1060 ></TR
1061 ></TABLE
1062 ><P
1063 >This is fine for simple values. However if the value is complicated
1064 then there is a problem: commenting out the <TT
1065 CLASS="LITERAL"
1066 >user_value</TT
1067 > line
1068 or lines means that the user value becomes invisible to the configuration system,
1069 so if the savefile is loaded and then regenerated the information
1070 will be lost. An alternative approach is to keep the <TT
1071 CLASS="LITERAL"
1072 >user_value</TT
1073 > but
1074 explicitly set the <TT
1075 CLASS="LITERAL"
1076 >value_source</TT
1077 > line,
1078 for example:</P
1079 ><TABLE
1080 BORDER="5"
1081 BGCOLOR="#E0E0F0"
1082 WIDTH="70%"
1083 ><TR
1084 ><TD
1085 ><PRE
1086 CLASS="SCREEN"
1087 >&#13;cdl_option CYGMFN_KERNEL_SYNCH_CONDVAR_TIMED_WAIT {     
1088 # Flavor: bool     
1089 user_value 1     
1090 # The inferred value should not be edited directly.     
1091 inferred_value 0     
1092 value_source inferred     
1093 # Default value: 1     
1094 ... 
1095 }; &#13;</PRE
1096 ></TD
1097 ></TR
1098 ></TABLE
1099 ><P
1100 >In this case the configuration system will use the inferred
1101 value for the purposes of dependency analysis etc., even though
1102 a user value is present. To restore the user value the <TT
1103 CLASS="LITERAL"
1104 >value_source</TT
1105 > line
1106 can be commented out again. If there is no explicit <TT
1107 CLASS="LITERAL"
1108 >value_source</TT
1109 > then
1110 the configuration system will just use the highest priority one:
1111 the user value if it exists; otherwise the inferred value if it
1112 exists; otherwise the default value which always exists.</P
1113 ><P
1114 >The default value for an option can be a simple constant,
1115 or it can be an expression involving other options. In the latter
1116 case the expression will be listed, together with the values for
1117 all options referenced in the expression and the current result
1118 of evaluating that expression. This is for informational purposes
1119 only, the default value is always recalculated deterministically
1120 when loading in a savefile.</P
1121 ><TABLE
1122 BORDER="5"
1123 BGCOLOR="#E0E0F0"
1124 WIDTH="70%"
1125 ><TR
1126 ><TD
1127 ><PRE
1128 CLASS="SCREEN"
1129 >&#13;cdl_option CYGBLD_GLOBAL_COMMAND_PREFIX {     
1130 # Flavor: data     
1131 # No user value, uncomment the following line to provide one.     
1132 # user_value arm-elf     
1133 # value_source default     
1134 # Default value:  CYGHWR_THUMB ? &#8220;thumb-elf&#8221; : &#8220;arm-elf&#8221;     
1135 #     CYGHWR_THUMB == 0     
1136 #   --&gt; arm-elf 
1137 }; &#13;</PRE
1138 ></TD
1139 ></TR
1140 ></TABLE
1141 ><P
1142 >For options with the data or booldata flavor, there are likely
1143 to be constraints on the possible values. If the value is supposed
1144 to be a number in a given range and a user value of &#8220;<TT
1145 CLASS="LITERAL"
1146 >hello
1147 world</TT
1148 >&#8221; is provided instead then there
1149 are likely to be compile-time failures. Component developers can
1150 specify constraints on the legal values, and these will be listed
1151 in the savefile.</P
1152 ><TABLE
1153 BORDER="5"
1154 BGCOLOR="#E0E0F0"
1155 WIDTH="70%"
1156 ><TR
1157 ><TD
1158 ><PRE
1159 CLASS="SCREEN"
1160
1161 cdl_option X_TLOSS {     
1162 # Flavor: data     
1163 # No user value, uncomment the following line to provide one.     
1164 # user_value 1.41484755040569E+16     
1165 # value_source default     
1166 # Default value: 1.41484755040569E+16     
1167 # Legal values: 1 to 1e308 
1168 };&#13;</PRE
1169 ></TD
1170 ></TR
1171 ></TABLE
1172 ><TABLE
1173 BORDER="5"
1174 BGCOLOR="#E0E0F0"
1175 WIDTH="70%"
1176 ><TR
1177 ><TD
1178 ><PRE
1179 CLASS="SCREEN"
1180 >cdl_component CYGNUM_LIBM_COMPATIBILITY {     
1181 # Flavor: booldata     
1182 # No user value, uncomment the following line to provide one.     
1183 # user_value 1 POSIX     
1184 # value_source default     
1185 # Default value: 1 POSIX     
1186 # Legal values:  &#8220;POSIX&#8221; &#8220;IEEE&#8221; &#8220;XOPEN&#8221; &#8220;SVID&#8221;     
1187 ... 
1188 };&#13;</PRE
1189 ></TD
1190 ></TR
1191 ></TABLE
1192 ><P
1193 >In some cases the legal values list may be an expression involving
1194 other options. If so then the current values of the referenced options
1195 will be listed, together with the result of evaluating the list
1196 expression, just as for default value expressions.</P
1197 ><P
1198 >If an illegal value is provided then this will result in a
1199 conflict, listed in the conflicts section of the savefile. For more
1200 complicated options a simple legal values list is not sufficient
1201 to allow the current value to be validated, and the configuration
1202 system will be unable to flag conflicts. This issue will be addressed in
1203 future releases of the configuration system.</P
1204 ><P
1205 >Following the value-related fields for a given option, any <SPAN
1206 CLASS="emphasis"
1207 ><I
1208 CLASS="EMPHASIS"
1209 >requires</I
1210 ></SPAN
1211 > constraints belonging
1212 to this option will be listed. These constraints are only effective
1213 if the option is active and, for bool and booldata flavors, enabled.
1214 If some aspect of <SPAN
1215 CLASS="PRODUCTNAME"
1216 >eCos</SPAN
1217 > functionality is inactive or disabled then
1218 it cannot impose any constraints on the rest of the system. As usual,
1219 the full expression will be listed followed by the current values
1220 of all options that are referenced and the result of evaluating
1221 the expression:</P
1222 ><TABLE
1223 BORDER="5"
1224 BGCOLOR="#E0E0F0"
1225 WIDTH="70%"
1226 ><TR
1227 ><TD
1228 ><PRE
1229 CLASS="SCREEN"
1230 >&#13;cdl_option CYGSEM_LIBC_TIME_TIME_WORKING {     
1231 ...     
1232 # Requires: CYGPKG_DEVICES_WALLCLOCK     
1233 #     CYGPKG_DEVICES_WALLCLOCK == current     
1234 #   --&gt; 1 
1235 };&#13;</PRE
1236 ></TD
1237 ></TR
1238 ></TABLE
1239 ><P
1240 >When modifying the value of an option it is useful to know
1241 not only what constraints the option imposes on the rest of the
1242 system but also what other options in the system depend in some
1243 way on this one. The savefile provides this information:</P
1244 ><TABLE
1245 BORDER="5"
1246 BGCOLOR="#E0E0F0"
1247 WIDTH="70%"
1248 ><TR
1249 ><TD
1250 ><PRE
1251 CLASS="SCREEN"
1252 >cdl_option CYGFUN_KERNEL_THREADS_TIMER {     
1253 ...     
1254 # The following properties are affected by this value     
1255 # option CYGMFN_KERNEL_SYNCH_CONDVAR_TIMED_WAIT     
1256 #     Requires: CYGFUN_KERNEL_THREADS_TIMER     
1257 # option CYGIMP_UITRON_STRICT_CONFORMANCE     
1258 #     Requires: CYGFUN_KERNEL_THREADS_TIMER     
1259 # option CYGSEM_LIBC_TIME_CLOCK_WORKING     
1260 #     Requires: CYGFUN_KERNEL_THREADS_TIMER 
1261 }; &#13;</PRE
1262 ></TD
1263 ></TR
1264 ></TABLE
1265 ></DIV
1266 ><DIV
1267 CLASS="SECT2"
1268 ><H2
1269 CLASS="SECT2"
1270 ><A
1271 NAME="AEN2847">Tcl Syntax</H2
1272 ><P
1273 ><SPAN
1274 CLASS="PRODUCTNAME"
1275 >eCos</SPAN
1276 > savefiles are implemented as Tcl scripts, and are read
1277 in by running the data through a standard Tcl interpreter that has
1278 been extended with a small number of additional commands such as <TT
1279 CLASS="LITERAL"
1280 >cdl_option</TT
1281 > and <TT
1282 CLASS="LITERAL"
1283 >cdl_configuration</TT
1284 >.
1285 In many cases this is an implementation detail that can be safely
1286 ignored while editing a savefile: simply replacing a <TT
1287 CLASS="LITERAL"
1288 >1</TT
1289 > with
1290 a <TT
1291 CLASS="LITERAL"
1292 >0</TT
1293 > to disable some functionality
1294 is not going to affect whether or not the savefile is still a valid
1295 Tcl script and can be processed by a Tcl interpreter. However, there
1296 are more complicated cases where an understanding of Tcl syntax
1297 is at least desirable, for example:</P
1298 ><TABLE
1299 BORDER="5"
1300 BGCOLOR="#E0E0F0"
1301 WIDTH="70%"
1302 ><TR
1303 ><TD
1304 ><PRE
1305 CLASS="SCREEN"
1306 >&#13;cdl_option CYGDAT_UITRON_MEMPOOLVAR_EXTERNS {
1307      # Flavor: data
1308      user_value \
1309       &#8220;static char vpool1\[ 2000 \], \\
1310       vpool2\[ 2000 \], \\
1311        vpool3\[ 2000 \];&#8221;     
1312 # value_source default     
1313 # Default value: \
1314      #     &#8220;static char vpool1\[ 2000 \], \\
1315      #      vpool2\[ 2000 \], \\
1316     #      vpool3\[ 2000 \];&#8221; 
1317 };&#13;</PRE
1318 ></TD
1319 ></TR
1320 ></TABLE
1321 ><P
1322 >The backslash at the end of the <TT
1323 CLASS="LITERAL"
1324 >user_value</TT
1325 > line
1326 is processed by the Tcl interpreter as a line continuation character.
1327 The quote marks around the user data are also interpreted by the
1328 Tcl interpreter and serve to turn the entire data field into a single
1329 argument. The backslashes preceding the opening and closing square
1330 brackets prevent the Tcl interpreter from treating these characters
1331 specially, otherwise there would be an attempt at <SPAN
1332 CLASS="emphasis"
1333 ><I
1334 CLASS="EMPHASIS"
1335 >command
1336 substitution</I
1337 ></SPAN
1338 > as described below. The double backslashes
1339 at the end of each line of the data will be turned into a single
1340 backslash by the Tcl interpreter, rather than escaping the newline
1341 character, so that the actual data seen by the configuration system
1342 is:</P
1343 ><TABLE
1344 BORDER="5"
1345 BGCOLOR="#E0E0F0"
1346 WIDTH="70%"
1347 ><TR
1348 ><TD
1349 ><PRE
1350 CLASS="SCREEN"
1351 >&#13;static char vpool1[ 2000 ], \
1352       vpool2[ 2000 ], \
1353       vpool3[ 2000 ];&#13;</PRE
1354 ></TD
1355 ></TR
1356 ></TABLE
1357 ><P
1358 >This is of course the data that should end up in the &micro;ITRON
1359 configuration header file. The opening and closing braces surrounding
1360 the entire body of the option data are also significant and cause
1361 this body to be passed as a single argument to the <B
1362 CLASS="COMMAND"
1363 >cdl_option</B
1364 > command.
1365 The closing semicolon is optional in this example, but provides
1366 a small amount of additional robustness if the savefile is edited
1367 such that it is no longer a valid Tcl script. If the data contained
1368 any <TT
1369 CLASS="LITERAL"
1370 >$</TT
1371 > characters then
1372 these would have to be treated specially as well, via a backslash escape.</P
1373 ><P
1374 >In spite of what all the above might seem to suggest, Tcl
1375 is actually a very simple yet powerful scripting language: the syntax
1376 is defined by just eleven rules. On occasion this simplicity means
1377 that Tcl&#8217;s behaviour is subtly different from other languages,
1378 which can confuse newcomers.</P
1379 ><P
1380 >When the Tcl interpreter is passed some data such as <TT
1381 CLASS="LITERAL"
1382 >puts
1383 Hello</TT
1384 >, it splits this data into a command and its
1385 arguments. The command will be terminated by a newline or by a semicolon,
1386 unless one of the quoting mechanisms is used. The command and each
1387 of its arguments are separated by white space. So in the following
1388 example:</P
1389 ><TABLE
1390 BORDER="5"
1391 BGCOLOR="#E0E0F0"
1392 WIDTH="70%"
1393 ><TR
1394 ><TD
1395 ><PRE
1396 CLASS="SCREEN"
1397 >puts Hello 
1398 set x 42 </PRE
1399 ></TD
1400 ></TR
1401 ></TABLE
1402 ><P
1403 >will result in two separate commands being executed. The first
1404 command is <TT
1405 CLASS="LITERAL"
1406 >puts</TT
1407 > and is passed a
1408 single argument, <TT
1409 CLASS="LITERAL"
1410 >Hello</TT
1411 >. The second
1412 command is <TT
1413 CLASS="LITERAL"
1414 >set</TT
1415 > and is passed two
1416 arguments, <TT
1417 CLASS="LITERAL"
1418 >x</TT
1419 > and <TT
1420 CLASS="LITERAL"
1421 >42</TT
1422 >.
1423 The intervening newline character serves to terminate the first
1424 command, and a semi-colon separator could be used instead: </P
1425 ><TABLE
1426 BORDER="5"
1427 BGCOLOR="#E0E0F0"
1428 WIDTH="70%"
1429 ><TR
1430 ><TD
1431 ><PRE
1432 CLASS="PROGRAMLISTING"
1433 >puts Hello;set x 42</PRE
1434 ></TD
1435 ></TR
1436 ></TABLE
1437 ><P
1438 >Any white space surrounding the semicolon is just ignored
1439 because it does not serve to separate arguments.</P
1440 ><P
1441 >Now consider the following:</P
1442 ><TABLE
1443 BORDER="5"
1444 BGCOLOR="#E0E0F0"
1445 WIDTH="70%"
1446 ><TR
1447 ><TD
1448 ><PRE
1449 CLASS="SCREEN"
1450 >set x Hello world</PRE
1451 ></TD
1452 ></TR
1453 ></TABLE
1454 ><P
1455 >This is not valid Tcl. It is an attempt to invoke the <TT
1456 CLASS="LITERAL"
1457 >set</TT
1458 > command
1459 with three arguments: <TT
1460 CLASS="LITERAL"
1461 >x</TT
1462 >, <TT
1463 CLASS="LITERAL"
1464 >Hello</TT
1465 >,
1466 and <TT
1467 CLASS="LITERAL"
1468 >world</TT
1469 >. The <TT
1470 CLASS="LITERAL"
1471 >set</TT
1472 > only
1473 takes two arguments, a variable name and a value, so it is necessary
1474 to combine the data into a single argument by quoting:</P
1475 ><TABLE
1476 BORDER="5"
1477 BGCOLOR="#E0E0F0"
1478 WIDTH="70%"
1479 ><TR
1480 ><TD
1481 ><PRE
1482 CLASS="PROGRAMLISTING"
1483 >set x &#8220;Hello world&#8221;</PRE
1484 ></TD
1485 ></TR
1486 ></TABLE
1487 ><P
1488 >When the Tcl interpreter encounters the first quote character
1489 it treats all subsequent data up to but not including the closing
1490 quote as part of the current argument. The quote marks are removed
1491 by the interpreter, so the second argument passed to the <TT
1492 CLASS="LITERAL"
1493 >set</TT
1494 > command
1495 is just <TT
1496 CLASS="LITERAL"
1497 >Hello world</TT
1498 > without the
1499 quote characters. This can be significant in the context of <SPAN
1500 CLASS="PRODUCTNAME"
1501 >eCos</SPAN
1502 > savefiles.
1503 For instance, consider the following configuration option:</P
1504 ><TABLE
1505 BORDER="5"
1506 BGCOLOR="#E0E0F0"
1507 WIDTH="70%"
1508 ><TR
1509 ><TD
1510 ><PRE
1511 CLASS="SCREEN"
1512 >&#13;cdl_option CYGDAT_LIBC_STDIO_DEFAULT_CONSOLE {     
1513 # Flavor: data     
1514 # No user value, uncomment the following line to provide one.     
1515 # user_value &#8220;\&#8221;/dev/ttydiag\&#8221;&#8221;     
1516 # value_source default     
1517 # Default value: &#8220;\&#8221;/dev/ttydiag\&#8221;&#8221; 
1518 }; &#13;</PRE
1519 ></TD
1520 ></TR
1521 ></TABLE
1522 ><P
1523 >The desired value of the configuration option should be a
1524 valid C string, complete with quote characters. If the savefile
1525 was edited to: </P
1526 ><TABLE
1527 BORDER="5"
1528 BGCOLOR="#E0E0F0"
1529 WIDTH="70%"
1530 ><TR
1531 ><TD
1532 ><PRE
1533 CLASS="SCREEN"
1534 >&#13;cdl_option CYGDAT_LIBC_STDIO_DEFAULT_CONSOLE {     
1535 # Flavor: data     
1536 user_value &#8220;/dev/ttydiag&#8221;     
1537 # value_source default     
1538 # Default value: &#8220;\&#8221;/dev/ttydiag\&#8221;&#8221; 
1539 }; &#13;</PRE
1540 ></TD
1541 ></TR
1542 ></TABLE
1543 ><P
1544 >then the Tcl interpreter would remove the quote marks when
1545 the savefile is read back in, so the option&#8217;s value would
1546 not have any quote marks and would not be a valid C string. The
1547 configuration system is not yet able to perform the required validation
1548 so the following <TT
1549 CLASS="LITERAL"
1550 >#define</TT
1551 > would
1552 be generated in the configuration header file:</P
1553 ><TABLE
1554 BORDER="5"
1555 BGCOLOR="#E0E0F0"
1556 WIDTH="70%"
1557 ><TR
1558 ><TD
1559 ><PRE
1560 CLASS="PROGRAMLISTING"
1561 >#define CYGDAT_LIBC_STDIO_DEFAULT_CONSOLE /dev/ttydiag </PRE
1562 ></TD
1563 ></TR
1564 ></TABLE
1565 ><P
1566 >This is likely to cause a compile-time failure when building
1567 <SPAN
1568 CLASS="PRODUCTNAME"
1569 >eCos</SPAN
1570 >.</P
1571 ><P
1572 >A quoted argument continues until the closing quote character
1573 is encountered, which means that it can span multiple lines. This
1574 can also be encountered in <SPAN
1575 CLASS="PRODUCTNAME"
1576 >eCos</SPAN
1577 > savefiles, for instance, in the <TT
1578 CLASS="LITERAL"
1579 >CYGDAT_UITRON_MEMPOOLVAR_EXTERNS</TT
1580 > example
1581 mentioned earlier. Newline or semicolon characters do not terminate
1582 the current command in such cases.</P
1583 ><P
1584 >The Tcl interpreter supports much the same forms of backslash
1585 substitution as other common programming languages. Some backslash
1586 sequences such as <TT
1587 CLASS="LITERAL"
1588 >\n</TT
1589 > will
1590 be replaced by the appropriate character. The sequence <TT
1591 CLASS="LITERAL"
1592 >\\</TT
1593 > will
1594 be replaced by a single backslash. A backslash at the very end of
1595 a line will cause that backslash, the newline character, and any
1596 white space at the start of the next line to be replaced by a single
1597 space. Hence the following two Tcl commands are equivalent:</P
1598 ><TABLE
1599 BORDER="5"
1600 BGCOLOR="#E0E0F0"
1601 WIDTH="70%"
1602 ><TR
1603 ><TD
1604 ><PRE
1605 CLASS="PROGRAMLISTING"
1606 >puts  &#8220;Hello\nworld\n&#8221; 
1607 puts \ 
1608 &#8220;Hello 
1609 world 
1610 &#8220;</PRE
1611 ></TD
1612 ></TR
1613 ></TABLE
1614 ><P
1615 >In addition to quote and backslash characters, the Tcl interpreter
1616 treats square brackets, the <TT
1617 CLASS="LITERAL"
1618 >$</TT
1619 > character,
1620 and braces specially. Square brackets are used for command substitution,
1621 for example:</P
1622 ><TABLE
1623 BORDER="5"
1624 BGCOLOR="#E0E0F0"
1625 WIDTH="70%"
1626 ><TR
1627 ><TD
1628 ><PRE
1629 CLASS="PROGRAMLISTING"
1630 >puts &#8220;The answer is [expr 6 * 9]&#8221;</PRE
1631 ></TD
1632 ></TR
1633 ></TABLE
1634 ><P
1635 >When the Tcl interpreter encounters the square brackets it
1636 will treat the contents as another command that should be executed
1637 first, and the result of executing that is used when continuing
1638 to process the script. In this case the Tcl interpreter will execute
1639 the command <TT
1640 CLASS="LITERAL"
1641 >expr 6 * 9</TT
1642 >,
1643 yielding a result of 54, and then the Tcl interpreter will execute
1644 <TT
1645 CLASS="LITERAL"
1646 >puts &#8220;The answer is 54&#8221;</TT
1647 >. It should be noted that
1648 the interpreter contains only one level of substitution: if the
1649 result of performing command substitution performs further special
1650 characters such as square brackets then these will not be treated
1651 specially.</P
1652 ><P
1653 >Command line substitution is very unlikely to prove useful
1654 in the context of an <SPAN
1655 CLASS="PRODUCTNAME"
1656 >eCos</SPAN
1657 > savefile, but it is part of the Tcl language
1658 and hence cannot be easily suppressed while reading in a savefile.
1659 As a result care has to be taken when savefile data involves square
1660 brackets. Consider the following:</P
1661 ><TABLE
1662 BORDER="5"
1663 BGCOLOR="#E0E0F0"
1664 WIDTH="70%"
1665 ><TR
1666 ><TD
1667 ><PRE
1668 CLASS="PROGRAMLISTING"
1669 >&#13;cdl_option CYGDAT_UITRON_MEMPOOLFIXED_EXTERNS {
1670      ...
1671      user_value \ 
1672 &#8220;static char fpool1[ 2000 ], 
1673 fpool2[ 2000 ];&#8221;
1674      ... 
1675 };</PRE
1676 ></TD
1677 ></TR
1678 ></TABLE
1679 ><P
1680 >The Tcl interpreter will interpret the square brackets as
1681 an attempt at command substitution and hence it will attempt to
1682 execute the command <TT
1683 CLASS="LITERAL"
1684 >2000</TT
1685 > with no
1686 arguments. No such command is defined by the Tcl language or by
1687 the savefile-related extensions provided by the configuration system,
1688 so this will result in an error when an attempt is made to read
1689 back the savefile. Instead it is necessary to backslash-escape the
1690 square brackets and thus suppress command substitution:</P
1691 ><TABLE
1692 BORDER="5"
1693 BGCOLOR="#E0E0F0"
1694 WIDTH="70%"
1695 ><TR
1696 ><TD
1697 ><PRE
1698 CLASS="PROGRAMLISTING"
1699 >&#13;cdl_option CYGDAT_UITRON_MEMPOOLFIXED_EXTERNS {
1700      ...
1701      user_value \ 
1702 &#8220;static char fpool1\[ 2000 \], 
1703 fpool2\[ 2000 \];&#8221;
1704      ... 
1705 }; </PRE
1706 ></TD
1707 ></TR
1708 ></TABLE
1709 ><P
1710 >Similarly the <TT
1711 CLASS="LITERAL"
1712 >$</TT
1713 > character
1714 is used in Tcl scripts to perform variable substitution:</P
1715 ><TABLE
1716 BORDER="5"
1717 BGCOLOR="#E0E0F0"
1718 WIDTH="70%"
1719 ><TR
1720 ><TD
1721 ><PRE
1722 CLASS="PROGRAMLISTING"
1723 >set x [expr 6 * 9] 
1724 puts &#8220;The answer is $x&#8221; </PRE
1725 ></TD
1726 ></TR
1727 ></TABLE
1728 ><P
1729 >Variable substitution, like command substitution, is very
1730 unlikely to prove useful in the context of an <SPAN
1731 CLASS="PRODUCTNAME"
1732 >eCos</SPAN
1733 > savefile. Should
1734 it be necessary to have a <TT
1735 CLASS="LITERAL"
1736 >$</TT
1737 > character
1738 in configuration data then again a backslash escape needs to be
1739 used.</P
1740 ><TABLE
1741 BORDER="5"
1742 BGCOLOR="#E0E0F0"
1743 WIDTH="70%"
1744 ><TR
1745 ><TD
1746 ><PRE
1747 CLASS="PROGRAMLISTING"
1748 >cdl_option FOODAT_MONITOR_PROMPT {
1749      ...
1750      user_value &#8220;\$ &#8220;
1751      ... 
1752 };</PRE
1753 ></TD
1754 ></TR
1755 ></TABLE
1756 ><P
1757 >Braces are used to collect a sequence of characters into a
1758 single argument, just like quotes. The difference is that variable,
1759 command and backslash substitution do not occur inside braces (with
1760 the sole exception of backslash substitution at the end of a line).
1761 So, for example, the <TT
1762 CLASS="LITERAL"
1763 >CYGDAT_UITRON_MEMPOOL_EXTERNFIXED_EXTERNS</TT
1764 > value
1765 could be written as:</P
1766 ><TABLE
1767 BORDER="5"
1768 BGCOLOR="#E0E0F0"
1769 WIDTH="70%"
1770 ><TR
1771 ><TD
1772 ><PRE
1773 CLASS="PROGRAMLISTING"
1774 >cdl_option CYGDAT_UITRON_MEMPOOLFIXED_EXTERNS {
1775      ...
1776      user_value \ 
1777 {static char fpool1[ 2000 ], 
1778 fpool2[ 2000 ];}
1779      ... 
1780 };</PRE
1781 ></TD
1782 ></TR
1783 ></TABLE
1784 ><P
1785 >The configuration system does not use this when generating
1786 savefiles because for simple edits of a savefile by inexperienced
1787 users the use of brace characters is likely to be a little bit more
1788 confusing than the use of quotes.</P
1789 ><P
1790 >At this stage it is worth noting that the basic format of
1791 each configuration option in the savefile makes use of braces:</P
1792 ><TABLE
1793 BORDER="5"
1794 BGCOLOR="#E0E0F0"
1795 WIDTH="70%"
1796 ><TR
1797 ><TD
1798 ><PRE
1799 CLASS="PROGRAMLISTING"
1800 >cdl_option &lt;name&gt; {
1801      ... 
1802 };</PRE
1803 ></TD
1804 ></TR
1805 ></TABLE
1806 ><P
1807 >The configuration system extends the Tcl language with a small
1808 number of additional commands such as <TT
1809 CLASS="LITERAL"
1810 >cdl_option</TT
1811 >.
1812 These commands take two arguments, a name and a body, where the
1813 body consists of all the text between the braces. First a check
1814 is made that the specified option is actually present in the configuration.
1815 Then the body is executed in a recursive invocation of the Tcl interpreter,
1816 this time with additional commands such as <TT
1817 CLASS="LITERAL"
1818 >user_value</TT
1819 > and <TT
1820 CLASS="LITERAL"
1821 >value_source</TT
1822 >.
1823 If, after editing, the braces are not correctly matched up then
1824 the savefile will no longer be a valid Tcl script and errors will
1825 be reported when the savefile is loaded again.</P
1826 ><P
1827 >Comments in Tcl scripts are introduced by a hash character <TT
1828 CLASS="LITERAL"
1829 >#</TT
1830 >.
1831 However, a hash character only introduces a comment if it occurs
1832 where a command is expected. Consider the following:</P
1833 ><TABLE
1834 BORDER="5"
1835 BGCOLOR="#E0E0F0"
1836 WIDTH="70%"
1837 ><TR
1838 ><TD
1839 ><PRE
1840 CLASS="PROGRAMLISTING"
1841 ># This is a comment 
1842 puts &#8220;Hello&#8221; # world </PRE
1843 ></TD
1844 ></TR
1845 ></TABLE
1846 ><P
1847 >The first line is a valid comment, since the hash character
1848 occurs right at the start where a command name is expected. The
1849 second line does not contain a comment. Instead it is an attempt
1850 to invoke the <TT
1851 CLASS="LITERAL"
1852 >puts</TT
1853 > command with
1854 three arguments: <TT
1855 CLASS="LITERAL"
1856 >Hello</TT
1857 >, <TT
1858 CLASS="LITERAL"
1859 >#</TT
1860 > and <TT
1861 CLASS="LITERAL"
1862 >world</TT
1863 >.
1864 These are not valid arguments for the <TT
1865 CLASS="LITERAL"
1866 >puts</TT
1867 > command
1868 so an error will be raised.</P
1869 ><P
1870 >If the second line was rewritten as:</P
1871 ><TABLE
1872 BORDER="5"
1873 BGCOLOR="#E0E0F0"
1874 WIDTH="70%"
1875 ><TR
1876 ><TD
1877 ><PRE
1878 CLASS="PROGRAMLISTING"
1879 >puts &#8220;Hello&#8221;; # world</PRE
1880 ></TD
1881 ></TR
1882 ></TABLE
1883 ><P
1884 >then this is a valid Tcl script. The semicolon identifies
1885 the end of the current command, so the hash character occurs at
1886 a point where the next command would start and hence it is interpreted
1887 as the start of a comment.</P
1888 ><P
1889 >This handling of comments can lead to subtle behaviour. Consider
1890 the following:</P
1891 ><TABLE
1892 BORDER="5"
1893 BGCOLOR="#E0E0F0"
1894 WIDTH="70%"
1895 ><TR
1896 ><TD
1897 ><PRE
1898 CLASS="PROGRAMLISTING"
1899 >cdl_option WHATEVER {
1900      # This is a comment }
1901      user_value 42
1902      ... 
1903 }</PRE
1904 ></TD
1905 ></TR
1906 ></TABLE
1907 ><P
1908 >Consider the way the Tcl interpreter processes this. The command
1909 name and the first argument do not pose any special difficulties.
1910 The opening brace is interpreted as the start of the next argument,
1911 which continues until a closing brace is encountered. In this case
1912 the closing brace occurs on the second line, so the second argument
1913 passed to <TT
1914 CLASS="LITERAL"
1915 >cdl_option</TT
1916 > is <TT
1917 CLASS="LITERAL"
1918 >\n # This is a comment</TT
1919 > . This second argument
1920 is processed in a recursive invocation of the Tcl interpreter and
1921 does not contain any commands, just a comment. Toplevel savefile
1922 processing then resumes, and the next command that is encountered
1923 is <TT
1924 CLASS="LITERAL"
1925 >user_value</TT
1926 >. Since the
1927 relevant savefile code is not currently processing a configuration
1928 option this is an error. Later on the Tcl interpreter would encounter
1929 a closing brace by itself, which is also an error. Fortunately this
1930 sequence of events is very unlikely to occur when editing generated
1931 savefiles.</P
1932 ><P
1933 >This should be sufficient information about Tcl to allow for
1934 safe editing of <SPAN
1935 CLASS="PRODUCTNAME"
1936 >eCos</SPAN
1937 > savefiles. Further information is available
1938 from a wide variety of sources, for example the book <SPAN
1939 CLASS="emphasis"
1940 ><I
1941 CLASS="EMPHASIS"
1942 >Tcl
1943 and the Tk Toolkit </I
1944 ></SPAN
1945 >by John K Ousterhout.</P
1946 ></DIV
1947 ></DIV
1948 ><DIV
1949 CLASS="NAVFOOTER"
1950 ><HR
1951 ALIGN="LEFT"
1952 WIDTH="100%"><TABLE
1953 SUMMARY="Footer navigation table"
1954 WIDTH="100%"
1955 BORDER="0"
1956 CELLPADDING="0"
1957 CELLSPACING="0"
1958 ><TR
1959 ><TD
1960 WIDTH="33%"
1961 ALIGN="left"
1962 VALIGN="top"
1963 ><A
1964 HREF="fine-grained-configuration.html"
1965 ACCESSKEY="P"
1966 >Prev</A
1967 ></TD
1968 ><TD
1969 WIDTH="34%"
1970 ALIGN="center"
1971 VALIGN="top"
1972 ><A
1973 HREF="ecos-user-guide.html"
1974 ACCESSKEY="H"
1975 >Home</A
1976 ></TD
1977 ><TD
1978 WIDTH="33%"
1979 ALIGN="right"
1980 VALIGN="top"
1981 ><A
1982 HREF="editing-the-sources.html"
1983 ACCESSKEY="N"
1984 >Next</A
1985 ></TD
1986 ></TR
1987 ><TR
1988 ><TD
1989 WIDTH="33%"
1990 ALIGN="left"
1991 VALIGN="top"
1992 >Fine-grained Configuration</TD
1993 ><TD
1994 WIDTH="34%"
1995 ALIGN="center"
1996 VALIGN="top"
1997 ><A
1998 HREF="manual-configuration.html"
1999 ACCESSKEY="U"
2000 >Up</A
2001 ></TD
2002 ><TD
2003 WIDTH="33%"
2004 ALIGN="right"
2005 VALIGN="top"
2006 >Editing the Sources</TD
2007 ></TR
2008 ></TABLE
2009 ></DIV
2010 ></BODY
2011 ></HTML
2012 >