1
0
Fork 0
mirror of https://github.com/ganelson/inform.git synced 2024-07-08 18:14:21 +03:00
inform7/docs/inbuild-module/3-bs2.html

242 lines
22 KiB
HTML
Raw Normal View History

2020-02-27 13:18:25 +02:00
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>3/bs</title>
2020-03-19 02:11:25 +02:00
<meta name="viewport" content="width=device-width initial-scale=1">
2020-02-27 13:18:25 +02:00
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Language" content="en-gb">
2020-03-19 02:11:25 +02:00
<link href="../inweb.css" rel="stylesheet" rev="stylesheet" type="text/css">
2020-02-27 13:18:25 +02:00
</head>
<body>
2020-03-19 02:11:25 +02:00
<nav role="navigation">
<h1><a href="../webs.html">Sources</a></h1>
<ul>
<li><a href="../compiler.html"><b>compiler tools</b></a></li>
2020-03-19 02:11:25 +02:00
<li><a href="../other.html">other tools</a></li>
<li><a href="../extensions.html">extensions and kits</a></li>
<li><a href="../units.html">unit test tools</a></li>
</ul>
<h2>Compiler Webs</h2>
<ul>
<li><a href="../inbuild/index.html">inbuild</a></li>
<li><a href="../inform7/index.html">inform7</a></li>
<li><a href="../inter/index.html">inter</a></li>
</ul>
<h2>Inbuild Modules</h2>
<ul>
<li><a href="../inbuild-module/index.html">inbuild</a></li>
<li><a href="../arch-module/index.html">arch</a></li>
<li><a href="../words-module/index.html">words</a></li>
<li><a href="../syntax-module/index.html">syntax</a></li>
<li><a href="../html-module/index.html">html</a></li>
</ul>
<h2>Inform7 Modules</h2>
<ul>
<li><a href="../core-module/index.html">core</a></li>
<li><a href="../problems-module/index.html">problems</a></li>
<li><a href="../inflections-module/index.html">inflections</a></li>
<li><a href="../linguistics-module/index.html">linguistics</a></li>
<li><a href="../kinds-module/index.html">kinds</a></li>
<li><a href="../if-module/index.html">if</a></li>
<li><a href="../multimedia-module/index.html">multimedia</a></li>
<li><a href="../index-module/index.html">index</a></li>
</ul>
<h2>Inter Modules</h2>
<ul>
<li><a href="../inter-module/index.html">inter</a></li>
<li><a href="../building-module/index.html">building</a></li>
<li><a href="../codegen-module/index.html">codegen</a></li>
</ul>
<h2>Foundation</h2>
<ul>
<li><a href="../../../inweb/docs/foundation-module/index.html">foundation</a></li>
</ul>
</nav>
<main role="main">
2020-02-27 13:18:25 +02:00
<!--Weave of '3/bs2' generated by 7-->
2020-03-22 12:50:19 +02:00
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">inbuild</a></li><li><a href="index.html#3">Chapter 3: Incremental Builds</a></li><li><b>Build Steps</b></li></ul><p class="purpose">A build step is a task which exercises one of the build skills.</p>
2020-02-27 13:18:25 +02:00
2020-03-30 14:23:06 +03:00
<ul class="toc"><li><a href="#SP1">&#167;1. Build skills</a></li><li><a href="#SP3">&#167;3. Build steps</a></li><li><a href="#SP5">&#167;5. Execution</a></li></ul><hr class="tocbar">
2020-02-27 13:18:25 +02:00
2020-03-30 14:23:06 +03:00
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. Build skills. </b>A "skill" is a single atomic task which we know how to perform. For example,
assimilating a binary for a kit is a skill.
</p>
<p class="inwebparagraph">Each different skill is an instance of:
</p>
2020-02-27 13:18:25 +02:00
<pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">build_skill</span><span class="plain"> {</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">name</span><span class="plain">;</span>
<span class="identifier">METHOD_CALLS</span>
<span class="identifier">MEMORY_MANAGEMENT</span>
<span class="plain">} </span><span class="reserved">build_skill</span><span class="plain">;</span>
<span class="reserved">build_skill</span><span class="plain"> *</span><span class="functiontext">BuildSteps::new_skill</span><span class="plain">(</span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">name</span><span class="plain">) {</span>
<span class="reserved">build_skill</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">build_skill</span><span class="plain">);</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">name</span><span class="plain"> = </span><span class="identifier">Str::duplicate</span><span class="plain">(</span><span class="identifier">name</span><span class="plain">);</span>
2020-02-27 13:18:25 +02:00
<span class="identifier">ENABLE_METHOD_CALLS</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">S</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function BuildSteps::new_skill is used in 3/is (<a href="3-is.html#SP1">&#167;1</a>), 3/is2 (<a href="3-is2.html#SP1">&#167;1</a>), 3/is3 (<a href="3-is3.html#SP1">&#167;1</a>), 3/is4 (<a href="3-is4.html#SP1">&#167;1</a>).</p>
<p class="endnote">The structure build_skill is private to this section.</p>
2020-03-30 14:23:06 +03:00
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b>Skills provide two method functions: one constructs a shell command to
perform the skill, and the other performs the skill directly by calling some
function within the current executable. These methods are optional, and if
one is absent then the skill can't be performed that way.
</p>
2020-02-27 13:18:25 +02:00
<pre class="definitions">
<span class="definitionkeyword">enum</span> <span class="constant">BUILD_SKILL_COMMAND_MTID</span>
<span class="definitionkeyword">enum</span> <span class="constant">BUILD_SKILL_INTERNAL_MTID</span>
</pre>
<pre class="display">
<span class="identifier">VMETHOD_TYPE</span><span class="plain">(</span><span class="constant">BUILD_SKILL_COMMAND_MTID</span><span class="plain">,</span>
<span class="reserved">build_skill</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain">, </span><span class="reserved">build_step</span><span class="plain"> *</span><span class="identifier">BS</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">command</span><span class="plain">, </span><span class="reserved">build_methodology</span><span class="plain"> *</span><span class="identifier">meth</span><span class="plain">)</span>
<span class="identifier">IMETHOD_TYPE</span><span class="plain">(</span><span class="constant">BUILD_SKILL_INTERNAL_MTID</span><span class="plain">,</span>
<span class="reserved">build_skill</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain">, </span><span class="reserved">build_step</span><span class="plain"> *</span><span class="identifier">BS</span><span class="plain">, </span><span class="reserved">build_methodology</span><span class="plain"> *</span><span class="identifier">meth</span><span class="plain">)</span>
</pre>
<p class="inwebparagraph"></p>
2020-03-30 14:23:06 +03:00
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. Build steps. </b>These are essentially just skills, but with a docket of contextual data. The
idea is that a function outside the <code class="display"><span class="extract">inbuild</span></code> module can carry out a skill
for us using only the contextual information in this structure, without having
to access any of <code class="display"><span class="extract">inbuild</span></code>'s variables directly.
</p>
2020-02-27 13:18:25 +02:00
<pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">build_step</span><span class="plain"> {</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">build_skill</span><span class="plain"> *</span><span class="identifier">what_to_do</span><span class="plain">;</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">build_vertex</span><span class="plain"> *</span><span class="identifier">vertex</span><span class="plain">; </span><span class="comment">what to do it to</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">linked_list</span><span class="plain"> *</span><span class="identifier">search_path</span><span class="plain">; </span><span class="comment">of <code class="display"><span class="extract">inbuild_nest</span></code></span>
2020-02-27 13:18:25 +02:00
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">target_vm</span><span class="plain"> *</span><span class="identifier">for_vm</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">inter_architecture</span><span class="plain"> *</span><span class="identifier">for_arch</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">for_release</span><span class="plain">;</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">inbuild_copy</span><span class="plain"> *</span><span class="identifier">associated_copy</span><span class="plain">; </span><span class="comment">e.g., the Inform project causing this work</span>
2020-02-27 13:18:25 +02:00
<span class="identifier">MEMORY_MANAGEMENT</span>
<span class="plain">} </span><span class="reserved">build_step</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
2020-03-31 02:17:21 +03:00
<p class="endnote">The structure build_step is accessed in 2/cps, 3/bg, 3/is, 3/is2, 3/is3, 3/is4, 4/em, 4/km, 5/kts, 5/ps2, 6/hdn, 6/inc and here.</p>
2020-02-27 13:18:25 +02:00
2020-03-30 14:23:06 +03:00
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. </b>We build scripts for a vertex by attaching one step at a time to it:
</p>
2020-02-27 13:18:25 +02:00
<pre class="display">
<span class="reserved">build_step</span><span class="plain"> *</span><span class="functiontext">BuildSteps::attach</span><span class="plain">(</span><span class="reserved">build_vertex</span><span class="plain"> *</span><span class="identifier">vertex</span><span class="plain">, </span><span class="reserved">build_skill</span><span class="plain"> *</span><span class="identifier">to_do</span><span class="plain">, </span><span class="identifier">linked_list</span><span class="plain"> *</span><span class="identifier">search</span><span class="plain">,</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">rel</span><span class="plain">, </span><span class="identifier">target_vm</span><span class="plain"> *</span><span class="identifier">VM</span><span class="plain">, </span><span class="identifier">inter_architecture</span><span class="plain"> *</span><span class="identifier">arch</span><span class="plain">, </span><span class="reserved">inbuild_copy</span><span class="plain"> *</span><span class="identifier">assoc</span><span class="plain">) {</span>
<span class="reserved">build_step</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">build_step</span><span class="plain">);</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">what_to_do</span><span class="plain"> = </span><span class="identifier">to_do</span><span class="plain">;</span>
<span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">vertex</span><span class="plain"> = </span><span class="identifier">vertex</span><span class="plain">;</span>
<span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">search_path</span><span class="plain"> = </span><span class="identifier">search</span><span class="plain">;</span>
<span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">for_vm</span><span class="plain"> = </span><span class="identifier">VM</span><span class="plain">;</span>
<span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">for_arch</span><span class="plain"> = </span><span class="identifier">arch</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">VM</span><span class="plain">) &amp;&amp; (</span><span class="identifier">arch</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">)) </span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">for_arch</span><span class="plain"> = </span><span class="identifier">TargetVMs::get_architecture</span><span class="plain">(</span><span class="identifier">VM</span><span class="plain">);</span>
<span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">for_release</span><span class="plain"> = </span><span class="identifier">rel</span><span class="plain">;</span>
<span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">associated_copy</span><span class="plain"> = </span><span class="identifier">assoc</span><span class="plain">;</span>
<span class="functiontext">BuildScripts::add_step</span><span class="plain">(</span><span class="identifier">vertex</span><span class="plain">-&gt;</span><span class="element">script</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">);</span>
2020-02-27 13:18:25 +02:00
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">S</span><span class="plain">;</span>
<span class="plain">}</span>
2020-03-30 14:23:06 +03:00
</pre>
<p class="inwebparagraph"></p>
2020-02-27 13:18:25 +02:00
2020-04-01 22:43:13 +03:00
<p class="endnote">The function BuildSteps::attach is used in 5/kts (<a href="5-kts.html#SP13_1">&#167;13.1</a>), 5/ps2 (<a href="5-ps2.html#SP4">&#167;4</a>).</p>
2020-03-30 14:23:06 +03:00
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. Execution. </b>Note that this prints a log of shell commands generated to <code class="display"><span class="extract">stdout</span></code> when
we are running inside Inbuild at the command line, but not when we are running
inside the <code class="display"><span class="extract">inform7</span></code> executable, where we are silent throughout.
</p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">BuildSteps::execute</span><span class="plain">(</span><span class="reserved">build_vertex</span><span class="plain"> *</span><span class="identifier">V</span><span class="plain">, </span><span class="reserved">build_step</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain">, </span><span class="reserved">build_methodology</span><span class="plain"> *</span><span class="identifier">BM</span><span class="plain">) {</span>
2020-02-27 13:18:25 +02:00
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">rv</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">command</span><span class="plain">);</span>
2020-03-30 14:23:06 +03:00
&lt;<span class="cwebmacro">Work out a shell command, and perhaps print or call it</span> <span class="cwebmacronumber">5.1</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Perform the skill internally if that's called for</span> <span class="cwebmacronumber">5.2</span>&gt;<span class="character">;</span>
2020-03-11 02:21:09 +02:00
<span class="plain">#</span><span class="identifier">ifndef</span><span class="plain"> </span><span class="identifier">CORE_MODULE</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">rv</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) </span><span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">STDERR</span><span class="plain">, </span><span class="string">"Build failed at '%S'\n"</span><span class="plain">, </span><span class="identifier">command</span><span class="plain">);</span>
2020-03-11 02:21:09 +02:00
<span class="plain">#</span><span class="identifier">endif</span>
2020-02-27 13:18:25 +02:00
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">command</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">rv</span><span class="plain">;</span>
<span class="plain">}</span>
2020-03-30 14:23:06 +03:00
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function BuildSteps::execute is used in 3/bs (<a href="3-bs.html#SP2">&#167;2</a>).</p>
<p class="inwebparagraph"><a id="SP5_1"></a><b>&#167;5.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Work out a shell command, and perhaps print or call it</span> <span class="cwebmacronumber">5.1</span>&gt; =
</code></p>
2020-02-27 13:18:25 +02:00
2020-03-30 14:23:06 +03:00
<pre class="displaydefn">
2020-04-07 03:06:09 +03:00
<span class="identifier">VMETHOD_CALL</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">what_to_do</span><span class="plain">, </span><span class="constant">BUILD_SKILL_COMMAND_MTID</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">, </span><span class="identifier">command</span><span class="plain">, </span><span class="identifier">BM</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::len</span><span class="plain">(</span><span class="identifier">command</span><span class="plain">) &gt; </span><span class="constant">0</span><span class="plain">) </span><span class="identifier">rv</span><span class="plain"> = </span><span class="functiontext">BuildSteps::shell</span><span class="plain">(</span><span class="identifier">command</span><span class="plain">, </span><span class="identifier">BM</span><span class="plain">);</span>
2020-03-30 14:23:06 +03:00
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP5">&#167;5</a>.</p>
<p class="inwebparagraph"><a id="SP5_2"></a><b>&#167;5.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">Perform the skill internally if that's called for</span> <span class="cwebmacronumber">5.2</span>&gt; =
</code></p>
<pre class="displaydefn">
2020-04-07 03:06:09 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">BM</span><span class="plain">-&gt;</span><span class="element">methodology</span><span class="plain"> == </span><span class="constant">INTERNAL_METHODOLOGY</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">returned</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
<span class="identifier">IMETHOD_CALL</span><span class="plain">(</span><span class="identifier">returned</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">-&gt;</span><span class="element">what_to_do</span><span class="plain">, </span><span class="constant">BUILD_SKILL_INTERNAL_MTID</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">, </span><span class="identifier">BM</span><span class="plain">);</span>
2020-03-30 14:23:06 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">returned</span><span class="plain"> != </span><span class="identifier">TRUE</span><span class="plain">) </span><span class="identifier">rv</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP5">&#167;5</a>.</p>
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. </b>This prints a shell command to <code class="display"><span class="extract">stdout</span></code> (except when inside <code class="display"><span class="extract">inform7</span></code>)
and also executes it if the methodology allows, returning the result. Note
that shell commands return 0 to indicate happiness.
</p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">BuildSteps::shell</span><span class="plain">(</span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">command</span><span class="plain">, </span><span class="reserved">build_methodology</span><span class="plain"> *</span><span class="identifier">BM</span><span class="plain">) {</span>
2020-02-27 13:18:25 +02:00
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">rv</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
2020-03-11 02:21:09 +02:00
<span class="plain">#</span><span class="identifier">ifndef</span><span class="plain"> </span><span class="identifier">CORE_MODULE</span>
2020-04-07 03:06:09 +03:00
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">STDOUT</span><span class="plain">, </span><span class="string">"%S\n"</span><span class="plain">, </span><span class="identifier">command</span><span class="plain">);</span>
2020-03-11 02:21:09 +02:00
<span class="plain">#</span><span class="identifier">endif</span>
2020-04-07 03:06:09 +03:00
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">BM</span><span class="plain">-&gt;</span><span class="element">methodology</span><span class="plain"> == </span><span class="constant">SHELL_METHODOLOGY</span><span class="plain">)</span>
<span class="identifier">rv</span><span class="plain"> = (</span><span class="identifier">Shell::run</span><span class="plain">(</span><span class="identifier">command</span><span class="plain">) == </span><span class="constant">0</span><span class="plain">)?</span><span class="identifier">TRUE:FALSE</span><span class="plain">;</span>
2020-02-27 13:18:25 +02:00
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">rv</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
2020-03-30 15:25:23 +03:00
<p class="endnote">The function BuildSteps::shell is used in <a href="#SP5_1">&#167;5.1</a>, 4/em (<a href="4-em.html#SP7">&#167;7</a>), 4/pm (<a href="4-pm.html#SP6">&#167;6</a>).</p>
2020-02-27 13:18:25 +02:00
<hr class="tocbar">
<ul class="toc"><li><a href="3-bs.html">Back to 'Build Scripts'</a></li><li><a href="3-is.html">Continue with 'Inter Skill'</a></li></ul><hr class="tocbar">
<!--End of weave-->
2020-03-19 02:11:25 +02:00
</main>
2020-02-27 13:18:25 +02:00
</body>
</html>