diff options
author | Joseph Brill <48932340+jcbrill@users.noreply.github.com> | 2022-06-26 11:40:02 (GMT) |
---|---|---|
committer | Joseph Brill <48932340+jcbrill@users.noreply.github.com> | 2022-06-26 11:40:02 (GMT) |
commit | 0b5f192428beb061d77d707d1e010c6119528a57 (patch) | |
tree | 4ca0a529e3369dbcdb46656f4eb85b57f2ed2df3 /doc | |
parent | 607d719e44d58de52f261b95a6c7c8a4dfa5b225 (diff) | |
parent | 07dc10b25b6169c9fb7e16dd78de8bb9ea107be6 (diff) | |
download | SCons-0b5f192428beb061d77d707d1e010c6119528a57.zip SCons-0b5f192428beb061d77d707d1e010c6119528a57.tar.gz SCons-0b5f192428beb061d77d707d1e010c6119528a57.tar.bz2 |
Merge branch 'master' into jbrill-msvc-batchargs
Diffstat (limited to 'doc')
-rw-r--r-- | doc/man/scons.xml | 423 |
1 files changed, 232 insertions, 191 deletions
diff --git a/doc/man/scons.xml b/doc/man/scons.xml index 4578d1c..3caa5ea 100644 --- a/doc/man/scons.xml +++ b/doc/man/scons.xml @@ -2612,28 +2612,35 @@ and specifically <link linkend='tool_modules'>Tool Modules</link>. <refsect2 id='builder_methods'> <title>Builder Methods</title> -<para>You tell &scons; what to build +<para>You tell &SCons; what to build by calling <firstterm>Builders</firstterm>, -functions which take -particular action(s) to produce a particular result type -(conventionally described by the builder name such as &b-Program;) -when given source files of a particular type. -Calling a builder defines one or more targets to the build system; -whether the targets are actually built on a given -invocation is determined by command-line options, -target selection rules, and whether &SCons; -determines the target(s) are out of date. +functions which take particular action(s) +to produce target(s) of a particular type +(conventionally hinted at by the builder name, e.g. &Program;) +from the specified source files. +A builder call is a declaration: &SCons; enters the +specified relationship into its internal dependency node graph, +and only later makes the decision on whether anything is actually built, +since this depends on command-line options, +target selection rules, and whether the target(s) are +out of date with respect to the sources. </para> <para> &SCons; -defines a number of builders, and you can also write your own. -Builders are attached to a &consenv; as methods, -and the available builder methods are listed as +provides a number of builders, and you can also write your own +(see <link linkend='builder_objects'>Builder Objects</link>). +Builders are created dynamically at run-time, +often (though not always) by tools which determine +whether the external dependencies for the builder are satisfied, +and which perform the necessary setup +(see <link linkend='tools'>Tools</link>). +Builders are attached to a &consenv; as methods. +The available builder methods are registered as key-value pairs in the -<varname>BUILDERS</varname> attribute of the &consenv;. -The available builders can be displayed like this -for debugging purposes: +&cv-link-BUILDERS; attribute of the &consenv;, +so the available builders can be examined. +This example displays them for debugging purposes: </para> <programlisting language="python"> @@ -2646,7 +2653,6 @@ Builder methods take two required arguments: <parameter>target</parameter> and <parameter>source</parameter>. -Either can be passed as a scalar or as a list. The <parameter>target</parameter> and <parameter>source</parameter> arguments can be specified either as positional arguments, @@ -2660,24 +2666,17 @@ Builder methods also take a variety of keyword arguments, described below. </para> -<para> -The builder <emphasis>may</emphasis> add other targets -beyond those requested if indicated by an <firstterm>Emitter</firstterm> -(see <xref linkend="builder_objects"/> and, for example, -&cv-link-PROGEMITTER; for more information). -</para> - <para>Because long lists of file names -can lead to a lot of quoting, -&scons; +can lead to a lot of quoting in a builder call, +&SCons; supplies a &f-link-Split; global function and a same-named environment method that splits a single string into a list, using -strings of white-space characters as the delimiter. -(similar to the Python string <function>split</function> -method, but succeeds even if the input isn't a string.)</para> +strings of white-space characters as the delimiter +(similar to the &Python; string <function>split</function> +method, but succeeds even if the input isn't a string).</para> <para> The following are equivalent examples of calling the @@ -2695,9 +2694,12 @@ env.Program('bar', source='bar.c foo.c'.split()) </programlisting> <para> -Python follows the POSIX pathname convention for path -strings: if a string begins with the operating system pathname separator -(on Windows both the slash and backslash separator work, +Sources and targets can be specified as a scalar or as a list, +composed of either strings or nodes (more on nodes below). +When specifying path strings, +&Python; follows the POSIX pathname convention: +if a string begins with the operating system pathname separator +(on Windows both the slash and backslash separator are accepted, and any leading drive specifier is ignored for the determination) it is considered an absolute path, otherwise it is a relative path. @@ -2706,32 +2708,26 @@ it is searched for as a file in the current directory. If it contains separator characters, the search follows down from the starting point, which is the top of the directory tree for an absolute path and the current directory for a relative path. +The "current directory" in this context is the directory +of the SConscript file currently being processed. </para> <para> -&scons; recognizes a third way to specify +&SCons; also recognizes a third way to specify path strings: if the string begins with the <emphasis role="bold">#</emphasis> character it is <firstterm>top-relative</firstterm> - it works like a relative path but the search follows down from the directory containing the top-level &SConstruct; rather than -from the current directory. The <emphasis role="bold">#</emphasis> is allowed -to be followed by a pathname separator, which is ignored if -found in that position. +from the current directory. The <emphasis role="bold">#</emphasis> +can optionally be followed by a pathname separator, +which is ignored if found in that position. Top-relative paths only work in places where &scons; will interpret the path (see some examples below). To be used in other contexts the string will need to be converted to a relative or absolute path first. </para> -<para> -<parameter>target</parameter> and <parameter>source</parameter> -can be absolute, relative, or -top-relative. Relative pathnames are searched considering the -directory of the SConscript -file currently being processed as the "current directory". -</para> - <para>Examples:</para> <programlisting language="python"> @@ -2786,14 +2782,12 @@ env.Program(source='bar.c') env.Program('bar.c') </programlisting> -<para>As a convenience, a +<para>The optional <parameter>srcdir</parameter> -keyword argument may be specified -when calling a Builder. -When specified, +keyword argument specifies that all source file strings that are not absolute paths or top-relative paths -will be interpreted relative to the specified +shall be interpreted relative to the specified <parameter>srcdir</parameter>. The following example will build the <filename>build/prog</filename> @@ -2810,6 +2804,99 @@ and env.Program('build/prog', ['f1.c', 'f2.c'], srcdir='src') </programlisting> +<para>The optional +<parameter>parse_flags</parameter> +keyword argument causes behavior similar to the +&f-link-env-MergeFlags; method, where the argument value is +broken into individual settings and merged into the appropriate &consvars;. +</para> + +<programlisting language="python"> +env.Program('hello', 'hello.c', parse_flags='-Iinclude -DEBUG -lm') +</programlisting> + +<para>This example adds 'include' to +the &cv-link-CPPPATH; &consvar;, +'EBUG' to +&cv-link-CPPDEFINES;, +and 'm' to +&cv-link-LIBS;. +</para> + +<para>The optional +<parameter>chdir</parameter> +keyword argument +specifies that the Builder's action(s) +should be executed +after changing directory. +If the +<parameter>chdir</parameter> +argument is +a path string or a directory Node, +scons will change to the specified directory. +If the +<parameter>chdir</parameter> +is not a string or Node +and evaluates true, +then &scons; will change to the +target file's directory.</para> + +<warning> +<para> +Python only keeps one current directory +location even if there are multiple threads. +This means that use of the +<parameter>chdir</parameter> +argument +will +<emphasis>not</emphasis> +work with the SCons +<option>-j</option> +option, +because individual worker threads spawned +by SCons interfere with each other +when they start changing directory.</para> +</warning> + +<programlisting language="python"> +# scons will change to the "sub" subdirectory +# before executing the "cp" command. +env.Command( + target='sub/dir/foo.out', + source='sub/dir/foo.in', + action="cp dir/foo.in dir/foo.out", + chdir='sub', +) + +# Because chdir is not a string, scons will change to the +# target's directory ("sub/dir") before executing the +# "cp" command. +env.Command('sub/dir/foo.out', 'sub/dir/foo.in', "cp foo.in foo.out", chdir=True) +</programlisting> + +<para>Note that &SCons; will +<emphasis>not</emphasis> +automatically modify +its expansion of +&consvars; like &cv-link-TARGET; +and &cv-link-SOURCE; +when using the <parameter>chdir</parameter> +keyword argument--that is, +the expanded file names +will still be relative to +the top-level directory where the &SConstruct; was found, +and consequently incorrect +relative to the chdir directory. +If you use the <parameter>chdir</parameter> keyword argument, +you will typically need to supply a different +command line using +expansions like +<literal>${TARGET.file}</literal> +and +<literal>${SOURCE.file}</literal> +to use just the filename portion of the +target and source.</para> + <para>Keyword arguments that are not specifically recognized are treated as &consvar; <firstterm>overrides</firstterm>, @@ -2837,29 +2924,9 @@ env.SharedLibrary( <para>Note that both the &cv-link-SHLIBSUFFIX; and &cv-link-LIBSUFFIXES; -variables must be set if you want &scons; to search automatically +&consvars; must be set if you want &scons; to search automatically for dependencies on the non-standard library names; -see the descriptions below of these variables for more information.</para> - -<para>The optional -<parameter>parse_flags</parameter> -keyword argument is recognized by builders. -This works similarly to the -&f-link-env-MergeFlags; method, where the argument value is -broken into individual settings and merged into the appropriate &consvars;. -</para> - -<programlisting language="python"> -env.Program('hello', 'hello.c', parse_flags='-Iinclude -DEBUG -lm') -</programlisting> - -<para>This example adds 'include' to -the &cv-link-CPPPATH; &consvar;, -'EBUG' to -&cv-link-CPPDEFINES;, -and 'm' to -&cv-link-LIBS;. -</para> +see the descriptions of these variables for more information.</para> <para>Although the builder methods defined by &scons; @@ -2872,30 +2939,47 @@ Program('hello', 'hello.c') SharedLibrary('word', 'word.cpp') </programlisting> -<para>If called this way, methods will internally use the -&defenv; that consists of the tools and values that +<para>If called this way, the builder will internally use the +&DefEnv; that consists of the tools and values that &scons; has determined are appropriate for the local system.</para> <para>Builder methods that can be called without an explicit -environment (indicated in the listing of builders without -a leading <varname>env.</varname>) -may be called from custom Python modules that you +environment (indicated in the listing of builders below +without a leading <varname>env.</varname>) +may be called from custom &Python; modules that you import into an SConscript file by adding the following -to the Python module:</para> +to the &Python; module:</para> <programlisting language="python"> from SCons.Script import * </programlisting> -<para>Builder methods return a <classname>NodeList</classname>, -a list-like object whose elements are Nodes, -&SCons;' internal representation of build targets or sources. -See <xref linkend="node_objects"/> for more information. +<para> +A builder <emphasis>may</emphasis> add additional targets +beyond those requested +if an attached <firstterm>Emitter</firstterm> chooses to do so +(see <xref linkend="builder_objects"/> for more information. +&cv-link-PROGEMITTER; is an example). +For example, the GNU linker takes a command-line argument +<option>-Map=<replaceable>mapfile</replaceable></option>, +which causes it to produce a linker map file in addition +to the executable file actually being linked. +If the &b-link-Program; builder's emitter is configured +to add this mapfile if the option is set, +then two targets will be returned when you only provided for one. +</para> + +<para> +For this reason, +builder methods always return a <classname>NodeList</classname>, +a list-like object whose elements are Nodes. +Nodes are the internal representation of build targets or sources +(see <xref linkend="node_objects"/> for more information). The returned <classname>NodeList</classname> object can be passed to other builder methods as source(s) -or passed to any &SCons; function or method -where a filename would normally be accepted. +or to other &SCons; functions or methods +where a path string would normally be accepted. </para> <para> For example, @@ -2912,7 +2996,7 @@ env.Program("prog", ['foo.c', bar_obj_list, 'main.c']) makes for a more portable build by avoiding having to specify a platform-specific object suffix -when calling the &Program; builder method. +when calling the &b-link-Program; builder method. </para> <para>The <classname>NodeList</classname> object @@ -2929,9 +3013,9 @@ Default(tgt) lists passed as source and target, so they are free to contain elements which are themselves lists, such as <varname>bar_obj_list</varname> -returned by the &StaticObject; call above. +returned by the &b-link-StaticObject; call. If you need to manipulate a list of lists returned by builders -directly in Python code, +directly in &Python; code, you can either build a new list by hand:</para> <programlisting language="python"> @@ -2943,7 +3027,7 @@ for obj in objects: </programlisting> <para>Or you can use the &f-link-Flatten; -function supplied by &scons; +function supplied by &SCons; to create a list containing just the Nodes, which may be more convenient:</para> @@ -2955,20 +3039,20 @@ for obj in objects: print(str(obj)) </programlisting> -<para>&SCons; builder calls return -a list-like object, not an actual Python list, -so it is not appropriate to use the Python add +<para>Since builder calls return +a list-like object, not an actual &Python; list, +it is not appropriate to use the &Python; add operator (<literal>+</literal> or <literal>+=</literal>) -to append builder results to a Python list. +to append builder results to a &Python; list. Because the list and the object are different types, -Python will not update the original list in place, +&Python; will not update the original list in place, but will instead create a new <classname>NodeList</classname> object containing the concatenation of the list elements and the builder results. -This will cause problems for any other Python variables +This will cause problems for any other &Python; variables in your SCons configuration that still hold on to a reference to the original list. -Instead, use the Python list +Instead, use the &Python; list <function>extend</function> method to make sure the list is updated in-place. Example:</para> @@ -2986,7 +3070,7 @@ object_files.extend(Object('bar.c')) </programlisting> <para>The path name for a Node's file may be used -by passing the Node to Python's builtin +by passing the Node to &Python;'s builtin <function>str</function> function:</para> @@ -2997,69 +3081,11 @@ print("The path to bar_obj is:", str(bar_obj_list[0])) <para>Note that because the Builder call returns a <classname>NodeList</classname>, -you have to access the first element in the list, +you have to access the first element in the list (<literal>bar_obj_list[0]</literal> in the example) to get at the Node that actually represents the object file.</para> -<para>Builder calls support a -<parameter>chdir</parameter> -keyword argument that -specifies that the Builder's action(s) -should be executed -after changing directory. -If the -<parameter>chdir</parameter> -argument is -a string or a directory Node, -scons will change to the specified directory. -If the -<parameter>chdir</parameter> -is not a string or Node -and is non-zero, -then scons will change to the -target file's directory.</para> - -<programlisting language="python"> -# scons will change to the "sub" subdirectory -# before executing the "cp" command. -env.Command('sub/dir/foo.out', 'sub/dir/foo.in', - "cp dir/foo.in dir/foo.out", - chdir='sub') - -# Because chdir is not a string, scons will change to the -# target's directory ("sub/dir") before executing the -# "cp" command. -env.Command('sub/dir/foo.out', 'sub/dir/foo.in', - "cp foo.in foo.out", - chdir=1) -</programlisting> - -<para>Note that &SCons; will -<emphasis>not</emphasis> -automatically modify -its expansion of -&consvars; like -<envar>$TARGET</envar> -and -<envar>$SOURCE</envar> -when using the <parameter>chdir</parameter> -keyword argument--that is, -the expanded file names -will still be relative to -the top-level directory where &SConstruct; was found, -and consequently incorrect -relative to the chdir directory. -If you use the <parameter>chdir</parameter> keyword argument, -you will typically need to supply a different -command line using -expansions like -<literal>${TARGET.file}</literal> -and -<literal>${SOURCE.file}</literal> -to use just the filename portion of the -targets and source.</para> - <para> When trying to handle errors that may occur in a builder method, consider that the corresponding Action is executed at a different @@ -3073,13 +3099,22 @@ a useful exception message indicating the problem in the SConscript files - programmatically recovering from build errors is rarely useful. </para> -<para>&scons; -predefines the following builder methods. +<para> +The following builder methods are predefined in the +&SCons; core software distribution. Depending on the setup of a particular &consenv; and on the type and software installation status of the underlying system, -not all builders may be available to that -&consenv;.</para> +not all builders may be available in that +&consenv;. +Since the function calling signature is the same for all builders: +</para> +<programlisting language="python"> +<function>Buildername</function>(<parameter>target, source, [key=val, ...]</parameter>) +</programlisting> +<para> +it is omitted in this listing for brevity. +</para> <!-- '\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" --> <!-- '\" BEGIN GENERATED BUILDER DESCRIPTIONS --> @@ -5585,38 +5620,37 @@ and the list of sources for this builder.</para> <programlisting language="python"> def e(target, source, env): - return (target + ['foo.foo'], source + ['foo.src']) + return target + ['foo.foo'], source + ['foo.src'] # Simple association of an emitter function with a Builder. -b = Builder("my_build < $TARGET > $SOURCE", - emitter = e) +b = Builder("my_build < $TARGET > $SOURCE", emitter=e) def e2(target, source, env): - return (target + ['bar.foo'], source + ['bar.src']) + return target + ['bar.foo'], source + ['bar.src'] # Simple association of a list of emitter functions with a Builder. -b = Builder("my_build < $TARGET > $SOURCE", - emitter = [e, e2]) +b = Builder("my_build < $TARGET > $SOURCE", emitter=[e, e2]) -# Calling an emitter function through a &consvar;. +# Calling an emitter function through a construction variable. env = Environment(MY_EMITTER=e) -b = Builder("my_build < $TARGET > $SOURCE", - emitter='$MY_EMITTER') +b = Builder("my_build < $TARGET > $SOURCE", emitter='$MY_EMITTER') -# Calling a list of emitter functions through a &consvar;. +# Calling a list of emitter functions through a construction variable. env = Environment(EMITTER_LIST=[e, e2]) -b = Builder("my_build < $TARGET > $SOURCE", - emitter='$EMITTER_LIST') +b = Builder("my_build < $TARGET > $SOURCE", emitter='$EMITTER_LIST') # Associating multiple emitters with different file # suffixes using a dictionary. def e_suf1(target, source, env): - return (target + ['another_target_file'], source) + return target + ['another_target_file'], source + def e_suf2(target, source, env): - return (target, source + ['another_source_file']) -b = Builder("my_build < $TARGET > $SOURCE", - emitter={'.suf1' : e_suf1, - '.suf2' : e_suf2}) + return target, source + ['another_source_file'] + +b = Builder( + action="my_build < $TARGET > $SOURCE", + emitter={'.suf1': e_suf1, '.suf2': e_suf2} +) </programlisting> </listitem> </varlistentry> @@ -5904,7 +5938,7 @@ you need to create the action object using &f-Action;. returns an appropriate object for the action represented by the type of the <parameter>action</parameter> argument -(the first positional parmeter):</para> +(the first positional parameter):</para> <itemizedlist> <listitem> @@ -6034,19 +6068,22 @@ The following argument types are accepted: <itemizedlist> <listitem> -<para>If <parameter>output</parameter> is a string, -substitution is performed on the string before it is printed. -The string typically contains variables, notably +<para>If the second argument is a string, +or if the <parameter>cmdstr</parameter> keyword argument is supplied, +the string defines what is printed. +Substitution is performed on the string before it is printed. +The string typically contains substitutable variables, notably <literal>$TARGET(S)</literal> and <literal>$SOURCE(S)</literal>, -or consists of just a single -variable, which is optionally defined somewhere else. +or consists of just a single variable +which is optionally defined somewhere else. &SCons; itself heavily uses the latter variant.</para> </listitem> <listitem> -<para>If <parameter>output</parameter> is a function, -the function will be called to obtain a string -describing the action being executed. +<para>If the second argument is a function, +or if the <parameter>strfunction</parameter> keyword argument is supplied, +the function will be called to obtain the string +to be printed when the action is performed. The function must accept three keyword arguments: <parameter>target</parameter>, @@ -6054,22 +6091,26 @@ must accept three keyword arguments: <parameter>env</parameter>, with the same interpretation as for a callable <parameter>action</parameter> argument above. +The function is responsible for handling any required substitutions. </para> </listitem> <listitem> -<para>If <parameter>output</parameter>is <constant>None</constant>, +<para>If the second argument is <constant>None</constant>, +or if <literal>cmdstr=None</literal> is supplied, output is suppressed entirely.</para> </listitem> </itemizedlist> <para> -Instead of using a positional argument, -the <parameter>cmdstr</parameter> -keyword argument may be used to specify the output string, -or the <parameter>strfunction</parameter> keyword argument -may be used to specify a function to return the output string. -<literal>cmdstr=None</literal> suppresses output entirely. +The <parameter>cmdstr</parameter> and +<parameter>strfunction</parameter> +keyword arguments may not both be supplied in a single call to &f-Action; +</para> + +<para> +Printing of action strings is affected by the setting of +&cv-link-PRINT_CMD_LINE_FUNC;. </para> <para>Examples:</para> |