1
0
Fork 0
mirror of https://github.com/ganelson/inform.git synced 2024-06-26 04:00:43 +03:00

Redrafted Chapter 3 of inbuild module

This commit is contained in:
Graham Nelson 2020-03-30 12:23:06 +01:00
parent 123b9c166e
commit 8f2dea78de
53 changed files with 722 additions and 599 deletions

View file

@ -155,8 +155,8 @@ only issue stubby Unix-like command line errors.)
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Task::issue_problems_arising</span><span class="plain">(</span><span class="identifier">build_vertex</span><span class="plain"> *</span><span class="identifier">V</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">V</span><span class="plain">-&gt;</span><span class="identifier">type</span><span class="plain"> == </span><span class="identifier">COPY_VERTEX</span><span class="plain">) {</span>
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"Issue from copy of %X at %08x\</span><span class="plain">n</span><span class="string">"</span><span class="plain">,</span>
<span class="identifier">V</span><span class="plain">-&gt;</span><span class="identifier">buildable_if_copy</span><span class="plain">-&gt;</span><span class="identifier">edition</span><span class="plain">-&gt;</span><span class="identifier">work</span><span class="plain">, </span><span class="identifier">V</span><span class="plain">-&gt;</span><span class="identifier">buildable_if_copy</span><span class="plain">);</span>
<span class="functiontext">SourceProblems::issue_problems_arising</span><span class="plain">(</span><span class="identifier">V</span><span class="plain">-&gt;</span><span class="identifier">buildable_if_copy</span><span class="plain">);</span>
<span class="identifier">V</span><span class="plain">-&gt;</span><span class="identifier">as_copy</span><span class="plain">-&gt;</span><span class="identifier">edition</span><span class="plain">-&gt;</span><span class="identifier">work</span><span class="plain">, </span><span class="identifier">V</span><span class="plain">-&gt;</span><span class="identifier">as_copy</span><span class="plain">);</span>
<span class="functiontext">SourceProblems::issue_problems_arising</span><span class="plain">(</span><span class="identifier">V</span><span class="plain">-&gt;</span><span class="identifier">as_copy</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">build_vertex</span><span class="plain"> *</span><span class="identifier">W</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">build_vertex</span><span class="plain">, </span><span class="identifier">V</span><span class="plain">-&gt;</span><span class="identifier">build_edges</span><span class="plain">)</span>
@ -419,7 +419,7 @@ we have to extract it from the build graph:
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">inform7_task</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"there is no current task"</span><span class="plain">);</span>
<span class="identifier">build_vertex</span><span class="plain"> *</span><span class="identifier">V</span><span class="plain"> = </span><span class="identifier">inform7_task</span><span class="plain">-</span><span class="element">&gt;project</span><span class="plain">-&gt;</span><span class="identifier">unblorbed_vertex</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">V</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"project graph not ready"</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">V</span><span class="plain">-&gt;</span><span class="identifier">buildable_if_internal_file</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">V</span><span class="plain">-&gt;</span><span class="identifier">as_file</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>

View file

@ -748,7 +748,7 @@ are given precedence over those in the external folder, and so on.
<p class="inwebparagraph"></p>
<p class="endnote">The function Inbuild::nest_list is used in <a href="#SP9_2">&#167;9.2</a>, 3/is (<a href="3-is.html#SP1">&#167;1</a>), 5/kts (<a href="5-kts.html#SP1">&#167;1</a>, <a href="5-kts.html#SP2">&#167;2</a>), 5/ed2 (<a href="5-ed2.html#SP4">&#167;4</a>), 5/ec (<a href="5-ec.html#SP1">&#167;1</a>), 5/ps (<a href="5-ps.html#SP1">&#167;1</a>, <a href="5-ps.html#SP3">&#167;3</a>), 6/inc (<a href="6-inc.html#SP6_1">&#167;6.1</a>, <a href="6-inc.html#SP6_1_2">&#167;6.1.2</a>).</p>
<p class="endnote">The function Inbuild::nest_list is used in <a href="#SP9_2">&#167;9.2</a>, 3/is (<a href="3-is.html#SP3">&#167;3</a>, <a href="3-is.html#SP4">&#167;4</a>), 5/kts (<a href="5-kts.html#SP1">&#167;1</a>, <a href="5-kts.html#SP2">&#167;2</a>), 5/ed2 (<a href="5-ed2.html#SP4">&#167;4</a>), 5/ec (<a href="5-ec.html#SP1">&#167;1</a>), 5/ps (<a href="5-ps.html#SP1">&#167;1</a>, <a href="5-ps.html#SP3">&#167;3</a>), 6/inc (<a href="6-inc.html#SP6_1">&#167;6.1</a>, <a href="6-inc.html#SP6_1_2">&#167;6.1.2</a>).</p>
<p class="endnote">The function Inbuild::internal is used in <a href="#SP23">&#167;23</a>, 5/ls (<a href="5-ls.html#SP7">&#167;7</a>).</p>
@ -949,7 +949,7 @@ depending on who's asking.
<p class="inwebparagraph"></p>
<p class="endnote">The function Inbuild::project is used in <a href="#SP11">&#167;11</a>, 3/is (<a href="3-is.html#SP1">&#167;1</a>), 5/es (<a href="5-es.html#SP5">&#167;5</a>).</p>
<p class="endnote">The function Inbuild::project is used in <a href="#SP11">&#167;11</a>, 3/is (<a href="3-is.html#SP4">&#167;4</a>), 5/es (<a href="5-es.html#SP5">&#167;5</a>).</p>
<p class="inwebparagraph"><a id="SP21"></a><b>&#167;21. </b>The materials folder sits alongside the project folder and has the same name,
but ending <code class="display"><span class="extract">.materials</span></code> instead of <code class="display"><span class="extract">.inform</span></code>.

View file

