diff --git a/CHANGES.txt b/CHANGES.txt
index ed6905ba7..0eab29a67 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -198,6 +198,8 @@ RELEASE VERSION/DATE TO BE FILLED IN LATER
attribute and to explain what's being done in the example.
- Test framework reformatted using settings from pyproject.toml.
Includes code embedded in docstrings.
+ - Improve the Builder Methods intro section in manpage, making sure
+ all prose appears before the listing of methods.
From Adam Scott:
- Changed Ninja's TEMPLATE rule pool to use `install_pool` instead of
diff --git a/RELEASE.txt b/RELEASE.txt
index 19927a3c2..6b6b6644f 100644
--- a/RELEASE.txt
+++ b/RELEASE.txt
@@ -224,6 +224,9 @@ DOCUMENTATION
being created from '${SOURCE.base}.out' to use a valid special
attribute and to explain what's being done in the example.
+- Improve the descriptive portion of the Builder Methods section in
+ the manpage: reword, reorganize.
+
DEVELOPMENT
-----------
diff --git a/SCons/BuilderTests.py b/SCons/BuilderTests.py
index adfa64828..6b8c9eec0 100644
--- a/SCons/BuilderTests.py
+++ b/SCons/BuilderTests.py
@@ -714,8 +714,8 @@ def func(target, source, env) -> None:
infiles.append(test.workpath('%d.in' % i))
outfiles.append(test.workpath('%d.out' % i))
test.write(infiles[-1], "\n")
- builder = SCons.Builder.Builder(action=SCons.Action.Action(func,None),
- single_source = 1, suffix='.out')
+ builder = SCons.Builder.Builder(action=SCons.Action.Action(func, None),
+ single_source=True, suffix='.out')
env['CNT'] = [0]
tgt = builder(env, target=outfiles[0], source=infiles[0])[0]
s = str(tgt)
diff --git a/SCons/Node/__init__.py b/SCons/Node/__init__.py
index 055c3090c..48e62746d 100644
--- a/SCons/Node/__init__.py
+++ b/SCons/Node/__init__.py
@@ -215,7 +215,7 @@ def get_contents_dir(node):
contents.append('%s %s\n' % (n.get_csig(), n.name))
return ''.join(contents)
-def get_contents_file(node):
+def get_contents_file(node) -> bytes:
if not node.rexists():
return b''
fname = node.rfile().get_abspath()
diff --git a/SCons/Tool/Tool.xml b/SCons/Tool/Tool.xml
index fcd33fe93..19511fe14 100644
--- a/SCons/Tool/Tool.xml
+++ b/SCons/Tool/Tool.xml
@@ -36,13 +36,13 @@ if it is not already present.
Example:
-
+
# builds foo.c
env.CFile(target='foo.c', source='foo.l')
# builds bar.c
env.CFile(target='bar', source='bar.y')
-
+
@@ -3343,62 +3272,13 @@ it is omitted in this listing for brevity.
-
-All
-targets of builder methods automatically depend on their sources.
-An explicit dependency can
-be specified using the
-&f-link-env-Depends;
-method of a &consenv; (see below).
-
-In addition,
-&scons;
-automatically scans
-source files for various programming languages,
-so the dependencies do not need to be specified explicitly.
-By default, SCons can
-C source files,
-C++ source files,
-Fortran source files with
-.F
-(POSIX systems only),
-.fpp,
-or
-.FPP
-file extensions,
-and assembly language files with
-.S
-(POSIX systems only),
-.spp,
-or
-.SPP
-files extensions
-for C preprocessor dependencies.
-SCons also has default support
-for scanning D source files,
-You can also write your own Scanners
-to add support for additional source file types.
-These can be added to the default
-Scanner object used by the
-&b-link-Object;, &b-link-StaticObject; and &b-link-SharedObject;
-Builders by adding them
-to the
-SourceFileScanner
-object.
-See
-for more information about
-defining your own Scanner objects
-and using the
-SourceFileScanner
-object.
-
&SCons; Functions and Environment Methods
-&SCons; provides a variety of &consenv; methods
+&SCons; provides a variety of &consenv; methods
and global functions to manipulate the build configuration.
Often, a &consenv; method and a global function with
the same name exist for convenience.
@@ -3441,19 +3321,17 @@ with two key differences:
-&Consenv; methods that change the environment
+&Consenv; methods that read from or change the environment
act on the environment instance from which they are called,
-while the corresponding global function acts on
-a special “hidden” &consenv; called the Default Environment.
-In some cases, the global function may take
-an initial argument giving the object to operate on.
+while the corresponding global function reads from
+a special “hidden” &consenv; called the &DefEnv;
String-valued arguments
(including strings in list-valued arguments)
-are subject to construction variable expansion
+are subject to &consvar; expansion
by the environment method form;
variable expansion is not immediately performed in the global function.
For example, Default('$MYTARGET')
@@ -5844,7 +5722,7 @@ Adding new Tool modules is described in
Builder Objects&scons;
-can be extended to build different types of targets
+can be extended to build additional types of targets
by adding new Builder objects
to a &consenv;.
In general,
@@ -5853,7 +5731,7 @@ when you want to build a new type of file or other external target.
For output file types &scons; already knows about,
you can usually modify the behavior of premade Builders
such as &b-link-Program;, &b-link-Object; or &b-link-Library;
-by changing the &consvars; they use
+by changing the &consvars; that control their behavior
(&cv-link-CC;, &cv-link-LINK;, etc.).
In this manner you can, for example, change the compiler to use,
which is simpler and less error-prone than writing a new builder.
@@ -5865,8 +5743,8 @@ The documentation for each Builder lists which
using the
&f-link-Builder;
factory function.
-Once created, a builder is added to an environment
-by entering it in the &cv-link-BUILDERS; dictionary
+Once created, a builder is added to a &consenv;
+by registering it in the &cv-link-BUILDERS; dictionary
in that environment (some of the examples
in this section illustrate this).
Doing so automatically triggers &SCons; to add a method
@@ -6399,16 +6277,14 @@ env.MyBuild('sub/dir/foo.out', 'sub/dir/foo.in')
-&Python; only keeps one current directory
-location even if there are multiple threads.
+&Python; only tracks one current directory location,
+even if there are multiple executing threads.
This means that use of the
chdir
-argument
-will
+argument will
not
-work with the SCons
-
-option,
+work with &SCons; in multi-threaded mode
+(the option),
because individual worker threads spawned
by SCons interfere with each other
when they start changing directory.
@@ -6420,8 +6296,8 @@ when they start changing directory.Any additional keyword arguments supplied
when a Builder object is created
(that is, when the &f-link-Builder; function is called)
-will be set in the executing construction
-environment when the Builder object is called.
+will be set in the executing &consenv;
+when the Builder object is called.
The canonical example here would be
to set a &consvar; to
the repository of a source code system.
@@ -6440,6 +6316,19 @@ and
emitter functions.
+
+When handling errors in a custom builder method,
+remember that the corresponding Action is executed at a different
+time than the &SConscript; file statement calling the builder.
+Wrapping a builder call in a try block
+is not useful,
+as success of the builder call is not the same as
+the build itself succeeding.
+If necessary, code a Builder's Action to exit with
+a useful exception message indicating the problem in the &SConscript; files.
+Programmatic recovery from build errors is rarely useful.
+
+
@@ -6583,7 +6472,7 @@ will expand &consvars; in any argument strings,
including
action,
at the time it is called,
-using the construction variables in the &consenv; through which
+using the &consvars; in the &consenv; through which
it was called. The global function form &f-link-Action;
delays variable expansion until
the Action object is actually used.