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:
parent
123b9c166e
commit
8f2dea78de
|
@ -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">-></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">-></span><span class="identifier">buildable_if_copy</span><span class="plain">-></span><span class="identifier">edition</span><span class="plain">-></span><span class="identifier">work</span><span class="plain">, </span><span class="identifier">V</span><span class="plain">-></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">-></span><span class="identifier">buildable_if_copy</span><span class="plain">);</span>
|
||||
<span class="identifier">V</span><span class="plain">-></span><span class="identifier">as_copy</span><span class="plain">-></span><span class="identifier">edition</span><span class="plain">-></span><span class="identifier">work</span><span class="plain">, </span><span class="identifier">V</span><span class="plain">-></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">-></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">-></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">>project</span><span class="plain">-></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">-></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">-></span><span class="identifier">as_file</span><span class="plain">;</span>
|
||||
<span class="plain">}</span>
|
||||
</pre>
|
||||
|
||||
|
|
|
@ -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">§9.2</a>, 3/is (<a href="3-is.html#SP1">§1</a>), 5/kts (<a href="5-kts.html#SP1">§1</a>, <a href="5-kts.html#SP2">§2</a>), 5/ed2 (<a href="5-ed2.html#SP4">§4</a>), 5/ec (<a href="5-ec.html#SP1">§1</a>), 5/ps (<a href="5-ps.html#SP1">§1</a>, <a href="5-ps.html#SP3">§3</a>), 6/inc (<a href="6-inc.html#SP6_1">§6.1</a>, <a href="6-inc.html#SP6_1_2">§6.1.2</a>).</p>
|
||||
<p class="endnote">The function Inbuild::nest_list is used in <a href="#SP9_2">§9.2</a>, 3/is (<a href="3-is.html#SP3">§3</a>, <a href="3-is.html#SP4">§4</a>), 5/kts (<a href="5-kts.html#SP1">§1</a>, <a href="5-kts.html#SP2">§2</a>), 5/ed2 (<a href="5-ed2.html#SP4">§4</a>), 5/ec (<a href="5-ec.html#SP1">§1</a>), 5/ps (<a href="5-ps.html#SP1">§1</a>, <a href="5-ps.html#SP3">§3</a>), 6/inc (<a href="6-inc.html#SP6_1">§6.1</a>, <a href="6-inc.html#SP6_1_2">§6.1.2</a>).</p>
|
||||
|
||||
<p class="endnote">The function Inbuild::internal is used in <a href="#SP23">§23</a>, 5/ls (<a href="5-ls.html#SP7">§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">§11</a>, 3/is (<a href="3-is.html#SP1">§1</a>), 5/es (<a href="5-es.html#SP5">§5</a>).</p>
|
||||
<p class="endnote">The function Inbuild::project is used in <a href="#SP11">§11</a>, 3/is (<a href="3-is.html#SP4">§4</a>), 5/es (<a href="5-es.html#SP5">§5</a>).</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP21"></a><b>§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>.
|
||||
|
|
|
@ -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">>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">>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">>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">>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">>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">>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">>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">>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">§5</a>, <a href="3-bg.html#SP6">§6</a>, <a href="3-bg.html#SP8_1">§8.1</a>).</p>
|
||||
<p class="endnote">The function Copies::write_copy is used in 3/bg (<a href="3-bg.html#SP6">§6</a>, <a href="3-bg.html#SP7">§7</a>, <a href="3-bg.html#SP9_1">§9.1</a>).</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP7"></a><b>§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">§8.1</a>).</p>
|
||||
<p class="endnote">The function Copies::copy_to is used in 3/bg (<a href="3-bg.html#SP9_1">§9.1</a>).</p>
|
||||
|
||||
<p class="endnote">The function Copies::overwrite_error is used in 4/km (<a href="4-km.html#SP6">§6</a>), 4/em (<a href="4-em.html#SP8">§8</a>), 4/lm (<a href="4-lm.html#SP7">§7</a>), 4/tm (<a href="4-tm.html#SP6">§6</a>), 4/pm (<a href="4-pm.html#SP7">§7</a>).</p>
|
||||
|
||||
|
|
|
@ -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">§8</a>).</p>
|
||||
<p class="endnote">The function Genres::stored_in_nests is used in 3/bg (<a href="3-bg.html#SP9">§9</a>).</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP3"></a><b>§3. </b>The requirements parser needs to identify genres by name, so:
|
||||
</p>
|
||||
|
|
|
@ -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">§1</a>), 5/kts (<a href="5-kts.html#SP1">§1</a>), 5/ls (<a href="5-ls.html#SP7">§7</a>), 6/inc (<a href="6-inc.html#SP6_1">§6.1</a>).</p>
|
||||
<p class="endnote">The function Nests::search_for_best is used in 3/is (<a href="3-is.html#SP3">§3</a>, <a href="3-is.html#SP4">§4</a>), 5/kts (<a href="5-kts.html#SP1">§1</a>), 5/ls (<a href="5-ls.html#SP7">§7</a>), 6/inc (<a href="6-inc.html#SP6_1">§6.1</a>).</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP9"></a><b>§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
|
||||
|
|
|
@ -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">§5.1</a>).</p>
|
||||
|
||||
<p class="endnote">The function Requirements::any_version_of is used in 3/is (<a href="3-is.html#SP1">§1</a>), 5/kts (<a href="5-kts.html#SP1">§1</a>), 5/ed2 (<a href="5-ed2.html#SP4">§4</a>), 5/ls (<a href="5-ls.html#SP7">§7</a>), 6/inc (<a href="6-inc.html#SP6_1_2">§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">§3</a>, <a href="3-is.html#SP4">§4</a>), 5/kts (<a href="5-kts.html#SP1">§1</a>), 5/ed2 (<a href="5-ed2.html#SP4">§4</a>), 5/ls (<a href="5-ls.html#SP7">§7</a>), 6/inc (<a href="6-inc.html#SP6_1_2">§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">§9.2</a>), 5/ec (<a href="5-ec.html#SP3">§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">§5</a>).</p>
|
||||
<p class="endnote">The function Requirements::write is used in 3/bg (<a href="3-bg.html#SP6">§6</a>).</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP7"></a><b>§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.
|
||||
|
|
|
@ -112,7 +112,7 @@ not subsequently altered.
|
|||
|
||||
<p class="inwebparagraph"></p>
|
||||
|
||||
<p class="endnote">The function Works::new is used in <a href="#SP10">§10</a>, 2/rqr (<a href="2-rqr.html#SP2">§2</a>), 3/is (<a href="3-is.html#SP1">§1</a>), 4/em (<a href="4-em.html#SP5">§5</a>), 4/lm (<a href="4-lm.html#SP4">§4</a>), 4/pbm (<a href="4-pbm.html#SP2">§2</a>), 4/pfm (<a href="4-pfm.html#SP2">§2</a>), 4/tm (<a href="4-tm.html#SP3">§3</a>), 5/kts (<a href="5-kts.html#SP1">§1</a>), 5/es (<a href="5-es.html#SP1">§1</a>), 5/ed (<a href="5-ed.html#SP10">§10</a>), 5/ls (<a href="5-ls.html#SP7">§7</a>), 6/hdn (<a href="6-hdn.html#SP13_3">§13.3</a>), 6/inc (<a href="6-inc.html#SP5_1">§5.1</a>).</p>
|
||||
<p class="endnote">The function Works::new is used in <a href="#SP10">§10</a>, 2/rqr (<a href="2-rqr.html#SP2">§2</a>), 3/is (<a href="3-is.html#SP3">§3</a>, <a href="3-is.html#SP4">§4</a>), 4/em (<a href="4-em.html#SP5">§5</a>), 4/lm (<a href="4-lm.html#SP4">§4</a>), 4/pbm (<a href="4-pbm.html#SP2">§2</a>), 4/pfm (<a href="4-pfm.html#SP2">§2</a>), 4/tm (<a href="4-tm.html#SP3">§3</a>), 5/kts (<a href="5-kts.html#SP1">§1</a>), 5/es (<a href="5-es.html#SP1">§1</a>), 5/ed (<a href="5-ed.html#SP10">§10</a>), 5/ls (<a href="5-ls.html#SP7">§7</a>), 6/hdn (<a href="6-hdn.html#SP13_3">§13.3</a>), 6/inc (<a href="6-inc.html#SP5_1">§5.1</a>).</p>
|
||||
|
||||
<p class="endnote">The function Works::new_raw is used in 4/km (<a href="4-km.html#SP3">§3</a>), 4/pm (<a href="4-pm.html#SP5">§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">§1</a>), 3/bg (<a href="3-bg.html#SP6">§6</a>, <a href="3-bg.html#SP7">§7</a>).</p>
|
||||
<p class="endnote">The function Works::write is used in 2/edt (<a href="2-edt.html#SP1">§1</a>), 3/bg (<a href="3-bg.html#SP7">§7</a>, <a href="3-bg.html#SP8">§8</a>).</p>
|
||||
|
||||
<p class="endnote">The function Works::write_to_HTML_file is used in <a href="#SP6">§6</a>, 5/ed (<a href="5-ed.html#SP19_2">§19.2</a>), 5/ed2 (<a href="5-ed2.html#SP3_2_1">§3.2.1</a>).</p>
|
||||
|
||||
|
|
|
@ -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">§1. Build graphs</a></li><li><a href="#SP2">§2. Creation</a></li><li><a href="#SP5">§5. Writing</a></li><li><a href="#SP8">§8. Archiving</a></li></ul><hr class="tocbar">
|
||||
<ul class="toc"><li><a href="#SP1">§1. Build graphs</a></li><li><a href="#SP2">§2. Creation</a></li><li><a href="#SP6">§6. Writing</a></li><li><a href="#SP9">§9. Archiving</a></li></ul><hr class="tocbar">
|
||||
|
||||
<p class="inwebparagraph"><a id="SP1"></a><b>§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>§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">>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">>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">>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">>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">>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">>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">>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">>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">>last_described_in_generation</span><span class="plain"> = 0;</span>
|
||||
<span class="identifier">V</span><span class="plain">-</span><span class="element">>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">>last_built_in_generation</span><span class="plain"> = -1;</span>
|
||||
<span class="identifier">V</span><span class="plain">-</span><span class="element">>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">>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">>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">>vertex</span><span class="plain">-</span><span class="element">>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">>vertex</span><span class="plain">-</span><span class="element">>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">>vertex</span><span class="plain">;</span>
|
||||
<span class="identifier">V</span><span class="plain">-</span><span class="element">>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">>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">>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">>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">>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">>last_described_in_generation</span><span class="plain"> = -1;</span>
|
||||
|
||||
<span class="identifier">V</span><span class="plain">-</span><span class="element">>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">>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">>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">>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">>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">>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">>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">§2</a>), 5/ps (<a href="5-ps.html#SP1">§1</a>, <a href="5-ps.html#SP3">§3</a>).</p>
|
||||
|
||||
<p class="endnote">The function Graphs::copy_vertex is used in 4/km (<a href="4-km.html#SP7">§7</a>), 4/em (<a href="4-em.html#SP9">§9</a>), 4/lm (<a href="4-lm.html#SP8">§8</a>), 4/pbm (<a href="4-pbm.html#SP7">§7</a>), 4/pfm (<a href="4-pfm.html#SP7">§7</a>), 4/tm (<a href="4-tm.html#SP7">§7</a>), 4/pm (<a href="4-pm.html#SP8">§8</a>).</p>
|
||||
<p class="endnote">The function Graphs::file_vertex is used in <a href="#SP3">§3</a>, 5/kts (<a href="5-kts.html#SP2">§2</a>), 5/ps (<a href="5-ps.html#SP1">§1</a>, <a href="5-ps.html#SP3">§3</a>).</p>
|
||||
|
||||
<p class="endnote">The function Graphs::req_vertex is used in 5/kts (<a href="5-kts.html#SP2">§2</a>), 6/inc (<a href="6-inc.html#SP6_1">§6.1</a>).</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP3"></a><b>§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>§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">>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">>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">>vertex</span><span class="plain">-</span><span class="element">>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">>vertex</span><span class="plain">-</span><span class="element">>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">>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">§2</a>).</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP4"></a><b>§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">§2</a>), 5/ps (<a href="5-ps.html#SP3">§3</a>), 6/inc (<a href="6-inc.html#SP1_1">§1.1</a>).</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP4"></a><b>§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>§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">§7.1</a>).</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP5"></a><b>§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>§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">>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">>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">>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">>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">>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">>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">>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">>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">>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">>buildable_if_copy</span><span class="plain">-</span><span class="element">>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">>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">>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">>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">>as_copy</span><span class="plain">-</span><span class="element">>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">>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">>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">>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>§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>§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">>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"><</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">>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">>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">>edition</span><span class="plain">-</span><span class="element">>work</span><span class="plain">-</span><span class="element">>genre</span><span class="plain">-</span><span class="element">>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">>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"><</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">>findable</span><span class="plain">-</span><span class="element">>work</span><span class="plain">-</span><span class="element">>genre</span><span class="plain">-</span><span class="element">>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">>findable</span><span class="plain">-</span><span class="element">>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">>findable</span><span class="plain">-</span><span class="element">>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">>as_requirement</span><span class="plain">-</span><span class="element">>work</span><span class="plain">-</span><span class="element">>genre</span><span class="plain">-</span><span class="element">>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">>as_requirement</span><span class="plain">-</span><span class="element">>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">>as_requirement</span><span class="plain">-</span><span class="element">>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">>findable</span><span class="plain">-</span><span class="element">>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">>as_requirement</span><span class="plain">-</span><span class="element">>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>§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>§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">>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">>findable</span><span class="plain">-</span><span class="element">>work</span><span class="plain">-</span><span class="element">>genre</span><span class="plain">-</span><span class="element">>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">>findable</span><span class="plain">-</span><span class="element">>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">>findable</span><span class="plain">-</span><span class="element">>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">>as_requirement</span><span class="plain">-</span><span class="element">>work</span><span class="plain">-</span><span class="element">>genre</span><span class="plain">-</span><span class="element">>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">>as_requirement</span><span class="plain">-</span><span class="element">>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">>as_requirement</span><span class="plain">-</span><span class="element">>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">>findable</span><span class="plain">-</span><span class="element">>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">>as_requirement</span><span class="plain">-</span><span class="element">>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>§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>§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 — 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">>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">>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">>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">>edition</span><span class="plain">-</span><span class="element">>work</span><span class="plain">-</span><span class="element">>genre</span><span class="plain">)) &&</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">>edition</span><span class="plain">-</span><span class="element">>work</span><span class="plain">-</span><span class="element">>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">>edition</span><span class="plain">-</span><span class="element">>work</span><span class="plain">-</span><span class="element">>author_name</span><span class="plain">) > 0)))</span>
|
||||
<<span class="cwebmacro">Archive a single copy</span> <span class="cwebmacronumber">8.1</span>><span class="plain">;</span>
|
||||
<<span class="cwebmacro">Archive a single copy</span> <span class="cwebmacronumber">9.1</span>><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">>build_edges</span><span class="plain">)</span>
|
||||
|
@ -408,13 +423,13 @@ cannot be read from any other nest — 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>§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>§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">
|
||||
<<span class="cwebmacrodefn">Archive a single copy</span> <span class="cwebmacronumber">8.1</span>> =
|
||||
<<span class="cwebmacrodefn">Archive a single copy</span> <span class="cwebmacronumber">9.1</span>> =
|
||||
</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">§8</a>.</p>
|
||||
<p class="endnote">This code is used in <a href="#SP9">§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">
|
||||
|
|
|
@ -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>§1. </b></p>
|
||||
<p class="inwebparagraph"><a id="SP1"></a><b>§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>§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">>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">>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">>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">>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">>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">§3</a>.</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP3"></a><b>§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-->
|
||||
|
|
|
@ -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">§1. Build scripts</a></li></ul><hr class="tocbar">
|
||||
|
||||
<p class="inwebparagraph"><a id="SP1"></a><b>§1. Build scripts. </b>Simple lists of steps: nothing to see here...
|
||||
<p class="inwebparagraph"><a id="SP1"></a><b>§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">>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">>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">>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">>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">>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">§2</a>).</p>
|
||||
|
||||
<p class="endnote">The function BuildScripts::script_length is used in 3/bg (<a href="3-bg.html#SP4">§4</a>).</p>
|
||||
|
||||
<p class="endnote">The function BuildScripts::add_step is used in 3/bs2 (<a href="3-bs2.html#SP4">§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">§7.1.3</a>).</p>
|
||||
<p class="endnote">The function BuildScripts::script_length is used in 3/bg (<a href="3-bg.html#SP5">§5</a>).</p>
|
||||
|
||||
<p class="endnote">The structure build_script is private to this section.</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP2"></a><b>§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">>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">§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-->
|
||||
|
|
|
@ -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">§1. Build skills</a></li><li><a href="#SP3">§3. Build steps</a></li></ul><hr class="tocbar">
|
||||
<ul class="toc"><li><a href="#SP1">§1. Build skills</a></li><li><a href="#SP3">§3. Build steps</a></li><li><a href="#SP5">§5. Execution</a></li></ul><hr class="tocbar">
|
||||
|
||||
<p class="inwebparagraph"><a id="SP1"></a><b>§1. Build skills. </b></p>
|
||||
<p class="inwebparagraph"><a id="SP1"></a><b>§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>§2. </b></p>
|
||||
<p class="inwebparagraph"><a id="SP2"></a><b>§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>§3. Build steps. </b></p>
|
||||
<p class="inwebparagraph"><a id="SP3"></a><b>§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>§4. </b></p>
|
||||
<p class="inwebparagraph"><a id="SP4"></a><b>§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">>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">>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">>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">>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">>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">>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">>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->what_to_do->name, meth->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">>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">) && (</span><span class="identifier">Str::len</span><span class="plain">(</span><span class="identifier">command</span><span class="plain">) > 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">) && (</span><span class="identifier">meth</span><span class="plain">-</span><span class="element">>methodology</span><span class="plain"> == </span><span class="constant">INTERNAL_METHODOLOGY</span><span class="plain">)) {</span>
|
||||
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">returned</span><span class="plain"> = 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">>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">>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">§2</a>), 5/ps (<a href="5-ps.html#SP3">§3</a>).</p>
|
||||
|
||||
<p class="endnote">The function BuildSteps::execute is used in 3/bs (<a href="3-bs.html#SP1">§1</a>).</p>
|
||||
<p class="inwebparagraph"><a id="SP5"></a><b>§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">§8</a>), 4/pm (<a href="4-pm.html#SP7">§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>
|
||||
<<span class="cwebmacro">Work out a shell command, and perhaps print or call it</span> <span class="cwebmacronumber">5.1</span>><span class="plain">;</span>
|
||||
<<span class="cwebmacro">Perform the skill internally if that's called for</span> <span class="cwebmacronumber">5.2</span>><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">§2</a>).</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP5_1"></a><b>§5.1. </b><code class="display">
|
||||
<<span class="cwebmacrodefn">Work out a shell command, and perhaps print or call it</span> <span class="cwebmacronumber">5.1</span>> =
|
||||
</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">>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">) > 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">§5</a>.</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP5_2"></a><b>§5.2. </b><code class="display">
|
||||
<<span class="cwebmacrodefn">Perform the skill internally if that's called for</span> <span class="cwebmacronumber">5.2</span>> =
|
||||
</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">>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">>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">§5</a>.</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP6"></a><b>§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">>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">§5.1</a>, 4/em (<a href="4-em.html#SP8">§8</a>), 4/pm (<a href="4-pm.html#SP7">§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">
|
||||
|
|
|
@ -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">>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">>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">>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">>buildable_if_copy</span><span class="plain">-</span><span class="element">>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">>buildable_if_copy</span><span class="plain">-</span><span class="element">>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">>as_copy</span><span class="plain">-</span><span class="element">>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">>as_copy</span><span class="plain">-</span><span class="element">>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">, &</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">, &</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"> & </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"> & </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"> & </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">>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">>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"> & </span><span class="constant">BUILD_DEPENDENCIES_MATTER_GB</span><span class="plain">) </span><<span class="cwebmacro">Build the build dependencies of the node</span> <span class="cwebmacronumber">7.1.1</span>><span class="plain">;</span>
|
||||
<span class="reserved">if</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="cwebmacro">Build the use dependencies of the node</span> <span class="cwebmacronumber">7.1.2</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">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">) && (</span><span class="functiontext">Graphs::can_be_built</span><span class="plain">(</span><span class="identifier">V</span><span class="plain">))) </span><<span class="cwebmacro">Build the node itself, if necessary</span> <span class="cwebmacronumber">7.1.3</span>><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">>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">>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><<span class="cwebmacro">Decide based on timestamps</span> <span class="cwebmacronumber">7.1.3.1</span>><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">>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">>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"> & </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">) >= 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"> & </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">) >= 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>
|
||||
|
|
|
@ -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>§1. </b></p>
|
||||
<ul class="toc"><li><a href="#SP1">§1. Creation</a></li><li><a href="#SP2">§2. Assimilation</a></li><li><a href="#SP4">§4. Code generation</a></li></ul><hr class="tocbar">
|
||||
|
||||
<p class="inwebparagraph"><a id="SP1"></a><b>§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">§3</a>).</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP2"></a><b>§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">>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">>associated_copy</span><span class="plain">-</span><span class="element">>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">>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">>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">§1</a>.</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP3"></a><b>§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">>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">>associated_copy</span><span class="plain">-</span><span class="element">>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">>associated_copy</span><span class="plain">-</span><span class="element">>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">§1</a>.</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP4"></a><b>§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">>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">>vertex</span><span class="plain">-</span><span class="element">>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">>vertex</span><span class="plain">-</span><span class="element">>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">>copy</span><span class="plain">-</span><span class="element">>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">>vertex</span><span class="plain">-</span><span class="element">>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">>vertex</span><span class="plain">-</span><span class="element">>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">§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">§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">
|
||||
|
|
|
@ -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>§1. </b></p>
|
||||
<p class="inwebparagraph"><a id="SP1"></a><b>§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">>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">>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">>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">>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">>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>
|
||||
|
|
|
@ -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>§1. </b></p>
|
||||
<p class="inwebparagraph"><a id="SP1"></a><b>§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">>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">>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">>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">>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">>as_copy</span><span class="plain">-</span><span class="element">>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">>as_copy</span><span class="plain">-</span><span class="element">>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">>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">>vertex</span><span class="plain">-</span><span class="element">>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">>vertex</span><span class="plain">-</span><span class="element">>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>
|
||||
|
|
|
@ -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>§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">>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">>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">>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">>associated_copy</span><span class="plain">-</span><span class="element">>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">>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">>associated_copy</span><span class="plain">-</span><span class="element">>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">>vertex</span><span class="plain">-</span><span class="element">>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">>vertex</span><span class="plain">-</span><span class="element">>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>
|
||||
|
|
|
@ -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">>edition</span><span class="plain">-</span><span class="element">>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">>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">>vertex</span><span class="plain">-</span><span class="element">>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">>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">>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">§6</a>.</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP10"></a><b>§10. Source text. </b></p>
|
||||
|
||||
|
||||
|
|
|
@ -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">>edition</span><span class="plain">-</span><span class="element">>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">>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">§1</a>.</p>
|
||||
|
||||
<p class="endnote">The function KitManager::build_vertex is used in <a href="#SP4">§4</a>, 5/kts (<a href="5-kts.html#SP1">§1</a>).</p>
|
||||
|
||||
<p class="endnote">The function KitManager::go_operational is used in <a href="#SP1">§1</a>.</p>
|
||||
|
||||
<p class="endnote">The function KitManager::read_contents is used in 5/kts (<a href="5-kts.html#SP2">§2</a>).</p>
|
||||
|
|
|
@ -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">§1. Genre definition</a></li><li><a href="#SP5">§5. Claiming</a></li><li><a href="#SP6">§6. Searching</a></li><li><a href="#SP7">§7. Copying</a></li><li><a href="#SP8">§8. Build graph</a></li></ul><hr class="tocbar">
|
||||
<ul class="toc"><li><a href="#SP1">§1. Genre definition</a></li><li><a href="#SP5">§5. Claiming</a></li><li><a href="#SP6">§6. Searching</a></li><li><a href="#SP7">§7. Copying</a></li></ul><hr class="tocbar">
|
||||
|
||||
<p class="inwebparagraph"><a id="SP1"></a><b>§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">>edition</span><span class="plain">-</span><span class="element">>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">§2</a>.</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP8"></a><b>§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">§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-->
|
||||
|
|
|
@ -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">§1. Genre definition</a></li><li><a href="#SP3">§3. Claiming</a></li><li><a href="#SP4">§4. Searching</a></li><li><a href="#SP5">§5. Copying</a></li><li><a href="#SP6">§6. Build graph</a></li><li><a href="#SP9">§9. Source text</a></li></ul><hr class="tocbar">
|
||||
<ul class="toc"><li><a href="#SP1">§1. Genre definition</a></li><li><a href="#SP3">§3. Claiming</a></li><li><a href="#SP4">§4. Searching</a></li><li><a href="#SP5">§5. Copying</a></li><li><a href="#SP6">§6. Build graph</a></li><li><a href="#SP7">§7. Source text</a></li></ul><hr class="tocbar">
|
||||
|
||||
<p class="inwebparagraph"><a id="SP1"></a><b>§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">§6</a>, <a href="#SP8">§8</a>, <a href="#SP9">§9</a>, 1/ic (<a href="1-ic.html#SP19">§19</a>), 3/is2 (<a href="3-is2.html#SP1">§1</a>), 3/is3 (<a href="3-is3.html#SP1">§1</a>), 3/is4 (<a href="3-is4.html#SP1">§1</a>), 4/pfm (<a href="4-pfm.html#SP9">§9</a>).</p>
|
||||
<p class="endnote">The function ProjectBundleManager::from_copy is used in <a href="#SP6">§6</a>, <a href="#SP7">§7</a>, 1/ic (<a href="1-ic.html#SP19">§19</a>), 3/is2 (<a href="3-is2.html#SP1">§1</a>), 3/is3 (<a href="3-is3.html#SP1">§1</a>), 3/is4 (<a href="3-is4.html#SP1">§1</a>), 4/pfm (<a href="4-pfm.html#SP7">§7</a>).</p>
|
||||
|
||||
<p class="endnote">The function ProjectBundleManager::new_copy is used in <a href="#SP3">§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">>edition</span><span class="plain">-</span><span class="element">>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">>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">§1</a>.</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP7"></a><b>§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">§3</a>.</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP8"></a><b>§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">§1</a>.</p>
|
||||
|
||||
<p class="endnote">The function ProjectBundleManager::go_operational is used in <a href="#SP1">§1</a>.</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP9"></a><b>§9. Source text. </b></p>
|
||||
<p class="inwebparagraph"><a id="SP7"></a><b>§7. Source text. </b></p>
|
||||
|
||||
|
||||
<pre class="display">
|
||||
|
|
|
@ -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">§1. Genre definition</a></li><li><a href="#SP3">§3. Claiming</a></li><li><a href="#SP4">§4. Searching</a></li><li><a href="#SP5">§5. Copying</a></li><li><a href="#SP6">§6. Build graph</a></li><li><a href="#SP9">§9. Source text</a></li></ul><hr class="tocbar">
|
||||
<ul class="toc"><li><a href="#SP1">§1. Genre definition</a></li><li><a href="#SP3">§3. Claiming</a></li><li><a href="#SP4">§4. Searching</a></li><li><a href="#SP5">§5. Copying</a></li><li><a href="#SP6">§6. Build graph</a></li><li><a href="#SP7">§7. Source text</a></li></ul><hr class="tocbar">
|
||||
|
||||
<p class="inwebparagraph"><a id="SP1"></a><b>§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">§6</a>, <a href="#SP8">§8</a>, 1/ic (<a href="1-ic.html#SP19">§19</a>), 3/is2 (<a href="3-is2.html#SP1">§1</a>), 3/is3 (<a href="3-is3.html#SP1">§1</a>), 3/is4 (<a href="3-is4.html#SP1">§1</a>).</p>
|
||||
<p class="endnote">The function ProjectFileManager::from_copy is used in <a href="#SP6">§6</a>, 1/ic (<a href="1-ic.html#SP19">§19</a>), 3/is2 (<a href="3-is2.html#SP1">§1</a>), 3/is3 (<a href="3-is3.html#SP1">§1</a>), 3/is4 (<a href="3-is4.html#SP1">§1</a>).</p>
|
||||
|
||||
<p class="endnote">The function ProjectFileManager::new_copy is used in <a href="#SP3">§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">>edition</span><span class="plain">-</span><span class="element">>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">>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">§1</a>.</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP7"></a><b>§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">§3</a>.</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP8"></a><b>§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">§1</a>.</p>
|
||||
|
||||
<p class="endnote">The function ProjectFileManager::go_operational is used in <a href="#SP1">§1</a>.</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP9"></a><b>§9. Source text. </b></p>
|
||||
<p class="inwebparagraph"><a id="SP7"></a><b>§7. Source text. </b></p>
|
||||
|
||||
|
||||
<pre class="display">
|
||||
|
|
|
@ -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">§1. Genre definition</a></li><li><a href="#SP5">§5. Claiming</a></li><li><a href="#SP6">§6. Searching</a></li><li><a href="#SP7">§7. Copying</a></li><li><a href="#SP8">§8. Build graph</a></li></ul><hr class="tocbar">
|
||||
<ul class="toc"><li><a href="#SP1">§1. Genre definition</a></li><li><a href="#SP5">§5. Claiming</a></li><li><a href="#SP6">§6. Searching</a></li><li><a href="#SP7">§7. Copying</a></li></ul><hr class="tocbar">
|
||||
|
||||
<p class="inwebparagraph"><a id="SP1"></a><b>§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">>edition</span><span class="plain">-</span><span class="element">>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">§2</a>.</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP8"></a><b>§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">§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-->
|
||||
|
|
|
@ -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">§1. Genre definition</a></li><li><a href="#SP4">§4. Claiming</a></li><li><a href="#SP5">§5. Searching</a></li><li><a href="#SP6">§6. Copying</a></li><li><a href="#SP7">§7. Build graph</a></li></ul><hr class="tocbar">
|
||||
<ul class="toc"><li><a href="#SP1">§1. Genre definition</a></li><li><a href="#SP4">§4. Claiming</a></li><li><a href="#SP5">§5. Searching</a></li><li><a href="#SP6">§6. Copying</a></li></ul><hr class="tocbar">
|
||||
|
||||
<p class="inwebparagraph"><a id="SP1"></a><b>§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">>edition</span><span class="plain">-</span><span class="element">>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">§1</a>.</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP7"></a><b>§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">§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-->
|
||||
|
|
|
@ -133,7 +133,7 @@
|
|||
|
||||
<p class="endnote">The function Extensions::scan is used in 4/em (<a href="4-em.html#SP5">§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>§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
|
||||
|
|
|
@ -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">>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">>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">§3</a>).</p>
|
||||
|
||||
<p class="endnote">The function Kits::inter_paths is used in 3/is (<a href="3-is.html#SP1">§1</a>).</p>
|
||||
<p class="endnote">The function Kits::inter_paths is used in 3/is (<a href="3-is.html#SP4">§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>
|
||||
|
||||
|
|
|
@ -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>§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:
|
||||
|
|
|
@ -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">>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">>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">>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">>source_vertices</span><span class="plain">) == 0) && (</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">>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">>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">>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>§1.1. </b><code class="display">
|
||||
<<span class="cwebmacrodefn">Perform if-this-then-that</span> <span class="cwebmacronumber">1.1</span>> =
|
||||
|
@ -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">§4</a>.</p>
|
||||
|
||||
<p class="endnote">The function Projects::list_of_inter_libraries is used in 3/is (<a href="3-is.html#SP1">§1</a>).</p>
|
||||
<p class="endnote">The function Projects::list_of_inter_libraries is used in 3/is (<a href="3-is.html#SP4">§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">§8</a>), 4/pfm (<a href="4-pfm.html#SP8">§8</a>).</p>
|
||||
<p class="endnote">The function Projects::construct_graph is used in 4/pbm (<a href="4-pbm.html#SP6">§6</a>), 4/pfm (<a href="4-pfm.html#SP6">§6</a>).</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP4"></a><b>§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">>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">>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">>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">>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">>annotation</span><span class="plain">,</span>
|
||||
<span class="identifier">N</span><span class="plain">-</span><span class="element">>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">>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">>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">§9</a>), 4/pfm (<a href="4-pfm.html#SP9">§9</a>).</p>
|
||||
<p class="endnote">The function Projects::read_source_text_for is used in 4/pbm (<a href="4-pbm.html#SP7">§7</a>), 4/pfm (<a href="4-pfm.html#SP7">§7</a>).</p>
|
||||
|
||||
<p class="inwebparagraph"><a id="SP5"></a><b>§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 — 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">>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">>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>
|
||||
|
|
|
@ -81,7 +81,7 @@
|
|||
|
||||
<p class="endnote">The function Pipelines::new_ip is used in 4/pm (<a href="4-pm.html#SP4">§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">
|
||||
|
|
|
@ -81,7 +81,7 @@
|
|||
|
||||
<p class="endnote">The function Templates::new_it is used in 4/tm (<a href="4-tm.html#SP3">§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">
|
||||
|
|
|
@ -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">) && (</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">>as_copy</span><span class="plain">-</span><span class="element">>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">>buildable_if_copy</span><span class="plain">-</span><span class="element">>edition</span><span class="plain">-</span><span class="element">>work</span><span class="plain">-</span><span class="element">>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">>as_copy</span><span class="plain">-</span><span class="element">>edition</span><span class="plain">-</span><span class="element">>work</span><span class="plain">-</span><span class="element">>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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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)))
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
prepare <- *attach
|
||||
prepare <- *kit
|
||||
merge-template <- all
|
||||
parse-linked-matter
|
||||
resolve-conditional-compilation
|
||||
|
|
|
@ -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,
|
||||
|
|
Loading…
Reference in a new issue