@ -105,7 +105,7 @@ claiming. If you are a manager, do not call this...
<span class="identifier">copy</span><span class="plain">-</span><span class="element">&gt;location_if_path</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">copy</span><span class="plain">-</span><span class="element">&gt;location_if_file</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">copy</span><span class="plain">-</span><span class="element">&gt;content</span><span class="plain"> = </span><span class="identifier">NULL_GENERAL_POINTER</span><span class="plain">;</span>
<span class="identifier">copy</span><span class="plain">-</span><span class="element">&gt;vertex</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">copy</span><span class="plain">-</span><span class="element">&gt;vertex</span><span class="plain"> = </span><span class="functiontext">Graphs::copy_vertex</span><span class="plain">(</span><span class="identifier">copy</span><span class="plain">);</span>
<span class="identifier">copy</span><span class="plain">-</span><span class="element">&gt;source_text_read</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="identifier">copy</span><span class="plain">-</span><span class="element">&gt;source_text</span><span class="plain"> = </span><span class="identifier">EMPTY_WORDING</span><span class="plain">;</span>
<span class="identifier">copy</span><span class="plain">-</span><span class="element">&gt;found_by</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
@ -196,7 +196,7 @@ for later reporting. These are stored in a list.
<p class="inwebparagraph"></p>
<p class="endnote">The function Copies::write_copy is used in 3/bg (<a href="3-bg.html#SP5">&#167;5</a>, <a href="3-bg.html#SP6">&#167;6</a>, <a href="3-bg.html#SP8_1">&#167;8.1</a>).</p>
<p class="endnote">The function Copies::write_copy is used in 3/bg (<a href="3-bg.html#SP6">&#167;6</a>, <a href="3-bg.html#SP7">&#167;7</a>, <a href="3-bg.html#SP9_1">&#167;9.1</a>).</p>
<p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. Reading source text. </b></p>
@ -365,7 +365,7 @@ its main task: building an Inform project.
<p class="inwebparagraph"></p>
<p class="endnote">The function Copies::copy_to is used in 3/bg (<a href="3-bg.html#SP8_1">&#167;8.1</a>).</p>
<p class="endnote">The function Copies::copy_to is used in 3/bg (<a href="3-bg.html#SP9_1">&#167;9.1</a>).</p>
<p class="endnote">The function Copies::overwrite_error is used in 4/km (<a href="4-km.html#SP6">&#167;6</a>), 4/em (<a href="4-em.html#SP8">&#167;8</a>), 4/lm (<a href="4-lm.html#SP7">&#167;7</a>), 4/tm (<a href="4-tm.html#SP6">&#167;6</a>), 4/pm (<a href="4-pm.html#SP7">&#167;7</a>).</p>

View file

@ -121,7 +121,7 @@ nest depends only on its genre.
<p class="inwebparagraph"></p>
<p class="endnote">The function Genres::stored_in_nests is used in 3/bg (<a href="3-bg.html#SP8">&#167;8</a>).</p>
<p class="endnote">The function Genres::stored_in_nests is used in 3/bg (<a href="3-bg.html#SP9">&#167;9</a>).</p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b>The requirements parser needs to identify genres by name, so:
</p>

View file

@ -247,7 +247,7 @@ others:
<p class="inwebparagraph"></p>
<p class="endnote">The function Nests::search_for_best is used in 3/is (<a href="3-is.html#SP1">&#167;1</a>), 5/kts (<a href="5-kts.html#SP1">&#167;1</a>), 5/ls (<a href="5-ls.html#SP7">&#167;7</a>), 6/inc (<a href="6-inc.html#SP6_1">&#167;6.1</a>).</p>
<p class="endnote">The function Nests::search_for_best is used in 3/is (<a href="3-is.html#SP3">&#167;3</a>, <a href="3-is.html#SP4">&#167;4</a>), 5/kts (<a href="5-kts.html#SP1">&#167;1</a>), 5/ls (<a href="5-ls.html#SP7">&#167;7</a>), 6/inc (<a href="6-inc.html#SP6_1">&#167;6.1</a>).</p>
<p class="inwebparagraph"><a id="SP9"></a><b>&#167;9. </b>Where "better" is defined as follows. This innocent-looking function is
in fact critical to what Inbuild does. It uses tags on nests to prefer copies

View file

@ -109,7 +109,7 @@ we can give a semantic version number range:
<p class="endnote">The function Requirements::new is used in 6/inc (<a href="6-inc.html#SP5_1">&#167;5.1</a>).</p>
<p class="endnote">The function Requirements::any_version_of is used in 3/is (<a href="3-is.html#SP1">&#167;1</a>), 5/kts (<a href="5-kts.html#SP1">&#167;1</a>), 5/ed2 (<a href="5-ed2.html#SP4">&#167;4</a>), 5/ls (<a href="5-ls.html#SP7">&#167;7</a>), 6/inc (<a href="6-inc.html#SP6_1_2">&#167;6.1.2</a>).</p>
<p class="endnote">The function Requirements::any_version_of is used in 3/is (<a href="3-is.html#SP3">&#167;3</a>, <a href="3-is.html#SP4">&#167;4</a>), 5/kts (<a href="5-kts.html#SP1">&#167;1</a>), 5/ed2 (<a href="5-ed2.html#SP4">&#167;4</a>), 5/ls (<a href="5-ls.html#SP7">&#167;7</a>), 6/inc (<a href="6-inc.html#SP6_1_2">&#167;6.1.2</a>).</p>
<p class="endnote">The function Requirements::anything_of_genre is used in 1/ic (<a href="1-ic.html#SP9_2">&#167;9.2</a>), 5/ec (<a href="5-ec.html#SP3">&#167;3</a>).</p>
@ -282,7 +282,7 @@ empty text is legal here, and produces an unlimited requirement.
<p class="inwebparagraph"></p>
<p class="endnote">The function Requirements::write is used in 3/bg (<a href="3-bg.html#SP5">&#167;5</a>).</p>
<p class="endnote">The function Requirements::write is used in 3/bg (<a href="3-bg.html#SP6">&#167;6</a>).</p>
<p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. Meeting requirements. </b>Finally, we actually use these intricacies for something. Given an edition,
we return <code class="display"><span class="extract">TRUE</span></code> if it meets the requirements and <code class="display"><span class="extract">FALSE</span></code> if it does not.

View file

@ -112,7 +112,7 @@ not subsequently altered.
<p class="inwebparagraph"></p>
<p class="endnote">The function Works::new is used in <a href="#SP10">&#167;10</a>, 2/rqr (<a href="2-rqr.html#SP2">&#167;2</a>), 3/is (<a href="3-is.html#SP1">&#167;1</a>), 4/em (<a href="4-em.html#SP5">&#167;5</a>), 4/lm (<a href="4-lm.html#SP4">&#167;4</a>), 4/pbm (<a href="4-pbm.html#SP2">&#167;2</a>), 4/pfm (<a href="4-pfm.html#SP2">&#167;2</a>), 4/tm (<a href="4-tm.html#SP3">&#167;3</a>), 5/kts (<a href="5-kts.html#SP1">&#167;1</a>), 5/es (<a href="5-es.html#SP1">&#167;1</a>), 5/ed (<a href="5-ed.html#SP10">&#167;10</a>), 5/ls (<a href="5-ls.html#SP7">&#167;7</a>), 6/hdn (<a href="6-hdn.html#SP13_3">&#167;13.3</a>), 6/inc (<a href="6-inc.html#SP5_1">&#167;5.1</a>).</p>
<p class="endnote">The function Works::new is used in <a href="#SP10">&#167;10</a>, 2/rqr (<a href="2-rqr.html#SP2">&#167;2</a>), 3/is (<a href="3-is.html#SP3">&#167;3</a>, <a href="3-is.html#SP4">&#167;4</a>), 4/em (<a href="4-em.html#SP5">&#167;5</a>), 4/lm (<a href="4-lm.html#SP4">&#167;4</a>), 4/pbm (<a href="4-pbm.html#SP2">&#167;2</a>), 4/pfm (<a href="4-pfm.html#SP2">&#167;2</a>), 4/tm (<a href="4-tm.html#SP3">&#167;3</a>), 5/kts (<a href="5-kts.html#SP1">&#167;1</a>), 5/es (<a href="5-es.html#SP1">&#167;1</a>), 5/ed (<a href="5-ed.html#SP10">&#167;10</a>), 5/ls (<a href="5-ls.html#SP7">&#167;7</a>), 6/hdn (<a href="6-hdn.html#SP13_3">&#167;13.3</a>), 6/inc (<a href="6-inc.html#SP5_1">&#167;5.1</a>).</p>
<p class="endnote">The function Works::new_raw is used in 4/km (<a href="4-km.html#SP3">&#167;3</a>), 4/pm (<a href="4-pm.html#SP5">&#167;5</a>).</p>
@ -225,7 +225,7 @@ begins at the start of the text, after a hyphen, or after a bracket. Thus
<p class="inwebparagraph"></p>
<p class="endnote">The function Works::write is used in 2/edt (<a href="2-edt.html#SP1">&#167;1</a>), 3/bg (<a href="3-bg.html#SP6">&#167;6</a>, <a href="3-bg.html#SP7">&#167;7</a>).</p>
<p class="endnote">The function Works::write is used in 2/edt (<a href="2-edt.html#SP1">&#167;1</a>), 3/bg (<a href="3-bg.html#SP7">&#167;7</a>, <a href="3-bg.html#SP8">&#167;8</a>).</p>
<p class="endnote">The function Works::write_to_HTML_file is used in <a href="#SP6">&#167;6</a>, 5/ed (<a href="5-ed.html#SP19_2">&#167;19.2</a>), 5/ed2 (<a href="5-ed2.html#SP3_2_1">&#167;3.2.1</a>).</p>

View file

@ -59,7 +59,7 @@
<!--Weave of '3/bg' generated by 7-->
<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 Graphs</b></li></ul><p class="purpose">Graphs in which vertices correspond to files or copies, and edges to dependencies between them.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Build graphs</a></li><li><a href="#SP2">&#167;2. Creation</a></li><li><a href="#SP5">&#167;5. Writing</a></li><li><a href="#SP8">&#167;8. Archiving</a></li></ul><hr class="tocbar">
<ul class="toc"><li><a href="#SP1">&#167;1. Build graphs</a></li><li><a href="#SP2">&#167;2. Creation</a></li><li><a href="#SP6">&#167;6. Writing</a></li><li><a href="#SP9">&#167;9. Archiving</a></li></ul><hr class="tocbar">
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. Build graphs. </b>See the Inbuild manual for an introduction to the build graph. Properly
speaking, it is a directed acyclic multigraph which us usually disconnected.
@ -95,25 +95,27 @@ compiled, is a file vertex.
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">linked_list</span><span class="plain"> *</span><span class="identifier">build_edges</span><span class="plain">; </span> <span class="comment">of <code class="display"><span class="extract">build_vertex</span></code></span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">linked_list</span><span class="plain"> *</span><span class="identifier">use_edges</span><span class="plain">; </span> <span class="comment">of <code class="display"><span class="extract">build_vertex</span></code></span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">inbuild_copy</span><span class="plain"> *</span><span class="identifier">buildable_if_copy</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">buildable_if_internal_file</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">inbuild_requirement</span><span class="plain"> *</span><span class="identifier">findable</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">inbuild_copy</span><span class="plain"> *</span><span class="identifier">as_copy</span><span class="plain">; </span> <span class="comment">for <code class="display"><span class="extract">COPY_VERTEX</span></code> only</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">as_file</span><span class="plain">; </span> <span class="comment">for <code class="display"><span class="extract">FILE_VERTEX</span></code> only</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">inbuild_requirement</span><span class="plain"> *</span><span class="identifier">as_requirement</span><span class="plain">; </span> <span class="comment">for <code class="display"><span class="extract">REQUIREMENT_VERTEX</span></code> only</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">annotation</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">source_file</span><span class="plain"> *</span><span class="identifier">read_as</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">last_described_in_generation</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">source_source</span><span class="plain">; </span> <span class="comment">for <code class="display"><span class="extract">FILE_VERTEX</span></code> of a file of I7 source text</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">source_file</span><span class="plain"> *</span><span class="identifier">as_source_file</span><span class="plain">; </span> <span class="comment">for <code class="display"><span class="extract">FILE_VERTEX</span></code> of a file of I7 source text</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">last_described_in_generation</span><span class="plain">; </span> <span class="comment">used when recursively printing a graph</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">build_result</span><span class="plain">; </span> <span class="comment">whether the most recent build of this succeeded...</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">last_built_in_generation</span><span class="plain">; </span> <span class="comment">...in this build generation</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">always_build_this</span><span class="plain">; </span> <span class="comment">i.e., don't look at timestamps hoping to skip it</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">build_script</span><span class="plain"> *</span><span class="identifier">script</span><span class="plain">; </span> <span class="comment">how to build what this node represents</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">build_result</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">last_built_in_generation</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">always_build_this</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">build_script</span><span class="plain"> *</span><span class="identifier">script</span><span class="plain">;</span>
<span class="identifier">MEMORY_MANAGEMENT</span>
<span class="plain">} </span><span class="reserved">build_vertex</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The structure build_vertex is accessed in 3/ib, 3/bs2, 3/is, 3/is3, 3/is4, 4/em, 5/ed, 5/ps, 6/inc and here.</p>
<p class="endnote">The structure build_vertex is accessed in 1/ic, 3/ib, 3/bs2, 3/is, 3/is2, 3/is3, 3/is4, 4/em, 4/lm, 4/pbm, 4/pfm, 4/tm, 4/pm, 5/kts, 5/es, 5/ed, 5/ed2, 5/ts, 5/ps, 5/ls, 5/ps2, 6/hdn, 6/inc and here.</p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. Creation. </b>First, the three colours of vertex.
</p>
@ -123,48 +125,61 @@ compiled, is a file vertex.
<span class="reserved">build_vertex</span><span class="plain"> *</span><span class="functiontext">Graphs::file_vertex</span><span class="plain">(</span><span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">F</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="identifier">CREATE</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="element">&gt;type</span><span class="plain"> = </span><span class="constant">FILE_VERTEX</span><span class="plain">;</span>
<span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;buildable_if_copy</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;buildable_if_internal_file</span><span class="plain"> = </span><span class="identifier">F</span><span class="plain">;</span>
<span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;build_edges</span><span class="plain"> = </span><span class="identifier">NEW_LINKED_LIST</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="element">&gt;use_edges</span><span class="plain"> = </span><span class="identifier">NEW_LINKED_LIST</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="element">&gt;script</span><span class="plain"> = </span><span class="functiontext">BuildScripts::new</span><span class="plain">();</span>
<span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;annotation</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;read_as</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;last_described_in_generation</span><span class="plain"> = 0;</span>
<span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;build_result</span><span class="plain"> = </span><span class="identifier">NOT_APPLICABLE</span><span class="plain">;</span>
<span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;last_built_in_generation</span><span class="plain"> = -1;</span>
<span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;always_build_this</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">V</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">build_vertex</span><span class="plain"> *</span><span class="functiontext">Graphs::copy_vertex</span><span class="plain">(</span><span class="reserved">inbuild_copy</span><span class="plain"> *</span><span class="identifier">C</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">C</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"no copy"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;vertex</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) {</span>
<span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;vertex</span><span class="plain"> = </span><span class="functiontext">Graphs::file_vertex</span><span class="plain">(</span><span class="identifier">NULL</span><span class="plain">);</span>
<span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;vertex</span><span class="plain">-</span><span class="element">&gt;type</span><span class="plain"> = </span><span class="constant">COPY_VERTEX</span><span class="plain">;</span>
<span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;vertex</span><span class="plain">-</span><span class="element">&gt;buildable_if_copy</span><span class="plain"> = </span><span class="identifier">C</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;vertex</span><span class="plain">;</span>
<span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;as_copy</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;as_file</span><span class="plain"> = </span><span class="identifier">F</span><span class="plain">;</span>
<span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;as_requirement</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;source_source</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;as_source_file</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;last_described_in_generation</span><span class="plain"> = -1;</span>
<span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;build_result</span><span class="plain"> = </span><span class="identifier">NOT_APPLICABLE</span><span class="plain">; </span> <span class="comment">has never been built</span>
<span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;last_built_in_generation</span><span class="plain"> = -1; </span> <span class="comment">never seen in any generation</span>
<span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;always_build_this</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;script</span><span class="plain"> = </span><span class="functiontext">BuildScripts::new</span><span class="plain">();</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">V</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">build_vertex</span><span class="plain"> *</span><span class="functiontext">Graphs::req_vertex</span><span class="plain">(</span><span class="reserved">inbuild_requirement</span><span class="plain"> *</span><span class="identifier">R</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">R</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"no requirement"</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="functiontext">Graphs::file_vertex</span><span class="plain">(</span><span class="identifier">NULL</span><span class="plain">);</span>
<span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;type</span><span class="plain"> = </span><span class="constant">REQUIREMENT_VERTEX</span><span class="plain">;</span>
<span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;findable</span><span class="plain"> = </span><span class="identifier">R</span><span class="plain">;</span>
<span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;as_requirement</span><span class="plain"> = </span><span class="identifier">R</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">V</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Graphs::file_vertex is used in 5/kts (<a href="5-kts.html#SP2">&#167;2</a>), 5/ps (<a href="5-ps.html#SP1">&#167;1</a>, <a href="5-ps.html#SP3">&#167;3</a>).</p>
<p class="endnote">The function Graphs::copy_vertex is used in 4/km (<a href="4-km.html#SP7">&#167;7</a>), 4/em (<a href="4-em.html#SP9">&#167;9</a>), 4/lm (<a href="4-lm.html#SP8">&#167;8</a>), 4/pbm (<a href="4-pbm.html#SP7">&#167;7</a>), 4/pfm (<a href="4-pfm.html#SP7">&#167;7</a>), 4/tm (<a href="4-tm.html#SP7">&#167;7</a>), 4/pm (<a href="4-pm.html#SP8">&#167;8</a>).</p>
<p class="endnote">The function Graphs::file_vertex is used in <a href="#SP3">&#167;3</a>, 5/kts (<a href="5-kts.html#SP2">&#167;2</a>), 5/ps (<a href="5-ps.html#SP1">&#167;1</a>, <a href="5-ps.html#SP3">&#167;3</a>).</p>
<p class="endnote">The function Graphs::req_vertex is used in 5/kts (<a href="5-kts.html#SP2">&#167;2</a>), 6/inc (<a href="6-inc.html#SP6_1">&#167;6.1</a>).</p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b>Next, the two colours of edge. Note that between A and B there can be
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b>Note that each copy is assigned exactly one copy vertex, when it is created.
This function should never otherwise be called.
</p>
<pre class="display">
<span class="reserved">build_vertex</span><span class="plain"> *</span><span class="functiontext">Graphs::copy_vertex</span><span class="plain">(</span><span class="reserved">inbuild_copy</span><span class="plain"> *</span><span class="identifier">C</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">C</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"no copy"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;vertex</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"already set"</span><span class="plain">);</span>
<span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;vertex</span><span class="plain"> = </span><span class="functiontext">Graphs::file_vertex</span><span class="plain">(</span><span class="identifier">NULL</span><span class="plain">);</span>
<span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;vertex</span><span class="plain">-</span><span class="element">&gt;type</span><span class="plain"> = </span><span class="constant">COPY_VERTEX</span><span class="plain">;</span>
<span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;vertex</span><span class="plain">-</span><span class="element">&gt;as_copy</span><span class="plain"> = </span><span class="identifier">C</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;vertex</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Graphs::copy_vertex is used in 2/cps (<a href="2-cps.html#SP2">&#167;2</a>).</p>
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. </b>Next, the two colours of edge. Note that between A and B there can be
at most one edge of each colour.
</p>
@ -197,7 +212,7 @@ at most one edge of each colour.
<p class="endnote">The function Graphs::need_this_to_use is used in 5/kts (<a href="5-kts.html#SP2">&#167;2</a>), 5/ps (<a href="5-ps.html#SP3">&#167;3</a>), 6/inc (<a href="6-inc.html#SP1_1">&#167;1.1</a>).</p>
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. </b>The script attached to a vertex is a list of instructions for how to build
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. </b>The script attached to a vertex is a list of instructions for how to build
the resource it refers to. Some vertices have no instructions provided, so:
</p>
@ -213,7 +228,7 @@ the resource it refers to. Some vertices have no instructions provided, so:
<p class="endnote">The function Graphs::can_be_built is used in 3/ib (<a href="3-ib.html#SP7_1">&#167;7.1</a>).</p>
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. Writing. </b>This is a suitably indented printout of the graph as seen from a given
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. Writing. </b>This is a suitably indented printout of the graph as seen from a given
vertex: it's used by the Inbuild command <code class="display"><span class="extract">-graph</span></code>.
</p>
@ -232,9 +247,9 @@ vertex: it's used by the Inbuild command <code class="display"><span class="extr
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" "</span><span class="plain">);</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">);</span>
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;type</span><span class="plain">) {</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">COPY_VERTEX</span><span class="plain">: </span><span class="functiontext">Copies::write_copy</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;buildable_if_copy</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">REQUIREMENT_VERTEX</span><span class="plain">: </span><span class="functiontext">Requirements::write</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;findable</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">FILE_VERTEX</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%f"</span><span class="plain">, </span><span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;buildable_if_internal_file</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">COPY_VERTEX</span><span class="plain">: </span><span class="functiontext">Copies::write_copy</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;as_copy</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">REQUIREMENT_VERTEX</span><span class="plain">: </span><span class="functiontext">Requirements::write</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;as_requirement</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">FILE_VERTEX</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%f"</span><span class="plain">, </span><span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;as_file</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">, </span><span class="string">"%p"</span><span class="plain">, </span><span class="identifier">stem</span><span class="plain">);</span>
@ -249,9 +264,9 @@ vertex: it's used by the Inbuild command <code class="display"><span class="extr
<span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;last_described_in_generation</span><span class="plain"> = </span><span class="identifier">description_round</span><span class="plain">;</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">recurse</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;buildable_if_copy</span><span class="plain">) </span><span class="identifier">stem</span><span class="plain"> = </span><span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;buildable_if_copy</span><span class="plain">-</span><span class="element">&gt;location_if_path</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;buildable_if_internal_file</span><span class="plain">)</span>
<span class="identifier">stem</span><span class="plain"> = </span><span class="identifier">Filenames::get_path_to</span><span class="plain">(</span><span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;buildable_if_internal_file</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;as_copy</span><span class="plain">) </span><span class="identifier">stem</span><span class="plain"> = </span><span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;as_copy</span><span class="plain">-</span><span class="element">&gt;location_if_path</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;as_file</span><span class="plain">)</span>
<span class="identifier">stem</span><span class="plain"> = </span><span class="identifier">Filenames::get_path_to</span><span class="plain">(</span><span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;as_file</span><span class="plain">);</span>
<span class="reserved">build_vertex</span><span class="plain"> *</span><span class="identifier">W</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">W</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="element">&gt;build_edges</span><span class="plain">)</span>
<span class="functiontext">Graphs::describe_r</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">depth</span><span class="plain">+1, </span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">TRUE</span><span class="plain">, </span><span class="identifier">stem</span><span class="plain">, </span><span class="identifier">TRUE</span><span class="plain">, </span><span class="identifier">description_round</span><span class="plain">);</span>
@ -278,7 +293,7 @@ vertex: it's used by the Inbuild command <code class="display"><span class="extr
<p class="endnote">The function Graphs::describe_vertex appears nowhere else.</p>
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. </b>A similar but slightly different recursion for <code class="display"><span class="extract">-build-needs</span></code> and <code class="display"><span class="extract">-use-needs</span></code>.
<p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. </b>A similar but slightly different recursion for <code class="display"><span class="extract">-build-needs</span></code> and <code class="display"><span class="extract">-use-needs</span></code>.
</p>
@ -291,18 +306,18 @@ vertex: it's used by the Inbuild command <code class="display"><span class="extr
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">depth</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">true_depth</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">uses_only</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;type</span><span class="plain"> == </span><span class="constant">COPY_VERTEX</span><span class="plain">) {</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">=0; </span><span class="identifier">i</span><span class="plain">&lt;</span><span class="identifier">depth</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" "</span><span class="plain">);</span>
<span class="reserved">inbuild_copy</span><span class="plain"> *</span><span class="identifier">C</span><span class="plain"> = </span><span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;buildable_if_copy</span><span class="plain">;</span>
<span class="reserved">inbuild_copy</span><span class="plain"> *</span><span class="identifier">C</span><span class="plain"> = </span><span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;as_copy</span><span class="plain">;</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%S: "</span><span class="plain">, </span><span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;edition</span><span class="plain">-</span><span class="element">&gt;work</span><span class="plain">-</span><span class="element">&gt;genre</span><span class="plain">-</span><span class="element">&gt;genre_name</span><span class="plain">);</span>
<span class="functiontext">Copies::write_copy</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">C</span><span class="plain">); </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="identifier">depth</span><span class="plain">++;</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;type</span><span class="plain"> == </span><span class="constant">REQUIREMENT_VERTEX</span><span class="plain">) {</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">=0; </span><span class="identifier">i</span><span class="plain">&lt;</span><span class="identifier">depth</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" "</span><span class="plain">);</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"missing %S: "</span><span class="plain">, </span><span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;findable</span><span class="plain">-</span><span class="element">&gt;work</span><span class="plain">-</span><span class="element">&gt;genre</span><span class="plain">-</span><span class="element">&gt;genre_name</span><span class="plain">);</span>
<span class="functiontext">Works::write</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;findable</span><span class="plain">-</span><span class="element">&gt;work</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">VersionNumberRanges::is_any_range</span><span class="plain">(</span><span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;findable</span><span class="plain">-</span><span class="element">&gt;version_range</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">) {</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"missing %S: "</span><span class="plain">, </span><span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;as_requirement</span><span class="plain">-</span><span class="element">&gt;work</span><span class="plain">-</span><span class="element">&gt;genre</span><span class="plain">-</span><span class="element">&gt;genre_name</span><span class="plain">);</span>
<span class="functiontext">Works::write</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;as_requirement</span><span class="plain">-</span><span class="element">&gt;work</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">VersionNumberRanges::is_any_range</span><span class="plain">(</span><span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;as_requirement</span><span class="plain">-</span><span class="element">&gt;version_range</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">) {</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">", need version in range "</span><span class="plain">);</span>
<span class="identifier">VersionNumberRanges::write_range</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;findable</span><span class="plain">-</span><span class="element">&gt;version_range</span><span class="plain">);</span>
<span class="identifier">VersionNumberRanges::write_range</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;as_requirement</span><span class="plain">-</span><span class="element">&gt;version_range</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">", any version will do"</span><span class="plain">);</span>
<span class="plain">}</span>
@ -326,7 +341,7 @@ vertex: it's used by the Inbuild command <code class="display"><span class="extr
<p class="endnote">The function Graphs::show_needs_r appears nowhere else.</p>
<p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. </b>And for <code class="display"><span class="extract">-build-missing</span></code> and <code class="display"><span class="extract">-use-missing</span></code>.
<p class="inwebparagraph"><a id="SP8"></a><b>&#167;8. </b>And for <code class="display"><span class="extract">-build-missing</span></code> and <code class="display"><span class="extract">-use-missing</span></code>.
</p>
@ -339,11 +354,11 @@ vertex: it's used by the Inbuild command <code class="display"><span class="extr
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">true_depth</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">uses_only</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">N</span><span class="plain"> = 0;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;type</span><span class="plain"> == </span><span class="constant">REQUIREMENT_VERTEX</span><span class="plain">) {</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"missing %S: "</span><span class="plain">, </span><span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;findable</span><span class="plain">-</span><span class="element">&gt;work</span><span class="plain">-</span><span class="element">&gt;genre</span><span class="plain">-</span><span class="element">&gt;genre_name</span><span class="plain">);</span>
<span class="functiontext">Works::write</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;findable</span><span class="plain">-</span><span class="element">&gt;work</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">VersionNumberRanges::is_any_range</span><span class="plain">(</span><span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;findable</span><span class="plain">-</span><span class="element">&gt;version_range</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">) {</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"missing %S: "</span><span class="plain">, </span><span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;as_requirement</span><span class="plain">-</span><span class="element">&gt;work</span><span class="plain">-</span><span class="element">&gt;genre</span><span class="plain">-</span><span class="element">&gt;genre_name</span><span class="plain">);</span>
<span class="functiontext">Works::write</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;as_requirement</span><span class="plain">-</span><span class="element">&gt;work</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">VersionNumberRanges::is_any_range</span><span class="plain">(</span><span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;as_requirement</span><span class="plain">-</span><span class="element">&gt;version_range</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">) {</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">", need version in range "</span><span class="plain">);</span>
<span class="identifier">VersionNumberRanges::write_range</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;findable</span><span class="plain">-</span><span class="element">&gt;version_range</span><span class="plain">);</span>
<span class="identifier">VersionNumberRanges::write_range</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;as_requirement</span><span class="plain">-</span><span class="element">&gt;version_range</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">", any version will do"</span><span class="plain">);</span>
<span class="plain">}</span>
@ -368,7 +383,7 @@ vertex: it's used by the Inbuild command <code class="display"><span class="extr
<p class="endnote">The function Graphs::show_missing_r appears nowhere else.</p>
<p class="inwebparagraph"><a id="SP8"></a><b>&#167;8. Archiving. </b>This isn't simply a matter of printing out, of course, but very similar code
<p class="inwebparagraph"><a id="SP9"></a><b>&#167;9. Archiving. </b>This isn't simply a matter of printing out, of course, but very similar code
handles <code class="display"><span class="extract">-archive</span></code> and <code class="display"><span class="extract">-archive-to N</span></code>.
</p>
@ -386,11 +401,11 @@ cannot be read from any other nest &mdash; so we won't archive it.
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Graphs::archive_r</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</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">int</span><span class="plain"> </span><span class="identifier">true_depth</span><span class="plain">, </span><span class="reserved">inbuild_nest</span><span class="plain"> *</span><span class="identifier">N</span><span class="plain">,</span>
<span class="reserved">build_methodology</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">V</span><span class="plain">-</span><span class="element">&gt;type</span><span class="plain"> == </span><span class="constant">COPY_VERTEX</span><span class="plain">) {</span>
<span class="reserved">inbuild_copy</span><span class="plain"> *</span><span class="identifier">C</span><span class="plain"> = </span><span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;buildable_if_copy</span><span class="plain">;</span>
<span class="reserved">inbuild_copy</span><span class="plain"> *</span><span class="identifier">C</span><span class="plain"> = </span><span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;as_copy</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="functiontext">Genres::stored_in_nests</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;edition</span><span class="plain">-</span><span class="element">&gt;work</span><span class="plain">-</span><span class="element">&gt;genre</span><span class="plain">)) &amp;&amp;</span>
<span class="plain">((</span><span class="identifier">Str::ne</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;edition</span><span class="plain">-</span><span class="element">&gt;work</span><span class="plain">-</span><span class="element">&gt;title</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"English"</span><span class="plain">)) ||</span>
<span class="plain">(</span><span class="identifier">Str::len</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;edition</span><span class="plain">-</span><span class="element">&gt;work</span><span class="plain">-</span><span class="element">&gt;author_name</span><span class="plain">) &gt; 0)))</span>
&lt;<span class="cwebmacro">Archive a single copy</span> <span class="cwebmacronumber">8.1</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Archive a single copy</span> <span class="cwebmacronumber">9.1</span>&gt;<span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">build_vertex</span><span class="plain"> *</span><span class="identifier">W</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">W</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="element">&gt;build_edges</span><span class="plain">)</span>
@ -408,13 +423,13 @@ cannot be read from any other nest &mdash; so we won't archive it.
<p class="endnote">The function Graphs::archive_r appears nowhere else.</p>
<p class="inwebparagraph"><a id="SP8_1"></a><b>&#167;8.1. </b>The most delicate thing here is that we don't want to archive something
<p class="inwebparagraph"><a id="SP9_1"></a><b>&#167;9.1. </b>The most delicate thing here is that we don't want to archive something
to <code class="display"><span class="extract">N</span></code> if it's already there; but that is difficult to detect.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Archive a single copy</span> <span class="cwebmacronumber">8.1</span>&gt; =
&lt;<span class="cwebmacrodefn">Archive a single copy</span> <span class="cwebmacronumber">9.1</span>&gt; =
</code></p>
@ -440,7 +455,7 @@ to <code class="display"><span class="extract">N</span></code> if it's already t
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP8">&#167;8</a>.</p>
<p class="endnote">This code is used in <a href="#SP9">&#167;9</a>.</p>
<hr class="tocbar">
<ul class="toc"><li><i>(This section begins Chapter 3: Incremental Builds.)</i></li><li><a href="3-bm.html">Continue with 'Build Methodology'</a></li></ul><hr class="tocbar">

View file

@ -59,7 +59,13 @@
<!--Weave of '3/bm' generated by 7-->
<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 Methodology</b></li></ul><p class="purpose">Whether to run tasks internally in some merged tool, or run via the shell, or simply trace to the standard output what we think ought to be done.</p>
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. </b></p>
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. </b>This is rather grandly named for what it is: it's just a bundle of settings
about how to carry out build steps. Should we (a) make a dry run, just printing
hypothetical shell commands, or (b) issue those shell commands via <code class="display"><span class="extract">system</span></code>,
or (c) take direct action by calling functions within the current executable?
If (a) or (b) then we will need to know the locations of the executable files
for the tools <code class="display"><span class="extract">inter</span></code>, <code class="display"><span class="extract">inform6</span></code>, <code class="display"><span class="extract">inform7</span></code> and <code class="display"><span class="extract">inblorb</span></code>.
</p>
<pre class="definitions">
@ -77,37 +83,63 @@
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">methodology</span><span class="plain">;</span>
<span class="identifier">MEMORY_MANAGEMENT</span>
<span class="plain">} </span><span class="reserved">build_methodology</span><span class="plain">;</span>
</pre>
<span class="reserved">build_methodology</span><span class="plain"> *</span><span class="functiontext">BuildMethodology::new</span><span class="plain">(</span><span class="identifier">pathname</span><span class="plain"> *</span><span class="identifier">tools_path</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">dev</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">meth</span><span class="plain">) {</span>
<p class="inwebparagraph"></p>
<p class="endnote">The structure build_methodology is accessed in 3/bs2, 3/is, 3/is2, 3/is3, 3/is4, 4/km, 4/em, 4/lm, 4/tm, 4/pm and here.</p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b>If the <code class="display"><span class="extract">tangled</span></code> flag is set, we expect <code class="display"><span class="extract">inform7</span></code>, for example, to be at
<code class="display"><span class="extract">tools_path/inform7/Tangled/inform7</span></code>; if it is clear, we expect it only to
be <code class="display"><span class="extract">tools_path/inform7</span></code>. This is relevant only for the command-line Inbuild,
which used tangled mode by default, but untangled mode if the user has
specified an explicit path at the command line.
</p>
<pre class="display">
<span class="reserved">build_methodology</span><span class="plain"> *</span><span class="functiontext">BuildMethodology::new</span><span class="plain">(</span><span class="identifier">pathname</span><span class="plain"> *</span><span class="identifier">tools_path</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">tangled</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">meth</span><span class="plain">) {</span>
<span class="reserved">build_methodology</span><span class="plain"> *</span><span class="identifier">BM</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">build_methodology</span><span class="plain">);</span>
<span class="identifier">BM</span><span class="plain">-</span><span class="element">&gt;methodology</span><span class="plain"> = </span><span class="identifier">meth</span><span class="plain">;</span>
<span class="identifier">pathname</span><span class="plain"> *</span><span class="identifier">inter_path</span><span class="plain"> = </span><span class="identifier">tools_path</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">dev</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">tangled</span><span class="plain">) {</span>
<span class="identifier">inter_path</span><span class="plain"> = </span><span class="identifier">Pathnames::subfolder</span><span class="plain">(</span><span class="identifier">inter_path</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"inter"</span><span class="plain">);</span>
<span class="identifier">inter_path</span><span class="plain"> = </span><span class="identifier">Pathnames::subfolder</span><span class="plain">(</span><span class="identifier">inter_path</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Tangled"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">BM</span><span class="plain">-</span><span class="element">&gt;to_inter</span><span class="plain"> = </span><span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">inter_path</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"inter"</span><span class="plain">);</span>
<span class="identifier">pathname</span><span class="plain"> *</span><span class="identifier">inform6_path</span><span class="plain"> = </span><span class="identifier">tools_path</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">dev</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">tangled</span><span class="plain">) {</span>
<span class="identifier">inform6_path</span><span class="plain"> = </span><span class="identifier">Pathnames::subfolder</span><span class="plain">(</span><span class="identifier">inform6_path</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"inform6"</span><span class="plain">);</span>
<span class="identifier">inform6_path</span><span class="plain"> = </span><span class="identifier">Pathnames::subfolder</span><span class="plain">(</span><span class="identifier">inform6_path</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Tangled"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">BM</span><span class="plain">-</span><span class="element">&gt;to_inform6</span><span class="plain"> = </span><span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">inform6_path</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"inform6"</span><span class="plain">);</span>
<span class="identifier">pathname</span><span class="plain"> *</span><span class="identifier">inform7_path</span><span class="plain"> = </span><span class="identifier">tools_path</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">dev</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">tangled</span><span class="plain">) {</span>
<span class="identifier">inform7_path</span><span class="plain"> = </span><span class="identifier">Pathnames::subfolder</span><span class="plain">(</span><span class="identifier">inform7_path</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"inform7"</span><span class="plain">);</span>
<span class="identifier">inform7_path</span><span class="plain"> = </span><span class="identifier">Pathnames::subfolder</span><span class="plain">(</span><span class="identifier">inform7_path</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Tangled"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">BM</span><span class="plain">-</span><span class="element">&gt;to_inform7</span><span class="plain"> = </span><span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">inform7_path</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"inform7"</span><span class="plain">);</span>
<span class="identifier">pathname</span><span class="plain"> *</span><span class="identifier">inblorb_path</span><span class="plain"> = </span><span class="identifier">tools_path</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">dev</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">tangled</span><span class="plain">) {</span>
<span class="identifier">inblorb_path</span><span class="plain"> = </span><span class="identifier">Pathnames::subfolder</span><span class="plain">(</span><span class="identifier">inblorb_path</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"inblorb"</span><span class="plain">);</span>
<span class="identifier">inblorb_path</span><span class="plain"> = </span><span class="identifier">Pathnames::subfolder</span><span class="plain">(</span><span class="identifier">inblorb_path</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Tangled"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">BM</span><span class="plain">-</span><span class="element">&gt;to_inblorb</span><span class="plain"> = </span><span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">inblorb_path</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"inblorb"</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">BM</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function BuildMethodology::new is used in <a href="#SP3">&#167;3</a>.</p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b>The <code class="display"><span class="extract">inform7</span></code> tool only ever uses the internal methodology, for which
these filenames are irrelevant, since no shell commands are ever issued.
It gets its BM by calling the following:
</p>
<pre class="display">
<span class="reserved">build_methodology</span><span class="plain"> *</span><span class="functiontext">BuildMethodology::stay_in_current_process</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext">BuildMethodology::new</span><span class="plain">(</span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">, </span><span class="constant">INTERNAL_METHODOLOGY</span><span class="plain">);</span>
<span class="plain">}</span>
@ -115,12 +147,8 @@
<p class="inwebparagraph"></p>
<p class="endnote">The function BuildMethodology::new appears nowhere else.</p>
<p class="endnote">The function BuildMethodology::stay_in_current_process appears nowhere else.</p>
<p class="endnote">The structure build_methodology is accessed in 3/bs2, 3/is, 3/is2, 3/is3, 3/is4, 4/km, 4/em, 4/lm, 4/tm, 4/pm and here.</p>
<hr class="tocbar">
<ul class="toc"><li><a href="3-bg.html">Back to 'Build Graphs'</a></li><li><a href="3-ib.html">Continue with 'Incremental Building'</a></li></ul><hr class="tocbar">
<!--End of weave-->

View file

@ -57,11 +57,13 @@
<main role="main">
<!--Weave of '3/bs' generated by 7-->
<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 Scripts</b></li></ul><p class="purpose">Scripts are nothing more than list of build steps.</p>
<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 Scripts</b></li></ul><p class="purpose">Scripts are nothing more than lists of build steps.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Build scripts</a></li></ul><hr class="tocbar">
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. Build scripts. </b>Simple lists of steps: nothing to see here...
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. Build scripts. </b>Suppose the incremental build algorithm has decided it wants to build node
<code class="display"><span class="extract">V</span></code> in the graph: it does so by calling <code class="display"><span class="extract">BuildScripts::execute</span></code> on the script
attached to <code class="display"><span class="extract">V</span></code>. This is only a list of steps:
</p>
@ -77,28 +79,13 @@
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">BS</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">BuildScripts::script_length</span><span class="plain">(</span><span class="reserved">build_script</span><span class="plain"> *</span><span class="identifier">BS</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">BS</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> 0;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">LinkedLists::len</span><span class="plain">(</span><span class="identifier">BS</span><span class="plain">-</span><span class="element">&gt;steps</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">BuildScripts::add_step</span><span class="plain">(</span><span class="reserved">build_script</span><span class="plain"> *</span><span class="identifier">BS</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">ADD_TO_LINKED_LIST</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="element">&gt;steps</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">BuildScripts::concatenate</span><span class="plain">(</span><span class="reserved">build_script</span><span class="plain"> *</span><span class="identifier">BT</span><span class="plain">, </span><span class="reserved">build_script</span><span class="plain"> *</span><span class="identifier">BF</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">LOOP_OVER_LINKED_LIST</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">BF</span><span class="plain">-</span><span class="element">&gt;steps</span><span class="plain">)</span>
<span class="functiontext">BuildScripts::add_step</span><span class="plain">(</span><span class="identifier">BT</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">BuildScripts::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_script</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>
<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="reserved">build_step</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</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="element">&gt;steps</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">rv</span><span class="plain">)</span>
<span class="identifier">rv</span><span class="plain"> = </span><span class="functiontext">BuildSteps::execute</span><span class="plain">(</span><span class="identifier">V</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">, </span><span class="identifier">meth</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="reserved">int</span><span class="plain"> </span><span class="functiontext">BuildScripts::script_length</span><span class="plain">(</span><span class="reserved">build_script</span><span class="plain"> *</span><span class="identifier">BS</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">BS</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> 0;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">LinkedLists::len</span><span class="plain">(</span><span class="identifier">BS</span><span class="plain">-</span><span class="element">&gt;steps</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
@ -106,16 +93,33 @@
<p class="endnote">The function BuildScripts::new is used in 3/bg (<a href="3-bg.html#SP2">&#167;2</a>).</p>
<p class="endnote">The function BuildScripts::script_length is used in 3/bg (<a href="3-bg.html#SP4">&#167;4</a>).</p>
<p class="endnote">The function BuildScripts::add_step is used in 3/bs2 (<a href="3-bs2.html#SP4">&#167;4</a>).</p>
<p class="endnote">The function BuildScripts::concatenate appears nowhere else.</p>
<p class="endnote">The function BuildScripts::execute is used in 3/ib (<a href="3-ib.html#SP7_1_3">&#167;7.1.3</a>).</p>
<p class="endnote">The function BuildScripts::script_length is used in 3/bg (<a href="3-bg.html#SP5">&#167;5</a>).</p>
<p class="endnote">The structure build_script is private to this section.</p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b>We execute the steps in sequence, of course. As soon as any step fails,
returning <code class="display"><span class="extract">FALSE</span></code>, the script halts and returns <code class="display"><span class="extract">FALSE</span></code>. An empty script
always succeeds and returns <code class="display"><span class="extract">TRUE</span></code>.
</p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">BuildScripts::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_script</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">BM</span><span class="plain">) {</span>
<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="reserved">build_step</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</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="element">&gt;steps</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">rv</span><span class="plain">)</span>
<span class="identifier">rv</span><span class="plain"> = </span><span class="functiontext">BuildSteps::execute</span><span class="plain">(</span><span class="identifier">V</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">, </span><span class="identifier">BM</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>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function BuildScripts::execute is used in 3/ib (<a href="3-ib.html#SP7_1_3">&#167;7.1.3</a>).</p>
<hr class="tocbar">
<ul class="toc"><li><a href="3-ib.html">Back to 'Incremental Building'</a></li><li><a href="3-bs2.html">Continue with 'Build Steps'</a></li></ul><hr class="tocbar">
<!--End of weave-->

View file

@ -59,9 +59,14 @@
<!--Weave of '3/bs2' generated by 7-->
<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>
<ul class="toc"><li><a href="#SP1">&#167;1. Build skills</a></li><li><a href="#SP3">&#167;3. Build steps</a></li></ul><hr class="tocbar">
<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">
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. Build skills. </b></p>
<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>
<pre class="display">
@ -85,7 +90,11 @@
<p class="endnote">The structure build_skill is private to this section.</p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b></p>
<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>
<pre class="definitions">
@ -102,18 +111,22 @@
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. Build steps. </b></p>
<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>
<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>
<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="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>
<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>
<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="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>
<span class="identifier">MEMORY_MANAGEMENT</span>
<span class="plain">} </span><span class="reserved">build_step</span><span class="plain">;</span>
</pre>
@ -122,15 +135,16 @@
<p class="endnote">The structure build_step is accessed in 2/cps, 3/bg, 3/is, 3/is2, 3/is3, 3/is4, 4/km, 4/em, 5/kts, 5/ps, 6/hdn, 6/inc and here.</p>
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. </b></p>
<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>
<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>
<span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;vertex</span><span class="plain"> = </span><span class="identifier">vertex</span><span class="plain">;</span>
<span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;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">-</span><span class="element">&gt;vertex</span><span class="plain"> = </span><span class="identifier">vertex</span><span class="plain">;</span>
<span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;search_path</span><span class="plain"> = </span><span class="identifier">search</span><span class="plain">;</span>
<span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;for_vm</span><span class="plain"> = </span><span class="identifier">VM</span><span class="plain">;</span>
<span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;for_arch</span><span class="plain"> = </span><span class="identifier">arch</span><span class="plain">;</span>
@ -140,42 +154,88 @@
<span class="functiontext">BuildScripts::add_step</span><span class="plain">(</span><span class="identifier">vertex</span><span class="plain">-</span><span class="element">&gt;script</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>
<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">meth</span><span class="plain">) {</span>
<span class="comment">PRINT("Exec %S %d\n", S-&gt;what_to_do-&gt;name, meth-&gt;methodology);</span>
<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>
<span class="identifier">VMETHOD_CALL</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;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">meth</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">rv</span><span class="plain">) &amp;&amp; (</span><span class="identifier">Str::len</span><span class="plain">(</span><span class="identifier">command</span><span class="plain">) &gt; 0)) </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">meth</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">rv</span><span class="plain">) &amp;&amp; (</span><span class="identifier">meth</span><span class="plain">-</span><span class="element">&gt;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"> = 0;</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">-</span><span class="element">&gt;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">meth</span><span class="plain">);</span>
<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>
<span class="plain">#</span><span class="identifier">ifndef</span><span class="plain"> </span><span class="identifier">CORE_MODULE</span>
<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'\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">command</span><span class="plain">);</span>
<span class="plain">#</span><span class="identifier">endif</span>
<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>
<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">meth</span><span class="plain">) {</span>
<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="plain">#</span><span class="identifier">ifndef</span><span class="plain"> </span><span class="identifier">CORE_MODULE</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">STDOUT</span><span class="plain">, </span><span class="string">"%S\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">command</span><span class="plain">);</span>
<span class="plain">#</span><span class="identifier">endif</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">meth</span><span class="plain">-</span><span class="element">&gt;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">) == 0)?</span><span class="identifier">TRUE</span><span class="plain">:</span><span class="identifier">FALSE</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>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function BuildSteps::attach is used in 5/kts (<a href="5-kts.html#SP2">&#167;2</a>), 5/ps (<a href="5-ps.html#SP3">&#167;3</a>).</p>
<p class="endnote">The function BuildSteps::execute is used in 3/bs (<a href="3-bs.html#SP1">&#167;1</a>).</p>
<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>
<p class="endnote">The function BuildSteps::shell is used in 4/em (<a href="4-em.html#SP8">&#167;8</a>), 4/pm (<a href="4-pm.html#SP7">&#167;7</a>).</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>
<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>
&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>
<span class="plain">#</span><span class="identifier">ifndef</span><span class="plain"> </span><span class="identifier">CORE_MODULE</span>
<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'\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">command</span><span class="plain">);</span>
<span class="plain">#</span><span class="identifier">endif</span>
<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>
</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>
<pre class="displaydefn">
<span class="identifier">VMETHOD_CALL</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;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; 0) </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>
</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">
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">BM</span><span class="plain">-</span><span class="element">&gt;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"> = 0;</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">-</span><span class="element">&gt;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>
<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>
<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="plain">#</span><span class="identifier">ifndef</span><span class="plain"> </span><span class="identifier">CORE_MODULE</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">STDOUT</span><span class="plain">, </span><span class="string">"%S\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">command</span><span class="plain">);</span>
<span class="plain">#</span><span class="identifier">endif</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">BM</span><span class="plain">-</span><span class="element">&gt;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">) == 0)?</span><span class="identifier">TRUE</span><span class="plain">:</span><span class="identifier">FALSE</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>
</pre>
<p class="inwebparagraph"></p>
<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#SP8">&#167;8</a>), 4/pm (<a href="4-pm.html#SP7">&#167;7</a>).</p>
<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">

View file

@ -80,10 +80,10 @@ binary Inter files, because those are its build-dependencies.
<span class="identifier">time_t</span><span class="plain"> </span><span class="functiontext">IncrementalBuild::timestamp</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">switch</span><span class="plain"> (</span><span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;type</span><span class="plain">) {</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">FILE_VERTEX</span><span class="plain">:</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">Filenames::timestamp</span><span class="plain">(</span><span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;buildable_if_internal_file</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">Filenames::timestamp</span><span class="plain">(</span><span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;as_file</span><span class="plain">);</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">COPY_VERTEX</span><span class="plain">:</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;buildable_if_copy</span><span class="plain">-</span><span class="element">&gt;location_if_file</span><span class="plain">)</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">Filenames::timestamp</span><span class="plain">(</span><span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;buildable_if_copy</span><span class="plain">-</span><span class="element">&gt;location_if_file</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;as_copy</span><span class="plain">-</span><span class="element">&gt;location_if_file</span><span class="plain">)</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">Filenames::timestamp</span><span class="plain">(</span><span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;as_copy</span><span class="plain">-</span><span class="element">&gt;location_if_file</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext">IncrementalBuild::time_of_latest_build_dependency</span><span class="plain">(</span><span class="identifier">V</span><span class="plain">);</span>
<span class="reserved">default</span><span class="plain">:</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">Platform::never_time</span><span class="plain">();</span>
@ -224,24 +224,25 @@ for each time we recurse.
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">no_build_generations</span><span class="plain"> = 0;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">IncrementalBuild::begin_recursion</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">gb</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_methodology</span><span class="plain"> *</span><span class="identifier">meth</span><span class="plain">) {</span>
<span class="reserved">build_methodology</span><span class="plain"> *</span><span class="identifier">BM</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">changes</span><span class="plain"> = 0;</span>
<span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">trace</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">trace_ibg</span><span class="plain">) </span><span class="identifier">trace</span><span class="plain"> = </span><span class="identifier">STDOUT</span><span class="plain">;</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">trace</span><span class="plain">, </span><span class="string">"Incremental build %d:\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">no_build_generations</span><span class="plain">);</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">rv</span><span class="plain"> = </span><span class="functiontext">IncrementalBuild::recurse</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">trace</span><span class="plain">, </span><span class="identifier">gb</span><span class="plain">, </span><span class="identifier">V</span><span class="plain">, </span><span class="identifier">meth</span><span class="plain">, &amp;</span><span class="identifier">changes</span><span class="plain">, </span><span class="identifier">no_build_generations</span><span class="plain">++);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">trace</span><span class="plain">, </span><span class="string">"%d change(s)\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">changes</span><span class="plain">);</span>
<span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">T</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">trace_ibg</span><span class="plain">) </span><span class="identifier">T</span><span class="plain"> = </span><span class="identifier">STDOUT</span><span class="plain">;</span>
<span class="identifier">no_build_generations</span><span class="plain">++;</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="string">"Incremental build %d:\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">no_build_generations</span><span class="plain">);</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">rv</span><span class="plain"> = </span><span class="functiontext">IncrementalBuild::recurse</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">gb</span><span class="plain">, </span><span class="identifier">V</span><span class="plain">, </span><span class="identifier">BM</span><span class="plain">, &amp;</span><span class="identifier">changes</span><span class="plain">, </span><span class="identifier">no_build_generations</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="string">"%d change(s)\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">changes</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>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">IncrementalBuild::recurse</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">trace</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">gb</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_methodology</span><span class="plain"> *</span><span class="identifier">meth</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> *</span><span class="identifier">changes</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">generation</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">trace</span><span class="plain">) {</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">trace</span><span class="plain">, </span><span class="string">"Visit %c%c%c: "</span><span class="plain">,</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">IncrementalBuild::recurse</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">T</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">gb</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_methodology</span><span class="plain"> *</span><span class="identifier">BM</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> *</span><span class="identifier">changes</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">generation</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">T</span><span class="plain">) {</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="string">"Visit %c%c%c: "</span><span class="plain">,</span>
<span class="plain">(</span><span class="identifier">gb</span><span class="plain"> &amp; </span><span class="constant">BUILD_DEPENDENCIES_MATTER_GB</span><span class="plain">)?</span><span class="character">'b'</span><span class="plain">:</span><span class="character">'.'</span><span class="plain">,</span>
<span class="plain">(</span><span class="identifier">gb</span><span class="plain"> &amp; </span><span class="constant">USE_DEPENDENCIES_MATTER_GB</span><span class="plain">)?</span><span class="character">'u'</span><span class="plain">:</span><span class="character">'.'</span><span class="plain">,</span>
<span class="plain">(</span><span class="identifier">gb</span><span class="plain"> &amp; </span><span class="constant">IGNORE_TIMESTAMPS_GB</span><span class="plain">)?</span><span class="character">'i'</span><span class="plain">:</span><span class="character">'.'</span><span class="plain">);</span>
<span class="functiontext">Graphs::describe</span><span class="plain">(</span><span class="identifier">trace</span><span class="plain">, </span><span class="identifier">V</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">);</span>
<span class="functiontext">Graphs::describe</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">V</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;last_built_in_generation</span><span class="plain"> == </span><span class="identifier">generation</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;build_result</span><span class="plain">;</span>
@ -284,10 +285,10 @@ needs no action taken.
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">trace</span><span class="plain">) </span><span class="identifier">STREAM_INDENT</span><span class="plain">(</span><span class="identifier">trace</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">T</span><span class="plain">) </span><span class="identifier">STREAM_INDENT</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">gb</span><span class="plain"> &amp; </span><span class="constant">BUILD_DEPENDENCIES_MATTER_GB</span><span class="plain">) </span>&lt;<span class="cwebmacro">Build the build dependencies of the node</span> <span class="cwebmacronumber">7.1.1</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">gb</span><span class="plain"> &amp; </span><span class="constant">USE_DEPENDENCIES_MATTER_GB</span><span class="plain">) </span>&lt;<span class="cwebmacro">Build the use dependencies of the node</span> <span class="cwebmacronumber">7.1.2</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">trace</span><span class="plain">) </span><span class="identifier">STREAM_OUTDENT</span><span class="plain">(</span><span class="identifier">trace</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">T</span><span class="plain">) </span><span class="identifier">STREAM_OUTDENT</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">rv</span><span class="plain">) &amp;&amp; (</span><span class="functiontext">Graphs::can_be_built</span><span class="plain">(</span><span class="identifier">V</span><span class="plain">))) </span>&lt;<span class="cwebmacro">Build the node itself, if necessary</span> <span class="cwebmacronumber">7.1.3</span>&gt;<span class="plain">;</span>
</pre>
@ -311,8 +312,8 @@ building V is itself a use of W, and therefore of X. So we always enable the
<span class="reserved">build_vertex</span><span class="plain"> *</span><span class="identifier">W</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">W</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="element">&gt;build_edges</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">rv</span><span class="plain">)</span>
<span class="identifier">rv</span><span class="plain"> = </span><span class="functiontext">IncrementalBuild::recurse</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">trace</span><span class="plain">,</span>
<span class="identifier">gb</span><span class="plain"> | </span><span class="constant">USE_DEPENDENCIES_MATTER_GB</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">meth</span><span class="plain">, </span><span class="identifier">changes</span><span class="plain">, </span><span class="identifier">generation</span><span class="plain">);</span>
<span class="identifier">rv</span><span class="plain"> = </span><span class="functiontext">IncrementalBuild::recurse</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">T</span><span class="plain">,</span>
<span class="identifier">gb</span><span class="plain"> | </span><span class="constant">USE_DEPENDENCIES_MATTER_GB</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">BM</span><span class="plain">, </span><span class="identifier">changes</span><span class="plain">, </span><span class="identifier">generation</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
@ -328,8 +329,8 @@ building V is itself a use of W, and therefore of X. So we always enable the
<span class="reserved">build_vertex</span><span class="plain"> *</span><span class="identifier">W</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">W</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="element">&gt;use_edges</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">rv</span><span class="plain">)</span>
<span class="identifier">rv</span><span class="plain"> = </span><span class="functiontext">IncrementalBuild::recurse</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">trace</span><span class="plain">,</span>
<span class="identifier">gb</span><span class="plain"> | </span><span class="constant">USE_DEPENDENCIES_MATTER_GB</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">meth</span><span class="plain">, </span><span class="identifier">changes</span><span class="plain">, </span><span class="identifier">generation</span><span class="plain">);</span>
<span class="identifier">rv</span><span class="plain"> = </span><span class="functiontext">IncrementalBuild::recurse</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">T</span><span class="plain">,</span>
<span class="identifier">gb</span><span class="plain"> | </span><span class="constant">USE_DEPENDENCIES_MATTER_GB</span><span class="plain">, </span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">BM</span><span class="plain">, </span><span class="identifier">changes</span><span class="plain">, </span><span class="identifier">generation</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
@ -351,11 +352,11 @@ building V is itself a use of W, and therefore of X. So we always enable the
<span class="reserved">else</span><span class="plain"> </span>&lt;<span class="cwebmacro">Decide based on timestamps</span> <span class="cwebmacronumber">7.1.3.1</span>&gt;<span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">needs_building</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">trace</span><span class="plain">) { </span><span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">trace</span><span class="plain">, </span><span class="string">"Build: "</span><span class="plain">); </span><span class="functiontext">Graphs::describe</span><span class="plain">(</span><span class="identifier">trace</span><span class="plain">, </span><span class="identifier">V</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">); }</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">T</span><span class="plain">) { </span><span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="string">"Build: "</span><span class="plain">); </span><span class="functiontext">Graphs::describe</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="identifier">V</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">); }</span>
<span class="plain">(*</span><span class="identifier">changes</span><span class="plain">)++;</span>
<span class="identifier">rv</span><span class="plain"> = </span><span class="functiontext">BuildScripts::execute</span><span class="plain">(</span><span class="identifier">V</span><span class="plain">, </span><span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;script</span><span class="plain">, </span><span class="identifier">meth</span><span class="plain">);</span>
<span class="identifier">rv</span><span class="plain"> = </span><span class="functiontext">BuildScripts::execute</span><span class="plain">(</span><span class="identifier">V</span><span class="plain">, </span><span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;script</span><span class="plain">, </span><span class="identifier">BM</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">trace</span><span class="plain">) { </span><span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">trace</span><span class="plain">, </span><span class="string">"No build\</span><span class="plain">n</span><span class="string">"</span><span class="plain">); }</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">T</span><span class="plain">) { </span><span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="string">"No build\</span><span class="plain">n</span><span class="string">"</span><span class="plain">); }</span>
<span class="plain">}</span>
</pre>
@ -384,16 +385,16 @@ created during the same second.
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">last_up_to_date_at</span><span class="plain"> == </span><span class="identifier">Platform::never_time</span><span class="plain">())</span>
<span class="identifier">needs_building</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="reserved">else</span><span class="plain"> {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">trace</span><span class="plain">) { </span><span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">trace</span><span class="plain">, </span><span class="string">"Last built at: %08x\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">last_up_to_date_at</span><span class="plain">); }</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">T</span><span class="plain">) { </span><span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="string">"Last built at: %08x\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">last_up_to_date_at</span><span class="plain">); }</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">gb</span><span class="plain"> &amp; </span><span class="constant">BUILD_DEPENDENCIES_MATTER_GB</span><span class="plain">) {</span>
<span class="identifier">time_t</span><span class="plain"> </span><span class="identifier">t</span><span class="plain"> = </span><span class="functiontext">IncrementalBuild::time_of_latest_build_dependency</span><span class="plain">(</span><span class="identifier">V</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">trace</span><span class="plain">) { </span><span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">trace</span><span class="plain">, </span><span class="string">"Most recent build dependency: %08x\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">t</span><span class="plain">); }</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">T</span><span class="plain">) { </span><span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="string">"Most recent build dependency: %08x\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">t</span><span class="plain">); }</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">IncrementalBuild::timecmp</span><span class="plain">(</span><span class="identifier">t</span><span class="plain">, </span><span class="identifier">last_up_to_date_at</span><span class="plain">) &gt;= 0)</span>
<span class="identifier">needs_building</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">gb</span><span class="plain"> &amp; </span><span class="constant">USE_DEPENDENCIES_MATTER_GB</span><span class="plain">) {</span>
<span class="identifier">time_t</span><span class="plain"> </span><span class="identifier">t</span><span class="plain"> = </span><span class="functiontext">IncrementalBuild::time_of_latest_use_dependency</span><span class="plain">(</span><span class="identifier">V</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">trace</span><span class="plain">) { </span><span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">trace</span><span class="plain">, </span><span class="string">"Most recent use dependency: %08x\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">t</span><span class="plain">); }</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">T</span><span class="plain">) { </span><span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">, </span><span class="string">"Most recent use dependency: %08x\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">t</span><span class="plain">); }</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">IncrementalBuild::timecmp</span><span class="plain">(</span><span class="identifier">t</span><span class="plain">, </span><span class="identifier">last_up_to_date_at</span><span class="plain">) &gt;= 0)</span>
<span class="identifier">needs_building</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>

