Mercurial > ecos-v3_0-branch
view host/libcdl/doc/reference.sgml @ 2863:7d8c61e6225c default tip
* Added execute permissions to files missed in conversion from CVS
| author | alexs |
|---|---|
| date | Thu, 26 Mar 2009 20:39:18 +0000 |
| parents | 74dbf4c3f2e1 |
| children |
line wrap: on
line source
<!-- {{{ Banner --> <!-- =============================================================== --> <!-- --> <!-- reference.sgml --> <!-- --> <!-- The man pages. --> <!-- --> <!-- =============================================================== --> <!-- ####ECOSDOCCOPYRIGHTBEGIN#### --> <!-- =============================================================== --> <!-- Copyright (C) 2000, 2001, 2002 Free Software Foundation, Inc. --> <!-- This material may be distributed only subject to the terms --> <!-- and conditions set forth in the Open Publication License, v1.0 --> <!-- or later (the latest version is presently available at --> <!-- http://www.opencontent.org/openpub/) --> <!-- Distribution of the work or derivative of the work in any --> <!-- standard (paper) book form is prohibited unless prior --> <!-- permission obtained from the copyright holder --> <!-- =============================================================== --> <!-- ####ECOSDOCCOPYRIGHTEND#### --> <!-- =============================================================== --> <!-- #####DESCRIPTIONBEGIN#### --> <!-- --> <!-- Author(s): bartv --> <!-- Contact(s): bartv --> <!-- Date: 2000/02/06 --> <!-- Version: 0.01 --> <!-- --> <!-- ####DESCRIPTIONEND#### --> <!-- =============================================================== --> <!-- }}} --> <chapter id="reference"> <title>CDL Language Specification</title> <para> This chapter contains reference information for the main &CDL; commands &cdl-option;, &cdl-component;, &cdl-package; and &cdl-interface;, followed by the various properties such as &active-if; and &compile; in alphabetical order. </para> <!-- {{{ cdl_option --> <refentry id="ref.cdl-option"> <refmeta> <refentrytitle>&cdl-option;</refentrytitle> </refmeta> <refnamediv> <refname>Command &cdl-option;</refname> <refpurpose>Define a single configuration option</refpurpose> </refnamediv> <refsynopsisdiv> <synopsis> cdl_option <name> { … } </synopsis> </refsynopsisdiv> <refsect1><title>Description</title> <para> The option is the basic unit of configurability. Generally each option corresponds to a single user choice. Typically there is a certain amount of information associated with an option to assist the user in manipulating that option, for example a textual description. There will also be some limits on the possible values that the user can choose, so an option may be a simple yes-or-no choice or it may be something more complicated such as an array size or a device name. Options may have associated constraints, so if that option is enabled then certain conditions have to satisfied elsewhere in the configuration. Options usually have direct consequences such as preprocessor <literal>#define</literal> symbols in a configuration header file. </para> <para> &cdl-option; is implemented as a Tcl command that takes two arguments, a name and a body. The name must be a valid C preprocessor identifier: a sequence of upper or lower case letters, digits or underscores, starting with a non-digit character; identifiers beginning with an underscore should normally be avoided because they may clash with system packages or with identifiers reserved for use by the compiler. Within a single configuration, names must be unique. If a configuration contained two packages which defined the same entity <literal>CYGIMP_SOME_OPTION</literal>, any references to that entity in a &requires; property or any other expression would be ambiguous. It is possible for a given name to be used by two different packages if those packages should never be loaded into a single configuration. For example, architectural HAL packages are allowed to re-use names because a single configuration cannot target two different architectures. For a recommended naming convention see <xref linkend="package.contents">. </para> <para> The second argument to <literal>cdl_option</literal> is a body of properties, typically surrounded by braces so that the Tcl interpreter treats it as a single argument. This body will be processed by a recursive invocation of the Tcl interpreter, extended with additional commands for the various properties that are allowed inside a &cdl-option;. The valid properties are: </para> <variablelist TermLength=16> <varlistentry><term><link linkend="ref.active-if">&active-if;</link></term> <listitem><para> Allow additional control over the active state of this option. </para></listitem></varlistentry> <varlistentry><term><link linkend="ref.calculated">&calculated;</link></term> <listitem><para> The option's value is not directly user-modifiable, it is calculated using a suitable CDL expression. </para></listitem></varlistentry> <varlistentry><term><link linkend="ref.compile">&compile;</link></term> <listitem><para> List the source files that should be built if this option is active and enabled. </para></listitem></varlistentry> <varlistentry><term><link linkend="ref.default-value">&default-value;</link></term> <listitem><para> Provide a default value for this option using a CDL expression. </para></listitem></varlistentry> <varlistentry><term><link linkend="ref.define">&define;</link></term> <listitem><para> Specify additional <literal>#define</literal> symbols that should go into the owning package's configuration header file. </para></listitem></varlistentry> <varlistentry><term><link linkend="ref.define-format">&define-format;</link></term> <listitem><para> Control how the option's value will appear in the configuration header file. </para></listitem></varlistentry> <varlistentry><term><link linkend="ref.define-proc">&define-proc;</link></term> <listitem><para> Use a fragment of Tcl code to output additional data to configuration header files. </para></listitem></varlistentry> <varlistentry><term><link linkend="ref.description">&description;</link></term> <listitem><para> Provide a textual description for this option. </para></listitem></varlistentry> <varlistentry><term><link linkend="ref.display">&display;</link></term> <listitem><para> Provide a short string describing this option. </para></listitem></varlistentry> <varlistentry><term><link linkend="ref.doc">&doc;</link></term> <listitem><para> The location of on-line documentation for this option. </para></listitem></varlistentry> <varlistentry><term><link linkend="ref.flavor">&flavor;</link></term> <listitem><para> Specify the nature of this option. </para></listitem></varlistentry> <varlistentry><term><link linkend="ref.if-define">&if-define;</link></term> <listitem><para> Output a common preprocessor construct to a configuration header file. </para></listitem></varlistentry> <varlistentry><term><link linkend="ref.implements">&implements;</link></term> <listitem><para> Enabling this option provides one instance of a more general interface. </para></listitem></varlistentry> <varlistentry><term><link linkend="ref.legal-values">&legal-values;</link></term> <listitem><para> Impose constraints on the possible values for this option. </para></listitem></varlistentry> <varlistentry><term><link linkend="ref.make">&make;</link></term> <listitem><para> An additional custom build step associated with this option, resulting in a target that should not go directly into a library. </para></listitem></varlistentry> <varlistentry><term><link linkend="ref.make-object">&make-object;</link></term> <listitem><para> An additional custom build step associated with this option, resulting in an object file that should go into a library. </para></listitem></varlistentry> <varlistentry><term><link linkend="ref.no-define">&no-define;</link></term> <listitem><para> Suppress the normal generation of a preprocessor <literal>#define</literal> symbol in a configuration header file. </para></listitem></varlistentry> <varlistentry><term><link linkend="ref.parent">&parent;</link></term> <listitem><para> Control the location of this option in the configuration hierarchy. </para></listitem></varlistentry> <varlistentry><term><link linkend="ref.requires">&requires;</link></term> <listitem><para> List constraints that the configuration should satisfy if this option is active and enabled. </para></listitem></varlistentry> </variablelist> </refsect1> <refsect1><title>Example</title> <programlisting format="linespecific" width=72> cdl_option CYGDBG_INFRA_DEBUG_PRECONDITIONS { display "Preconditions" default_value 1 description " This option allows individual control of preconditions. A precondition is one type of assert, which it is useful to control separately from more general asserts. The function is CYG_PRECONDITION(condition,msg)." } </programlisting> </refsect1> <refsect1><title>See Also</title> <para> Command <link linkend="ref.cdl-component">&cdl-component;</link>, command <link linkend="ref.cdl-package">&cdl-package;</link>, command <link linkend="ref.cdl-interface">&cdl-interface;</link>. </para> </refsect1> </refentry> <!-- }}} --> <!-- {{{ cdl_component --> <refentry id="ref.cdl-component"> <refmeta> <refentrytitle>&cdl-component;</refentrytitle> </refmeta> <refnamediv> <refname>Command &cdl-component;</refname> <refpurpose>Define a component, a collection of configuration options</refpurpose> </refnamediv> <refsynopsisdiv> <synopsis> cdl_component <name> { … } </synopsis> </refsynopsisdiv> <refsect1><title>Description</title> <para> A component is a configuration option that can contain additional options and sub-components. The body of a &cdl-component; can contain the same properties as that of a &cdl-option;. There is an additional property, &script; which allows configuration data to be split into multiple files. It is also possible for a component body to include &cdl-component;, &cdl-option; and &cdl-interface; entities that should go below this component in the configuration hierarchy. </para> <para> &cdl-component; is implemented as a Tcl command that takes two arguments, a name and a body. The name must be a valid C preprocessor identifier: a sequence of upper or lower case letters, digits or underscores, starting with a non-digit character; identifiers beginning with an underscore should normally be avoided because they may clash with system packages or with identifiers reserved for use by the compiler. Within a single configuration, names must be unique. If a configuration contained two packages which defined the same entity <literal>CYGIMP_SOME_OPTION</literal>, any references to that entity in a &requires; property or any other expression would be ambiguous. It is possible for a given name to be used by two different packages if those packages should never be loaded into a single configuration. For example, architectural HAL packages are allowed to re-use certain names because a single configuration cannot target two different architectures. For a recommended naming convention see <xref linkend="package.contents">. </para> <para> The second argument to &cdl-component; is a body of properties and other commands, typically surrounded by braces so that the Tcl interpreter treats it as a single argument. This body will be processed by a recursive invocation of the Tcl interpreter, extended with additional commands for the various properties that are allowed inside a &cdl-component;. The valid commands are: </para> <variablelist TermLength=16> <varlistentry><term><link linkend="ref.active-if">&active-if;</link></term> <listitem><para> Allow additional control over the active state of this component. </para></listitem></varlistentry> <varlistentry><term><link linkend="ref.calculated">&calculated;</link></term> <listitem><para> The component's value is not directly user-modifiable, it is calculated using a suitable CDL expression. </para></listitem></varlistentry> <varlistentry><term><link linkend="ref.cdl-component">&cdl-component</link></term> <listitem><para> Define a sub-component. </para></listitem></varlistentry> <varlistentry><term><link linkend="ref.cdl-interface">&cdl-interface;</link></term> <listitem><para> Define an interface which should appear immediately below this component in the configuration hierarchy. </para></listitem></varlistentry> <varlistentry><term><link linkend="ref.cdl-option">&cdl-option;</link></term> <listitem><para> Define a configuration option which should appear immediately below this component in the configuration hierarchy. </para></listitem></varlistentry> <varlistentry><term><link linkend="ref.compile">&compile;</link></term> <listitem><para> List the source files that should be built if this component is active and enabled. </para></listitem></varlistentry> <varlistentry><term><link linkend="ref.default-value">&default-value;</link></term> <listitem><para> Provide a default value for this component using a CDL expression. </para></listitem></varlistentry> <varlistentry><term><link linkend="ref.define">&define;</link></term> <listitem><para> Specify additional <literal>#define</literal> symbols that should go into the owning package's configuration header file. </para></listitem></varlistentry> <varlistentry><term><link linkend="ref.define-format">&define-format;</link></term> <listitem><para> Control how the component's value will appear in the configuration header file. </para></listitem></varlistentry> <varlistentry><term><link linkend="ref.define-proc">&define-proc;</link></term> <listitem><para> Use a fragment of Tcl code to output additional data to configuration header files. </para></listitem></varlistentry> <varlistentry><term><link linkend="ref.description">&description;</link></term> <listitem><para> Provide a textual description for this component. </para></listitem></varlistentry> <varlistentry><term><link linkend="ref.display">&display;</link></term> <listitem><para> Provide a short string describing this component. </para></listitem></varlistentry> <varlistentry><term><link linkend="ref.doc">&doc;</link></term> <listitem><para> The location of on-line documentation for this component. </para></listitem></varlistentry> <varlistentry><term><link linkend="ref.flavor">&flavor;</link></term> <listitem><para> Specify the nature of this component. </para></listitem></varlistentry> <varlistentry><term><link linkend="ref.if-define">&if-define;</link></term> <listitem><para> Output a common preprocessor construct to a configuration header file. </para></listitem></varlistentry> <varlistentry><term><link linkend="ref.implements">&implements;</link></term> <listitem><para> Enabling this component provides one instance of a more general interface. </para></listitem></varlistentry> <varlistentry><term><link linkend="ref.legal-values">&legal-values;</link></term> <listitem><para> Impose constraints on the possible values for this component. </para></listitem></varlistentry> <varlistentry><term><link linkend="ref.make">&make;</link></term> <listitem><para> An additional custom build step associated with this component, resulting in a target that should not go directly into a library. </para></listitem></varlistentry> <varlistentry><term><link linkend="ref.make-object">&make-object;</link></term> <listitem><para> An additional custom build step associated with this component, resulting in an object file that should go into a library. </para></listitem></varlistentry> <varlistentry><term><link linkend="ref.no-define">&no-define;</link></term> <listitem><para> Suppress the normal generation of a preprocessor <literal>#define</literal> symbol in a configuration header file. </para></listitem></varlistentry> <varlistentry><term><link linkend="ref.parent">&parent;</link></term> <listitem><para> Control the location of this component in the configuration hierarchy. </para></listitem></varlistentry> <varlistentry><term><link linkend="ref.requires">&requires;</link></term> <listitem><para> List constraints that the configuration should satisfy if this component is active and enabled. </para></listitem></varlistentry> <varlistentry><term><link linkend="ref.script">&script;</link></term> <listitem><para> Include additional configuration information from another CDL script </para></listitem></varlistentry> </variablelist> </refsect1> <refsect1><title>Example</title> <para> <programlisting format="linespecific" width=72> cdl_component CYGDBG_USE_ASSERTS { display "Use asserts" default_value 1 description " If this component is enabled, assertions in the code are tested at run-time. Assert functions (CYG_ASSERT()) are defined in 'include/cyg/infra/cyg_ass.h' within the 'install' tree. If the component is disabled, these result in no additional object code and no checking of the asserted conditions." script assert.cdl } </programlisting> </para> </refsect1> <refsect1><title>See Also</title> <para> Command <link linkend="ref.cdl-option">&cdl-option;</link>, command <link linkend="ref.cdl-package">&cdl-package;</link>, command <link linkend="ref.cdl-interface">&cdl-interface;</link>. </para> </refsect1> </refentry> <!-- }}} --> <!-- {{{ cdl_package --> <refentry id="ref.cdl-package"> <refmeta> <refentrytitle>&cdl-package;</refentrytitle> </refmeta> <refnamediv> <refname>Command &cdl-package;</refname> <refpurpose>Define a package, a component that can be distributed</refpurpose> </refnamediv> <refsynopsisdiv> <synopsis> cdl_package <name> { … } </synopsis> </refsynopsisdiv> <refsect1><title>Description</title> <para> A package is a unit of distribution. It is also a configuration option in that users can choose whether or not a particular package is loaded into the configuration, and which version of that package should be loaded. It is also a component in that it can contain additional components and options in a hierarchy. </para> <para> The top-level &CDL; script for a package should begin with a &cdl-package; command. This can contain most of the properties that can be used in a &cdl-option; command, and a number of additional ones which apply to a package as a whole. It is also possible to include &cdl-component;, &cdl-interface; and &cdl-option; commands in the body of a package. However all configuration entities that occur at the top level of the script containing the &cdl-package; command are automatically placed below that package in the configuration hierarchy, so putting them inside the body has no effect. </para> <para> The following properties cannot be used in the body of a &cdl-package; command: </para> <variablelist TermLength=16> <varlistentry><term>&flavor;</term> <listitem><para> Packages always have the flavor <literal>booldata</literal>. </para></listitem></varlistentry> <varlistentry><term>&default-value;</term> <listitem><para> The value of a package is its version number. This is specified at the time the package is loaded into the configuration, and cannot be calculated afterwards. Typically the most recent version of the package will be loaded. </para></listitem></varlistentry> <varlistentry><term>&legal-values;</term> <listitem><para> The legal values list for a given package is determined by which versions of that package are installed in the component repository, and cannot be further constrained in the CDL scripts. </para></listitem></varlistentry> <varlistentry><term>&calculated;</term> <listitem><para> The value of a package is always selected at the time that it is loaded into the configuration, and cannot be re-calculated afterwards. </para></listitem></varlistentry> <varlistentry><term>&script;</term> <listitem><para> This would be redundant since the CDL script containing the &cdl-package; command acts as that package's script. </para></listitem></varlistentry> </variablelist> <para> &cdl-package; is implemented as a Tcl command that takes two arguments, a name and a body. The name must be a valid C preprocessor identifier: a sequence of upper or lower case letters, digits or underscores, starting with a non-digit character; identifiers beginning with an underscore should normally be avoided because they may clash with system packages or with identifiers reserved for use by the compiler. Packages should always have unique names within a given component repository. For a recommended naming convention see <xref linkend="package.contents">. </para> <para> The second argument to &cdl-package; is a body of properties and other commands, typically surrounded by braces so that the Tcl interpreter treats it as a single argument. This body will be processed by a recursive invocation of the Tcl interpreter, extended with additional commands for the various properties that are allowed inside a &cdl-package;. The valid commands are: </para> <variablelist TermLength=16> <varlistentry><term><link linkend="ref.active-if">&active-if;</link></term> <listitem><para> Allow additional control over the active state of this package. </para></listitem></varlistentry> <varlistentry><term><link linkend="ref.cdl-component">&cdl-component;</link></term> <listitem><para> Define a component which should appear immediately below this package in the configuration hierarchy. </para></listitem></varlistentry> <varlistentry><term><link linkend="ref.cdl-interface">&cdl-interface;</link></term> <listitem><para> Define an interface which should appear immediately below this package in the configuration hierarchy. </para></listitem></varlistentry> <varlistentry><term><link linkend="ref.cdl-option">&cdl-option;</link></term> <listitem><para> Define an option which should appear immediately below this package in the configuration hierarchy. </para></listitem></varlistentry> <varlistentry><term><link linkend="ref.compile">&compile;</link></term> <listitem><para> List the source files that should be built for this package. </para></listitem></varlistentry> <varlistentry><term><link linkend="ref.define">&define;</link></term> <listitem><para> Specify additional <literal>#define</literal> symbols that should go into the package's configuration header file. </para></listitem></varlistentry> <varlistentry><term><link linkend="ref.define-format">&define-format;</link></term> <listitem><para> Control how the package's value will appear in the global configuration header file <filename class="headerfile">pkgconf/system.h</filename> </para></listitem></varlistentry> <varlistentry><term><link linkend="ref.define-header">&define-header;</link></term> <listitem><para> Specify the configuration header file that will be generated for this package. </para></listitem></varlistentry> <varlistentry><term><link linkend="ref.define-proc">&define-proc;</link></term> <listitem><para> Use a fragment of Tcl code to output additional data to configuration header files. </para></listitem></varlistentry> <varlistentry><term><link linkend="ref.description">&description;</link></term> <listitem><para> Provide a textual description for this component. </para></listitem></varlistentry> <varlistentry><term><link linkend="ref.display">&display;</link></term> <listitem><para> Provide a short string describing this component. </para></listitem></varlistentry> <varlistentry><term><link linkend="ref.doc">&doc;</link></term> <listitem><para> The location of on-line documentation for this component. </para></listitem></varlistentry> <varlistentry><term><link linkend="ref.hardware">&hardware;</link></term> <listitem><para> This package is tied to specific hardware. </para></listitem></varlistentry> <varlistentry><term><link linkend="ref.if-define">&if-define;</link></term> <listitem><para> Output a common preprocessor construct to a configuration header file. </para></listitem></varlistentry> <varlistentry><term><link linkend="ref.implements">&implements;</link></term> <listitem><para> Enabling this component provides one instance of a more general interface. </para></listitem></varlistentry> <varlistentry><term><link linkend="ref.include-dir">&include-dir;</link></term> <listitem><para> Specify the desired location of this package's exported header files in the install tree. </para></listitem></varlistentry> <varlistentry><term><link linkend="ref.include-files">&include-files;</link></term> <listitem><para> List the header files that are exported by this package. </para></listitem></varlistentry> <varlistentry><term><link linkend="ref.library">&library;</link></term> <listitem><para> Specify which library should contain the object files generated by building this package. </para></listitem></varlistentry> <varlistentry><term><link linkend="ref.make">&make;</link></term> <listitem><para> An additional custom build step associated with this component, resulting in a target that should not go directly into a library. </para></listitem></varlistentry> <varlistentry><term><link linkend="ref.make-object">&make-object;</link></term> <listitem><para> An additional custom build step associated with this component, resulting in an object file that should go into a library. </para></listitem></varlistentry> <varlistentry><term><link linkend="ref.no-define">&no-define;</link></term> <listitem><para> Suppress the normal generation of the package's <literal>#define</literal> in the global configuration header file <filename class="headerfile">pkgconf/system.h</filename>. </para></listitem></varlistentry> <varlistentry><term><link linkend="ref.parent">&parent;</link></term> <listitem><para> Control the location of this package in the configuration hierarchy. </para></listitem></varlistentry> <varlistentry><term><link linkend="ref.requires">&requires;</link></term> <listitem><para> List constraints that the configuration should satisfy if this package is active. </para></listitem></varlistentry> </variablelist> </refsect1> <refsect1><title>Example</title> <programlisting format="linespecific" width=72> cdl_package CYGPKG_INFRA { display "Infrastructure" include_dir cyg/infra description " Common types and useful macros. Tracing and assertion facilities. Package startup options." compile startup.cxx prestart.cxx pkgstart.cxx userstart.cxx \ dummyxxmain.cxx null.cxx simple.cxx fancy.cxx buffer.cxx \ diag.cxx tcdiag.cxx memcpy.c memset.c delete.cxx } </programlisting> </refsect1> <refsect1><title>See Also</title> <para> Command <link linkend="ref.cdl-option">&cdl-option;</link>, command <link linkend="ref.cdl-component">&cdl-component;</link>, command <link linkend="ref.cdl-interface">&cdl-interface;</link>. </para> </refsect1> </refentry> <!-- }}} --> <!-- {{{ cdl_interface --> <refentry id="ref.cdl-interface"> <refmeta> <refentrytitle>&cdl-interface;</refentrytitle> </refmeta> <refnamediv> <refname>Command &cdl-interface;</refname> <refpurpose>Define an interface, functionality that can be provided by a number of different implementations.</refpurpose> </refnamediv> <refsynopsisdiv> <synopsis> cdl_interface <name> { … } </synopsis> </refsynopsisdiv> <refsect1><title>Description</title> <para> An interface is a special type of calculated configuration option. It provides an abstraction mechanism that is often useful in &CDL; expressions. As an example, suppose that some package relies on the presence of code that implements the standard kernel scheduling interface. However the requirement is no more stringent than this, so the constraint can be satisfied by the mlqueue scheduler, the bitmap scheduler, or any additional schedulers that may get implemented in future. A first attempt at expressing the dependency might be: </para> <programlisting width=72> requires CYGSEM_KERNEL_SCHED_MLQUEUE || CYGSEM_KERNEL_SCHED_BITMAP </programlisting> <para> This constraint is limited, it may need to be changed if a new scheduler were to be added to the system. Interfaces provide a way of expressing more general relationships: </para> <programlisting width=72> requires CYGINT_KERNEL_SCHEDULER </programlisting> <para> The interface <literal>CYGINT_KERNEL_SCHEDULER</literal> is <emphasis>implemented</emphasis> by both the mlqueue and bitmap schedulers, and may be implemented by future schedulers as well. The value of an interface is the number of implementors that are active and enabled, so in a typical configuration only one scheduler will be in use and the value of the interface will be <literal>1</literal>. If all schedulers are disabled then the interface will have a value <literal>0</literal> and the &requires; constraint will not be satisfied. </para> <para> Some component writers may prefer to use the first &requires; constraint on the grounds that the code will only have been tested with the mlqueue and bitmap schedulers and cannot be guaranteed to work with any new schedulers. Other component writers may take a more optimistic view and assume that their code will work with any scheduler until proven otherwise. </para> <para> Interfaces must be defined in CDL scripts, just like options, components and packages. This involves the command &cdl-interface; which takes two arguments, a name and a body. The name must be a valid C preprocessor identifier: a sequence of upper or lower case letters, digits or underscores, starting with a non-digit character; identifiers beginning with an underscore should normally be avoided because they may clash with system packages or with identifiers reserved for use by the compiler. Within a single configuration, names must be unique. If a configuration contained two packages which defined the same entity <literal>CYGIMP_SOME_OPTION</literal>, any references to that entity in a &requires; property or any other expression would be ambiguous. It is possible for a given name to be used by two different packages if those packages should never be loaded into a single configuration. For example, architectural HAL packages are allowed to re-use names because a single configuration cannot target two different architectures. For a recommended naming convention see <xref linkend="package.contents">. </para> <para> The second argument to &cdl-interface; is a body of properties, typically surrounded by braces so that the Tcl interpreter treats it as a single argument. This body will be processed by a recursive invocation of the Tcl interpreter, extended with additional commands for the various properties that are allowed inside a &cdl-interface;. The valid properties are a subset of those for a &cdl-option;. </para> <variablelist TermLength=16> <varlistentry><term><link linkend="ref.active-if">&active-if;</link></term> <listitem><para> Allow additional control over the active state of this interface. </para></listitem></varlistentry> <varlistentry><term><link linkend="ref.compile">&compile;</link></term> <listitem><para> List the source files that should be built if this interface is active. </para></listitem></varlistentry> <varlistentry><term><link linkend="ref.define">&define;</link></term> <listitem><para> Specify additional <literal>#define</literal> symbols that should go into the owning package's configuration header file. </para></listitem></varlistentry> <varlistentry><term><link linkend="ref.define-format">&define-format;</link></term> <listitem><para> Control how the interface's value will appear in the configuration header file. </para></listitem></varlistentry> <varlistentry><term><link linkend="ref.define-proc">&define-proc;</link></term> <listitem><para> Use a fragment of Tcl code to output additional data to configuration header files. </para></listitem></varlistentry> <varlistentry><term><link linkend="ref.description">&description;</link></term> <listitem><para> Provide a textual description for this interface. </para></listitem></varlistentry> <varlistentry><term><link linkend="ref.display">&display;</link></term> <listitem><para> Provide a short string describing this interface. </para></listitem></varlistentry> <varlistentry><term><link linkend="ref.doc">&doc;</link></term> <listitem><para> The location of on-line documentation for this interface. </para></listitem></varlistentry> <varlistentry><term><link linkend="ref.flavor">&flavor;</link></term> <listitem><para> Interfaces have the <literal>data</literal> flavor by default, but they can also be given the <literal>bool</literal> or <literal>booldata</literal> flavor when necessary. A <literal>bool</literal> interface is disabled if there are no active and enabled implementors, otherwise it is enabled. A <literal>booldata</literal> interface is also disabled if there are no active and enabled implementors, otherwise it is enabled and the data is a number corresponding to the number of these implementors. </para></listitem></varlistentry> <varlistentry><term><link linkend="ref.if-define">&if-define;</link></term> <listitem><para> Output a common preprocessor construct to a configuration header file. </para></listitem></varlistentry> <varlistentry><term><link linkend="ref.implements">&implements;</link></term> <listitem><para> If this interface is active it provides one instance of a more general interface. </para></listitem></varlistentry> <varlistentry><term><link linkend="ref.legal-values">&legal-values;</link></term> <listitem><para> Interfaces always have a small numerical value. The &legal-values; can be used to apply additional constraints such as an upper limit. </para></listitem></varlistentry> <varlistentry><term><link linkend="ref.make">&make;</link></term> <listitem><para> An additional custom build step associated with this option, resulting in a target that should not go directly into a library. </para></listitem></varlistentry> <varlistentry><term><link linkend="ref.make-object">&make-object;</link></term> <listitem><para> An additional custom build step associated with this option, resulting in an object file that should go into a library. </para></listitem></varlistentry> <varlistentry><term><link linkend="ref.no-define">&no-define;</link></term> <listitem><para> Suppress the normal generation of a preprocessor <literal>#define</literal> symbol in a configuration header file. </para></listitem></varlistentry> <varlistentry><term><link linkend="ref.parent">&parent;</link></term> <listitem><para> Control the location of this option in the configuration hierarchy. </para></listitem></varlistentry> <varlistentry><term><link linkend="ref.requires">&requires;</link></term> <listitem><para> List constraints that the configuration should satisfy if this option is active and enabled. </para></listitem></varlistentry> </variablelist> <para> A number of properties are not applicable to interfaces: </para> <variablelist> <varlistentry><term><link linkend="ref.calculated">&calculated;</link></term> <listitem><para> Interfaces are always calculated, based on the number of active and enabled entities that implement the interface. </para></listitem></varlistentry> <varlistentry><term><link linkend="ref.default-value">&default-value;</link></term> <listitem><para> Interface values are calculated so a &default-value; property would be meaningless. </para></listitem></varlistentry> </variablelist> <para> Interfaces are not containers, so they cannot hold other entities such as options or components. </para> <para> A commonly used constraint on interface values takes the form: </para> <programlisting width=72> requires CYGINT_KERNEL_SCHEDULER == 1 </programlisting> <para> This constraint specifies that there can be only one scheduler in the system. In some circumstances it is possible for the configuration tools to detect this pattern and act accordingly, so for example enabling the bitmap scheduler would automatically disable the mlqueue scheduler. </para> </refsect1> <refsect1><title>Example</title> <programlisting width=72> cdl_interface CYGINT_KERNEL_SCHEDULER { display "Number of schedulers in this configuration" requires 1 == CYGINT_KERNEL_SCHEDULER } </programlisting> </refsect1> <refsect1><title>See Also</title> <para> Property <link linkend="ref.implements">&implements;</link>, command <link linkend="ref.cdl-option">&cdl-option;</link>. command <link linkend="ref.cdl-component">&cdl-component;</link>, command <link linkend="ref.cdl-package">&cdl-package;</link>. </para> </refsect1> </refentry> <!-- }}} --> <!-- {{{ active_if --> <refentry id="ref.active-if"> <refmeta> <refentrytitle>&active-if;</refentrytitle> </refmeta> <refnamediv> <refname>Property &active-if;</refname> <refpurpose>Allow additional control over the active state of an option or other CDL entity.</refpurpose> </refnamediv> <refsynopsisdiv> <synopsis> cdl_option <name> { active_if <condition> … } </synopsis> </refsynopsisdiv> <refsect1><title>Description</title> <para> Configuration options or other entities may be either active or inactive. Typically this is controlled by the option's location in the overall hierarchy. Consider the option <literal>CYGDBG_INFRA_DEBUG_PRECONDITIONS</literal>, which exists below the component <literal>CYGDBG_USE_ASSERT</literal>. If the whole component is disabled then the options it contains are inactive: there is no point in enabling preconditions unless there is generic assertion support; any &requires; constraints associated with preconditions are irrelevant; any &compile; property or other build-related property is ignored. </para> <para> In some cases the hierarchy does not provide sufficient control over whether or not a particular option should be active. For example, the math library could have support for floating point exceptions which is only worthwhile if the hardware implements appropriate functionality, as specified by the architectural HAL. The relevant math library configuration options should remain below the <literal>CYGPKG_LIBM</literal> package in the overall hierarchy, but should be inactive unless there is appropriate hardware support. In cases like this an &active-if; property is appropriate. </para> <para> Another common use of &active-if; properties is to avoid excessive nesting in the configuration hierarchy. If some option B is only relevant if option A is enabled, it is possible to turn A into a component that contains B. However adding another level to the hierarchy for a component which will contain just one entry may be considered excessive. In such cases it is possible for B to have an &active-if; dependency on A. </para> <para> &active-if; takes a goal expression as argument. For details of goal expression syntax see <xref linkend="language.goal-expression">. In most cases the goal expression will be very simple, often involving just one other option, but more complicated expressions can be used when appropriate. It is also possible to have multiple &active-if; conditions in a single option, in which case all of the conditions have to be satisfied if the option is to be active. </para> <para> The &active-if; and &requires; properties have certain similarities, but they serve a different purpose. Suppose there are two options A and B, and option B relies on functionality provided by A. This could be expressed as either <literal>active_if A</literal> or as <literal>requires A</literal>. The points to note are: </para> <itemizedlist> <listitem><para> If <literal>active_if A</literal> is used and A is disabled or inactive, then graphical tools will generally prevent any attempt at modifying B. For example the text for B could be grayed out, and the associated checkbutton (if B is a boolean option) would be disabled. If the user needs the functionality provided by option B then it is necessary to go to option A first and manipulate it appropriately. </para></listitem> <listitem><para> If <literal>requires A</literal> is used and A is disabled or inactive, graphical tools will still allow B to be manipulated and enabled. This would result in a new conflict which may get resolved automatically or which may need user intervention. </para></listitem> <listitem><para> If there are hardware dependencies then an &active-if; condition is usually the preferred approach. There is no point in allowing the user to manipulate a configuration option if the corresponding functionality cannot possibly work on the currently-selected hardware. Much the same argument applies to coarse-grained dependencies, for example if an option depends on the presence of a TCP/IP stack then an <literal>active_if CYGPKG_NET</literal> condition is appropriate: it may be possible to satisfy the condition, but it requires the fairly drastic step of loading another package; further more, if the user wanted a TCP/IP stack in the configuration then it would probably have been loaded already. </para></listitem> <listitem><para> If option B exists to provide additional debugging information about the functionality provided by A then again an &active-if; constraint is appropriate. There is no point in letting users enable extra debugging facilities for a feature that is not actually present. </para></listitem> <listitem><para> The configuration system's inference engine will cope equally well with &active-if; and &requires; properties. Suppose there is a conflict because some third option depends on B. If B is <literal>active_if A</literal> then the inference engine will attempt to make A active and enabled, and then to enable B if necessary. If B <literal>requires A</literal> then the inference engine will attempt to enable B and resolve the resulting conflict by causing A to be both active and enabled. Although the inference occurs in a different order, in most cases the effect will be the same. </para></listitem> </itemizedlist> </refsect1> <refsect1><title>Example</title> <programlisting width=72> # Do not provide extra semaphore debugging if there are no semaphores cdl_option CYGDBG_KERNEL_INSTRUMENT_BINSEM { active_if CYGPKG_KERNEL_SYNCH … } # Avoid another level in the configuration hierarchy cdl_option CYGSEM_KERNEL_SYNCH_MUTEX_PRIORITY_INHERITANCE_SIMPLE_RELAY { active_if CYGSEM_KERNEL_SYNCH_MUTEX_PRIORITY_INHERITANCE_SIMPLE … } # Functionality that is only relevant if another package is loaded cdl_option CYGSEM_START_UITRON_COMPATIBILITY { active_if CYGPKG_UITRON … } # Check that the hardware or HAL provide the appropriate functionality cdl_option CYGDBG_HAL_DEBUG_GDB_BREAK_SUPPORT { active_if CYGINT_HAL_DEBUG_GDB_STUBS_BREAK … } </programlisting> </refsect1> <refsect1><title>See Also</title> <para> Property <link linkend="ref.requires">&requires;</link>. </para> </refsect1> </refentry> <!-- }}} --> <!-- {{{ calculated --> <refentry id="ref.calculated"> <refmeta> <refentrytitle>&calculated;</refentrytitle> </refmeta> <refnamediv> <refname>Property &calculated;</refname> <refpurpose>Used if the current option's value is not user-modifiable, but is calculated using a suitable CDL expression.</refpurpose> </refnamediv> <refsynopsisdiv> <synopsis> cdl_option <name> { calculated <expression> … } </synopsis> </refsynopsisdiv> <refsect1><title>Description</title> <para> In some cases it is useful to have a configuration option whose value cannot be modified directly by the user. This can be achieved using a &calculated;, which takes a CDL expression as argument (see <xref linkend="language.expression"> for a description of expression syntax). The configuration system evaluates the expression when the current package is loaded and whenever there is a change to any other option referenced in the expression. The result depends on the option's flavor: </para> <variablelist TermLength=16> <varlistentry><term><literal>flavor none</literal></term> <listitem><para> Options with this flavor have no value, so the &calculated; property is not applicable. </para></listitem></varlistentry> <varlistentry><term><literal>flavor bool</literal></term> <listitem><para> If the expression evaluates to a non-zero result the option is enabled, otherwise it is disabled. </para></listitem></varlistentry> <varlistentry><term><literal>flavor booldata</literal></term> <listitem><para> If the result of evaluating the expression is zero then the option is disabled, otherwise the option is enabled and its value is the result. </para></listitem></varlistentry> <varlistentry><term><literal>flavor data</literal></term> <listitem><para> The value of the option is the result of evaluating the expression. </para></listitem></varlistentry> </variablelist> <para> There are a number of valid uses for calculated options, and there are also many cases where some other CDL facility would be more appropriate. Valid uses of calculated options include the following: </para> <itemizedlist> <listitem><para> On some target hardware a particular feature may be user-configurable, while on other targets it is fixed. For example some processors can operate in either big-endian or little-endian mode, while other processors do not provide any choice. It is possible to have an option <literal>CYGARC_BIGENDIAN</literal> which is calculated in some architectural HAL packages but user-modifiable in others. </para></listitem> <listitem><para> Calculated options can provide an alternative way for one package to affect the behavior of another one. Suppose a package may provide two possible implementations, a preferred one involving self-modifying code and a slower alternative. If the system involves a ROM bootstrap then the slower alternative must be used, but it would be inappropriate to modify the startup option in every HAL to impose constraints on this package. Instead it is possible to have a calculated option whose value is <literal>{ CYG_HAL_STARTUP == "ROM" }</literal>, and which has appropriate consequences. Arguably this is a spurious example, and it should be a user choice whether or not to use self-modifying code with a &default-value; based on <literal>CYG_HAL_STARTUP</literal>, but that is for the component writer to decide. </para></listitem> <listitem><para> Sometimes it should be possible to perform a particular test at compile-time, for example by using a C preprocessor <literal>#if</literal> construct. However the preprocessor has only limited functionality, for example it cannot perform string comparisons. CDL expressions are more powerful. </para></listitem> <listitem><para> Occasionally a particular sub-expression may occur multiple times in a CDL script. If the sub-expression is sufficiently complex then it may be worthwhile to have a calculated option whose value is the sub-expression, and then reference that calculated option in the appropriate places. </para></listitem> </itemizedlist> <para> Alternatives to using calculated options include the following: </para> <itemizedlist> <listitem><para> CDL <link linkend="language.interface">interfaces</link> are a form of calculated option intended as an abstraction mechanism. An interface can be used to express the concept of <emphasis>any scheduler</emphasis>, as opposed to a specific one such as the bitmap scheduler. </para></listitem> <listitem><para> If a calculated option would serve only to add additional information to a configuration header file, it may be possible to achieve the same effect using a <link linkend="ref.define-proc">&define-proc</link> property or one of the other properties related to header file generation. </para></listitem> </itemizedlist> <tip> <para> If the first entry in a &calculated; expression is a negative number, for example <literal>calculated -1</literal> then this can be misinterpreted as an option instead of as part of the expression. Currently the &calculated; property does not take any options, but this may change in future. Option processing halts at the sequence <literal>--</literal>, so the desired value can be expressed safely using <literal>calculated -- -1</literal> </para> </tip> <warning> <para> Some of the CDL scripts in current &eCos; releases make excessive use of calculated options. This is partly because the recommended alternatives were not always available at the time the scripts were written. It is also partly because there is still some missing functionality, for example &define-proc; properties cannot yet access the configuration data so it may be necessary to use &calculated; properties to access the data and perform the desired manipulation via a &CDL; expression. New scripts should use calculated options only in accordance with the guidelines. </para> </warning> <note> <para> For options with the booldata flavor the current CDL syntax does not allow the enabled flag and the value to be calculated separately. Functionality to permit this may be added in a future release. </para> </note> <note> <para> It has been suggested that having options which are not user-modifiable is potentially confusing, and that a top-level <literal>cdl_constant</literal> command should be added to the language instead of or in addition to the &calculated; property. Such a change is under consideration. However because the value of a calculated option can depend on other options, it is not necessarily constant. </para> </note> </refsect1> <refsect1><title>Example</title> <programlisting width=72> # A constant on some target hardware, perhaps user-modifiable on other # targets. cdl_option CYGNUM_HAL_RTC_PERIOD { display "Real-time clock period" flavor data calculated 12500 } </programlisting> </refsect1> <refsect1><title>See Also</title> <para> Properties <link linkend="ref.default-value">&default-value;</link>, <link linkend="ref.flavor">&flavor;</link> and <link linkend="ref.legal-values">&legal-values;</link>, </para> </refsect1> </refentry> <!-- }}} --> <!-- {{{ compile --> <refentry id="ref.compile"> <refmeta> <refentrytitle>&compile;</refentrytitle> </refmeta> <refnamediv> <refname>Property &compile;</refname> <refpurpose>List the source files that should be built if this option is active and enabled.</refpurpose> </refnamediv> <refsynopsisdiv> <synopsis> cdl_option <name> { compile [-library=libxxx.a] <list of files> … } </synopsis> </refsynopsisdiv> <refsect1><title>Description</title> <para> The &compile; property allows component developers to specify source files which should be compiled and added to one of the target libraries. Usually each source file will end up the library <filename>libtarget.a</filename>. It is possible for component writers to specify an alternative library for an entire package using the <link linkend="ref.library">&library;</link> property. Alternatively the desired library can be specified on the &compile; line itself. For example, to add a particular source file to the <filename>libextras.a</filename> library the following could be used: </para> <programlisting width=72> cdl_package CYGPKG_IO_SERIAL { … compile -library=libextras.a common/tty.c } </programlisting> <para> Details of the build process including such issues as compiler flags and the order in which things happen can be found in <xref linkend="build">. </para> <para> &compile; properties can occur in any of &cdl-option;, &cdl-component;, &cdl-package; or &cdl-interface;. A &compile; property has effect if and only if the entity that contains it is active and enabled. Typically the body of a &cdl-package; will define any source files that need to be built irrespective of individual options, and each &cdl-component;, &cdl-option;, and &cdl-interface; will define source files that are more specific. A single &compile; property can list any number of source files, all destined for the same library. A &cdl-option; or other entity can contain multiple &compile; properties, each of which can specify a different library. It is possible for a given source file to be specified in &compile; properties for several different options, in which case the source file will get built if any of these options are active and enabled. </para> <para> If the package follows the <link linkend="package.hierarchy">directory layout conventions</link> then the configuration tools will search for the specified source files first in the <filename class="directory">src</filename> subdirectory of the package, then relative to the package directory itself. </para> <note> <para> A shortcoming of the current specification of &compile; properties is that there is no easy way to specify source files that should be built unless an option is enabled. It would sometimes be useful to be able to say: “if option <literal>A</literal> is enabled then compile file <filename>x.c</filename>, otherwise compile file <filename>y.c</filename>. There are two simple ways of achieving this: </para> <itemizedlist> <listitem><para> Always compile <filename>y.c</filename>, typically by listing it in the body of the &cdl-package;, but use <literal>#ifndef A</literal> to produce an empty object file if option <literal>A</literal> is not enabled. This has the big disadvantage that the file always gets compiled and hence for some configurations builds will take longer than necessary. </para></listitem> <listitem><para> Use a &calculated; option whose value is <literal>!A</literal>, and have a <literal>compile y.c</literal> property in its body. This has the big disadvantage of adding another calculated option to the configuration. </para></listitem> </itemizedlist> <para> It is likely that this will be resolved in the future, possibly by using some sort of expression as the argument to a &compile; property. </para> </note> <note> <para> Currently it is not possible to control the priority of a &compile; property, in other words the order in which a file gets compiled relative to other build steps. This functionality might prove useful for complicated packages and should be added. </para> </note> </refsect1> <refsect1><title>Example</title> <programlisting width=72> cdl_package CYGPKG_INFRA { display "Infrastructure" include_dir cyg/infra description " Common types and useful macros. Tracing and assertion facilities. Package startup options." compile startup.cxx prestart.cxx pkgstart.cxx userstart.cxx \ dummyxxmain.cxx memcpy.c memset.c delete.cxx \ diag.cxx tcdiag.cxx } </programlisting> </refsect1> <refsect1><title>See Also</title> <para> Properties <link linkend="ref.make">make</link>, <link linkend="ref.make-object">make_object</link> and <link linkend="ref.library">library</link>. </para> </refsect1> </refentry> <!-- }}} --> <!-- {{{ default_value --> <refentry id="ref.default-value"> <refmeta> <refentrytitle>&default-value;</refentrytitle> </refmeta> <refnamediv> <refname>Property &default-value;</refname> <refpurpose>Provide a default value for this option using a CDL expression.</refpurpose> </refnamediv> <refsynopsisdiv> <synopsis> cdl_option <name> { default_value <expression> … } </synopsis> </refsynopsisdiv> <refsect1><title>Description</title> <para> The &default-value; property allows the initial value of a configuration option to depend on other configuration options. The arguments to the property should be a &CDL; expression, see <xref linkend="language.expression"> for the syntactic details. In many cases a simple constant value will suffice, for example: </para> <programlisting width=72> cdl_component CYGPKG_KERNEL_EXCEPTIONS { … default_value 1 cdl_option CYGSEM_KERNEL_EXCEPTIONS_DECODE { … default_value 0 } } </programlisting> <para> However it is also possible for an option's default value to depend on other options. For example the common HAL package provides some support functions that are needed by the &eCos; kernel, but are unlikely to be useful if the kernel is not being used. This relationship can be expressed using: </para> <programlisting width=72> cdl_option CYGFUN_HAL_COMMON_KERNEL_SUPPORT { ... default_value CYGPKG_KERNEL } </programlisting> <para> If the kernel is loaded then this HAL option is automatically enabled, although the user can still disable it explicitly should this prove necessary. If the kernel is not loaded then the option is disabled, although it can still be enabled by the user if desired. &default-value; expressions can be more complicated than this if appropriate, and provide a very powerful facility for component writers who want their code to “just do the right thing” in a wide variety of configurations. </para> <para> The &CDL; configuration system evaluates the &default-value; expression when the current package is loaded and whenever there is a change to any other option referenced in the expression. The result depends on the option's flavor: </para> <variablelist TermLength=16> <varlistentry><term><literal>flavor none</literal></term> <listitem><para> Options with this flavor have no value, so the &default-value; property is not applicable. </para></listitem></varlistentry> <varlistentry><term><literal>flavor bool</literal></term> <listitem><para> If the expression evaluates to a non-zero result the option is enabled by default, otherwise it is disabled. </para></listitem></varlistentry> <varlistentry><term><literal>flavor booldata</literal></term> <listitem><para> If the result of evaluating the expression is zero then the option is disabled, otherwise the option is enabled and its value is the result. </para></listitem></varlistentry> <varlistentry><term><literal>flavor data</literal></term> <listitem><para> The default value of the option is the result of evaluating the expression. </para></listitem></varlistentry> </variablelist> <para> A &cdl-option; or other entity can have at most one &default-value; property, and it is illegal to have both a &calculated; and a &default-value; property in one body. If an option does not have either a &default-value; or a &calculated; property and it does not have the flavor <literal>none</literal> then the configuration tools will assume a default value expression of <literal>0</literal>. </para> <para> On occasion it is useful to have a configuration option <literal>A</literal> which has both a &requires; constraint on some other option <literal>B</literal> and a &default-value; expression of <literal>B</literal>. If option <literal>B</literal> is not enabled then <literal>A</literal> will also be disabled by default and no conflict arises. If <literal>B</literal> is enabled then <literal>A</literal> also becomes enabled and again no conflict arises. If a user attempts to enable <literal>B</literal> but not <literal>A</literal> then there will be a conflict. Users should be able to deduce that the two options are closely interlinked and should not be manipulated independently except in very unusual circumstances. </para> <tip> <para> If the first entry in a &default-value; expression is a negative number, for example <literal>default_value -1</literal> then this can be misinterpreted as an option instead of as part of the expression. Currently the &default-value; property does not take any options, but this may change in future. Option processing halts at the sequence <literal>--</literal>, so the desired value can be expressed safely using <literal>default_value -- -1</literal> </para> </tip> <note> <para> In many cases it would be useful to calculate default values using some global preferences, for example: </para> <programlisting width=72> cdl_option CYGIMP_LIBC_STRING_PREFER_SMALL_TO_FAST { … default_value CYGGLO_CODESIZE > CYGGLO_SPEED } </programlisting> <para> Such global preference options do not yet exist, but are likely to be added in a future version. </para> </note> <note> <para> For options with the booldata flavor the current syntax does not allow the default values of the enabled flag and the value to be controlled separately. Functionality to permit this may be added in a future release. </para> </note> </refsect1> <refsect1><title>Example</title> <programlisting width=72> cdl_option CYGDBG_HAL_DEBUG_GDB_THREAD_SUPPORT { display "Include GDB multi-threading debug support" requires CYGDBG_KERNEL_DEBUG_GDB_THREAD_SUPPORT default_value CYGDBG_KERNEL_DEBUG_GDB_THREAD_SUPPORT description " This option enables some extra HAL code which is needed to support multi-threaded source level debugging." } </programlisting> </refsect1> <refsect1><title>See Also</title> <para> Properties <link linkend="ref.calculated">&calculated;</link>, <link linkend="ref.flavor">&flavor;</link> and <link linkend="ref.legal-values">&legal-values;</link>. </para> </refsect1> </refentry> <!-- }}} --> <!-- {{{ define --> <refentry id="ref.define"> <refmeta> <refentrytitle>&define;</refentrytitle> </refmeta> <refnamediv> <refname>Property &define;</refname> <refpurpose>Specify additional <literal>#define</literal> symbols that should go into the owning package's configuration header file.</refpurpose> </refnamediv> <refsynopsisdiv> <synopsis> cdl_option <name> { define [-file=<filename>] [-format=<format>] <symbol> … } </synopsis> </refsynopsisdiv> <refsect1><title>Description</title> <para> Normally the configuration system generates a single <literal>#define</literal> for each option that is active and enabled, with the defined symbol being the name of the option. These <literal>#define's</literal> go to the package's own configuration header file, for example <filename class="HeaderFile">pkgconf/kernel.h</filename> for kernel configuration options. For the majority of options this is sufficient. Sometimes it is useful to have more control over which <literal>#define's</literal> get generated. </para> <para> The &define; property can be used to generate an additional <literal>#define</literal> if the option is both active and enabled, for example: </para> <programlisting width=72> cdl_option CYGNUM_LIBC_STDIO_FOPEN_MAX { … define FOPEN_MAX } </programlisting> <para> If this option is given the value 40 then the following <literal>#define's</literal> will be generated in the configuration header <filename class="HeaderFile">pkgconf/libc.h</filename>: </para> <screen width=72> #define CYGNUM_LIBC_STDIO_FOPEN_MAX 40 #define FOPEN_MAX 40 </screen> <para> The default <literal>#define</literal> can be suppressed if desired using the &no-define; property. This is useful if the symbol should only be defined in <filename class="HeaderFile">pkgconf/system.h</filename> and not in the package's own configuration header file. The value that will be used for this <literal>#define</literal> is the same as for the default one, and depends on the option's flavor as follows: </para> <variablelist TermLength=16> <varlistentry><term><literal>flavor none</literal></term> <listitem><para> Options with this flavor are always enabled and have no value, so the constant <literal>1</literal> will be used. </para></listitem></varlistentry> <varlistentry><term><literal>flavor bool</literal></term> <listitem><para> If the option is disabled then no <literal>#define</literal> will be generated. Otherwise the constant <literal>1</literal> will be used. </para></listitem></varlistentry> <varlistentry><term><literal>flavor booldata</literal></term> <listitem><para> If the option is disabled then no <literal>#define</literal> will be generated. Otherwise the option's current value will be used. </para></listitem></varlistentry> <varlistentry><term><literal>flavor data</literal></term> <listitem><para> The option's current value will be used. </para></listitem></varlistentry> </variablelist> <para> For active options with the <literal>data</literal> flavor, and for active and enabled options with the <literal>booldata</literal> flavor, either one or two <literal>#define's</literal> will be generated. These take the following forms: </para> <programlisting width=72> #define <symbol> <value> #define <symbol>_<value> </programlisting> <para> For the first <literal>#define</literal> it is possible to control the format used for the value using a <literal>-format=<format></literal> option. For example, the following can be used to output some configuration data as a C string: </para> <programlisting width=72> cdl_option <name> { … define -format="\\\"%s\\\"" <symbol> } </programlisting> <para> The implementation of this facility involves concatenating the Tcl command <literal>format</literal>, the format string, and the string representation of the option's value, and evaluating this in a Tcl interpreter. Therefore the format string will be processed twice by a Tcl parser, and appropriate care has to be taken with quoting. </para> <para> The second <literal>#define</literal> will be generated only if is a valid C preprocessor macro symbol. By default the symbols generated by &define; properties will end up in the package's own configuration header file. The <literal>-file</literal> option can be used to specify an alternative destination. At the time of writing the only valid alternative definition is <literal>-file=system.h</literal>, which will send the output to the global configuration header file <filename class="HeaderFile">pkgconf/system.h</filename>. </para> <caution> <para> Care has to be taken with the <literal>-format</literal> option. Because the Tcl interpreter's <literal>format</literal> command is used, this property is subject to any problems with the implementation of this in the Tcl library. Generally there should be no problems with string data or with integers up to 32 bits, but there may well be problems if 64-bit data is involved. This issue may be addressed in a future release. </para> </caution> </refsect1> <refsect1><title>Example</title> <programlisting width=72> cdl_component CYG_HAL_STARTUP { display "Startup type" flavor data legal_values {"RAM" "ROM" } default_value {"RAM"} no_define define -file=system.h CYG_HAL_STARTUP … } </programlisting> </refsect1> <refsect1><title>See Also</title> <para> Properties <link linkend="ref.define-format">&define-format;</link>, <link linkend="ref.define-header">&define-header;</link>, <link linkend="ref.define-proc">&define-proc;</link>, <link linkend="ref.if-define">&if-define;</link> and <link linkend="ref.no-define">&no-define;</link>. </para> </refsect1> </refentry> <!-- }}} --> <!-- {{{ define_format --> <refentry id="ref.define-format"> <refmeta> <refentrytitle>&define-format;</refentrytitle> </refmeta> <refnamediv> <refname>Property &define-format;</refname> <refpurpose>Control how an option's value will appear in the configuration header file.</refpurpose> </refnamediv> <refsynopsisdiv> <synopsis> cdl_option <name> { define_format <format string> … } </synopsis> </refsynopsisdiv> <refsect1><title>Description</title> <para> For active options with the <literal>data</literal> flavor, and for active and enabled options with the <literal>booldata</literal> flavor, the configuration tools will normally generate two <literal>#define's</literal> in the package's configuration header file. These take the following forms: </para> <programlisting width=72> #define <name> <value> #define <name>_<value> </programlisting> <para> The &define-format; property can be used to control exactly what appears as the value for the first of these <literal>#define's</literal>. For example, the following can be used to output some configuration data as a C string: </para> <programlisting width=72> cdl_option <name> { … define -format="\\\"%s\\\"" <symbol> } </programlisting> <para> The implementation of &define-format; involves concatenating the Tcl command <literal>format</literal>, the format string, and the string representation of the option's value, and evaluating this in a Tcl interpreter. Therefore the format string will be processed twice by a Tcl parser, and appropriate care has to be taken with quoting. </para> <para> The second <literal>#define</literal> will be generated only if is a valid C preprocessor macro symbol, and is not affected by the &define-format; property. Also, the property is only relevant for options with the <literal>data</literal> or <literal>booldata</literal> flavor, and cannot be used in conjunction with the &no-define; property since it makes no sense to specify the format if no <literal>#define</literal> is generated. </para> <caution> <para> Because the Tcl interpreter's <literal>format</literal> command is used, this property is subject to any problems with the implementation of this in the Tcl library. Generally there should be no problems with string data or with integers up to 32 bits, but there may well be problems if 64-bit data is involved. This issue may be addressed in a future release. </para> </caution> </refsect1> <refsect1><title>Example</title> <programlisting width=72> cdl_option CYGNUM_UITRON_VER_ID { display "OS identification" flavor data legal_values 0 to 0xFFFF default_value 0 define_format "0x%04x" description " This value is returned in the 'id' field of the T_VER structure in response to a get_ver() system call." } </programlisting> </refsect1> <refsect1><title>See Also</title> <para> Properties <link linkend="ref.define">&define;</link>, <link linkend="ref.define-header">&define-header;</link>, <link linkend="ref.define-proc">&define-proc;</link>, <link linkend="ref.if-define">&if-define;</link> and <link linkend="ref.no-define">&no-define;</link>. </para> </refsect1> </refentry> <!-- }}} --> <!-- {{{ define_header --> <refentry id="ref.define-header"> <refmeta> <refentrytitle>&define-header;</refentrytitle> </refmeta> <refnamediv> <refname>Property &define-header;</refname> <refpurpose>Specify the configuration header file that will be generated for a given package.</refpurpose> </refnamediv> <refsynopsisdiv> <synopsis> cdl_package <name> { define_header <file name> … } </synopsis> </refsynopsisdiv> <refsect1><title>Description</title> <para> When the configuration tools generate a build tree, one of the steps is to output each package's configuration data to a header file. For example the kernel's configuration data gets output to <filename class="HeaderFile">pkgconf/kernel.h</filename>. This allows each package's source code to <literal>#include</literal> the appropriate header file and adapt to the choices made by the user. </para> <para> By default the configuration tools will synthesize a file name from the package name. This involves removing any prefix such as <literal>CYGPKG_</literal>, up to and including the first underscore, and then converting the remainder of the name to lower case. In some cases it may be desirable to use a different header file, for example an existing package may have been ported to &eCos; and the source code may already <literal>#include</literal> a particular file for configuration data. In such cases a &define-header; property can be used to specify an alternative filename. </para> <para> The &define-header; property can only be used in the body of a &cdl-package; command. It applies to a package as a whole and cannot be used at a finer grain. The name specified in a &define-header; property will always be interpreted as relative to the <filename class="Directory">include/pkgconf</filename> sub-directory of the install tree. </para> <note> <para> For hardware-specific packages such as device drivers and HAL packages, the current scheme of generating a configuration header file name based on the package name may be abandoned. Instead all hardware packages would send their configuration data to a single header file, <filename class="HeaderFile">pkgconf/hardware.h</filename>. This would make it easier for code to obtain details of the current hardware, but obviously there are compatibility issues. For now it is recommended that all hardware packages specify their configuration header file explicitly. </para> </note> </refsect1> <refsect1><title>Example</title> <programlisting width=72> cdl_package CYGPKG_HAL_ARM { display "ARM architecture" parent CYGPKG_HAL hardware include_dir cyg/hal define_header hal_arm.h … } </programlisting> </refsect1> <refsect1><title>See Also</title> <para> Properties <link linkend="ref.define">&define;</link>, <link linkend="ref.define-format">&define-format;</link>, <link linkend="ref.define-proc">&define-proc;</link>, <link linkend="ref.if-define">&if-define;</link>, <link linkend="ref.no-define">&no-define;</link> and <link linkend="ref.hardware">&hardware;</link>, </para> </refsect1> </refentry> <!-- }}} --> <!-- {{{ define_proc --> <refentry id="ref.define-proc"> <refmeta> <refentrytitle>&define-proc;</refentrytitle> </refmeta> <refnamediv> <refname>Property &define-proc;</refname> <refpurpose>Use a fragment of Tcl code to output additional data to configuration header files.</refpurpose> </refnamediv> <refsynopsisdiv> <synopsis> cdl_option <name> { define_proc <Tcl script> … } </synopsis> </refsynopsisdiv> <refsect1><title>Description</title> <para> For most configuration options it is sufficient to have an entry in the configuration header file of the form: </para> <programlisting width=72> #define <name> <value> </programlisting> <para> In some cases it is desirable to perform some more complicated processing when generating a configuration header file. There are a number of CDL properties for this, including &define-format; and &if-define;. The most flexible is &define-proc;: this allows the component writer to specify a Tcl script that gets invoked whenever the configuration system generates the header file for the owning package. The script can output anything to the header file, for example it could generate a C data structure based on various configuration values. </para> <para> At the point that the &define-proc; script is invoked there will be two channels to open files, accessible via Tcl variables: <literal>cdl_header</literal> is a channel to the current package's own header file for example <filename class="HeaderFile">pkgconf/kernel.h</filename>; <literal>cdl_system_header</literal> is a channel to the global configuration file <filename class="Headerfile">pkgconf/system.h</filename>. A typical &define-proc; script will use the <literal>puts</literal> command to output data to one of these channels. </para> <para> &define-proc; properties only take effect if the current option is active and enabled. The default behavior of the configuration system for an option with the <literal>bool</literal> flavor corresponds to the following &define-proc;: </para> <programlisting width=72> cdl_option XXX { … define_proc { puts $cdl_header "#define XXX 1" } } </programlisting> <warning> <para> In the current implementation it is not possible for a &define-proc; property to examine the current values of various configuration options and adapt accordingly. This is a major limitation, and will be addressed in future versions of the configuration tools. </para> </warning> </refsect1> <refsect1><title>Example</title> <programlisting width=90> cdl_package CYGPKG_HAL_ARM_PID { display "ARM PID evaluation board" parent CYGPKG_HAL_ARM define_header hal_arm_pid.h include_dir cyg/hal hardware define_proc { puts $::cdl_system_header "#define CYGBLD_HAL_TARGET_H <pkgconf/hal_arm.h>" puts $::cdl_system_header "#define CYGBLD_HAL_PLATFORM_H <pkgconf/hal_arm_pid.h>" puts $::cdl_header "" puts $::cdl_header "#define HAL_PLATFORM_CPU \"ARM 7TDMI\"" puts $::cdl_header "#define HAL_PLATFORM_BOARD \"PID\"" puts $::cdl_header "#define HAL_PLATFORM_EXTRA \"\"" puts $::cdl_header "" } … } </programlisting> </refsect1> <refsect1><title>See Also</title> <para> Properties <link linkend="ref.define">&define;</link>, <link linkend="ref.define-format">&define-format;</link>, <link linkend="ref.define-header">&define-header;</link>, <link linkend="ref.if-define">&if-define;</link> and <link linkend="ref.no-define">&no-define;</link>. </para> </refsect1> </refentry> <!-- }}} --> <!-- {{{ description --> <refentry id="ref.description"> <refmeta> <refentrytitle>&description;</refentrytitle> </refmeta> <refnamediv> <refname>Property &description;</refname> <refpurpose>Provide a textual description for an option.</refpurpose> </refnamediv> <refsynopsisdiv> <synopsis> cdl_option <name> { description <text> … } </synopsis> </refsynopsisdiv> <refsect1><title>Description</title> <para> Users can only be expected to manipulate configuration options sensibly if they are given sufficient information about these options. There are three properties which serve to explain an option in plain text: the &display; property gives a textual alias for an option, which is usually more comprehensible than something like <literal>CYGPKG_LIBC_TIME_ZONES</literal>; the &description; property gives a longer description, typically a paragraph or so; the &doc; property specifies the location of additional on-line documentation related to a configuration option. In the context of a graphical tool the &display; string will be the primary way for users to identify configuration options; the &description; paragraph will be visible whenever the option is selected; the on-line documentation will only be accessed when the user explicitly requests it. </para> <para> At present there is no way of providing any sort of formatting mark-up in a description. It is possible that future versions of the configuration tools will provide some control over the way the description text gets rendered. </para> </refsect1> <refsect1><title>Example</title> <programlisting width=72> cdl_option CYGDBG_INFRA_DEBUG_TRACE_MESSAGE { display "Use trace text" default_value 1 description " All trace calls within eCos contain a text message which should give some information about the circumstances. These text messages will end up being embedded in the application image and hence there is a significant penalty in terms of image size. It is possible to suppress the use of these messages by disabling this option. This results in smaller code size, but there is less human-readable information available in the trace output, possibly only filenames and line numbers." } </programlisting> </refsect1> <refsect1><title>See Also</title> <para> Properties <link linkend="ref.display">&display;</link> and <link linkend="ref.doc">&doc;</link>. </para> </refsect1> </refentry> <!-- }}} --> <!-- {{{ display --> <refentry id="ref.display"> <refmeta> <refentrytitle>&display;</refentrytitle> </refmeta> <refnamediv> <refname>Property &display;</refname> <refpurpose>Provide a short string describing this option.</refpurpose> </refnamediv> <refsynopsisdiv> <synopsis> cdl_option <name> { display <string> … } </synopsis> </refsynopsisdiv> <refsect1><title>Description</title> <para> Users can only be expected to manipulate configuration options sensibly if they are given sufficient information about these options. There are three properties which serve to explain an option in plain text: the &display; property gives a textual alias for an option, which is usually more comprehensible than something like <literal>CYGPKG_LIBC_TIME_ZONES</literal>; the &description; property gives a longer description, typically a paragraph or so; the &doc; property specifies the location of additional on-line documentation related to a configuration option. In the context of a graphical tool the &display; string will be the primary way for users to identify configuration options; the &description; paragraph will be visible whenever the option is selected; the on-line documentation will only be accessed when the user explicitly requests it. </para> </refsect1> <refsect1><title>Example</title> <programlisting width=72> cdl_option CYGNUM_KERNEL_SYNCH_MBOX_QUEUE_SIZE { display "Message box queue size" flavor data legal_values 1 to 65535 default_value 10 description " This configuration option controls the number of messages that can be queued in a message box before a non-blocking put() operation will fail or a blocking put() operation will block. The cost in memory is one pointer per message box for each possible message." } </programlisting> </refsect1> <refsect1><title>See Also</title> <para> Properties <link linkend="ref.description">&description;</link> and <link linkend="ref.doc">&doc;</link>. </para> </refsect1> </refentry> <!-- }}} --> <!-- {{{ doc --> <refentry id="ref.doc"> <refmeta> <refentrytitle>&doc;</refentrytitle> </refmeta> <refnamediv> <refname>Property &doc;</refname> <refpurpose>The location of online-documentation for a configuration option.</refpurpose> </refnamediv> <refsynopsisdiv> <synopsis> cdl_option <name> { doc <URL;> … } </synopsis> </refsynopsisdiv> <refsect1><title>Description</title> <para> Users can only be expected to manipulate configuration options sensibly if they are given sufficient information about these options. There are three properties which serve to explain an option in plain text: the &display; property gives a textual alias for an option, which is usually more comprehensible than something like <literal>CYGPKG_LIBC_TIME_ZONES</literal>; the &description; property gives a longer description, typically a paragraph or so; the &doc; property specifies the location of additional on-line documentation related to a configuration option. In the context of a graphical tool the &display; string will be the primary way for users to identify configuration options; the &description; paragraph will be visible whenever the option is selected; the on-line documentation will only be accessed when the user explicitly requests it. </para> <para> The documentation may be an absolute URL, but more generally the on-line documentation will be shipped with the package and can be accessed via a relative URL. If the package follows the <link linkend="package.hierarchy">directory layout conventions</link> then the configuration tools will search for the specified html file first in the <filename class="directory">doc</filename> subdirectory of the package, then relative to the package directory itself. The URL may contain a <literal>#</literal> character to specify an anchor within a page. </para> <warning> <para> At the time of writing the &eCos; packages in the standard distribution do not conform to the directory layout conventions when it comes to the documentation. Instead of organizing the documentation on a per-package basis and placing it in the corresponding <filename class="directory">doc</filename> sub-directories, all the documentation is kept in a central location. This should get addressed in a future release of the system. Third party component writers should follow the layout conventions. </para> </warning> </refsect1> <refsect1><title>Example</title> <programlisting width=72> cdl_package CYGPKG_KERNEL { display "eCos kernel" doc ref/ecos-ref.4.html include_dir cyg/kernel description " This package contains the core functionality of the eCos kernel. It relies on functionality provided by various HAL packages and by the eCos infrastructure. In turn the eCos kernel provides support for other packages such as the device drivers and the uITRON compatibility layer." … } </programlisting> </refsect1> <refsect1><title>See Also</title> <para> Properties <link linkend="ref.description">&description;</link> and <link linkend="ref.display">&display;</link>. </para> </refsect1> </refentry> <!-- }}} --> <!-- {{{ flavor --> <refentry id="ref.flavor"> <refmeta> <refentrytitle>&flavor;</refentrytitle> </refmeta> <refnamediv> <refname>Property &flavor;</refname> <refpurpose>Specify the nature of a configuration option.</refpurpose> </refnamediv> <refsynopsisdiv> <synopsis> cdl_option <name> { flavor <flavor> … } </synopsis> </refsynopsisdiv> <refsect1><title>Description</title> <para> The state of a &CDL; configuration option is a somewhat complicated concept. This state determines what happens when a build tree is generated: it controls what files get built and what <literal>#define's</literal> end up in configuration header files. The state also controls the values used during expression evaluation. The key concepts are: </para> <orderedlist> <listitem><para> An option may or may not be loaded into the current configuration. However it is still possible for packages to reference options which are not loaded in a &requires; constraint or other expression. If an option is not loaded then it will have no direct effect on the build process, and <literal>0</literal> will be used for expression evaluation. </para></listitem> <listitem><para> Even if an option is loaded it may still be inactive. Usually this is controlled by the option's location in the configuration hierarchy. If an option's parent is active and enabled then the option will normally be active. If the parent is either inactive or disabled then the option will be inactive. For example, if kernel timeslicing is diabled then the option <literal>CYGNUM_KERNEL_SCHED_TIMESLICE_TICKS</literal> is irrelevant and must have no effect. The &active-if; property can be used to specify additional constraints. If an option is inactive then it will have no direct effect on the build process, in other words it will not cause any files to get built or <literal>#define's</literal> to be generated. For the purposes of expression evaluation an inactive option has a value of <literal>0</literal>. </para></listitem> <listitem><para> An option may be enabled or disabled. Most options are boolean in nature, for example a particular function may get inlined or it may involve a full procedure call. If an option is disabled then it has no direct effect on the build process, and for the purposes of expression evaluation it has a value of 0. </para></listitem> <listitem><para> An option may also have additional data associated with it, for example a numerical value used to control the size of an array. </para></listitem> </orderedlist> <para> Most options are boolean in nature and do not have any additional associated data. For some options only the data part makes sense and users should be unable to manipulate the enabled/disabled part of the state. For a comparatively small number of options it makes sense to have the ability to disable that option or to enable it and associate data as well. Finally, when constructing an option hierarchy it is occasionally useful to have entities which serve only as placeholders. The &flavor; property can be used to control all this. There are four possible values. It should be noted that the active or inactive state of an option takes priority over the flavor: if an option is inactive then no <literal>#define's</literal> will be generated and any build-related properties such as &compile; will be ignored. </para> <variablelist TermLength=16> <varlistentry><term>flavor <literal>none</literal></term> <listitem><para> The <literal>none</literal> is intended primarily for placeholder components in the hierarchy, although it can be used for other purposes. Options with this flavor are always enabled and do not have any additional data associated with them, so there is no way for users to modify the option. For the purposes of expression evaluation an option with flavor <literal>none</literal> always has the value <literal>1</literal>. Normal <literal>#define</literal> processing will take place, so typically a single <literal>#define</literal> will be generated using the option name and a value of <literal>1</literal>. Similarly build-related properties such as &compile; will take effect. </para></listitem></varlistentry> <varlistentry><term>flavor <literal>bool</literal></term> <listitem><para> Boolean options can be either enabled or disabled, and there is no additional data associated with them. If a boolean option is disabled then no <literal>#define</literal> will be generated and any build-related properties such as &compile; will be ignored. For the purposes of expression evaluation a disabled option has the value <literal>0</literal>. If a boolean option is enabled then normal <literal>#define</literal> processing will take place, all build-related properties take effect, and the option's value will be <literal>1</literal>. </para></listitem></varlistentry> <varlistentry><term>flavor <literal>data</literal></term> <listitem><para> Options with this flavor are always enabled, and have some additional data associated with them which can be edited by the user. This data can be any sequence of characters, although in practice the &legal-values; property will often be used to impose constraints. In appropriate contexts such as expressions the configuration tools will attempt to interpret the data as integer or floating point numbers. Since an option with the <literal>data</literal> flavor cannot be disabled, normal <literal>#define</literal> processing takes place and the data will be used for the value. Similarly all build-related properties take effect, and the option's value for the purposes of expression evaluation is the data. </para></listitem></varlistentry> <varlistentry><term>flavor <literal>booldata</literal></term> <listitem><para> This combines the <literal>bool</literal> and <literal>data</literal> flavors. The option may be enabled or disabled, and in addition the option has some associated data. If the option is disabled then no <literal>#define</literal> will be generated, the build-related properties have no effect, and for the purposes of expression evaluation the option's value is <literal>0</literal>. If the option is enabled then a <literal>#define</literal> will be generated using the data as the value, all build-related properties take effect, and the option's value for the purposes of expression evaluation is the data. If <literal>0</literal> is legal data then it is not possible to distinguish this case from the option being disabled or inactive. </para></listitem></varlistentry> </variablelist> <para> Options and components have the <literal>bool</literal> flavor by default, but this can be changed as desired. Packages always have the <literal>booldata</literal> flavor, and this cannot be changed. Interfaces have the <literal>data</literal> flavor by default, since the value of an interface is a count of the number of active and enabled interfaces, but they can be given the <literal>bool</literal> or <literal>booldata</literal> flavors. </para> <note> <para> The expression syntax needs to be extended to allow the loaded, active, enabled and data aspects of an option's state to be examined individually. This would allow component writers to distinguish between a disabled <literal>booldata</literal> option and an enabled one which has a value of <literal>0</literal>. Such an enhancement to the expression syntax may also prove useful in other circumstances. </para> </note> </refsect1> <refsect1><title>Example</title> <programlisting width=72> cdl_component CYGPKG_LIBM_COMPATIBILITY { cdl_component CYGNUM_LIBM_COMPATIBILITY { flavor booldata … cdl_option CYGNUM_LIBM_COMPAT_DEFAULT { flavor data … } } … } cdl_component CYGPKG_LIBM_TRACE { flavor bool … } </programlisting> </refsect1> <refsect1><title>See Also</title> <para> Properties <link linkend="ref.calculated">&calculated;</link>, <link linkend="ref.default-value">&default-value;</link> and <link linkend="ref.legal-values">&legal-values;</link>, </para> </refsect1> </refentry> <!-- }}} --> <!-- {{{ hardware --> <refentry id="ref.hardware"> <refmeta> <refentrytitle>&hardware;</refentrytitle> </refmeta> <refnamediv> <refname>Property &hardware;</refname> <refpurpose>Specify that a package is tied to specific hardware.</refpurpose> </refnamediv> <refsynopsisdiv> <synopsis> cdl_option <name> { active_if <condition> … } </synopsis> </refsynopsisdiv> <refsect1><title>Description</title> <para> Some packages such as device drivers and HAL packages are hardware-specific, and generally it makes no sense to add such packages to a configuration unless the corresponding hardware is present on your target system. Typically hardware package selection happens automatically when you select your target. The &hardware; property can be used in the body of a &cdl-package; command to indicate that the package is hardware-specific. </para> <note> <para> At the time of writing the &hardware; property is largely ignored by the configuration tools, but this may change in future. Amongst other possible changes, for hardware-specific packages such as device drivers and HAL packages, the current scheme of generating a configuration header file name based purely on the package name may be abandoned. Instead all hardware packages would send their configuration data to a single header file, <filename class="HeaderFile">pkgconf/hardware.h</filename>. This would make it easier for code to obtain details of the current hardware, but obviously there are compatibility issues. For now it is recommended that all hardware packages specify their configuration header file explicitly. </para> </note> </refsect1> <refsect1><title>Example</title> <programlisting width=72> cdl_package CYGPKG_HAL_ARM { display "ARM architecture" parent CYGPKG_HAL hardware include_dir cyg/hal define_header hal_arm.h … } </programlisting> </refsect1> <refsect1><title>See Also</title> <para> Property <link linkend="ref.define-header">&define-header;</link>, and command <link linkend="ref.cdl-package">&cdl-package;</link>. </para> </refsect1> </refentry> <!-- }}} --> <!-- {{{ if_define --> <refentry id="ref.if-define"> <refmeta> <refentrytitle>&if-define;</refentrytitle> </refmeta> <refnamediv> <refname>Property &if-define;</refname> <refpurpose>Output a common preprocessor construct to a configuration header file.</refpurpose> </refnamediv> <refsynopsisdiv> <synopsis> cdl_option <name> { if_define [-file=<filename>] <symbol1> <symbol2> … } </synopsis> </refsynopsisdiv> <refsect1><title>Description</title> <para> The purpose of the &if-define; property is best explained by an example. Suppose you want finer-grained control over assertions, say on a per-package or even a per-file basis rather than globally. The assertion macros can be defined by an exported header file in an infrastructure package, using code like the following: </para> <programlisting width=72> #ifdef CYGDBG_USE_ASSERTS # define CYG_ASSERT( _bool_, _msg_ ) \ CYG_MACRO_START \ if ( ! ( _bool_ ) ) \ CYG_ASSERT_DOCALL( _msg_ ); \ CYG_MACRO_END #else # define CYG_ASSERT( _bool_, _msg_ ) CYG_EMPTY_STATEMENT #endif </programlisting> <para> Assuming this header file is <literal>#include'd</literal> directly or indirectly by any code which may need to be built with assertions enabled, the challenge is now to control whether or not <varname>CYGDBG_USE_ASSERTS</varname> is defined for any given source file. This is the purpose of the &if-define; property: </para> <programlisting width=72> cdl_option CYGDBG_KERNEL_USE_ASSERTS { … if_define CYGSRC_KERNEL CYGDBG_USE_ASSERTS requires CYGDBG_INFRA_ASSERTION_SUPPORT } </programlisting> <para> If this option is active and enabled then the kernel's configuration header file would end up containing the following: </para> <programlisting width=72> #ifdef CYGSRC_KERNEL # define CYGDBG_USE_ASSERTS 1 #endif </programlisting> <para> Kernel source code can now begin with the following construct: </para> <programlisting width=72> #define CYGSRC_KERNEL 1 #include <pkgconf/kernel.h> #include <cyg/infra/cyg_ass.h> </programlisting> <para> The configuration option only affects kernel source code, assuming nothing else <literal>#define's</literal> the symbol <varname>CYGSRC_KERNEL</varname>. If the per-package assertion option is disabled then <varname>CYGDBG_USE_ASSERTS</varname> will not get defined. If the option is enabled then <varname>CYGDBG_USE_ASSERTS</varname> will get defined and assertions will be enabled for the kernel sources. It is possible to use the same mechanism for other facilities such as tracing, and to apply it at a finer grain such as individual source files by having multiple options with &if-define; properties and multiple symbols such as <varname>CYGSRC_KERNEL_SCHED_BITMAP_CXX</varname>. </para> <para> The &if-define; property takes two arguments, both of which must be valid C preprocessor symbols. If the current option is active and enabled then three lines will be output to the configuration header file: </para> <programlisting width=72> #ifdef <symbol1> # define <symbol2> #endif </programlisting> <para> If the option is inactive or disabled then these lines will not be output. By default the current package's configuration header file will be used, but it is possible to specify an alternative destination using a <literal>-file</literal> option. At present the only legitimate alternative destination is <literal>system.h</literal>, the global configuration header. &if-define; processing happens in addition to, not instead of, the normal <literal>#define</literal> processing or the handling of other header-file related properties. </para> <note> <para> The infrastructure in the current &eCos; release does not yet work this way. In future it may do so, and the intention is that suitable configuration options get generated semi-automatically by the configuration system rather than having to be defined explicitly. </para> </note> <tip> <para> As an alternative to changing the configuration, updating the build tree, and so on, it is possible to enable assertions by editing a source file directly, for example: </para> <programlisting width=72> #define CYGSRC_KERNEL 1 #define CYGDBG_USE_ASSERTS 1 #include <pkgconf/kernel.h> #include <cyg/infra/cyg_ass.h> </programlisting> <para> The assertion header file does not care whether <varname>CYGDBG_USE_ASSERTS</varname> is <literal>#define'd</literal> via a configuration option or by explicit code. This technique can be useful to component writers when debugging their source code, although care has to be taken to remove any such <literal>#define's</literal> later on. </para> </tip> </refsect1> <refsect1><title>Example</title> <programlisting width=72> cdl_option CYGDBG_KERNEL_USE_ASSERTS { display "Assertions in the kernel package" … if_define CYGSRC_KERNEL CYGDBG_USE_ASSERTS requires CYGDBG_INFRA_ASSERTION_SUPPORT } </programlisting> </refsect1> <refsect1><title>See Also</title> <para> Properties <link linkend="ref.define">&define;</link>, <link linkend="ref.define-format">&define-format;</link>, <link linkend="ref.define-header">&define-header;</link>, <link linkend="ref.define-proc">&define-proc;</link> and <link linkend="ref.no-define">&no-define;</link>. </para> </refsect1> </refentry> <!-- }}} --> <!-- {{{ implements --> <refentry id="ref.implements"> <refmeta> <refentrytitle>&implements;</refentrytitle> </refmeta> <refnamediv> <refname>Property &implements;</refname> <refpurpose>Enabling this option provides one instance of a more general interface.</refpurpose> </refnamediv> <refsynopsisdiv> <synopsis> cdl_option <name> { implements <interface> … } </synopsis> </refsynopsisdiv> <refsect1><title>Description</title> <para> The &CDL; interface concept provides an abstraction mechanism that can be useful in many different circumstances. Essentially an interface is a calculated option whose value is the number of active and enabled options which implement that interface. For example the interface <varname>CYGINT_KERNEL_SCHEDULER</varname> has a value corresponding to the number of schedulers in the system, typically just one. </para> <para> The &implements; property takes a single argument, which should be the name of an interface. This interface may be defined in the same package as the implementor or in some other package. In the latter case it may sometimes be appropriate for the implementor or the implementor's package to have a &requires; property for the package containing the interface. An option may contain multiple &implements; properties. It is possible for an option to implement a given interface multiple times, and on occasion this is actually useful. </para> </refsect1> <refsect1><title>Example</title> <programlisting width=72> cdl_option CYGSEM_KERNEL_SCHED_MLQUEUE { display "Multi-level queue scheduler" default_value 1 implements CYGINT_KERNEL_SCHEDULER … } </programlisting> </refsect1> <refsect1><title>See Also</title> <para> Command <link linkend="ref.cdl-interface">&cdl-interface;</link>. </para> </refsect1> </refentry> <!-- }}} --> <!-- {{{ include_dir --> <refentry id="ref.include-dir"> <refmeta> <refentrytitle>&include-dir;</refentrytitle> </refmeta> <refnamediv> <refname>Property &include-dir;</refname> <refpurpose>Specify the desired location of a package's exported header files in the install tree.</refpurpose> </refnamediv> <refsynopsisdiv> <synopsis> cdl_package <name> { include_dir <sub-directory> … } </synopsis> </refsynopsisdiv> <refsect1><title>Description</title> <para> Most packages export one or more header files defining their public interface. For example the C library exports header files such as <filename class="HeaderFile">stdio.h</filename> and <filename class="HeaderFile">ctype.h</filename>. If the package follows the <link linkend="package.hierarchy">directory layout conventions</link> then the exported header files will normally be found in the package's <filename class="directory">include</filename> sub-directory. Alternatively the &include-files; property can be used to specify which header files should be exported. </para> <para> By default a package's exported header files will be copied to the <filename class="directory">include</filename> sub-directory of the install tree. This is correct for packages like the C library because that is the correct location for files such as <filename class="HeaderFile">stdio.h</filename>. However to reduce the probability of name clashes it is desirable for packages to use different sub-directories, for example infrastructure header files get copied to <filename class="directory">include/cyg/infra</filename> rather than to the top-level <filename class="directory">include</filename> directory itself. </para> <para> It would be possible to replicate these sub-directories in each package's source tree, such that the infrastructure header file sources lived in <filename class="directory">include/cyg/infra</filename> in the source tree as well as in the install tree. This would make things more difficult for the package developers. Instead it is possible to specify the desired install tree sub-directory using an &include-dir; property, for example <literal>include_dir cyg/infra</literal>. </para> <para> The &include-dir; property can only be used in the body of a &cdl-package; command, since it applies to all of the header files exported by a package, and only one &include-dir; property can be used. If there is no &include-dir; property then exported header files will end up in the top-level <filename class="directory">include</filename> directory of the install tree. </para> </refsect1> <refsect1><title>Example</title> <programlisting width=72> cdl_package CYGPKG_INFRA { display "Infrastructure" include_dir cyg/infra description " Common types and useful macros. Tracing and assertion facilities. Package startup options." … } </programlisting> </refsect1> <refsect1><title>See Also</title> <para> Property <link linkend="ref.include-files">&include-files;</link>, and command <link linkend="ref.cdl-package">&cdl-package;</link>. </para> </refsect1> </refentry> <!-- }}} --> <!-- {{{ include_files --> <refentry id="ref.include-files"> <refmeta> <refentrytitle>&include-files;</refentrytitle> </refmeta> <refnamediv> <refname>Property &include-files;</refname> <refpurpose>List the header files that are exported by a package.</refpurpose> </refnamediv> <refsynopsisdiv> <synopsis> cdl_package <name> { include_files <file1> … … } </synopsis> </refsynopsisdiv> <refsect1><title>Description</title> <para> Most packages export one or more header files defining their public interface. For example the C library exports header files such as <filename class="HeaderFile">stdio.h</filename> and <filename class="HeaderFile">ctype.h</filename>. If the package follows the <link linkend="package.hierarchy">directory layout conventions</link> then the exported header files will normally be found in the package's <filename class="directory">include</filename> sub-directory. For packages which do not follow these conventions, typically simple ones for which a complicated sub-directory hierarchy is undesirable, there has to be an alternative way of specifying which header file or files define the public interface. The &include-files; property provides support for this. </para> <para> By default, if a package does not have an <filename class="directory">include</filename> subdirectory and it does not have an &include-files; property then all files with a suffix of <literal>.h</literal>, <literal>.hxx</literal>, <literal>.inl</literal> or <literal>.inc</literal> will be treated as public header files. However some of these may be private files containing implementation details. If there is an &include-files; property then only the files listed in that property will be exported. </para> <para> If a package should not export any header files but does contain private implementation headers, an &include-files; property with no arguments should be used. </para> </refsect1> <refsect1><title>Example</title> <programlisting width=72> cdl_package <SOME_PACKAGE> { … include_dir <some directory> include_files interface.h } cdl_package <ANOTHER_PACKAGE> { … include_files } </programlisting> </refsect1> <refsect1><title>See Also</title> <para> Property <link linkend="ref.include-dir">&include-dir;</link>, and command <link linkend="ref.cdl-package">&cdl-package;</link>. </para> </refsect1> </refentry> <!-- }}} --> <!-- {{{ legal_values --> <refentry id="ref.legal-values"> <refmeta> <refentrytitle>&legal-values;</refentrytitle> </refmeta> <refnamediv> <refname>Property &legal-values;</refname> <refpurpose>Impose constraints on the possible values for an option.</refpurpose> </refnamediv> <refsynopsisdiv> <synopsis> cdl_option <name> { legal_values <list expression> … } </synopsis> </refsynopsisdiv> <refsect1><title>Description</title> <para> Options with the <literal>data</literal> or <literal>booldata</literal> flavors can have an arbitrary sequence of characters as their data. In nearly all cases some restrictions have to be imposed, for example the data should correspond to a number within a certain range, or it should be one of a small number of constants. The &legal-values; property can be used to impose such constraints. The arguments to the property should be a &CDL; list expression, see <xref linkend="language.list-expression"> for the syntactic details. Common examples include: </para> <programlisting width=72> legal_values 0 to 0x7fff legal_values 9600 19200 38400 legal_values { "RAM" "ROM" } </programlisting> <para> The &legal-values; property can only be used for options with the <literal>data</literal> or <literal>booldata</literal> flavors, since it makes little sense to further constrain the legal values of a boolean option. An option can have at most one &legal-values; property. </para> <tip> <para> If the first entry in a &legal-values; list expression is a negative number, for example <literal>legal_values -1 to 1</literal> then this can be misinterpreted as an option instead of as part of the expression. Currently the &legal-values; property does not take any options, but this may change in future. Option processing halts at the sequence <literal>--</literal>, so the desired range can be expressed safely using <literal>legal_values -- -1 to 1</literal> </para> </tip> <note> <para> Architectural HAL packages should provide constants which can be used in &legal-values; list expressions. For example it should be possible to specify a numeric range such as <literal>0 to CYGARC_MAXINT</literal>, rather than hard-wiring numbers such as <literal>0x7fffffff</literal> which may not be valid on all targets. Current HAL packages do not define such constants. </para> </note> <note> <para> The &legal-values; property is restricted mainly to numerical ranges and simple enumerations, and cannot cope with more complicated data items. Future versions of the configuration system will provide additional data validation facilities, for example a <literal>check_proc</literal> property which specifies a Tcl script that can be used to perform the validation. </para> </note> </refsect1> <refsect1><title>Example</title> <programlisting width=72> cdl_option CYGNUM_LIBC_TIME_STD_DEFAULT_OFFSET { display "Default Standard Time offset" flavor data legal_values -- -90000 to 90000 default_value -- 0 description " This option controls the offset from UTC in seconds when in local Standard Time. This value can be positive or negative. It can also be set at run time using the cyg_libc_time_setzoneoffsets() function." } </programlisting> </refsect1> <refsect1><title>See Also</title> <para> Properties <link linkend="ref.calculated">&calculated;</link>, <link linkend="ref.default-value">&default-value;</link>, and <link linkend="ref.flavor">&flavor;</link>. </para> </refsect1> </refentry> <!-- }}} --> <!-- {{{ library --> <refentry id="ref.library"> <refmeta> <refentrytitle>&library;</refentrytitle> </refmeta> <refnamediv> <refname>Property &library;</refname> <refpurpose>Specify which library should contain the object files generated by building this package.</refpurpose> </refnamediv> <refsynopsisdiv> <synopsis> cdl_package <name> { library <library name> … } </synopsis> </refsynopsisdiv> <refsect1><title>Description</title> <para> By default all object files that get built for all packages end up in a single library, <filename>libtarget.a</filename>. This makes things easier for the typical application developer because it is only necessary to link with a single library, rather than with separate libraries for each package. It is possible to specify an alternative library for specific files as an option to the &compile; and &make-object; properties, and there is one library <link linkend="build"><filename>libextras.a</filename></link> which serves a specific purpose in the build system. The &library; property allows an alternative library to be specified for all the object files that will be generated for a given package. </para> <para> The use of the &library; property should be avoided, since it makes things more difficult for application developers. The property is intended only for special cases, for example if there are legal objections to mingling object files from different packages in a single library. It could also be used to work around name clash problems if two packages happen to define an exported symbol with the same name, but any attempt to use multiple libraries in this way is error-prone and should be avoided. </para> <para> The &library; property takes a single argument, the name of a library, which should follow the standard naming convention of <literal>lib<something>.a</literal>. A &library; property can only occur in the body of a &cdl-package; command and applies to all object files generated for that package (except where explicitly overwritten with a <literal>-library=</literal> option to one of the build-related properties). A &cdl-package; body can contain at most one &library; property. </para> </refsect1> <refsect1><title>Example</title> <programlisting width=72> cdl_package <SOME_PACKAGE> { … library libSomePackage.a } </programlisting> </refsect1> <refsect1><title>See Also</title> <para> Properties <link linkend="ref.compile">&compile;</link>, <link linkend="ref.make">&make;</link>, and <link linkend="ref.make-object">&make-object;</link>, command <link linkend="ref.cdl-package">&cdl-package;</link>. </para> </refsect1> </refentry> <!-- }}} --> <!-- {{{ make --> <refentry id="ref.make"> <refmeta> <refentrytitle>&make;</refentrytitle> </refmeta> <refnamediv> <refname>Property &make;</refname> <refpurpose>Define an additional custom build step associated with an option, resulting in a target that should not go directly into a library.</refpurpose> </refnamediv> <refsynopsisdiv> <synopsis> cdl_option <name> { make [-priority=<pri>] { <custom build step> } … } </synopsis> </refsynopsisdiv> <refsect1><title>Description</title> <para> When building an &eCos; configuration the primary target is a single library, <filename>libtarget.a</filename>. In some cases it is necessary to build some additional targets. For example architectural HAL packages typically build a linker script and some start-up code. Such additional targets can be specified by a &make; property. Any option can have one or more &make; properties, although typically such properties only occur in the body of a &cdl-package; command. </para> <para> The &make; property takes a single argument, which resembles a makefile rule: it consists of a target, a list of dependencies, and one or more commands that should be executed. However the argument is not a makefile fragment, and custom build steps may get executed in build environments that do not involve make. For full details of custom build steps see <xref linkend="build.custom">. </para> <warning> <para> The exact syntax and limitations of custom build steps have not yet been finalized, and are subject to change in future versions of the configuration tools. </para> </warning> <para> The &make; property takes an optional priority argument indicating the order in which build steps take place. This priority complements the dependency list, and avoids problems with packages needing to know details of custom build steps in other packages (which may change between releases). The defined order is: </para> <variablelist termlength=12> <varlistentry><term>Priority 0</term> <listitem><para> The header files exported by the current set of packages are copied to the appropriate places in the <filename class="directory">include</filename> subdirectory of the install tree. Any unnecessary copies are avoided, to prevent rebuilds of package and application source modules caused by header file dependencies. </para> <note><para> A possible future enhancement of the build system may result in the build and install trees being updated automatically if there has been a change to the <filename>ecos.ecc</filename> configuration savefile. </para></note></listitem> </varlistentry> <varlistentry><term>Priority 100</term> <listitem><para> All files specified in &compile; properties will get built, producing the corresponding object files. In addition any custom build steps defined by &make-object; properties get executed, unless there is a <literal>-priority=</literal> option. </para></listitem> </varlistentry> <varlistentry><term>Priority 200</term> <listitem><para> The libraries now get built using the appropriate object files. </para></listitem> </varlistentry> <varlistentry><term>Priority 300</term> <listitem><para> Any custom build steps specified by &make; properties now get executed, unless the priority for a particular build step is changed from its default. </para></listitem> </varlistentry> </variablelist> <para> For example, if a custom build step needs to take place before any of the normal source files get compiled then it should be given a priority somewhere between 0 and 100. If a custom build step involves post-processing an object file prior to its incorporation into a library then a priority between 100 and 200 should be used. </para> </refsect1> <refsect1><title>Example</title> <programlisting width=88> cdl_package CYGPKG_HAL_MN10300_AM33 { display "MN10300 AM33 variant" parent CYGPKG_HAL_MN10300 implements CYGINT_HAL_MN10300_VARIANT hardware include_dir cyg/hal define_header hal_mn10300_am33.h description " The MN10300 AM33 variant HAL package provides generic support for this processor architecture. It is also necessary to select a specific target platform HAL package." make { <PREFIX>/lib/target.ld: <PACKAGE>/src/mn10300_am33.ld $(CC) -E -P -Wp,-MD,target.tmp -DEXTRAS=1 -xc $(INCLUDE_PATH) $(CFLAGS) -o $@ $< @echo $@ ": \\" > $(notdir $@).deps @tail +2 target.tmp >> $(notdir $@).deps @echo >> $(notdir $@).deps @rm target.tmp } } </programlisting> </refsect1> <refsect1><title>See Also</title> <para> Properties <link linkend="ref.compile">compile</link>, <link linkend="ref.make-object">make_object</link> and <link linkend="ref.library">library</link>. </para> </refsect1> </refentry> <!-- }}} --> <!-- {{{ make_object --> <refentry id="ref.make-object"> <refmeta> <refentrytitle>&make-object;</refentrytitle> </refmeta> <refnamediv> <refname>Property &make-object;</refname> <refpurpose>Define a custom build step, resulting in an object file that should go into a library.</refpurpose> </refnamediv> <refsynopsisdiv> <synopsis> cdl_option <name> { make_object [-library=<library>] [-priority=<pri>] { <custom build step> } … } </synopsis> </refsynopsisdiv> <refsect1><title>Description</title> <para> When building an &eCos; configuration the primary target is a single library, <filename>libtarget.a</filename>. Most of the object files which go into this library will be generated as a result of &compile; properties. Occasionally it may be necessary to have special build steps for a given object file, and this can be achieved with a &make-object; property. The use of this property should be avoided whenever possible because it greatly increases the risk of portability problems, both on the host side because of possible problems with the tools, and on the target side because a custom build step may not allow adequately for the wide variety of architectures supported by &eCos;. </para> <para> The &make-object; property takes a single argument, which resembles a makefile rule: it consists of a target, a list of dependencies, and one or more commands that should be executed. The target should be an object file. However the &make-object; argument is not a makefile fragment, and custom build steps may get executed in build environments that do not involve make. For full details of custom build steps see <xref linkend="build.custom">. </para> <warning> <para> The exact syntax and limitations of custom build steps have not yet been finalized, and may change in future versions of the configuration tools. </para> </warning> <para> The &make-object; property takes an optional library argument. If no library is specified then the default library for the current package will be used, which will be <filename>libtarget.a</filename> unless the &cdl-package; command contains a &library; property. </para> <para> The &make-object; property also takes an optional priority argument indicating the order in which build steps take place. This priority complements the dependency list, and avoids problems with packages needing to know details of custom build steps in other packages (which may change between releases). The defined order is: </para> <variablelist termlength=12> <varlistentry><term>Priority 0</term> <listitem><para> The header files exported by the current set of packages are copied to the appropriate places in the <filename class="directory">include</filename> subdirectory of the install tree. Any unnecessary copies are avoided, to prevent rebuilds of package and application source modules caused by header file dependencies. </para> <note><para> A possible future enhancement of the build system may result in the build and install trees being updated automatically if there has been a change to the <filename>ecos.ecc</filename> configuration savefile. </para></note></listitem> </varlistentry> <varlistentry><term>Priority 100</term> <listitem><para> All files specified in &compile; properties will get built, producing the corresponding object files. In addition any custom build steps defined by &make-object; properties get executed, unless there is a <literal>-priority=</literal> option. </para></listitem> </varlistentry> <varlistentry><term>Priority 200</term> <listitem><para> The libraries now get built using the appropriate object files. </para></listitem> </varlistentry> <varlistentry><term>Priority 300</term> <listitem><para> Any custom build steps specified by &make; properties now get executed, unless the priority for a particular build step is changed from its default. </para></listitem> </varlistentry> </variablelist> <para> For example, if a custom build step needs to take place before any of the normal source files get compiled then it should be given a priority somewhere between 0 and 100. If a custom build step involves post-processing an object file prior to its incorporation into a library then a priority between 100 and 200 should be used. It is not sensible to have a priority above 200, since that would imply building an additional object file for a library that has already been created. </para> </refsect1> <refsect1><title>Example</title> <programlisting width=72> cdl_option XXX { … make_object { parser.o: parser.y yacc $< $(CC) $(CFLAGS) -o $@ y.tab.c } } </programlisting> </refsect1> <refsect1><title>See Also</title> <para> Properties <link linkend="ref.compile">compile</link>, <link linkend="ref.make">make</link> and <link linkend="ref.library">library</link>. </para> </refsect1> </refentry> <!-- }}} --> <!-- {{{ no_define --> <refentry id="ref.no-define"> <refmeta> <refentrytitle>&no-define;</refentrytitle> </refmeta> <refnamediv> <refname>Property &no-define;</refname> <refpurpose>Suppress the normal generation of a preprocessor <literal>#define</literal> symbol in a configuration header file.</refpurpose> </refnamediv> <refsynopsisdiv> <synopsis> cdl_option <name> { no_define … } </synopsis> </refsynopsisdiv> <refsect1><title>Description</title> <para> By default all active and enabled properties result in either one or two <literal>#define'd</literal> symbols in the package's configuration header file, and this is one of the main ways in which options can affect packages at build-time. It is possible to suppress the default <literal>#define's</literal> by specifying a &no-define; property in the body of an option or other &CDL; entity. This property takes no arguments and should occur only once in a given body. </para> <para> The &no-define; property is frequently used in conjunction with one of the other header-file related properties such as &define;. If one of the other properties is used to export the required information to a configuration header file then often there is little point in exporting the default <literal>#define</literal> as well &mdash in fact there could be a name clash. The &no-define; property can also be useful if the sole purpose of an option is to affect which files get built, and the default <literal>#define</literal> would never get tested in any source code. However in such cases the default <literal>#define</literal> is mostly harmless and there is little to be gained by suppressing it. </para> </refsect1> <refsect1><title>Example</title> <programlisting width=72> cdl_component CYG_HAL_STARTUP { display "Startup type" flavor data legal_values { "RAM" "ROM" } default_value {"RAM"} no_define define -file system.h CYG_HAL_STARTUP … } </programlisting> </refsect1> <refsect1><title>See Also</title> <para> Properties <link linkend="ref.define">&define;</link>, <link linkend="ref.define-format">&define-format;</link>, <link linkend="ref.define-header">&define-header;</link>, <link linkend="ref.define-proc">&define-proc;</link> and <link linkend="ref.if-define">&if-define;</link>. </para> </refsect1> </refentry> <!-- }}} --> <!-- {{{ parent --> <refentry id="ref.parent"> <refmeta> <refentrytitle>&parent;</refentrytitle> </refmeta> <refnamediv> <refname>Property &parent;</refname> <refpurpose>Control the location of an option in the configuration hierarchy.</refpurpose> </refnamediv> <refsynopsisdiv> <synopsis> cdl_option <name> { parent <component or package> … } </synopsis> </refsynopsisdiv> <refsect1><title>Description</title> <para> Configuration options live in a hierarchy of packages and components. By default a given option's position in the hierarchy is a simple consequence of its position within the CDL scripts. Packages are generally placed at the top-level of the configuration. Any components or options that are defined at the same level as the &cdl-package; command in a package's top-level CDL script are placed immediately below that package in the hierarchy. Any options or components that are defined in the body of a &cdl-package; or &cdl-component; command, or that are read in as a result of processing a component's &script; property, will be placed immediately below that package or component in the hierarchy. </para> <para> In some circumstances it is useful to specify an alternative position in the hierarchy for a given option. For example it is often convenient to re-parent device driver packages below <varname>CYGPKG_IO</varname> in the configuration hierarchy, thus reducing the number of packages at the top level of the hierarchy and making navigation easier. The &parent; property can be used to achieve this. </para> <para> The &parent; property takes a single argument, which should be the name of a package or component. The body of a &cdl-option; or other CDL entity can contain at most one &parent; property. </para> <para> Although the &parent; property affects an option's position in the overall hierarchy and hence whether or not that option is active, a re-parented option still belongs to the package that defines it. By default any <literal>#define's</literal> will be exported to that package's configuration header file. Any &compile; properties can only reference source files present in that package, and it is not directly possible to cause some file in another package to be built by re-parenting. </para> <para> As a special case, if an empty string is specified for the parent then the option is placed at the top of the hierarchy, ahead of any packages which are not explicitly re-parented in this way. This facility is useful for configuration options such as global preferences and default compiler flags. </para> <tip> <para> If an option is re-parented somewhere below another package and that other package is not actually loaded, the option is an orphan and its active/inactive state is undefined. In such cases it is a good idea for the owning package to require the presence of the other one. Unfortunately this technique does not work if a package as a whole is reparented below another one that has not been loaded: the package is orphaned so it may be automatically inactive, and hence any &requires; properties would have no effect. </para> </tip> </refsect1> <refsect1><title>Example</title> <programlisting width=72> cdl_package CYGPKG_HAL_I386 { display "i386 architecture" parent CYGPKG_HAL hardware include_dir cyg/hal define_header hal_i386.h … } cdl_component CYGBLD_GLOBAL_OPTIONS { display "Global build options" parent "" … } </programlisting> </refsect1> <refsect1><title>See Also</title> <para> Property <link linkend="ref.script">&script;</link>, commands <link linkend="ref.cdl-component">&cdl-component;</link> and <link linkend="ref.cdl-package">&cdl-package;</link>. </para> </refsect1> </refentry> <!-- }}} --> <!-- {{{ requires --> <refentry id="ref.requires"> <refmeta> <refentrytitle>&requires;</refentrytitle> </refmeta> <refnamediv> <refname>Property &requires;</refname> <refpurpose>List constraints that the configuration should satisfy if a given option is active and enabled..</refpurpose> </refnamediv> <refsynopsisdiv> <synopsis> cdl_option <name> { requires <goal expression> … } </synopsis> </refsynopsisdiv> <refsect1><title>Description</title> <para> Configuration options are not independent. For example the C library can provide thread-safe implementations of certain functions, but only if the kernel is present, if the kernel provides multi-threading, and if the kernel options related to per-thread data are enabled. It is possible to express such constraints using &requires; properties. </para> <para> The arguments to a &requires; property should constitute a goal expression, as described in <xref linkend="language.list-expression">. Most goal expressions are relatively simple because the constraints being described are simple, but complicated expressions can be used when necessary. The body of an option or other CDL entity can contain any number of &requires; constraints. If the option is active and enabled then all these constraints should be satisfied, and any goal expressions which evaluate to <literal>0</literal> will result in conflicts being raised. It is possible for users to ignore such conflicts and attempt to build the current configuration anyway, but there is no guarantee that anything will work. If an option is inactive or disabled then its &requires; constraints will be ignored. </para> <para> The configuration system contains an inference engine which can resolve many types of conflicts automatically. For example, if option <literal>A</literal> is enabled and requires an option <literal>B</literal> that is currently disabled then the inference engine may attempt to resolve the conflict by enabling <literal>B</literal>. However this will not always be possible, for example there may be other constraints in the configuration which force <literal>B</literal> to be disabled at present, in which case user intervention is required. </para> </refsect1> <refsect1><title>Example</title> <programlisting width=72> cdl_component CYGPKG_IO_SERIAL_POWERPC_COGENT_SERIAL_A { display "Cogent PowerPC serial port A driver" flavor bool default_value 0 requires (CYGIMP_KERNEL_INTERRUPTS_CHAIN || \ !CYGPKG_IO_SERIAL_POWERPC_COGENT_SERIAL_B) … } </programlisting> </refsect1> <refsect1><title>See Also</title> <para> Property <link linkend="ref.active-if">&active-if;</link>. </para> </refsect1> </refentry> <!-- }}} --> <!-- {{{ script --> <refentry id="ref.script"> <refmeta> <refentrytitle>&script;</refentrytitle> </refmeta> <refnamediv> <refname>Property &script;</refname> <refpurpose>Include additional configuration information from another CDL script.</refpurpose> </refnamediv> <refsynopsisdiv> <synopsis> cdl_component <name> { script <filename> … } </synopsis> </refsynopsisdiv> <refsect1><title>Description</title> <para> It is possible to define all the configuration options and sub-components for a given package in a single CDL script, either by nesting them in the appropriate command bodies, by extensive use of the &parent; property, or by some combination of these two. However for large packages this is inconvenient and it is better to split the raw configuration data over several different files. The &script; property can be used to achieve this. It takes a single filename as argument. If the package follows the <link linkend="package.hierarchy">directory layout conventions</link> then the configuration tools will look for the specified file in the <filename class="directory">cdl</filename> sub-directory of the package, otherwise it will look for the file relative to the package's top-level directory. </para> <para> The &script; property can only occur in the body of a &cdl-component command, and only one &script; property per body is allowed. </para> </refsect1> <refsect1><title>Example</title> <programlisting width=72> cdl_component CYGPKG_UITRON_TASKS { display "Tasks" flavor none description " uITRON Tasks are the basic blocks of multi-tasking in the uITRON world; they are threads or lightweight processes, sharing the address space and the CPU. They communicate using the primitives outlined above. Each has a stack, an entry point (a C or C++ function), and (where appropriate) a scheduling priority." script tasks.cdl } </programlisting> </refsect1> <refsect1><title>See Also</title> <para> Command <link linkend="ref.cdl-component">&cdl-component;</link>, and property <link linkend="ref.parent">&parent;</link>. </para> </refsect1> </refentry> <!-- }}} --> </chapter>