View file

@ -57,9 +57,14 @@
<main role="main">
<!--Weave of '3/is' generated by 7-->
<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>Inter Skill</b></li></ul><p class="purpose">A build step is a task such as running inform7 or inblorb on some file.</p>
<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>Inter Skill</b></li></ul><p class="purpose">The skills of kit assimilation and of code generation from Inter.</p>
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. </b></p>
<ul class="toc"><li><a href="#SP1">&#167;1. Creation</a></li><li><a href="#SP2">&#167;2. Assimilation</a></li><li><a href="#SP4">&#167;4. Code generation</a></li></ul><hr class="tocbar">
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. Creation. </b>Note that code generation can only be done internally, and only in fact within
the <code class="display"><span class="extract">inform7</span></code> compiler: this is because the Inter code which it generates from
is being held in memory by <code class="display"><span class="extract">inform7</span></code>.
</p>
<pre class="display">
@ -67,34 +72,67 @@
<span class="reserved">build_skill</span><span class="plain"> *</span><span class="identifier">code_generate_using_inter_skill</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">InterSkill::create</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="identifier">assimilate_using_inter_skill</span><span class="plain"> = </span><span class="functiontext">BuildSteps::new_skill</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"assimilate using inter"</span><span class="plain">);</span>
<span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">assimilate_using_inter_skill</span><span class="plain">, </span><span class="constant">BUILD_SKILL_COMMAND_MTID</span><span class="plain">, </span><span class="functiontext">InterSkill::assimilate_via_shell</span><span class="plain">);</span>
<span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">assimilate_using_inter_skill</span><span class="plain">, </span><span class="constant">BUILD_SKILL_INTERNAL_MTID</span><span class="plain">, </span><span class="functiontext">InterSkill::assimilate_internally</span><span class="plain">);</span>
<span class="identifier">code_generate_using_inter_skill</span><span class="plain"> = </span><span class="functiontext">BuildSteps::new_skill</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"code generate using inter"</span><span class="plain">);</span>
<span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">code_generate_using_inter_skill</span><span class="plain">, </span><span class="constant">BUILD_SKILL_INTERNAL_MTID</span><span class="plain">, </span><span class="functiontext">InterSkill::code_generate_internally</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">assimilate_using_inter_skill</span><span class="plain"> =</span>
<span class="functiontext">BuildSteps::new_skill</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"assimilate using inter"</span><span class="plain">);</span>
<span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">assimilate_using_inter_skill</span><span class="plain">, </span><span class="constant">BUILD_SKILL_COMMAND_MTID</span><span class="plain">,</span>
<span class="functiontext">InterSkill::assimilate_via_shell</span><span class="plain">);</span>
<span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">assimilate_using_inter_skill</span><span class="plain">, </span><span class="constant">BUILD_SKILL_INTERNAL_MTID</span><span class="plain">,</span>
<span class="functiontext">InterSkill::assimilate_internally</span><span class="plain">);</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">InterSkill::assimilate_via_shell</span><span class="plain">(</span><span class="reserved">build_skill</span><span class="plain"> *</span><span class="identifier">skill</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">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">code_generate_using_inter_skill</span><span class="plain"> =</span>
<span class="functiontext">BuildSteps::new_skill</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"code generate using inter"</span><span class="plain">);</span>
<span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">code_generate_using_inter_skill</span><span class="plain">, </span><span class="constant">BUILD_SKILL_INTERNAL_MTID</span><span class="plain">,</span>
<span class="functiontext">InterSkill::code_generate_internally</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function InterSkill::create is used in 1/ic (<a href="1-ic.html#SP3">&#167;3</a>).</p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. Assimilation. </b></p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">InterSkill::assimilate_via_shell</span><span class="plain">(</span><span class="reserved">build_skill</span><span class="plain"> *</span><span class="identifier">skill</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">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>
<span class="identifier">inter_architecture</span><span class="plain"> *</span><span class="identifier">A</span><span class="plain"> = </span><span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;for_arch</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">A</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"no architecture given"</span><span class="plain">);</span>
<span class="identifier">pathname</span><span class="plain"> *</span><span class="identifier">kit_path</span><span class="plain"> = </span><span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;associated_copy</span><span class="plain">-</span><span class="element">&gt;location_if_path</span><span class="plain">;</span>
<span class="identifier">Shell::quote_file</span><span class="plain">(</span><span class="identifier">command</span><span class="plain">, </span><span class="identifier">meth</span><span class="plain">-</span><span class="element">&gt;to_inter</span><span class="plain">);</span>
<span class="identifier">Shell::quote_file</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="element">&gt;to_inter</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">command</span><span class="plain">, </span><span class="string">"-architecture %S "</span><span class="plain">, </span><span class="identifier">Architectures::to_codename</span><span class="plain">(</span><span class="identifier">A</span><span class="plain">));</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">command</span><span class="plain">, </span><span class="string">"-assimilate "</span><span class="plain">);</span>
<span class="identifier">Shell::quote_path</span><span class="plain">(</span><span class="identifier">command</span><span class="plain">, </span><span class="identifier">kit_path</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">InterSkill::assimilate_internally</span><span class="plain">(</span><span class="reserved">build_skill</span><span class="plain"> *</span><span class="identifier">skill</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">meth</span><span class="plain">) {</span>
<p class="inwebparagraph"></p>
<p class="endnote">The function InterSkill::assimilate_via_shell is used in <a href="#SP1">&#167;1</a>.</p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b>Something to watch out for here is that, when running internally as part of
<code class="display"><span class="extract">inform7</span></code>, we use the copy of the <code class="display"><span class="extract">assimilate</span></code> pipeline inside the installation
of <code class="display"><span class="extract">inform7</span></code> (it will be in the internal nest). When we perform assimilation
from the command line using the <code class="display"><span class="extract">inter</span></code> tool, we use the <code class="display"><span class="extract">assimilate</span></code> pipeline
supplied in the <code class="display"><span class="extract">inter</span></code> installation. But those two files are in fact the same,
or should be, so the effect is the same.
</p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">InterSkill::assimilate_internally</span><span class="plain">(</span><span class="reserved">build_skill</span><span class="plain"> *</span><span class="identifier">skill</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>
<span class="plain">#</span><span class="identifier">ifdef</span><span class="plain"> </span><span class="identifier">CODEGEN_MODULE</span>
<span class="identifier">inter_architecture</span><span class="plain"> *</span><span class="identifier">A</span><span class="plain"> = </span><span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;for_arch</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">A</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"no architecture given"</span><span class="plain">);</span>
<span class="identifier">pathname</span><span class="plain"> *</span><span class="identifier">kit_path</span><span class="plain"> = </span><span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;associated_copy</span><span class="plain">-</span><span class="element">&gt;location_if_path</span><span class="plain">;</span>
<span class="identifier">dictionary</span><span class="plain"> *</span><span class="identifier">pipeline_vars</span><span class="plain"> = </span><span class="identifier">CodeGen::Pipeline::basic_dictionary</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"output.i6"</span><span class="plain">);</span>
<span class="identifier">dictionary</span><span class="plain"> *</span><span class="identifier">pipeline_vars</span><span class="plain"> = </span><span class="identifier">CodeGen::Pipeline::basic_dictionary</span><span class="plain">(</span><span class="identifier">NULL</span><span class="plain">);</span>
<span class="reserved">inbuild_requirement</span><span class="plain"> *</span><span class="identifier">req</span><span class="plain"> =</span>
<span class="functiontext">Requirements::any_version_of</span><span class="plain">(</span><span class="functiontext">Works::new</span><span class="plain">(</span><span class="identifier">pipeline_genre</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"assimilate.interpipeline"</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">));</span>
<span class="functiontext">Requirements::any_version_of</span><span class="plain">(</span>
<span class="functiontext">Works::new</span><span class="plain">(</span><span class="identifier">pipeline_genre</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"assimilate.interpipeline"</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">));</span>
<span class="reserved">inbuild_search_result</span><span class="plain"> *</span><span class="identifier">R</span><span class="plain"> = </span><span class="functiontext">Nests::search_for_best</span><span class="plain">(</span><span class="identifier">req</span><span class="plain">, </span><span class="functiontext">Inbuild::nest_list</span><span class="plain">());</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">R</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) {</span>
<span class="identifier">Errors::nowhere</span><span class="plain">(</span><span class="string">"assimilate pipeline could not be found"</span><span class="plain">);</span>
@ -111,11 +149,13 @@
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">fullname</span><span class="plain">, </span><span class="string">"%f"</span><span class="plain">, </span><span class="identifier">assim_t</span><span class="plain">);</span>
<span class="identifier">Str::copy</span><span class="plain">(</span><span class="identifier">Dictionaries::create_text</span><span class="plain">(</span><span class="identifier">pipeline_vars</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"*outt"</span><span class="plain">), </span><span class="identifier">fullname</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">fullname</span><span class="plain">);</span>
<span class="identifier">Str::copy</span><span class="plain">(</span><span class="identifier">Dictionaries::create_text</span><span class="plain">(</span><span class="identifier">pipeline_vars</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"*attach"</span><span class="plain">), </span><span class="identifier">Pathnames::directory_name</span><span class="plain">(</span><span class="identifier">kit_path</span><span class="plain">));</span>
<span class="identifier">Str::copy</span><span class="plain">(</span><span class="identifier">Dictionaries::create_text</span><span class="plain">(</span><span class="identifier">pipeline_vars</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"*kit"</span><span class="plain">),</span>
<span class="identifier">Pathnames::directory_name</span><span class="plain">(</span><span class="identifier">kit_path</span><span class="plain">));</span>
<span class="identifier">linked_list</span><span class="plain"> *</span><span class="identifier">inter_paths</span><span class="plain"> = </span><span class="identifier">NEW_LINKED_LIST</span><span class="plain">(</span><span class="identifier">pathname</span><span class="plain">);</span>
<span class="identifier">ADD_TO_LINKED_LIST</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;associated_copy</span><span class="plain">-</span><span class="element">&gt;location_if_path</span><span class="plain">, </span><span class="identifier">pathname</span><span class="plain">, </span><span class="identifier">inter_paths</span><span class="plain">);</span>
<span class="identifier">codegen_pipeline</span><span class="plain"> *</span><span class="identifier">SS</span><span class="plain"> = </span><span class="identifier">CodeGen::Pipeline::parse_from_file</span><span class="plain">(</span><span class="identifier">pipeline_as_file</span><span class="plain">, </span><span class="identifier">pipeline_vars</span><span class="plain">);</span>
<span class="identifier">codegen_pipeline</span><span class="plain"> *</span><span class="identifier">SS</span><span class="plain"> =</span>
<span class="identifier">CodeGen::Pipeline::parse_from_file</span><span class="plain">(</span><span class="identifier">pipeline_as_file</span><span class="plain">, </span><span class="identifier">pipeline_vars</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">SS</span><span class="plain">) {</span>
<span class="identifier">linked_list</span><span class="plain"> *</span><span class="identifier">requirements_list</span><span class="plain"> = </span><span class="identifier">NEW_LINKED_LIST</span><span class="plain">(</span><span class="identifier">inter_library</span><span class="plain">);</span>
<span class="identifier">CodeGen::Pipeline::run</span><span class="plain">(</span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">SS</span><span class="plain">, </span><span class="identifier">inter_paths</span><span class="plain">, </span><span class="identifier">requirements_list</span><span class="plain">);</span>
@ -127,8 +167,25 @@
<span class="plain">#</span><span class="identifier">endif</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">InterSkill::code_generate_internally</span><span class="plain">(</span><span class="reserved">build_skill</span><span class="plain"> *</span><span class="identifier">skill</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">meth</span><span class="plain">) {</span>
<p class="inwebparagraph"></p>
<p class="endnote">The function InterSkill::assimilate_internally is used in <a href="#SP1">&#167;1</a>.</p>
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. Code generation. </b>This can only be done internally, for reasons given above, and only when the
<code class="display"><span class="extract">codegen</span></code> module is present in the current executable (which in practice means:
only inside <code class="display"><span class="extract">inform7</span></code>).
</p>
<p class="inwebparagraph">Recall that the <code class="display"><span class="extract">inter_pipeline_name</span></code> is managed in Inbuild Control, but that
it defaults to <code class="display"><span class="extract">compile</span></code>.
</p>
<pre class="display">
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">InterSkill::code_generate_internally</span><span class="plain">(</span><span class="reserved">build_skill</span><span class="plain"> *</span><span class="identifier">skill</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>
<span class="plain">#</span><span class="identifier">ifdef</span><span class="plain"> </span><span class="identifier">CODEGEN_MODULE</span>
<span class="identifier">clock_t</span><span class="plain"> </span><span class="identifier">back_end</span><span class="plain"> = </span><span class="identifier">clock</span><span class="plain">();</span>
<span class="identifier">CodeGen::Architecture::set</span><span class="plain">(</span>
@ -136,15 +193,17 @@
<span class="identifier">TargetVMs::get_architecture</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;for_vm</span><span class="plain">)));</span>
<span class="identifier">Str::copy</span><span class="plain">(</span><span class="identifier">Dictionaries::create_text</span><span class="plain">(</span><span class="identifier">pipeline_vars</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"*in"</span><span class="plain">), </span><span class="identifier">I</span><span class="string">"*memory"</span><span class="plain">);</span>
<span class="identifier">Str::copy</span><span class="plain">(</span><span class="identifier">Dictionaries::create_text</span><span class="plain">(</span><span class="identifier">pipeline_vars</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"*out"</span><span class="plain">),</span>
<span class="identifier">Filenames::get_leafname</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;vertex</span><span class="plain">-</span><span class="element">&gt;buildable_if_internal_file</span><span class="plain">));</span>
<span class="identifier">Filenames::get_leafname</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;vertex</span><span class="plain">-</span><span class="element">&gt;as_file</span><span class="plain">));</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain"> = </span><span class="identifier">inter_pipeline_file</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">F</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) {</span>
<span class="reserved">inbuild_requirement</span><span class="plain"> *</span><span class="identifier">req</span><span class="plain"> =</span>
<span class="functiontext">Requirements::any_version_of</span><span class="plain">(</span><span class="functiontext">Works::new</span><span class="plain">(</span><span class="identifier">pipeline_genre</span><span class="plain">, </span><span class="identifier">inter_pipeline_name</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">));</span>
<span class="functiontext">Requirements::any_version_of</span><span class="plain">(</span>
<span class="functiontext">Works::new</span><span class="plain">(</span><span class="identifier">pipeline_genre</span><span class="plain">, </span><span class="identifier">inter_pipeline_name</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">));</span>
<span class="reserved">inbuild_search_result</span><span class="plain"> *</span><span class="identifier">R</span><span class="plain"> = </span><span class="functiontext">Nests::search_for_best</span><span class="plain">(</span><span class="identifier">req</span><span class="plain">, </span><span class="functiontext">Inbuild::nest_list</span><span class="plain">());</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">R</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) {</span>
<span class="identifier">Errors::with_text</span><span class="plain">(</span><span class="string">"inter pipeline '%S' could not be found"</span><span class="plain">, </span><span class="identifier">inter_pipeline_name</span><span class="plain">);</span>
<span class="identifier">Errors::with_text</span><span class="plain">(</span><span class="string">"inter pipeline '%S' could not be found"</span><span class="plain">,</span>
<span class="identifier">inter_pipeline_name</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">F</span><span class="plain"> = </span><span class="identifier">R</span><span class="plain">-</span><span class="element">&gt;copy</span><span class="plain">-</span><span class="element">&gt;location_if_file</span><span class="plain">;</span>
@ -155,9 +214,11 @@
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">CodeGen::Pipeline::set_repository</span><span class="plain">(</span><span class="identifier">SS</span><span class="plain">, </span><span class="identifier">Emit::tree</span><span class="plain">());</span>
<span class="identifier">CodeGen::Pipeline::run</span><span class="plain">(</span><span class="identifier">Filenames::get_path_to</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;vertex</span><span class="plain">-</span><span class="element">&gt;buildable_if_internal_file</span><span class="plain">),</span>
<span class="identifier">SS</span><span class="plain">, </span><span class="functiontext">Kits::inter_paths</span><span class="plain">(), </span><span class="functiontext">Projects::list_of_inter_libraries</span><span class="plain">(</span><span class="functiontext">Inbuild::project</span><span class="plain">()));</span>
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"Back end elapsed time: %dcs\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, ((</span><span class="reserved">int</span><span class="plain">) (</span><span class="identifier">clock</span><span class="plain">() - </span><span class="identifier">back_end</span><span class="plain">)) / (</span><span class="identifier">CLOCKS_PER_SEC</span><span class="plain">/100));</span>
<span class="identifier">CodeGen::Pipeline::run</span><span class="plain">(</span><span class="identifier">Filenames::get_path_to</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;vertex</span><span class="plain">-</span><span class="element">&gt;as_file</span><span class="plain">),</span>
<span class="identifier">SS</span><span class="plain">, </span><span class="functiontext">Kits::inter_paths</span><span class="plain">(),</span>
<span class="functiontext">Projects::list_of_inter_libraries</span><span class="plain">(</span><span class="functiontext">Inbuild::project</span><span class="plain">()));</span>
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"Back end elapsed time: %dcs\</span><span class="plain">n</span><span class="string">"</span><span class="plain">,</span>
<span class="plain">((</span><span class="reserved">int</span><span class="plain">) (</span><span class="identifier">clock</span><span class="plain">() - </span><span class="identifier">back_end</span><span class="plain">)) / (</span><span class="identifier">CLOCKS_PER_SEC</span><span class="plain">/100));</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">#</span><span class="identifier">endif</span>
<span class="plain">#</span><span class="identifier">ifndef</span><span class="plain"> </span><span class="identifier">CORE_MODULE</span>
@ -168,13 +229,7 @@
<p class="inwebparagraph"></p>
<p class="endnote">The function InterSkill::create is used in 1/ic (<a href="1-ic.html#SP3">&#167;3</a>).</p>
<p class="endnote">The function InterSkill::assimilate_via_shell appears nowhere else.</p>
<p class="endnote">The function InterSkill::assimilate_internally appears nowhere else.</p>
<p class="endnote">The function InterSkill::code_generate_internally appears nowhere else.</p>
<p class="endnote">The function InterSkill::code_generate_internally is used in <a href="#SP1">&#167;1</a>.</p>
<hr class="tocbar">
<ul class="toc"><li><a href="3-bs2.html">Back to 'Build Steps'</a></li><li><a href="3-is2.html">Continue with 'Inform7 Skill'</a></li></ul><hr class="tocbar">

View file

@ -57,26 +57,32 @@
<main role="main">
<!--Weave of '3/is2' generated by 7-->
<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>Inform7 Skill</b></li></ul><p class="purpose">A build step is a task such as running inform7 or inblorb on some file.</p>
<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>Inform7 Skill</b></li></ul><p class="purpose">The skill of turning source text into Inter code.</p>
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. </b></p>
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. </b>This skill can be performed externally with a shell command to <code class="display"><span class="extract">inform7</span></code>, or,
if we are running inside <code class="display"><span class="extract">inform7</span></code> anyway, internally with a function call.
</p>
<pre class="display">
<span class="reserved">build_skill</span><span class="plain"> *</span><span class="identifier">compile_using_inform7_skill</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Inform7Skill::create</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="identifier">compile_using_inform7_skill</span><span class="plain"> = </span><span class="functiontext">BuildSteps::new_skill</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"compile using inform7"</span><span class="plain">);</span>
<span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">compile_using_inform7_skill</span><span class="plain">, </span><span class="constant">BUILD_SKILL_COMMAND_MTID</span><span class="plain">, </span><span class="functiontext">Inform7Skill::inform7_via_shell</span><span class="plain">);</span>
<span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">compile_using_inform7_skill</span><span class="plain">, </span><span class="constant">BUILD_SKILL_INTERNAL_MTID</span><span class="plain">, </span><span class="functiontext">Inform7Skill::inform7_internally</span><span class="plain">);</span>
<span class="identifier">compile_using_inform7_skill</span><span class="plain"> =</span>
<span class="functiontext">BuildSteps::new_skill</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"compile using inform7"</span><span class="plain">);</span>
<span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">compile_using_inform7_skill</span><span class="plain">, </span><span class="constant">BUILD_SKILL_COMMAND_MTID</span><span class="plain">,</span>
<span class="functiontext">Inform7Skill::inform7_via_shell</span><span class="plain">);</span>
<span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">compile_using_inform7_skill</span><span class="plain">, </span><span class="constant">BUILD_SKILL_INTERNAL_MTID</span><span class="plain">,</span>
<span class="functiontext">Inform7Skill::inform7_internally</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Inform7Skill::inform7_via_shell</span><span class="plain">(</span><span class="reserved">build_skill</span><span class="plain"> *</span><span class="identifier">skill</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">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="reserved">int</span><span class="plain"> </span><span class="functiontext">Inform7Skill::inform7_via_shell</span><span class="plain">(</span><span class="reserved">build_skill</span><span class="plain"> *</span><span class="identifier">skill</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">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>
<span class="reserved">inform_project</span><span class="plain"> *</span><span class="identifier">project</span><span class="plain"> = </span><span class="functiontext">ProjectBundleManager::from_copy</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;associated_copy</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">project</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">project</span><span class="plain"> = </span><span class="functiontext">ProjectFileManager::from_copy</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;associated_copy</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">project</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"no project"</span><span class="plain">);</span>
<span class="identifier">Shell::quote_file</span><span class="plain">(</span><span class="identifier">command</span><span class="plain">, </span><span class="identifier">meth</span><span class="plain">-</span><span class="element">&gt;to_inform7</span><span class="plain">);</span>
<span class="identifier">Shell::quote_file</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="element">&gt;to_inform7</span><span class="plain">);</span>
<span class="reserved">kit_dependency</span><span class="plain"> *</span><span class="identifier">kd</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">kd</span><span class="plain">, </span><span class="reserved">kit_dependency</span><span class="plain">, </span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;kits_to_include</span><span class="plain">)</span>
@ -101,7 +107,7 @@
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Inform7Skill::inform7_internally</span><span class="plain">(</span><span class="reserved">build_skill</span><span class="plain"> *</span><span class="identifier">skill</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">meth</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Inform7Skill::inform7_internally</span><span class="plain">(</span><span class="reserved">build_skill</span><span class="plain"> *</span><span class="identifier">skill</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>
<span class="plain">#</span><span class="identifier">ifdef</span><span class="plain"> </span><span class="identifier">CORE_MODULE</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">Task::carry_out</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">);</span>
<span class="plain">#</span><span class="identifier">endif</span>

View file

@ -57,28 +57,34 @@
<main role="main">
<!--Weave of '3/is3' generated by 7-->
<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>Inform6 Skill</b></li></ul><p class="purpose">A build step is a task such as running inform7 or inblorb on some file.</p>
<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>Inform6 Skill</b></li></ul><p class="purpose">The skill of compiling Inform 6 into a story file for the target VM.</p>
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. </b></p>
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. </b>This can only be performed via the shell, as the Inform 6 compiler is never
part of the executables of the more modern Inform tools, and so can't be
called as a function.
</p>
<pre class="display">
<span class="reserved">build_skill</span><span class="plain"> *</span><span class="identifier">compile_using_inform6_skill</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Inform6Skill::create</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="identifier">compile_using_inform6_skill</span><span class="plain"> = </span><span class="functiontext">BuildSteps::new_skill</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"compile using inform6"</span><span class="plain">);</span>
<span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">compile_using_inform6_skill</span><span class="plain">, </span><span class="constant">BUILD_SKILL_COMMAND_MTID</span><span class="plain">, </span><span class="functiontext">Inform6Skill::inform6_via_shell</span><span class="plain">);</span>
<span class="identifier">compile_using_inform6_skill</span><span class="plain"> =</span>
<span class="functiontext">BuildSteps::new_skill</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"compile using inform6"</span><span class="plain">);</span>
<span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">compile_using_inform6_skill</span><span class="plain">, </span><span class="constant">BUILD_SKILL_COMMAND_MTID</span><span class="plain">,</span>
<span class="functiontext">Inform6Skill::inform6_via_shell</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Inform6Skill::inform6_via_shell</span><span class="plain">(</span><span class="reserved">build_skill</span><span class="plain"> *</span><span class="identifier">skill</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">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">Shell::quote_file</span><span class="plain">(</span><span class="identifier">command</span><span class="plain">, </span><span class="identifier">meth</span><span class="plain">-</span><span class="element">&gt;to_inform6</span><span class="plain">);</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Inform6Skill::inform6_via_shell</span><span class="plain">(</span><span class="reserved">build_skill</span><span class="plain"> *</span><span class="identifier">skill</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">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>
<span class="identifier">Shell::quote_file</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="element">&gt;to_inform6</span><span class="plain">);</span>
<span class="reserved">inform_project</span><span class="plain"> *</span><span class="identifier">project</span><span class="plain"> = </span><span class="functiontext">ProjectBundleManager::from_copy</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;associated_copy</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">project</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">project</span><span class="plain"> = </span><span class="functiontext">ProjectFileManager::from_copy</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;associated_copy</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">project</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"no project"</span><span class="plain">);</span>
<span class="identifier">pathname</span><span class="plain"> *</span><span class="identifier">build_folder</span><span class="plain"> = </span><span class="identifier">Pathnames::subfolder</span><span class="plain">(</span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;as_copy</span><span class="plain">-</span><span class="element">&gt;location_if_path</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Build"</span><span class="plain">);</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">inf_F</span><span class="plain"> = </span><span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">build_folder</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"auto.inf"</span><span class="plain">);</span>
<span class="identifier">pathname</span><span class="plain"> *</span><span class="identifier">build</span><span class="plain"> = </span><span class="identifier">Pathnames::subfolder</span><span class="plain">(</span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;as_copy</span><span class="plain">-</span><span class="element">&gt;location_if_path</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Build"</span><span class="plain">);</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">inf_F</span><span class="plain"> = </span><span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">build</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"auto.inf"</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">command</span><span class="plain">, </span><span class="string">"-kE2S"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">TargetVMs::debug_enabled</span><span class="plain">((</span><span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;for_vm</span><span class="plain">))) </span><span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">command</span><span class="plain">, </span><span class="string">"D"</span><span class="plain">);</span>
@ -87,7 +93,7 @@
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">command</span><span class="plain">, </span><span class="string">"w%S "</span><span class="plain">, </span><span class="identifier">ext</span><span class="plain">);</span>
<span class="identifier">Shell::quote_file</span><span class="plain">(</span><span class="identifier">command</span><span class="plain">, </span><span class="identifier">inf_F</span><span class="plain">);</span>
<span class="identifier">Shell::quote_file</span><span class="plain">(</span><span class="identifier">command</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;vertex</span><span class="plain">-</span><span class="element">&gt;buildable_if_internal_file</span><span class="plain">);</span>
<span class="identifier">Shell::quote_file</span><span class="plain">(</span><span class="identifier">command</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;vertex</span><span class="plain">-</span><span class="element">&gt;as_file</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>

View file

@ -57,7 +57,7 @@
<main role="main">
<!--Weave of '3/is4' generated by 7-->
<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>Inblorb Skill</b></li></ul><p class="purpose">A build step is a task such as running inform7 or inblorb on some file.</p>
<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>Inblorb Skill</b></li></ul><p class="purpose">The skill of packaging a story file and associated resources into a blorb.</p>
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. </b></p>
@ -66,19 +66,23 @@
<span class="reserved">build_skill</span><span class="plain"> *</span><span class="identifier">package_using_inblorb_skill</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">InblorbSkill::create</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="identifier">package_using_inblorb_skill</span><span class="plain"> = </span><span class="functiontext">BuildSteps::new_skill</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"package using inblorb"</span><span class="plain">);</span>
<span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">package_using_inblorb_skill</span><span class="plain">, </span><span class="constant">BUILD_SKILL_COMMAND_MTID</span><span class="plain">, </span><span class="functiontext">InblorbSkill::inblorb_via_shell</span><span class="plain">);</span>
<span class="identifier">package_using_inblorb_skill</span><span class="plain"> =</span>
<span class="functiontext">BuildSteps::new_skill</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"package using inblorb"</span><span class="plain">);</span>
<span class="identifier">METHOD_ADD</span><span class="plain">(</span><span class="identifier">package_using_inblorb_skill</span><span class="plain">, </span><span class="constant">BUILD_SKILL_COMMAND_MTID</span><span class="plain">,</span>
<span class="functiontext">InblorbSkill::inblorb_via_shell</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">InblorbSkill::inblorb_via_shell</span><span class="plain">(</span><span class="reserved">build_skill</span><span class="plain"> *</span><span class="identifier">skill</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">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="reserved">int</span><span class="plain"> </span><span class="functiontext">InblorbSkill::inblorb_via_shell</span><span class="plain">(</span><span class="reserved">build_skill</span><span class="plain"> *</span><span class="identifier">skill</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">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>
<span class="reserved">inform_project</span><span class="plain"> *</span><span class="identifier">project</span><span class="plain"> = </span><span class="functiontext">ProjectBundleManager::from_copy</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;associated_copy</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">project</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">project</span><span class="plain"> = </span><span class="functiontext">ProjectFileManager::from_copy</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;associated_copy</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">project</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"no project"</span><span class="plain">);</span>
<span class="identifier">Shell::quote_file</span><span class="plain">(</span><span class="identifier">command</span><span class="plain">, </span><span class="identifier">meth</span><span class="plain">-</span><span class="element">&gt;to_inblorb</span><span class="plain">);</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">blurb</span><span class="plain"> = </span><span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;associated_copy</span><span class="plain">-</span><span class="element">&gt;location_if_path</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Release.blurb"</span><span class="plain">);</span>
<span class="identifier">Shell::quote_file</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="element">&gt;to_inblorb</span><span class="plain">);</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">blurb</span><span class="plain"> = </span><span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;associated_copy</span><span class="plain">-</span><span class="element">&gt;location_if_path</span><span class="plain">,</span>
<span class="identifier">I</span><span class="string">"Release.blurb"</span><span class="plain">);</span>
<span class="identifier">Shell::quote_file</span><span class="plain">(</span><span class="identifier">command</span><span class="plain">, </span><span class="identifier">blurb</span><span class="plain">);</span>
<span class="identifier">Shell::quote_file</span><span class="plain">(</span><span class="identifier">command</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;vertex</span><span class="plain">-</span><span class="element">&gt;buildable_if_internal_file</span><span class="plain">);</span>
<span class="identifier">Shell::quote_file</span><span class="plain">(</span><span class="identifier">command</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;vertex</span><span class="plain">-</span><span class="element">&gt;as_file</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>

View file

@ -189,7 +189,6 @@ So we'll open it and look.
<span class="reserved">inbuild_copy</span><span class="plain"> *</span><span class="functiontext">ExtensionManager::claim_file_as_copy</span><span class="plain">(</span><span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">TextFiles::exists</span><span class="plain">(</span><span class="identifier">F</span><span class="plain">) == </span><span class="identifier">FALSE</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">inbuild_copy</span><span class="plain"> *</span><span class="identifier">C</span><span class="plain"> = </span><span class="functiontext">ExtensionManager::new_copy</span><span class="plain">(</span><span class="identifier">F</span><span class="plain">);</span>
<span class="functiontext">ExtensionManager::build_vertex</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">);</span>
<span class="functiontext">Works::add_to_database</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;edition</span><span class="plain">-</span><span class="element">&gt;work</span><span class="plain">, </span><span class="constant">CLAIMED_WDBC</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">C</span><span class="plain">;</span>
<span class="plain">}</span>
@ -338,11 +337,7 @@ the current VM settings.
<span class="functiontext">Inclusions::traverse</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">, </span><span class="functiontext">ExtensionManager::from_copy</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">)-</span><span class="element">&gt;syntax_tree</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="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">V</span><span class="plain">, </span><span class="reserved">build_vertex</span><span class="plain">, </span><span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;vertex</span><span class="plain">-</span><span class="element">&gt;use_edges</span><span class="plain">)</span>
<span class="functiontext">ExtensionManager::ensure_graphed</span><span class="plain">(</span><span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;buildable_if_copy</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">ExtensionManager::build_vertex</span><span class="plain">(</span><span class="reserved">inbuild_copy</span><span class="plain"> *</span><span class="identifier">C</span><span class="plain">) {</span>
<span class="functiontext">Graphs::copy_vertex</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">);</span>
<span class="functiontext">ExtensionManager::ensure_graphed</span><span class="plain">(</span><span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;as_copy</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
@ -352,8 +347,6 @@ the current VM settings.
<p class="endnote">The function ExtensionManager::ensure_graphed appears nowhere else.</p>
<p class="endnote">The function ExtensionManager::build_vertex is used in <a href="#SP6">&#167;6</a>.</p>
<p class="inwebparagraph"><a id="SP10"></a><b>&#167;10. Source text. </b></p>

View file

@ -171,7 +171,6 @@ a valid metadata file.
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">canary</span><span class="plain"> = </span><span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"kit_metadata.txt"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">TextFiles::exists</span><span class="plain">(</span><span class="identifier">canary</span><span class="plain">)) {</span>
<span class="reserved">inbuild_copy</span><span class="plain"> *</span><span class="identifier">C</span><span class="plain"> = </span><span class="functiontext">KitManager::new_copy</span><span class="plain">(</span><span class="identifier">Pathnames::directory_name</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">), </span><span class="identifier">P</span><span class="plain">);</span>
<span class="functiontext">KitManager::build_vertex</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">);</span>
<span class="functiontext">Works::add_to_database</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;edition</span><span class="plain">-</span><span class="element">&gt;work</span><span class="plain">, </span><span class="constant">CLAIMED_WDBC</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">C</span><span class="plain">;</span>
<span class="plain">}</span>
@ -278,10 +277,6 @@ we need to <code class="display"><span class="extract">rsync</span></code> it.
<span class="plain">*</span><span class="identifier">V</span><span class="plain"> = </span><span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;vertex</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">KitManager::build_vertex</span><span class="plain">(</span><span class="reserved">inbuild_copy</span><span class="plain"> *</span><span class="identifier">C</span><span class="plain">) {</span>
<span class="functiontext">Graphs::copy_vertex</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">KitManager::go_operational</span><span class="plain">(</span><span class="reserved">inbuild_genre</span><span class="plain"> *</span><span class="identifier">G</span><span class="plain">, </span><span class="reserved">inbuild_copy</span><span class="plain"> *</span><span class="identifier">C</span><span class="plain">) {</span>
<span class="functiontext">Kits::construct_graph</span><span class="plain">(</span><span class="functiontext">KitManager::from_copy</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">));</span>
<span class="plain">}</span>
@ -308,8 +303,6 @@ we need to <code class="display"><span class="extract">rsync</span></code> it.
<p class="endnote">The function KitManager::building_soon is used in <a href="#SP1">&#167;1</a>.</p>
<p class="endnote">The function KitManager::build_vertex is used in <a href="#SP4">&#167;4</a>, 5/kts (<a href="5-kts.html#SP1">&#167;1</a>).</p>
<p class="endnote">The function KitManager::go_operational is used in <a href="#SP1">&#167;1</a>.</p>
<p class="endnote">The function KitManager::read_contents is used in 5/kts (<a href="5-kts.html#SP2">&#167;2</a>).</p>

View file

@ -59,7 +59,7 @@
<!--Weave of '4/lm' generated by 7-->
<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#4">Chapter 4: Managing Genres of Work</a></li><li><b>Language Manager</b></li></ul><p class="purpose">A language is a combination of Inter code with an Inform 7 extension.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Genre definition</a></li><li><a href="#SP5">&#167;5. Claiming</a></li><li><a href="#SP6">&#167;6. Searching</a></li><li><a href="#SP7">&#167;7. Copying</a></li><li><a href="#SP8">&#167;8. Build graph</a></li></ul><hr class="tocbar">
<ul class="toc"><li><a href="#SP1">&#167;1. Genre definition</a></li><li><a href="#SP5">&#167;5. Claiming</a></li><li><a href="#SP6">&#167;6. Searching</a></li><li><a href="#SP7">&#167;7. Copying</a></li></ul><hr class="tocbar">
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. Genre definition. </b></p>
@ -184,7 +184,6 @@ a valid metadata file. The name should be in English text, without accents.
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">canary</span><span class="plain"> = </span><span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"about.txt"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">TextFiles::exists</span><span class="plain">(</span><span class="identifier">canary</span><span class="plain">)) {</span>
<span class="reserved">inbuild_copy</span><span class="plain"> *</span><span class="identifier">C</span><span class="plain"> = </span><span class="functiontext">LanguageManager::new_copy</span><span class="plain">(</span><span class="identifier">Pathnames::directory_name</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">), </span><span class="identifier">P</span><span class="plain">);</span>
<span class="functiontext">LanguageManager::build_vertex</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">);</span>
<span class="functiontext">Works::add_to_database</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;edition</span><span class="plain">-</span><span class="element">&gt;work</span><span class="plain">, </span><span class="constant">CLAIMED_WDBC</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">C</span><span class="plain">;</span>
<span class="plain">}</span>
@ -282,21 +281,6 @@ we need to <code class="display"><span class="extract">rsync</span></code> it.
<p class="endnote">The function LanguageManager::copy_to_nest is used in <a href="#SP2">&#167;2</a>.</p>
<p class="inwebparagraph"><a id="SP8"></a><b>&#167;8. Build graph. </b>The build graph for a language bundle is just a single node: you don't need to
build it at all.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">LanguageManager::build_vertex</span><span class="plain">(</span><span class="reserved">inbuild_copy</span><span class="plain"> *</span><span class="identifier">C</span><span class="plain">) {</span>
<span class="functiontext">Graphs::copy_vertex</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function LanguageManager::build_vertex is used in <a href="#SP5">&#167;5</a>.</p>
<hr class="tocbar">
<ul class="toc"><li><a href="4-em.html">Back to 'Extension Manager'</a></li><li><a href="4-pbm.html">Continue with 'Project Bundle Manager'</a></li></ul><hr class="tocbar">
<!--End of weave-->

View file

@ -59,7 +59,7 @@
<!--Weave of '4/pbm' generated by 7-->
<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#4">Chapter 4: Managing Genres of Work</a></li><li><b>Project Bundle Manager</b></li></ul><p class="purpose">A project bundle is a folder holding an Inform 7 work. The app creates these.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Genre definition</a></li><li><a href="#SP3">&#167;3. Claiming</a></li><li><a href="#SP4">&#167;4. Searching</a></li><li><a href="#SP5">&#167;5. Copying</a></li><li><a href="#SP6">&#167;6. Build graph</a></li><li><a href="#SP9">&#167;9. Source text</a></li></ul><hr class="tocbar">
<ul class="toc"><li><a href="#SP1">&#167;1. Genre definition</a></li><li><a href="#SP3">&#167;3. Claiming</a></li><li><a href="#SP4">&#167;4. Searching</a></li><li><a href="#SP5">&#167;5. Copying</a></li><li><a href="#SP6">&#167;6. Build graph</a></li><li><a href="#SP7">&#167;7. Source text</a></li></ul><hr class="tocbar">
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. Genre definition. </b></p>
@ -113,7 +113,7 @@ which stores data about extensions used by the Inform compiler.
<p class="inwebparagraph"></p>
<p class="endnote">The function ProjectBundleManager::from_copy is used in <a href="#SP6">&#167;6</a>, <a href="#SP8">&#167;8</a>, <a href="#SP9">&#167;9</a>, 1/ic (<a href="1-ic.html#SP19">&#167;19</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>), 4/pfm (<a href="4-pfm.html#SP9">&#167;9</a>).</p>
<p class="endnote">The function ProjectBundleManager::from_copy is used in <a href="#SP6">&#167;6</a>, <a href="#SP7">&#167;7</a>, 1/ic (<a href="1-ic.html#SP19">&#167;19</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>), 4/pfm (<a href="4-pfm.html#SP7">&#167;7</a>).</p>
<p class="endnote">The function ProjectBundleManager::new_copy is used in <a href="#SP3">&#167;3</a>.</p>
@ -140,7 +140,6 @@ not a file, false if we know the reverse, and otherwise not applicable.
<span class="reserved">inbuild_copy</span><span class="plain"> *</span><span class="functiontext">ProjectBundleManager::claim_folder_as_copy</span><span class="plain">(</span><span class="identifier">pathname</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">) {</span>
<span class="reserved">inbuild_copy</span><span class="plain"> *</span><span class="identifier">C</span><span class="plain"> = </span><span class="functiontext">ProjectBundleManager::new_copy</span><span class="plain">(</span><span class="identifier">Pathnames::directory_name</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">), </span><span class="identifier">P</span><span class="plain">);</span>
<span class="functiontext">ProjectBundleManager::build_vertex</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">);</span>
<span class="functiontext">Works::add_to_database</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;edition</span><span class="plain">-</span><span class="element">&gt;work</span><span class="plain">, </span><span class="constant">CLAIMED_WDBC</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">C</span><span class="plain">;</span>
<span class="plain">}</span>
@ -192,31 +191,7 @@ projects lived there.
<span class="reserved">inform_project</span><span class="plain"> *</span><span class="identifier">project</span><span class="plain"> = </span><span class="functiontext">ProjectBundleManager::from_copy</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">);</span>
<span class="plain">*</span><span class="identifier">V</span><span class="plain"> = </span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;chosen_build_target</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function ProjectBundleManager::building_soon is used in <a href="#SP1">&#167;1</a>.</p>
<p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. </b>The build graph for a project will need further thought...
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">ProjectBundleManager::build_vertex</span><span class="plain">(</span><span class="reserved">inbuild_copy</span><span class="plain"> *</span><span class="identifier">C</span><span class="plain">) {</span>
<span class="functiontext">Graphs::copy_vertex</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function ProjectBundleManager::build_vertex is used in <a href="#SP3">&#167;3</a>.</p>
<p class="inwebparagraph"><a id="SP8"></a><b>&#167;8. </b>which it will get here:
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">ProjectBundleManager::go_operational</span><span class="plain">(</span><span class="reserved">inbuild_genre</span><span class="plain"> *</span><span class="identifier">G</span><span class="plain">, </span><span class="reserved">inbuild_copy</span><span class="plain"> *</span><span class="identifier">C</span><span class="plain">) {</span>
<span class="functiontext">Projects::construct_graph</span><span class="plain">(</span><span class="functiontext">ProjectBundleManager::from_copy</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">));</span>
<span class="plain">}</span>
@ -224,9 +199,11 @@ projects lived there.
<p class="inwebparagraph"></p>
<p class="endnote">The function ProjectBundleManager::building_soon is used in <a href="#SP1">&#167;1</a>.</p>
<p class="endnote">The function ProjectBundleManager::go_operational is used in <a href="#SP1">&#167;1</a>.</p>
<p class="inwebparagraph"><a id="SP9"></a><b>&#167;9. Source text. </b></p>
<p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. Source text. </b></p>
<pre class="display">

View file

@ -59,7 +59,7 @@
<!--Weave of '4/pfm' generated by 7-->
<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#4">Chapter 4: Managing Genres of Work</a></li><li><b>Project File Manager</b></li></ul><p class="purpose">A project file is a plain text file of Inform 7 source text.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Genre definition</a></li><li><a href="#SP3">&#167;3. Claiming</a></li><li><a href="#SP4">&#167;4. Searching</a></li><li><a href="#SP5">&#167;5. Copying</a></li><li><a href="#SP6">&#167;6. Build graph</a></li><li><a href="#SP9">&#167;9. Source text</a></li></ul><hr class="tocbar">
<ul class="toc"><li><a href="#SP1">&#167;1. Genre definition</a></li><li><a href="#SP3">&#167;3. Claiming</a></li><li><a href="#SP4">&#167;4. Searching</a></li><li><a href="#SP5">&#167;5. Copying</a></li><li><a href="#SP6">&#167;6. Build graph</a></li><li><a href="#SP7">&#167;7. Source text</a></li></ul><hr class="tocbar">
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. Genre definition. </b></p>
@ -113,7 +113,7 @@ which stores data about extensions used by the Inform compiler.
<p class="inwebparagraph"></p>
<p class="endnote">The function ProjectFileManager::from_copy is used in <a href="#SP6">&#167;6</a>, <a href="#SP8">&#167;8</a>, 1/ic (<a href="1-ic.html#SP19">&#167;19</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 function ProjectFileManager::from_copy is used in <a href="#SP6">&#167;6</a>, 1/ic (<a href="1-ic.html#SP19">&#167;19</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 function ProjectFileManager::new_copy is used in <a href="#SP3">&#167;3</a>.</p>
@ -143,7 +143,6 @@ or <code class="display"><span class="extract">.i7</span></code>.
<span class="reserved">inbuild_copy</span><span class="plain"> *</span><span class="functiontext">ProjectFileManager::claim_file_as_copy</span><span class="plain">(</span><span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain">) {</span>
<span class="reserved">inbuild_copy</span><span class="plain"> *</span><span class="identifier">C</span><span class="plain"> = </span><span class="functiontext">ProjectFileManager::new_copy</span><span class="plain">(</span><span class="identifier">Filenames::get_leafname</span><span class="plain">(</span><span class="identifier">F</span><span class="plain">), </span><span class="identifier">F</span><span class="plain">);</span>
<span class="functiontext">ProjectFileManager::build_vertex</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">);</span>
<span class="functiontext">Works::add_to_database</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;edition</span><span class="plain">-</span><span class="element">&gt;work</span><span class="plain">, </span><span class="constant">CLAIMED_WDBC</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">C</span><span class="plain">;</span>
<span class="plain">}</span>
@ -195,31 +194,7 @@ projects lived there.
<span class="reserved">inform_project</span><span class="plain"> *</span><span class="identifier">project</span><span class="plain"> = </span><span class="functiontext">ProjectFileManager::from_copy</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">);</span>
<span class="plain">*</span><span class="identifier">V</span><span class="plain"> = </span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;chosen_build_target</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function ProjectFileManager::building_soon is used in <a href="#SP1">&#167;1</a>.</p>
<p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. </b>The build graph for a project will need further thought...
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">ProjectFileManager::build_vertex</span><span class="plain">(</span><span class="reserved">inbuild_copy</span><span class="plain"> *</span><span class="identifier">C</span><span class="plain">) {</span>
<span class="functiontext">Graphs::copy_vertex</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function ProjectFileManager::build_vertex is used in <a href="#SP3">&#167;3</a>.</p>
<p class="inwebparagraph"><a id="SP8"></a><b>&#167;8. </b>which it will get here:
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">ProjectFileManager::go_operational</span><span class="plain">(</span><span class="reserved">inbuild_genre</span><span class="plain"> *</span><span class="identifier">G</span><span class="plain">, </span><span class="reserved">inbuild_copy</span><span class="plain"> *</span><span class="identifier">C</span><span class="plain">) {</span>
<span class="functiontext">Projects::construct_graph</span><span class="plain">(</span><span class="functiontext">ProjectFileManager::from_copy</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">));</span>
<span class="plain">}</span>
@ -227,9 +202,11 @@ projects lived there.
<p class="inwebparagraph"></p>
<p class="endnote">The function ProjectFileManager::building_soon is used in <a href="#SP1">&#167;1</a>.</p>
<p class="endnote">The function ProjectFileManager::go_operational is used in <a href="#SP1">&#167;1</a>.</p>
<p class="inwebparagraph"><a id="SP9"></a><b>&#167;9. Source text. </b></p>
<p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. Source text. </b></p>
<pre class="display">

View file

@ -59,7 +59,7 @@
<!--Weave of '4/pm' generated by 7-->
<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#4">Chapter 4: Managing Genres of Work</a></li><li><b>Pipeline Manager</b></li></ul><p class="purpose">An Inform 7 pipeline.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Genre definition</a></li><li><a href="#SP5">&#167;5. Claiming</a></li><li><a href="#SP6">&#167;6. Searching</a></li><li><a href="#SP7">&#167;7. Copying</a></li><li><a href="#SP8">&#167;8. Build graph</a></li></ul><hr class="tocbar">
<ul class="toc"><li><a href="#SP1">&#167;1. Genre definition</a></li><li><a href="#SP5">&#167;5. Claiming</a></li><li><a href="#SP6">&#167;6. Searching</a></li><li><a href="#SP7">&#167;7. Copying</a></li></ul><hr class="tocbar">
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. Genre definition. </b></p>
@ -143,7 +143,7 @@ supplied at the command line; <code class="display"><span class="extract">ext</s
not a file, false if we know the reverse, and otherwise not applicable.
</p>
<p class="inwebparagraph">An pipeline, for us, simply needs to be a file with extension <code class="display"><span class="extract">interpipeline</span></code>.
<p class="inwebparagraph">An pipeline, for us, simply needs to be a file with extension <code class="display"><span class="extract">.interpipeline</span></code>.
</p>
@ -166,7 +166,6 @@ not a file, false if we know the reverse, and otherwise not applicable.
<span class="functiontext">Editions::new</span><span class="plain">(</span><span class="functiontext">Works::new_raw</span><span class="plain">(</span><span class="identifier">pipeline_genre</span><span class="plain">, </span><span class="identifier">unext</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">), </span><span class="identifier">V</span><span class="plain">), </span><span class="identifier">F</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">unext</span><span class="plain">);</span>
<span class="functiontext">Works::add_to_database</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;edition</span><span class="plain">-</span><span class="element">&gt;work</span><span class="plain">, </span><span class="constant">CLAIMED_WDBC</span><span class="plain">);</span>
<span class="functiontext">PipelineManager::build_vertex</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">C</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
@ -258,21 +257,6 @@ since a pipeline is a single file; to sync, we just overwrite.
<p class="endnote">The function PipelineManager::copy_to_nest is used in <a href="#SP2">&#167;2</a>.</p>
<p class="inwebparagraph"><a id="SP8"></a><b>&#167;8. Build graph. </b>The build graph for a pipeline is just a single node: you don't need to
build a pipeline at all.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">PipelineManager::build_vertex</span><span class="plain">(</span><span class="reserved">inbuild_copy</span><span class="plain"> *</span><span class="identifier">C</span><span class="plain">) {</span>
<span class="functiontext">Graphs::copy_vertex</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function PipelineManager::build_vertex is used in <a href="#SP5">&#167;5</a>.</p>
<hr class="tocbar">
<ul class="toc"><li><a href="4-tm.html">Back to 'Template Manager'</a></li><li><i>(This section ends Chapter 4: Managing Genres of Work.)</i></li></ul><hr class="tocbar">
<!--End of weave-->

View file

@ -59,7 +59,7 @@
<!--Weave of '4/tm' generated by 7-->
<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#4">Chapter 4: Managing Genres of Work</a></li><li><b>Template Manager</b></li></ul><p class="purpose">A template is the outline for a website presenting an Inform work.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Genre definition</a></li><li><a href="#SP4">&#167;4. Claiming</a></li><li><a href="#SP5">&#167;5. Searching</a></li><li><a href="#SP6">&#167;6. Copying</a></li><li><a href="#SP7">&#167;7. Build graph</a></li></ul><hr class="tocbar">
<ul class="toc"><li><a href="#SP1">&#167;1. Genre definition</a></li><li><a href="#SP4">&#167;4. Claiming</a></li><li><a href="#SP5">&#167;5. Searching</a></li><li><a href="#SP6">&#167;6. Copying</a></li></ul><hr class="tocbar">
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. Genre definition. </b></p>
@ -154,7 +154,6 @@ either a manifest file, or else an <code class="display"><span class="extract">i
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">canary2</span><span class="plain"> = </span><span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"index.html"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">TextFiles::exists</span><span class="plain">(</span><span class="identifier">canary1</span><span class="plain">)) || (</span><span class="identifier">TextFiles::exists</span><span class="plain">(</span><span class="identifier">canary2</span><span class="plain">))) {</span>
<span class="reserved">inbuild_copy</span><span class="plain"> *</span><span class="identifier">C</span><span class="plain"> = </span><span class="functiontext">TemplateManager::new_copy</span><span class="plain">(</span><span class="identifier">Pathnames::directory_name</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">), </span><span class="identifier">P</span><span class="plain">);</span>
<span class="functiontext">TemplateManager::build_vertex</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">);</span>
<span class="functiontext">Works::add_to_database</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;edition</span><span class="plain">-</span><span class="element">&gt;work</span><span class="plain">, </span><span class="constant">CLAIMED_WDBC</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">C</span><span class="plain">;</span>
<span class="plain">}</span>
@ -254,21 +253,6 @@ a folder, we need to <code class="display"><span class="extract">rsync</span></c
<p class="endnote">The function TemplateManager::copy_to_nest is used in <a href="#SP1">&#167;1</a>.</p>
<p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. Build graph. </b>The build graph for a template is just a single node: you don't need to
build a template at all.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">TemplateManager::build_vertex</span><span class="plain">(</span><span class="reserved">inbuild_copy</span><span class="plain"> *</span><span class="identifier">C</span><span class="plain">) {</span>
<span class="functiontext">Graphs::copy_vertex</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function TemplateManager::build_vertex is used in <a href="#SP4">&#167;4</a>.</p>
<hr class="tocbar">
<ul class="toc"><li><a href="4-pfm.html">Back to 'Project File Manager'</a></li><li><a href="4-pm.html">Continue with 'Pipeline Manager'</a></li></ul><hr class="tocbar">
<!--End of weave-->

View file

@ -133,7 +133,7 @@
<p class="endnote">The function Extensions::scan is used in 4/em (<a href="4-em.html#SP5">&#167;5</a>).</p>
<p class="endnote">The structure inform_extension is accessed in 1/ic, 3/is2, 3/is3, 4/em, 4/lm, 4/pbm, 4/pfm, 4/tm, 4/pm, 5/kts, 5/ed, 5/ed2, 5/ts, 5/ps, 5/ls, 5/ps2, 6/hdn, 6/inc and here.</p>
<p class="endnote">The structure inform_extension is accessed in 1/ic, 3/bg, 3/ib, 3/is2, 3/is3, 4/em, 4/lm, 4/pbm, 4/pfm, 4/tm, 4/pm, 5/kts, 5/ed, 5/ed2, 5/ts, 5/ps, 5/ls, 5/ps2, 6/hdn, 6/inc and here.</p>
<p class="inwebparagraph"><a id="SP1_1"></a><b>&#167;1.1. </b>The following scans a potential extension file. If it seems malformed, a
suitable error is written to the stream <code class="display"><span class="extract">error_text</span></code>. If not, this is left

View file

@ -178,7 +178,6 @@
<span class="reserved">inbuild_search_result</span><span class="plain"> *</span><span class="identifier">R</span><span class="plain"> = </span><span class="functiontext">Nests::search_for_best</span><span class="plain">(</span><span class="identifier">req</span><span class="plain">, </span><span class="identifier">nest_list</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">R</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">Errors::fatal_with_text</span><span class="plain">(</span><span class="string">"cannot find kit"</span><span class="plain">, </span><span class="identifier">name</span><span class="plain">);</span>
<span class="reserved">inbuild_copy</span><span class="plain"> *</span><span class="identifier">C</span><span class="plain"> = </span><span class="identifier">R</span><span class="plain">-</span><span class="element">&gt;copy</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;vertex</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="functiontext">KitManager::build_vertex</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext">KitManager::from_copy</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">);</span>
<span class="plain">}</span>
@ -276,9 +275,9 @@
<p class="endnote">The function Kits::early_source_text is used in 5/ps (<a href="5-ps.html#SP3">&#167;3</a>).</p>
<p class="endnote">The function Kits::inter_paths is used in 3/is (<a href="3-is.html#SP1">&#167;1</a>).</p>
<p class="endnote">The function Kits::inter_paths is used in 3/is (<a href="3-is.html#SP4">&#167;4</a>).</p>
<p class="endnote">The structure inform_kit is accessed in 1/ic, 3/is2, 3/is3, 4/lm, 4/pbm, 4/pfm, 4/tm, 4/pm, 5/es, 5/ed, 5/ed2, 5/ts, 5/ps, 5/ls, 5/ps2, 6/hdn, 6/inc and here.</p>
<p class="endnote">The structure inform_kit is accessed in 1/ic, 3/bg, 3/ib, 3/is2, 3/is3, 4/em, 4/lm, 4/pbm, 4/pfm, 4/tm, 4/pm, 5/es, 5/ed, 5/ed2, 5/ts, 5/ps, 5/ls, 5/ps2, 6/hdn, 6/inc and here.</p>
<p class="endnote">The structure inform_kit_ittt is private to this section.</p>

View file

@ -112,7 +112,7 @@ of the following structure.
<p class="endnote">The function Languages::path_to_bundle appears nowhere else.</p>
<p class="endnote">The structure inform_language is accessed in 1/ic, 2/edt, 2/rqr, 2/nst, 3/is2, 3/is3, 4/lm, 4/pbm, 4/pfm, 4/tm, 4/pm, 5/kts, 5/es, 5/ed, 5/ed2, 5/ec, 5/ts, 5/ps, 5/ps2, 6/hdn, 6/inc, 6/vmg and here.</p>
<p class="endnote">The structure inform_language is accessed in 1/ic, 2/edt, 2/rqr, 2/nst, 3/bg, 3/ib, 3/is2, 3/is3, 4/em, 4/lm, 4/pbm, 4/pfm, 4/tm, 4/pm, 5/kts, 5/es, 5/ed, 5/ed2, 5/ec, 5/ts, 5/ps, 5/ps2, 6/hdn, 6/inc, 6/vmg and here.</p>
<p class="inwebparagraph"><a id="SP1_1"></a><b>&#167;1.1. </b>Within the bundle folder is a file called <code class="display"><span class="extract">about.txt</span></code>, which sets numbered
fields to excerpts of text. The following are the field numbers:

View file

@ -159,13 +159,13 @@
<span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">leafname</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">leafname</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">) {</span>
<span class="reserved">build_vertex</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain"> = </span><span class="functiontext">Graphs::file_vertex</span><span class="plain">(</span><span class="identifier">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">, </span><span class="identifier">leafname</span><span class="plain">));</span>
<span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;annotation</span><span class="plain"> = </span><span class="identifier">leafname</span><span class="plain">;</span>
<span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;source_source</span><span class="plain"> = </span><span class="identifier">leafname</span><span class="plain">;</span>
<span class="identifier">ADD_TO_LINKED_LIST</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">, </span><span class="reserved">build_vertex</span><span class="plain">, </span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;source_vertices</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">LinkedLists::len</span><span class="plain">(</span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;source_vertices</span><span class="plain">) == 0) &amp;&amp; (</span><span class="identifier">F</span><span class="plain">)) {</span>
<span class="reserved">build_vertex</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain"> = </span><span class="functiontext">Graphs::file_vertex</span><span class="plain">(</span><span class="identifier">F</span><span class="plain">);</span>
<span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;annotation</span><span class="plain"> = </span><span class="identifier">I</span><span class="string">"your source text"</span><span class="plain">;</span>
<span class="identifier">S</span><span class="plain">-</span><span class="element">&gt;source_source</span><span class="plain"> = </span><span class="identifier">I</span><span class="string">"your source text"</span><span class="plain">;</span>
<span class="identifier">ADD_TO_LINKED_LIST</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">, </span><span class="reserved">build_vertex</span><span class="plain">, </span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;source_vertices</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
@ -275,7 +275,7 @@
<p class="endnote">The structure kit_dependency is accessed in 3/is2 and here.</p>
<p class="endnote">The structure inform_project is accessed in 1/ic, 2/edt, 2/rqr, 2/nst, 3/is2, 3/is3, 4/em, 4/lm, 4/pbm, 4/pfm, 4/tm, 4/pm, 5/kts, 5/es, 5/ed, 5/ed2, 5/ec, 5/ts, 5/ls, 5/ps2, 6/hdn, 6/inc, 6/vmg and here.</p>
<p class="endnote">The structure inform_project is accessed in 1/ic, 2/edt, 2/rqr, 2/nst, 3/bg, 3/ib, 3/is2, 3/is3, 4/em, 4/lm, 4/pbm, 4/pfm, 4/tm, 4/pm, 5/kts, 5/es, 5/ed, 5/ed2, 5/ec, 5/ts, 5/ls, 5/ps2, 6/hdn, 6/inc, 6/vmg and here.</p>
<p class="inwebparagraph"><a id="SP1_1"></a><b>&#167;1.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Perform if-this-then-that</span> <span class="cwebmacronumber">1.1</span>&gt; =
@ -470,7 +470,7 @@ may be multiple sentences, which we need to count up.
<p class="endnote">The function Projects::early_source_text is used in <a href="#SP4">&#167;4</a>.</p>
<p class="endnote">The function Projects::list_of_inter_libraries is used in 3/is (<a href="3-is.html#SP1">&#167;1</a>).</p>
<p class="endnote">The function Projects::list_of_inter_libraries is used in 3/is (<a href="3-is.html#SP4">&#167;4</a>).</p>
<p class="endnote">The function Projects::build_pathname appears nowhere else.</p>
@ -480,7 +480,7 @@ may be multiple sentences, which we need to count up.
<p class="endnote">The function Projects::graph_dependent_language appears nowhere else.</p>
<p class="endnote">The function Projects::construct_graph is used in 4/pbm (<a href="4-pbm.html#SP8">&#167;8</a>), 4/pfm (<a href="4-pfm.html#SP8">&#167;8</a>).</p>
<p class="endnote">The function Projects::construct_graph is used in 4/pbm (<a href="4-pbm.html#SP6">&#167;6</a>), 4/pfm (<a href="4-pfm.html#SP6">&#167;6</a>).</p>
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. </b></p>
@ -521,9 +521,9 @@ may be multiple sentences, which we need to count up.
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">L</span><span class="plain">) {</span>
<span class="reserved">build_vertex</span><span class="plain"> *</span><span class="identifier">N</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">N</span><span class="plain">, </span><span class="reserved">build_vertex</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">) {</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain"> = </span><span class="identifier">N</span><span class="plain">-</span><span class="element">&gt;buildable_if_internal_file</span><span class="plain">;</span>
<span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain"> = </span><span class="identifier">N</span><span class="plain">-</span><span class="element">&gt;as_file</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">bwc</span><span class="plain"> == -1) </span><span class="identifier">bwc</span><span class="plain"> = </span><span class="identifier">lexer_wordcount</span><span class="plain">;</span>
<span class="identifier">N</span><span class="plain">-</span><span class="element">&gt;read_as</span><span class="plain"> = </span><span class="functiontext">SourceText::read_file</span><span class="plain">(</span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;as_copy</span><span class="plain">, </span><span class="identifier">F</span><span class="plain">, </span><span class="identifier">N</span><span class="plain">-</span><span class="element">&gt;annotation</span><span class="plain">,</span>
<span class="identifier">N</span><span class="plain">-</span><span class="element">&gt;as_source_file</span><span class="plain"> = </span><span class="functiontext">SourceText::read_file</span><span class="plain">(</span><span class="identifier">project</span><span class="plain">-</span><span class="element">&gt;as_copy</span><span class="plain">, </span><span class="identifier">F</span><span class="plain">, </span><span class="identifier">N</span><span class="plain">-</span><span class="element">&gt;source_source</span><span class="plain">,</span>
<span class="identifier">FALSE</span><span class="plain">, </span><span class="identifier">TRUE</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
@ -556,7 +556,7 @@ may be multiple sentences, which we need to count up.
<p class="inwebparagraph"></p>
<p class="endnote">The function Projects::read_source_text_for is used in 4/pbm (<a href="4-pbm.html#SP9">&#167;9</a>), 4/pfm (<a href="4-pfm.html#SP9">&#167;9</a>).</p>
<p class="endnote">The function Projects::read_source_text_for is used in 4/pbm (<a href="4-pbm.html#SP7">&#167;7</a>), 4/pfm (<a href="4-pfm.html#SP7">&#167;7</a>).</p>
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. </b>It might seem sensible to parse the opening sentence of the source text,
the bibliographic sentence giving title and author, by looking at the result
@ -715,7 +715,7 @@ stop &mdash; it's needed before sentence-breaking has even taken place.
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">L</span><span class="plain">) {</span>
<span class="reserved">build_vertex</span><span class="plain"> *</span><span class="identifier">N</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">N</span><span class="plain">, </span><span class="reserved">build_vertex</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">sf</span><span class="plain"> == </span><span class="identifier">N</span><span class="plain">-</span><span class="element">&gt;read_as</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">sf</span><span class="plain"> == </span><span class="identifier">N</span><span class="plain">-</span><span class="element">&gt;as_source_file</span><span class="plain">)</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">FALSE</span><span class="plain">;</span>

View file

@ -81,7 +81,7 @@
<p class="endnote">The function Pipelines::new_ip is used in 4/pm (<a href="4-pm.html#SP4">&#167;4</a>).</p>
<p class="endnote">The structure inform_pipeline is accessed in 1/ic, 2/edt, 2/rqr, 2/nst, 3/is2, 3/is3, 4/lm, 4/pbm, 4/pfm, 4/tm, 4/pm, 5/kts, 5/es, 5/ed, 5/ed2, 5/ec, 5/ts, 5/ps, 5/ls, 6/hdn, 6/inc, 6/vmg and here.</p>
<p class="endnote">The structure inform_pipeline is accessed in 1/ic, 2/edt, 2/rqr, 2/nst, 3/bg, 3/ib, 3/is2, 3/is3, 4/em, 4/lm, 4/pbm, 4/pfm, 4/tm, 4/pm, 5/kts, 5/es, 5/ed, 5/ed2, 5/ec, 5/ts, 5/ps, 5/ls, 6/hdn, 6/inc, 6/vmg and here.</p>
<hr class="tocbar">
<ul class="toc"><li><a href="5-ls.html">Back to 'Language Services'</a></li><li><i>(This section ends Chapter 5: Services for the Inform Compiler.)</i></li></ul><hr class="tocbar">

View file

@ -81,7 +81,7 @@
<p class="endnote">The function Templates::new_it is used in 4/tm (<a href="4-tm.html#SP3">&#167;3</a>).</p>
<p class="endnote">The structure inform_template is accessed in 1/ic, 2/edt, 2/rqr, 2/nst, 3/is2, 3/is3, 4/lm, 4/pbm, 4/pfm, 4/tm, 4/pm, 5/kts, 5/es, 5/ed, 5/ed2, 5/ec, 5/ps, 5/ls, 5/ps2, 6/hdn, 6/inc, 6/vmg and here.</p>
<p class="endnote">The structure inform_template is accessed in 1/ic, 2/edt, 2/rqr, 2/nst, 3/bg, 3/ib, 3/is2, 3/is3, 4/em, 4/lm, 4/pbm, 4/pfm, 4/tm, 4/pm, 5/kts, 5/es, 5/ed, 5/ed2, 5/ec, 5/ps, 5/ls, 5/ps2, 6/hdn, 6/inc, 6/vmg and here.</p>
<hr class="tocbar">
<ul class="toc"><li><a href="5-ec.html">Back to 'Extension Census'</a></li><li><a href="5-ps.html">Continue with 'Project Services'</a></li></ul><hr class="tocbar">

View file

@ -146,7 +146,7 @@ guaranteed to be no INCLUDE nodes remaining in the parse tree.
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">last_H0</span><span class="plain">) &amp;&amp; (</span><span class="identifier">ParseTree::int_annotation</span><span class="plain">(</span><span class="identifier">last_H0</span><span class="plain">, </span><span class="identifier">implied_heading_ANNOT</span><span class="plain">) != </span><span class="identifier">TRUE</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="functiontext">Inclusions::spawned_from_vertex</span><span class="plain">(</span><span class="identifier">last_H0</span><span class="plain">);</span>
<span class="reserved">build_vertex</span><span class="plain"> *</span><span class="identifier">EV</span><span class="plain"> = </span><span class="identifier">E</span><span class="plain">-</span><span class="element">&gt;as_copy</span><span class="plain">-</span><span class="element">&gt;vertex</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;buildable_if_copy</span><span class="plain">-</span><span class="element">&gt;edition</span><span class="plain">-</span><span class="element">&gt;work</span><span class="plain">-</span><span class="element">&gt;genre</span><span class="plain"> == </span><span class="identifier">extension_genre</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">V</span><span class="plain">-</span><span class="element">&gt;as_copy</span><span class="plain">-</span><span class="element">&gt;edition</span><span class="plain">-</span><span class="element">&gt;work</span><span class="plain">-</span><span class="element">&gt;genre</span><span class="plain"> == </span><span class="identifier">extension_genre</span><span class="plain">)</span>
<span class="functiontext">Graphs::need_this_to_use</span><span class="plain">(</span><span class="identifier">V</span><span class="plain">, </span><span class="identifier">EV</span><span class="plain">);</span>
<span class="reserved">else</span>
<span class="functiontext">Graphs::need_this_to_build</span><span class="plain">(</span><span class="identifier">V</span><span class="plain">, </span><span class="identifier">EV</span><span class="plain">);</span>

View file

@ -124,7 +124,7 @@
</li>
<li>
<p><a href="3-bs.html"><spon class="sectiontitle">Build Scripts</span></a> -
<span class="purpose">Scripts are nothing more than list of build steps.</span></p>
<span class="purpose">Scripts are nothing more than lists of build steps.</span></p>
</li>
<li>
<p><a href="3-bs2.html"><spon class="sectiontitle">Build Steps</span></a> -
@ -132,19 +132,19 @@
</li>
<li>
<p><a href="3-is.html"><spon class="sectiontitle">Inter Skill</span></a> -
<span class="purpose">A build step is a task such as running inform7 or inblorb on some file.</span></p>
<span class="purpose">The skills of kit assimilation and of code generation from Inter.</span></p>
</li>
<li>
<p><a href="3-is2.html"><spon class="sectiontitle">Inform7 Skill</span></a> -
<span class="purpose">A build step is a task such as running inform7 or inblorb on some file.</span></p>
<span class="purpose">The skill of turning source text into Inter code.</span></p>
</li>
<li>
<p><a href="3-is3.html"><spon class="sectiontitle">Inform6 Skill</span></a> -
<span class="purpose">A build step is a task such as running inform7 or inblorb on some file.</span></p>
<span class="purpose">The skill of compiling Inform 6 into a story file for the target VM.</span></p>
</li>
<li>
<p><a href="3-is4.html"><spon class="sectiontitle">Inblorb Skill</span></a> -
<span class="purpose">A build step is a task such as running inform7 or inblorb on some file.</span></p>
<span class="purpose">The skill of packaging a story file and associated resources into a blorb.</span></p>
</li>
</ul>
</li>

View file

@ -37,7 +37,7 @@ inbuild_copy *Copies::new_p(inbuild_edition *edition) {
copy->location_if_path = NULL;
copy->location_if_file = NULL;
copy->content = NULL_GENERAL_POINTER;
copy->vertex = NULL;
copy->vertex = Graphs::copy_vertex(copy);
copy->source_text_read = FALSE;
copy->source_text = EMPTY_WORDING;
copy->found_by = NULL;

View file

@ -32,18 +32,20 @@ typedef struct build_vertex {
struct linked_list *build_edges; /* of |build_vertex| */
struct linked_list *use_edges; /* of |build_vertex| */
struct inbuild_copy *buildable_if_copy;
struct filename *buildable_if_internal_file;
struct inbuild_requirement *findable;
struct inbuild_copy *as_copy; /* for |COPY_VERTEX| only */
struct filename *as_file; /* for |FILE_VERTEX| only */
struct inbuild_requirement *as_requirement; /* for |REQUIREMENT_VERTEX| only */
struct text_stream *annotation;
struct source_file *read_as;
int last_described_in_generation;
struct text_stream *source_source; /* for |FILE_VERTEX| of a file of I7 source text */
struct source_file *as_source_file; /* for |FILE_VERTEX| of a file of I7 source text */
int last_described_in_generation; /* used when recursively printing a graph */
int build_result; /* whether the most recent build of this succeeded... */
int last_built_in_generation; /* ...in this build generation */
int always_build_this; /* i.e., don't look at timestamps hoping to skip it */
struct build_script *script; /* how to build what this node represents */
int build_result;
int last_built_in_generation;
int always_build_this;
struct build_script *script;
MEMORY_MANAGEMENT
} build_vertex;
@ -54,38 +56,46 @@ First, the three colours of vertex.
build_vertex *Graphs::file_vertex(filename *F) {
build_vertex *V = CREATE(build_vertex);
V->type = FILE_VERTEX;
V->buildable_if_copy = NULL;
V->buildable_if_internal_file = F;
V->build_edges = NEW_LINKED_LIST(build_vertex);
V->use_edges = NEW_LINKED_LIST(build_vertex);
V->script = BuildScripts::new();
V->annotation = NULL;
V->read_as = NULL;
V->last_described_in_generation = 0;
V->build_result = NOT_APPLICABLE;
V->last_built_in_generation = -1;
V->always_build_this = FALSE;
return V;
}
build_vertex *Graphs::copy_vertex(inbuild_copy *C) {
if (C == NULL) internal_error("no copy");
if (C->vertex == NULL) {
C->vertex = Graphs::file_vertex(NULL);
C->vertex->type = COPY_VERTEX;
C->vertex->buildable_if_copy = C;
}
return C->vertex;
V->as_copy = NULL;
V->as_file = F;
V->as_requirement = NULL;
V->source_source = NULL;
V->as_source_file = NULL;
V->last_described_in_generation = -1;
V->build_result = NOT_APPLICABLE; /* has never been built */
V->last_built_in_generation = -1; /* never seen in any generation */
V->always_build_this = FALSE;
V->script = BuildScripts::new();
return V;
}
build_vertex *Graphs::req_vertex(inbuild_requirement *R) {
if (R == NULL) internal_error("no requirement");
build_vertex *V = Graphs::file_vertex(NULL);
V->type = REQUIREMENT_VERTEX;
V->findable = R;
V->as_requirement = R;
return V;
}
@ Note that each copy is assigned exactly one copy vertex, when it is created.
This function should never otherwise be called.
=
build_vertex *Graphs::copy_vertex(inbuild_copy *C) {
if (C == NULL) internal_error("no copy");
if (C->vertex) internal_error("already set");
C->vertex = Graphs::file_vertex(NULL);
C->vertex->type = COPY_VERTEX;
C->vertex->as_copy = C;
return C->vertex;
}
@ Next, the two colours of edge. Note that between A and B there can be
at most one edge of each colour.
@ -137,9 +147,9 @@ void Graphs::describe_r(OUTPUT_STREAM, int depth, build_vertex *V,
WRITE(" ");
TEMPORARY_TEXT(T);
switch (V->type) {
case COPY_VERTEX: Copies::write_copy(T, V->buildable_if_copy); break;
case REQUIREMENT_VERTEX: Requirements::write(T, V->findable); break;
case FILE_VERTEX: WRITE("%f", V->buildable_if_internal_file); break;
case COPY_VERTEX: Copies::write_copy(T, V->as_copy); break;
case REQUIREMENT_VERTEX: Requirements::write(T, V->as_requirement); break;
case FILE_VERTEX: WRITE("%f", V->as_file); break;
}
TEMPORARY_TEXT(S);
WRITE_TO(S, "%p", stem);
@ -154,9 +164,9 @@ void Graphs::describe_r(OUTPUT_STREAM, int depth, build_vertex *V,
V->last_described_in_generation = description_round;
WRITE("\n");
if (recurse) {
if (V->buildable_if_copy) stem = V->buildable_if_copy->location_if_path;
if (V->buildable_if_internal_file)
stem = Filenames::get_path_to(V->buildable_if_internal_file);
if (V->as_copy) stem = V->as_copy->location_if_path;
if (V->as_file)
stem = Filenames::get_path_to(V->as_file);
build_vertex *W;
LOOP_OVER_LINKED_LIST(W, build_vertex, V->build_edges)
Graphs::describe_r(OUT, depth+1, W, TRUE, stem, TRUE, description_round);
@ -185,18 +195,18 @@ void Graphs::show_needs_r(OUTPUT_STREAM, build_vertex *V,
int depth, int true_depth, int uses_only) {
if (V->type == COPY_VERTEX) {
for (int i=0; i<depth; i++) WRITE(" ");
inbuild_copy *C = V->buildable_if_copy;
inbuild_copy *C = V->as_copy;
WRITE("%S: ", C->edition->work->genre->genre_name);
Copies::write_copy(OUT, C); WRITE("\n");
depth++;
}
if (V->type == REQUIREMENT_VERTEX) {
for (int i=0; i<depth; i++) WRITE(" ");
WRITE("missing %S: ", V->findable->work->genre->genre_name);
Works::write(OUT, V->findable->work);
if (VersionNumberRanges::is_any_range(V->findable->version_range) == FALSE) {
WRITE("missing %S: ", V->as_requirement->work->genre->genre_name);
Works::write(OUT, V->as_requirement->work);
if (VersionNumberRanges::is_any_range(V->as_requirement->version_range) == FALSE) {
WRITE(", need version in range ");
VersionNumberRanges::write_range(OUT, V->findable->version_range);
VersionNumberRanges::write_range(OUT, V->as_requirement->version_range);
} else {
WRITE(", any version will do");
}
@ -224,11 +234,11 @@ int Graphs::show_missing_r(OUTPUT_STREAM, build_vertex *V,
int true_depth, int uses_only) {
int N = 0;
if (V->type == REQUIREMENT_VERTEX) {
WRITE("missing %S: ", V->findable->work->genre->genre_name);
Works::write(OUT, V->findable->work);
if (VersionNumberRanges::is_any_range(V->findable->version_range) == FALSE) {
WRITE("missing %S: ", V->as_requirement->work->genre->genre_name);
Works::write(OUT, V->as_requirement->work);
if (VersionNumberRanges::is_any_range(V->as_requirement->version_range) == FALSE) {
WRITE(", need version in range ");
VersionNumberRanges::write_range(OUT, V->findable->version_range);
VersionNumberRanges::write_range(OUT, V->as_requirement->version_range);
} else {
WRITE(", any version will do");
}
@ -262,7 +272,7 @@ void Graphs::archive(OUTPUT_STREAM, build_vertex *V, inbuild_nest *N,
void Graphs::archive_r(OUTPUT_STREAM, build_vertex *V, int true_depth, inbuild_nest *N,
build_methodology *BM) {
if (V->type == COPY_VERTEX) {
inbuild_copy *C = V->buildable_if_copy;
inbuild_copy *C = V->as_copy;
if ((Genres::stored_in_nests(C->edition->work->genre)) &&
((Str::ne(C->edition->work->title, I"English")) ||
(Str::len(C->edition->work->author_name) > 0)))

View file

@ -3,7 +3,12 @@
Whether to run tasks internally in some merged tool, or run via the shell, or
simply trace to the standard output what we think ought to be done.
@
@ This is rather grandly named for what it is: it's just a bundle of settings
about how to carry out build steps. Should we (a) make a dry run, just printing
hypothetical shell commands, or (b) issue those shell commands via |system|,
or (c) take direct action by calling functions within the current executable?
If (a) or (b) then we will need to know the locations of the executable files
for the tools |inter|, |inform6|, |inform7| and |inblorb|.
@e DRY_RUN_METHODOLOGY from 1
@e SHELL_METHODOLOGY
@ -19,29 +24,36 @@ typedef struct build_methodology {
MEMORY_MANAGEMENT
} build_methodology;
build_methodology *BuildMethodology::new(pathname *tools_path, int dev, int meth) {
@ If the |tangled| flag is set, we expect |inform7|, for example, to be at
|tools_path/inform7/Tangled/inform7|; if it is clear, we expect it only to
be |tools_path/inform7|. This is relevant only for the command-line Inbuild,
which used tangled mode by default, but untangled mode if the user has
specified an explicit path at the command line.
=
build_methodology *BuildMethodology::new(pathname *tools_path, int tangled, int meth) {
build_methodology *BM = CREATE(build_methodology);
BM->methodology = meth;
pathname *inter_path = tools_path;
if (dev) {
if (tangled) {
inter_path = Pathnames::subfolder(inter_path, I"inter");
inter_path = Pathnames::subfolder(inter_path, I"Tangled");
}
BM->to_inter = Filenames::in_folder(inter_path, I"inter");
pathname *inform6_path = tools_path;
if (dev) {
if (tangled) {
inform6_path = Pathnames::subfolder(inform6_path, I"inform6");
inform6_path = Pathnames::subfolder(inform6_path, I"Tangled");
}
BM->to_inform6 = Filenames::in_folder(inform6_path, I"inform6");
pathname *inform7_path = tools_path;
if (dev) {
if (tangled) {
inform7_path = Pathnames::subfolder(inform7_path, I"inform7");
inform7_path = Pathnames::subfolder(inform7_path, I"Tangled");
}
BM->to_inform7 = Filenames::in_folder(inform7_path, I"inform7");
pathname *inblorb_path = tools_path;
if (dev) {
if (tangled) {
inblorb_path = Pathnames::subfolder(inblorb_path, I"inblorb");
inblorb_path = Pathnames::subfolder(inblorb_path, I"Tangled");
}
@ -49,6 +61,11 @@ build_methodology *BuildMethodology::new(pathname *tools_path, int dev, int meth
return BM;
}
@ The |inform7| tool only ever uses the internal methodology, for which
these filenames are irrelevant, since no shell commands are ever issued.
It gets its BM by calling the following:
=
build_methodology *BuildMethodology::stay_in_current_process(void) {
return BuildMethodology::new(NULL, FALSE, INTERNAL_METHODOLOGY);
}

View file

@ -1,9 +1,11 @@
[BuildScripts::] Build Scripts.
Scripts are nothing more than list of build steps.
Scripts are nothing more than lists of build steps.
@h Build scripts.
Simple lists of steps: nothing to see here...
Suppose the incremental build algorithm has decided it wants to build node
|V| in the graph: it does so by calling |BuildScripts::execute| on the script
attached to |V|. This is only a list of steps:
=
typedef struct build_script {
@ -17,26 +19,25 @@ build_script *BuildScripts::new(void) {
return BS;
}
void BuildScripts::add_step(build_script *BS, build_step *S) {
ADD_TO_LINKED_LIST(S, build_step, BS->steps);
}
int BuildScripts::script_length(build_script *BS) {
if (BS == NULL) return 0;
return LinkedLists::len(BS->steps);
}
void BuildScripts::add_step(build_script *BS, build_step *S) {
ADD_TO_LINKED_LIST(S, build_step, BS->steps);
}
@ We execute the steps in sequence, of course. As soon as any step fails,
returning |FALSE|, the script halts and returns |FALSE|. An empty script
always succeeds and returns |TRUE|.
void BuildScripts::concatenate(build_script *BT, build_script *BF) {
build_step *S;
LOOP_OVER_LINKED_LIST(S, build_step, BF->steps)
BuildScripts::add_step(BT, S);
}
int BuildScripts::execute(build_vertex *V, build_script *BS, build_methodology *meth) {
=
int BuildScripts::execute(build_vertex *V, build_script *BS, build_methodology *BM) {
int rv = TRUE;
build_step *S;
LOOP_OVER_LINKED_LIST(S, build_step, BS->steps)
if (rv)
rv = BuildSteps::execute(V, S, meth);
rv = BuildSteps::execute(V, S, BM);
return rv;
}

View file

@ -3,6 +3,10 @@
A build step is a task which exercises one of the build skills.
@h Build skills.
A "skill" is a single atomic task which we know how to perform. For example,
assimilating a binary for a kit is a skill.
Each different skill is an instance of:
=
typedef struct build_skill {
@ -18,7 +22,10 @@ build_skill *BuildSteps::new_skill(text_stream *name) {
return S;
}
@
@ 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.
@e BUILD_SKILL_COMMAND_MTID
@e BUILD_SKILL_INTERNAL_MTID
@ -30,27 +37,31 @@ IMETHOD_TYPE(BUILD_SKILL_INTERNAL_MTID,
build_skill *S, build_step *BS, build_methodology *meth)
@h Build steps.
These are essentially just skills, but with a docket of contextual data. The
idea is that a function outside the |inbuild| module can carry out a skill
for us using only the contextual information in this structure, without having
to access any of |inbuild|'s variables directly.
=
typedef struct build_step {
struct build_skill *what_to_do;
struct build_vertex *vertex;
struct build_vertex *vertex; /* what to do it to */
struct linked_list *search_path; /* of |inbuild_nest| */
struct target_vm *for_vm;
struct inter_architecture *for_arch;
int for_release;
struct inbuild_copy *associated_copy;
struct inbuild_copy *associated_copy; /* e.g., the Inform project causing this work */
MEMORY_MANAGEMENT
} build_step;
@
@ We build scripts for a vertex by attaching one step at a time to it:
=
build_step *BuildSteps::attach(build_vertex *vertex, build_skill *to_do, linked_list *search,
int rel, target_vm *VM, inter_architecture *arch, inbuild_copy *assoc) {
build_step *S = CREATE(build_step);
S->vertex = vertex;
S->what_to_do = to_do;
S->vertex = vertex;
S->search_path = search;
S->for_vm = VM;
S->for_arch = arch;
@ -61,17 +72,17 @@ build_step *BuildSteps::attach(build_vertex *vertex, build_skill *to_do, linked_
return S;
}
int BuildSteps::execute(build_vertex *V, build_step *S, build_methodology *meth) {
// PRINT("Exec %S %d\n", S->what_to_do->name, meth->methodology);
@h Execution.
Note that this prints a log of shell commands generated to |stdout| when
we are running inside Inbuild at the command line, but not when we are running
inside the |inform7| executable, where we are silent throughout.
=
int BuildSteps::execute(build_vertex *V, build_step *S, build_methodology *BM) {
int rv = TRUE;
TEMPORARY_TEXT(command);
VMETHOD_CALL(S->what_to_do, BUILD_SKILL_COMMAND_MTID, S, command, meth);
if ((rv) && (Str::len(command) > 0)) rv = BuildSteps::shell(command, meth);
if ((rv) && (meth->methodology == INTERNAL_METHODOLOGY)) {
int returned = 0;
IMETHOD_CALL(returned, S->what_to_do, BUILD_SKILL_INTERNAL_MTID, S, meth);
if (returned != TRUE) rv = FALSE;
}
@<Work out a shell command, and perhaps print or call it@>;
@<Perform the skill internally if that's called for@>;
#ifndef CORE_MODULE
if (rv == FALSE) WRITE_TO(STDERR, "Build failed at '%S'\n", command);
#endif
@ -79,11 +90,28 @@ int BuildSteps::execute(build_vertex *V, build_step *S, build_methodology *meth)
return rv;
}
int BuildSteps::shell(text_stream *command, build_methodology *meth) {
@<Work out a shell command, and perhaps print or call it@> =
VMETHOD_CALL(S->what_to_do, BUILD_SKILL_COMMAND_MTID, S, command, BM);
if (Str::len(command) > 0) rv = BuildSteps::shell(command, BM);
@<Perform the skill internally if that's called for@> =
if (BM->methodology == INTERNAL_METHODOLOGY) {
int returned = 0;
IMETHOD_CALL(returned, S->what_to_do, BUILD_SKILL_INTERNAL_MTID, S, BM);
if (returned != TRUE) rv = FALSE;
}
@ This prints a shell command to |stdout| (except when inside |inform7|)
and also executes it if the methodology allows, returning the result. Note
that shell commands return 0 to indicate happiness.
=
int BuildSteps::shell(text_stream *command, build_methodology *BM) {
int rv = TRUE;
#ifndef CORE_MODULE
WRITE_TO(STDOUT, "%S\n", command);
#endif
if (meth->methodology == SHELL_METHODOLOGY) rv = (Shell::run(command) == 0)?TRUE:FALSE;
if (BM->methodology == SHELL_METHODOLOGY)
rv = (Shell::run(command) == 0)?TRUE:FALSE;
return rv;
}

View file

@ -1,23 +1,27 @@
[InblorbSkill::] Inblorb Skill.
A build step is a task such as running inform7 or inblorb on some file.
The skill of packaging a story file and associated resources into a blorb.
@ =
build_skill *package_using_inblorb_skill = NULL;
void InblorbSkill::create(void) {
package_using_inblorb_skill = BuildSteps::new_skill(I"package using inblorb");
METHOD_ADD(package_using_inblorb_skill, BUILD_SKILL_COMMAND_MTID, InblorbSkill::inblorb_via_shell);
package_using_inblorb_skill =
BuildSteps::new_skill(I"package using inblorb");
METHOD_ADD(package_using_inblorb_skill, BUILD_SKILL_COMMAND_MTID,
InblorbSkill::inblorb_via_shell);
}
int InblorbSkill::inblorb_via_shell(build_skill *skill, build_step *S, text_stream *command, build_methodology *meth) {
int InblorbSkill::inblorb_via_shell(build_skill *skill, build_step *S,
text_stream *command, build_methodology *BM) {
inform_project *project = ProjectBundleManager::from_copy(S->associated_copy);
if (project == NULL) project = ProjectFileManager::from_copy(S->associated_copy);
if (project == NULL) internal_error("no project");
Shell::quote_file(command, meth->to_inblorb);
filename *blurb = Filenames::in_folder(S->associated_copy->location_if_path, I"Release.blurb");
Shell::quote_file(command, BM->to_inblorb);
filename *blurb = Filenames::in_folder(S->associated_copy->location_if_path,
I"Release.blurb");
Shell::quote_file(command, blurb);
Shell::quote_file(command, S->vertex->buildable_if_internal_file);
Shell::quote_file(command, S->vertex->as_file);
return TRUE;
}

View file

@ -20,10 +20,10 @@ binary Inter files, because those are its build-dependencies.
time_t IncrementalBuild::timestamp(build_vertex *V) {
switch (V->type) {
case FILE_VERTEX:
return Filenames::timestamp(V->buildable_if_internal_file);
return Filenames::timestamp(V->as_file);
case COPY_VERTEX:
if (V->buildable_if_copy->location_if_file)
return Filenames::timestamp(V->buildable_if_copy->location_if_file);
if (V->as_copy->location_if_file)
return Filenames::timestamp(V->as_copy->location_if_file);
return IncrementalBuild::time_of_latest_build_dependency(V);
default:
return Platform::never_time();
@ -118,24 +118,25 @@ for each time we recurse.
=
int no_build_generations = 0;
int IncrementalBuild::begin_recursion(OUTPUT_STREAM, int gb, build_vertex *V,
build_methodology *meth) {
build_methodology *BM) {
int changes = 0;
text_stream *trace = NULL;
if (trace_ibg) trace = STDOUT;
WRITE_TO(trace, "Incremental build %d:\n", no_build_generations);
int rv = IncrementalBuild::recurse(OUT, trace, gb, V, meth, &changes, no_build_generations++);
WRITE_TO(trace, "%d change(s)\n", changes);
text_stream *T = NULL;
if (trace_ibg) T = STDOUT;
no_build_generations++;
WRITE_TO(T, "Incremental build %d:\n", no_build_generations);
int rv = IncrementalBuild::recurse(OUT, T, gb, V, BM, &changes, no_build_generations);
WRITE_TO(T, "%d change(s)\n", changes);
return rv;
}
int IncrementalBuild::recurse(OUTPUT_STREAM, text_stream *trace, int gb, build_vertex *V,
build_methodology *meth, int *changes, int generation) {
if (trace) {
WRITE_TO(trace, "Visit %c%c%c: ",
int IncrementalBuild::recurse(OUTPUT_STREAM, text_stream *T, int gb, build_vertex *V,
build_methodology *BM, int *changes, int generation) {
if (T) {
WRITE_TO(T, "Visit %c%c%c: ",
(gb & BUILD_DEPENDENCIES_MATTER_GB)?'b':'.',
(gb & USE_DEPENDENCIES_MATTER_GB)?'u':'.',
(gb & IGNORE_TIMESTAMPS_GB)?'i':'.');
Graphs::describe(trace, V, FALSE);
Graphs::describe(T, V, FALSE);
}
if (V->last_built_in_generation == generation) return V->build_result;
@ -162,10 +163,10 @@ clear. Here, if a node has no build script attached, it must be because it
needs no action taken.
@<Build this node if necessary, setting rv to its success or failure@> =
if (trace) STREAM_INDENT(trace);
if (T) STREAM_INDENT(T);
if (gb & BUILD_DEPENDENCIES_MATTER_GB) @<Build the build dependencies of the node@>;
if (gb & USE_DEPENDENCIES_MATTER_GB) @<Build the use dependencies of the node@>;
if (trace) STREAM_OUTDENT(trace);
if (T) STREAM_OUTDENT(T);
if ((rv) && (Graphs::can_be_built(V))) @<Build the node itself, if necessary@>;
@ Suppose V needs W (for whatever reason), and that W can only be used with X.
@ -177,15 +178,15 @@ building V is itself a use of W, and therefore of X. So we always enable the
build_vertex *W;
LOOP_OVER_LINKED_LIST(W, build_vertex, V->build_edges)
if (rv)
rv = IncrementalBuild::recurse(OUT, trace,
gb | USE_DEPENDENCIES_MATTER_GB, W, meth, changes, generation);
rv = IncrementalBuild::recurse(OUT, T,
gb | USE_DEPENDENCIES_MATTER_GB, W, BM, changes, generation);
@<Build the use dependencies of the node@> =
build_vertex *W;
LOOP_OVER_LINKED_LIST(W, build_vertex, V->use_edges)
if (rv)
rv = IncrementalBuild::recurse(OUT, trace,
gb | USE_DEPENDENCIES_MATTER_GB, W, meth, changes, generation);
rv = IncrementalBuild::recurse(OUT, T,
gb | USE_DEPENDENCIES_MATTER_GB, W, BM, changes, generation);
@ Now for the node |V| itself.
@ -195,11 +196,11 @@ building V is itself a use of W, and therefore of X. So we always enable the
else @<Decide based on timestamps@>;
if (needs_building) {
if (trace) { WRITE_TO(trace, "Build: "); Graphs::describe(trace, V, FALSE); }
if (T) { WRITE_TO(T, "Build: "); Graphs::describe(T, V, FALSE); }
(*changes)++;
rv = BuildScripts::execute(V, V->script, meth);
rv = BuildScripts::execute(V, V->script, BM);
} else {
if (trace) { WRITE_TO(trace, "No build\n"); }
if (T) { WRITE_TO(T, "No build\n"); }
}
@ This is where the incremental promise is finally kept. If the timestamp of
@ -215,16 +216,16 @@ created during the same second.
if (last_up_to_date_at == Platform::never_time())
needs_building = TRUE;
else {
if (trace) { WRITE_TO(trace, "Last built at: %08x\n", last_up_to_date_at); }
if (T) { WRITE_TO(T, "Last built at: %08x\n", last_up_to_date_at); }
if (gb & BUILD_DEPENDENCIES_MATTER_GB) {
time_t t = IncrementalBuild::time_of_latest_build_dependency(V);
if (trace) { WRITE_TO(trace, "Most recent build dependency: %08x\n", t); }
if (T) { WRITE_TO(T, "Most recent build dependency: %08x\n", t); }
if (IncrementalBuild::timecmp(t, last_up_to_date_at) >= 0)
needs_building = TRUE;
}
if (gb & USE_DEPENDENCIES_MATTER_GB) {
time_t t = IncrementalBuild::time_of_latest_use_dependency(V);
if (trace) { WRITE_TO(trace, "Most recent use dependency: %08x\n", t); }
if (T) { WRITE_TO(T, "Most recent use dependency: %08x\n", t); }
if (IncrementalBuild::timecmp(t, last_up_to_date_at) >= 0)
needs_building = TRUE;
}

View file

@ -1,24 +1,31 @@
[Inform6Skill::] Inform6 Skill.
A build step is a task such as running inform7 or inblorb on some file.
The skill of compiling Inform 6 into a story file for the target VM.
@ =
@ This can only be performed via the shell, as the Inform 6 compiler is never
part of the executables of the more modern Inform tools, and so can't be
called as a function.
=
build_skill *compile_using_inform6_skill = NULL;
void Inform6Skill::create(void) {
compile_using_inform6_skill = BuildSteps::new_skill(I"compile using inform6");
METHOD_ADD(compile_using_inform6_skill, BUILD_SKILL_COMMAND_MTID, Inform6Skill::inform6_via_shell);
compile_using_inform6_skill =
BuildSteps::new_skill(I"compile using inform6");
METHOD_ADD(compile_using_inform6_skill, BUILD_SKILL_COMMAND_MTID,
Inform6Skill::inform6_via_shell);
}
int Inform6Skill::inform6_via_shell(build_skill *skill, build_step *S, text_stream *command, build_methodology *meth) {
Shell::quote_file(command, meth->to_inform6);
int Inform6Skill::inform6_via_shell(build_skill *skill, build_step *S,
text_stream *command, build_methodology *BM) {
Shell::quote_file(command, BM->to_inform6);
inform_project *project = ProjectBundleManager::from_copy(S->associated_copy);
if (project == NULL) project = ProjectFileManager::from_copy(S->associated_copy);
if (project == NULL) internal_error("no project");
pathname *build_folder = Pathnames::subfolder(project->as_copy->location_if_path, I"Build");
filename *inf_F = Filenames::in_folder(build_folder, I"auto.inf");
pathname *build = Pathnames::subfolder(project->as_copy->location_if_path, I"Build");
filename *inf_F = Filenames::in_folder(build, I"auto.inf");
WRITE_TO(command, "-kE2S");
if (TargetVMs::debug_enabled((S->for_vm))) WRITE_TO(command, "D");
@ -27,6 +34,6 @@ int Inform6Skill::inform6_via_shell(build_skill *skill, build_step *S, text_stre
WRITE_TO(command, "w%S ", ext);
Shell::quote_file(command, inf_F);
Shell::quote_file(command, S->vertex->buildable_if_internal_file);
Shell::quote_file(command, S->vertex->as_file);
return TRUE;
}

View file

@ -1,22 +1,29 @@
[Inform7Skill::] Inform7 Skill.
A build step is a task such as running inform7 or inblorb on some file.
The skill of turning source text into Inter code.
@ =
@ This skill can be performed externally with a shell command to |inform7|, or,
if we are running inside |inform7| anyway, internally with a function call.
=
build_skill *compile_using_inform7_skill = NULL;
void Inform7Skill::create(void) {
compile_using_inform7_skill = BuildSteps::new_skill(I"compile using inform7");
METHOD_ADD(compile_using_inform7_skill, BUILD_SKILL_COMMAND_MTID, Inform7Skill::inform7_via_shell);
METHOD_ADD(compile_using_inform7_skill, BUILD_SKILL_INTERNAL_MTID, Inform7Skill::inform7_internally);
compile_using_inform7_skill =
BuildSteps::new_skill(I"compile using inform7");
METHOD_ADD(compile_using_inform7_skill, BUILD_SKILL_COMMAND_MTID,
Inform7Skill::inform7_via_shell);
METHOD_ADD(compile_using_inform7_skill, BUILD_SKILL_INTERNAL_MTID,
Inform7Skill::inform7_internally);
}
int Inform7Skill::inform7_via_shell(build_skill *skill, build_step *S, text_stream *command, build_methodology *meth) {
int Inform7Skill::inform7_via_shell(build_skill *skill, build_step *S,
text_stream *command, build_methodology *BM) {
inform_project *project = ProjectBundleManager::from_copy(S->associated_copy);
if (project == NULL) project = ProjectFileManager::from_copy(S->associated_copy);
if (project == NULL) internal_error("no project");
Shell::quote_file(command, meth->to_inform7);
Shell::quote_file(command, BM->to_inform7);
kit_dependency *kd;
LOOP_OVER_LINKED_LIST(kd, kit_dependency, project->kits_to_include)
@ -41,7 +48,7 @@ int Inform7Skill::inform7_via_shell(build_skill *skill, build_step *S, text_stre
return TRUE;
}
int Inform7Skill::inform7_internally(build_skill *skill, build_step *S, build_methodology *meth) {
int Inform7Skill::inform7_internally(build_skill *skill, build_step *S, build_methodology *BM) {
#ifdef CORE_MODULE
return Task::carry_out(S);
#endif

View file

@ -1,40 +1,65 @@
[InterSkill::] Inter Skill.
A build step is a task such as running inform7 or inblorb on some file.
The skills of kit assimilation and of code generation from Inter.
@ =
@h Creation.
Note that code generation can only be done internally, and only in fact within
the |inform7| compiler: this is because the Inter code which it generates from
is being held in memory by |inform7|.
=
build_skill *assimilate_using_inter_skill = NULL;
build_skill *code_generate_using_inter_skill = NULL;
void InterSkill::create(void) {
assimilate_using_inter_skill = BuildSteps::new_skill(I"assimilate using inter");
METHOD_ADD(assimilate_using_inter_skill, BUILD_SKILL_COMMAND_MTID, InterSkill::assimilate_via_shell);
METHOD_ADD(assimilate_using_inter_skill, BUILD_SKILL_INTERNAL_MTID, InterSkill::assimilate_internally);
code_generate_using_inter_skill = BuildSteps::new_skill(I"code generate using inter");
METHOD_ADD(code_generate_using_inter_skill, BUILD_SKILL_INTERNAL_MTID, InterSkill::code_generate_internally);
assimilate_using_inter_skill =
BuildSteps::new_skill(I"assimilate using inter");
METHOD_ADD(assimilate_using_inter_skill, BUILD_SKILL_COMMAND_MTID,
InterSkill::assimilate_via_shell);
METHOD_ADD(assimilate_using_inter_skill, BUILD_SKILL_INTERNAL_MTID,
InterSkill::assimilate_internally);
code_generate_using_inter_skill =
BuildSteps::new_skill(I"code generate using inter");
METHOD_ADD(code_generate_using_inter_skill, BUILD_SKILL_INTERNAL_MTID,
InterSkill::code_generate_internally);
}
int InterSkill::assimilate_via_shell(build_skill *skill, build_step *S, text_stream *command, build_methodology *meth) {
@h Assimilation.
=
int InterSkill::assimilate_via_shell(build_skill *skill, build_step *S,
text_stream *command, build_methodology *BM) {
inter_architecture *A = S->for_arch;
if (A == NULL) internal_error("no architecture given");
pathname *kit_path = S->associated_copy->location_if_path;
Shell::quote_file(command, meth->to_inter);
Shell::quote_file(command, BM->to_inter);
WRITE_TO(command, "-architecture %S ", Architectures::to_codename(A));
WRITE_TO(command, "-assimilate ");
Shell::quote_path(command, kit_path);
return TRUE;
}
int InterSkill::assimilate_internally(build_skill *skill, build_step *S, build_methodology *meth) {
@ Something to watch out for here is that, when running internally as part of
|inform7|, we use the copy of the |assimilate| pipeline inside the installation
of |inform7| (it will be in the internal nest). When we perform assimilation
from the command line using the |inter| tool, we use the |assimilate| pipeline
supplied in the |inter| installation. But those two files are in fact the same,
or should be, so the effect is the same.
=
int InterSkill::assimilate_internally(build_skill *skill, build_step *S,
build_methodology *BM) {
#ifdef CODEGEN_MODULE
inter_architecture *A = S->for_arch;
if (A == NULL) internal_error("no architecture given");
pathname *kit_path = S->associated_copy->location_if_path;
dictionary *pipeline_vars = CodeGen::Pipeline::basic_dictionary(I"output.i6");
dictionary *pipeline_vars = CodeGen::Pipeline::basic_dictionary(NULL);
inbuild_requirement *req =
Requirements::any_version_of(Works::new(pipeline_genre, I"assimilate.interpipeline", NULL));
Requirements::any_version_of(
Works::new(pipeline_genre, I"assimilate.interpipeline", NULL));
inbuild_search_result *R = Nests::search_for_best(req, Inbuild::nest_list());
if (R == NULL) {
Errors::nowhere("assimilate pipeline could not be found");
@ -51,11 +76,13 @@ int InterSkill::assimilate_internally(build_skill *skill, build_step *S, build_m
WRITE_TO(fullname, "%f", assim_t);
Str::copy(Dictionaries::create_text(pipeline_vars, I"*outt"), fullname);
DISCARD_TEXT(fullname);
Str::copy(Dictionaries::create_text(pipeline_vars, I"*attach"), Pathnames::directory_name(kit_path));
Str::copy(Dictionaries::create_text(pipeline_vars, I"*kit"),
Pathnames::directory_name(kit_path));
linked_list *inter_paths = NEW_LINKED_LIST(pathname);
ADD_TO_LINKED_LIST(S->associated_copy->location_if_path, pathname, inter_paths);
codegen_pipeline *SS = CodeGen::Pipeline::parse_from_file(pipeline_as_file, pipeline_vars);
codegen_pipeline *SS =
CodeGen::Pipeline::parse_from_file(pipeline_as_file, pipeline_vars);
if (SS) {
linked_list *requirements_list = NEW_LINKED_LIST(inter_library);
CodeGen::Pipeline::run(NULL, SS, inter_paths, requirements_list);
@ -68,7 +95,17 @@ int InterSkill::assimilate_internally(build_skill *skill, build_step *S, build_m
return FALSE;
}
int InterSkill::code_generate_internally(build_skill *skill, build_step *S, build_methodology *meth) {
@h Code generation.
This can only be done internally, for reasons given above, and only when the
|codegen| module is present in the current executable (which in practice means:
only inside |inform7|).
Recall that the |inter_pipeline_name| is managed in Inbuild Control, but that
it defaults to |compile|.
=
int InterSkill::code_generate_internally(build_skill *skill, build_step *S,
build_methodology *BM) {
#ifdef CODEGEN_MODULE
clock_t back_end = clock();
CodeGen::Architecture::set(
@ -76,15 +113,17 @@ int InterSkill::code_generate_internally(build_skill *skill, build_step *S, buil
TargetVMs::get_architecture(S->for_vm)));
Str::copy(Dictionaries::create_text(pipeline_vars, I"*in"), I"*memory");
Str::copy(Dictionaries::create_text(pipeline_vars, I"*out"),
Filenames::get_leafname(S->vertex->buildable_if_internal_file));
Filenames::get_leafname(S->vertex->as_file));
filename *F = inter_pipeline_file;
if (F == NULL) {
inbuild_requirement *req =
Requirements::any_version_of(Works::new(pipeline_genre, inter_pipeline_name, NULL));
Requirements::any_version_of(
Works::new(pipeline_genre, inter_pipeline_name, NULL));
inbuild_search_result *R = Nests::search_for_best(req, Inbuild::nest_list());
if (R == NULL) {
Errors::with_text("inter pipeline '%S' could not be found", inter_pipeline_name);
Errors::with_text("inter pipeline '%S' could not be found",
inter_pipeline_name);
return FALSE;
}
F = R->copy->location_if_file;
@ -95,9 +134,11 @@ int InterSkill::code_generate_internally(build_skill *skill, build_step *S, buil
return FALSE;
}
CodeGen::Pipeline::set_repository(SS, Emit::tree());
CodeGen::Pipeline::run(Filenames::get_path_to(S->vertex->buildable_if_internal_file),
SS, Kits::inter_paths(), Projects::list_of_inter_libraries(Inbuild::project()));
LOG("Back end elapsed time: %dcs\n", ((int) (clock() - back_end)) / (CLOCKS_PER_SEC/100));
CodeGen::Pipeline::run(Filenames::get_path_to(S->vertex->as_file),
SS, Kits::inter_paths(),
Projects::list_of_inter_libraries(Inbuild::project()));
LOG("Back end elapsed time: %dcs\n",
((int) (clock() - back_end)) / (CLOCKS_PER_SEC/100));
return TRUE;
#endif
#ifndef CORE_MODULE

View file

@ -95,7 +95,6 @@ void ExtensionManager::claim_as_copy(inbuild_genre *gen, inbuild_copy **C,
inbuild_copy *ExtensionManager::claim_file_as_copy(filename *F) {
if (TextFiles::exists(F) == FALSE) return NULL;
inbuild_copy *C = ExtensionManager::new_copy(F);
ExtensionManager::build_vertex(C);
Works::add_to_database(C->edition->work, CLAIMED_WDBC);
return C;
}
@ -217,11 +216,7 @@ void ExtensionManager::ensure_graphed(inbuild_copy *C) {
Inclusions::traverse(C, ExtensionManager::from_copy(C)->syntax_tree);
build_vertex *V;
LOOP_OVER_LINKED_LIST(V, build_vertex, C->vertex->use_edges)
ExtensionManager::ensure_graphed(V->buildable_if_copy);
}
void ExtensionManager::build_vertex(inbuild_copy *C) {
Graphs::copy_vertex(C);
ExtensionManager::ensure_graphed(V->as_copy);
}
@h Source text.

View file

@ -86,7 +86,6 @@ inbuild_copy *KitManager::claim_folder_as_copy(pathname *P) {
filename *canary = Filenames::in_folder(P, I"kit_metadata.txt");
if (TextFiles::exists(canary)) {
inbuild_copy *C = KitManager::new_copy(Pathnames::directory_name(P), P);
KitManager::build_vertex(C);
Works::add_to_database(C->edition->work, CLAIMED_WDBC);
return C;
}
@ -171,10 +170,6 @@ void KitManager::building_soon(inbuild_genre *gen, inbuild_copy *C, build_vertex
*V = C->vertex;
}
void KitManager::build_vertex(inbuild_copy *C) {
Graphs::copy_vertex(C);
}
void KitManager::go_operational(inbuild_genre *G, inbuild_copy *C) {
Kits::construct_graph(KitManager::from_copy(C));
}

View file

@ -93,7 +93,6 @@ inbuild_copy *LanguageManager::claim_folder_as_copy(pathname *P) {
filename *canary = Filenames::in_folder(P, I"about.txt");
if (TextFiles::exists(canary)) {
inbuild_copy *C = LanguageManager::new_copy(Pathnames::directory_name(P), P);
LanguageManager::build_vertex(C);
Works::add_to_database(C->edition->work, CLAIMED_WDBC);
return C;
}
@ -169,12 +168,3 @@ void LanguageManager::copy_to_nest(inbuild_genre *gen, inbuild_copy *C, inbuild_
Pathnames::rsync(C->location_if_path, dest_language);
}
}
@h Build graph.
The build graph for a language bundle is just a single node: you don't need to
build it at all.
=
void LanguageManager::build_vertex(inbuild_copy *C) {
Graphs::copy_vertex(C);
}

View file

@ -54,7 +54,7 @@ supplied at the command line; |ext| is a substring of it, and is its extension
|directory_status| is true if we know for some reason that this is a directory
not a file, false if we know the reverse, and otherwise not applicable.
An pipeline, for us, simply needs to be a file with extension |interpipeline|.
An pipeline, for us, simply needs to be a file with extension |.interpipeline|.
=
void PipelineManager::claim_as_copy(inbuild_genre *gen, inbuild_copy **C,
@ -75,7 +75,6 @@ inbuild_copy *PipelineManager::claim_file_as_copy(filename *F, text_stream *erro
Editions::new(Works::new_raw(pipeline_genre, unext, NULL), V), F);
DISCARD_TEXT(unext);
Works::add_to_database(C->edition->work, CLAIMED_WDBC);
PipelineManager::build_vertex(C);
return C;
}
@ -145,12 +144,3 @@ void PipelineManager::copy_to_nest(inbuild_genre *gen, inbuild_copy *C, inbuild_
BuildSteps::shell(command, meth);
DISCARD_TEXT(command);
}
@h Build graph.
The build graph for a pipeline is just a single node: you don't need to
build a pipeline at all.
=
void PipelineManager::build_vertex(inbuild_copy *C) {
Graphs::copy_vertex(C);
}

View file

@ -62,7 +62,6 @@ void ProjectBundleManager::claim_as_copy(inbuild_genre *gen, inbuild_copy **C,
inbuild_copy *ProjectBundleManager::claim_folder_as_copy(pathname *P) {
inbuild_copy *C = ProjectBundleManager::new_copy(Pathnames::directory_name(P), P);
ProjectBundleManager::build_vertex(C);
Works::add_to_database(C->edition->work, CLAIMED_WDBC);
return C;
}
@ -95,16 +94,6 @@ void ProjectBundleManager::building_soon(inbuild_genre *gen, inbuild_copy *C, bu
*V = project->chosen_build_target;
}
@ The build graph for a project will need further thought...
=
void ProjectBundleManager::build_vertex(inbuild_copy *C) {
Graphs::copy_vertex(C);
}
@ which it will get here:
=
void ProjectBundleManager::go_operational(inbuild_genre *G, inbuild_copy *C) {
Projects::construct_graph(ProjectBundleManager::from_copy(C));
}

View file

@ -65,7 +65,6 @@ void ProjectFileManager::claim_as_copy(inbuild_genre *gen, inbuild_copy **C,
inbuild_copy *ProjectFileManager::claim_file_as_copy(filename *F) {
inbuild_copy *C = ProjectFileManager::new_copy(Filenames::get_leafname(F), F);
ProjectFileManager::build_vertex(C);
Works::add_to_database(C->edition->work, CLAIMED_WDBC);
return C;
}
@ -98,16 +97,6 @@ void ProjectFileManager::building_soon(inbuild_genre *gen, inbuild_copy *C, buil
*V = project->chosen_build_target;
}
@ The build graph for a project will need further thought...
=
void ProjectFileManager::build_vertex(inbuild_copy *C) {
Graphs::copy_vertex(C);
}
@ which it will get here:
=
void ProjectFileManager::go_operational(inbuild_genre *G, inbuild_copy *C) {
Projects::construct_graph(ProjectFileManager::from_copy(C));
}

View file

@ -69,7 +69,6 @@ inbuild_copy *TemplateManager::claim_folder_as_copy(pathname *P) {
filename *canary2 = Filenames::in_folder(P, I"index.html");
if ((TextFiles::exists(canary1)) || (TextFiles::exists(canary2))) {
inbuild_copy *C = TemplateManager::new_copy(Pathnames::directory_name(P), P);
TemplateManager::build_vertex(C);
Works::add_to_database(C->edition->work, CLAIMED_WDBC);
return C;
}
@ -147,12 +146,3 @@ void TemplateManager::copy_to_nest(inbuild_genre *gen, inbuild_copy *C, inbuild_
Pathnames::rsync(C->location_if_path, P);
}
}
@h Build graph.
The build graph for a template is just a single node: you don't need to
build a template at all.
=
void TemplateManager::build_vertex(inbuild_copy *C) {
Graphs::copy_vertex(C);
}

View file

@ -118,7 +118,6 @@ inform_kit *Kits::load(text_stream *name, linked_list *nest_list) {
inbuild_search_result *R = Nests::search_for_best(req, nest_list);
if (R == NULL) Errors::fatal_with_text("cannot find kit", name);
inbuild_copy *C = R->copy;
if (C->vertex == NULL) KitManager::build_vertex(C);
return KitManager::from_copy(C);
}

View file

@ -99,13 +99,13 @@ void Projects::set_source_filename(inform_project *project, pathname *P, filenam
text_stream *leafname;
LOOP_OVER_LINKED_LIST(leafname, text_stream, L) {
build_vertex *S = Graphs::file_vertex(Filenames::in_folder(P, leafname));
S->annotation = leafname;
S->source_source = leafname;
ADD_TO_LINKED_LIST(S, build_vertex, project->source_vertices);
}
}
if ((LinkedLists::len(project->source_vertices) == 0) && (F)) {
build_vertex *S = Graphs::file_vertex(F);
S->annotation = I"your source text";
S->source_source = I"your source text";
ADD_TO_LINKED_LIST(S, build_vertex, project->source_vertices);
}
}
@ -374,9 +374,9 @@ void Projects::read_source_text_for(inform_project *project) {
if (L) {
build_vertex *N;
LOOP_OVER_LINKED_LIST(N, build_vertex, L) {
filename *F = N->buildable_if_internal_file;
filename *F = N->as_file;
if (bwc == -1) bwc = lexer_wordcount;
N->read_as = SourceText::read_file(project->as_copy, F, N->annotation,
N->as_source_file = SourceText::read_file(project->as_copy, F, N->source_source,
FALSE, TRUE);
}
}
@ -518,7 +518,7 @@ int Projects::draws_from_source_file(inform_project *project, source_file *sf) {
if (L) {
build_vertex *N;
LOOP_OVER_LINKED_LIST(N, build_vertex, L)
if (sf == N->read_as)
if (sf == N->as_source_file)
return TRUE;
}
return FALSE;

View file

@ -68,7 +68,7 @@ void Inclusions::visit(parse_node_tree *T, parse_node *pn, parse_node *last_H0,
if ((last_H0) && (ParseTree::int_annotation(last_H0, implied_heading_ANNOT) != TRUE)) {
build_vertex *V = Inclusions::spawned_from_vertex(last_H0);
build_vertex *EV = E->as_copy->vertex;
if (V->buildable_if_copy->edition->work->genre == extension_genre)
if (V->as_copy->edition->work->genre == extension_genre)
Graphs::need_this_to_use(V, EV);
else
Graphs::need_this_to_build(V, EV);

View file

@ -1,4 +1,4 @@
prepare <- *attach
prepare <- *kit
merge-template <- all
parse-linked-matter
resolve-conditional-compilation

View file

@ -81,8 +81,8 @@ only issue stubby Unix-like command line errors.)
void Task::issue_problems_arising(build_vertex *V) {
if (V->type == COPY_VERTEX) {
LOG("Issue from copy of %X at %08x\n",
V->buildable_if_copy->edition->work, V->buildable_if_copy);
SourceProblems::issue_problems_arising(V->buildable_if_copy);
V->as_copy->edition->work, V->as_copy);
SourceProblems::issue_problems_arising(V->as_copy);
}
build_vertex *W;
LOOP_OVER_LINKED_LIST(W, build_vertex, V->build_edges)
@ -261,7 +261,7 @@ filename *Task::storyfile_file(void) {
if (inform7_task == NULL) internal_error("there is no current task");
build_vertex *V = inform7_task->project->unblorbed_vertex;
if (V == NULL) internal_error("project graph not ready");
return V->buildable_if_internal_file;
return V->as_file;
}
@ Deeper inside the|Build| subfolder is an (also ephemeral) |Index| subfolder,