mirror of
https://github.com/ganelson/inform.git
synced 2024-07-17 06:24:24 +03:00
545 lines
64 KiB
HTML
545 lines
64 KiB
HTML
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
|
<html>
|
|
<head>
|
|
<title>M/rc</title>
|
|
<meta name="viewport" content="width=device-width initial-scale=1">
|
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
|
<meta http-equiv="Content-Language" content="en-gb">
|
|
<link href="../inweb.css" rel="stylesheet" rev="stylesheet" type="text/css">
|
|
</head>
|
|
<body>
|
|
<nav role="navigation">
|
|
<h1><a href="../webs.html">Sources</a></h1>
|
|
<ul>
|
|
<li><a href="../compiler.html"><b>compiler tools</b></a></li>
|
|
<li><a href="../other.html">other tools</a></li>
|
|
<li><a href="../extensions.html">extensions and kits</a></li>
|
|
<li><a href="../units.html">unit test tools</a></li>
|
|
</ul>
|
|
<h2>Compiler Webs</h2>
|
|
<ul>
|
|
<li><a href="../inbuild/index.html">inbuild</a></li>
|
|
<li><a href="../inform7/index.html">inform7</a></li>
|
|
<li><a href="../inter/index.html">inter</a></li>
|
|
</ul>
|
|
<h2>Inbuild Modules</h2>
|
|
<ul>
|
|
<li><a href="../inbuild-module/index.html">inbuild</a></li>
|
|
<li><a href="../arch-module/index.html">arch</a></li>
|
|
<li><a href="../words-module/index.html">words</a></li>
|
|
<li><a href="../syntax-module/index.html">syntax</a></li>
|
|
<li><a href="../html-module/index.html">html</a></li>
|
|
</ul>
|
|
<h2>Inform7 Modules</h2>
|
|
<ul>
|
|
<li><a href="../core-module/index.html">core</a></li>
|
|
<li><a href="../problems-module/index.html">problems</a></li>
|
|
<li><a href="../inflections-module/index.html">inflections</a></li>
|
|
<li><a href="../linguistics-module/index.html">linguistics</a></li>
|
|
<li><a href="../kinds-module/index.html">kinds</a></li>
|
|
<li><a href="../if-module/index.html">if</a></li>
|
|
<li><a href="../multimedia-module/index.html">multimedia</a></li>
|
|
<li><a href="../index-module/index.html">index</a></li>
|
|
</ul>
|
|
<h2>Inter Modules</h2>
|
|
<ul>
|
|
<li><a href="../inter-module/index.html">inter</a></li>
|
|
<li><a href="../building-module/index.html">building</a></li>
|
|
<li><a href="../codegen-module/index.html">codegen</a></li>
|
|
</ul>
|
|
<h2>Foundation</h2>
|
|
<ul>
|
|
<li><a href="../../../inweb/docs/foundation-module/index.html">foundation</a></li>
|
|
</ul>
|
|
|
|
|
|
</nav>
|
|
<main role="main">
|
|
|
|
<!--Weave of '1/mn' generated by 7-->
|
|
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Tools</a></li><li><a href="index.html">inbuild</a></li><li><a href="index.html#1">Chapter 1: Outside of inform7</a></li><li><b>Main</b></li></ul><p class="purpose">A command-line interface for Inbuild functions which are not part of the normal operation of the Inform compiler.</p>
|
|
|
|
<ul class="toc"><li><a href="#SP1">§1. Settings variables</a></li><li><a href="#SP2">§2. Main routine</a></li><li><a href="#SP2_6">§2.6. Target list</a></li><li><a href="#SP2_7">§2.7. Command line</a></li><li><a href="#SP5">§5. Interface to Words module</a></li><li><a href="#SP6">§6. Interface to Syntax module</a></li></ul><hr class="tocbar">
|
|
|
|
<p class="inwebparagraph"><a id="SP1"></a><b>§1. Settings variables. </b>The following will be set at the command line.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">path_to_inbuild</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">inbuild_task</span><span class="plain"> = </span><span class="constant">INSPECT_TTASK</span><span class="plain">;</span>
|
|
<span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">path_to_tools</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">dry_run_mode</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">, </span><span class="identifier">build_trace_mode</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
|
|
<span class="reserved">inbuild_nest</span><span class="plain"> *</span><span class="identifier">destination_nest</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">filter_text</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">unit_test</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="inwebparagraph"><a id="SP2"></a><b>§2. Main routine. </b>When Inbuild is called at the command line, it begins at <code class="display"><span class="extract">main</span></code>, like all C
|
|
programs.
|
|
</p>
|
|
|
|
<p class="inwebparagraph">Inbuild manages "copies", which are instances of programs or resources found
|
|
somewhere in the file system. The copies which it acts on in a given run are
|
|
called "targets". The task of <code class="display"><span class="extract">main</span></code> is to read the command-line arguments,
|
|
set the following variables as needed, and produce a list of targets to work
|
|
on; then to carry out that work, and then shut down again.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">main</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">argc</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> **</span><span class="identifier">argv</span><span class="plain">) {</span>
|
|
<<span class="cwebmacro">Start up the modules</span> <span class="cwebmacronumber">2.1</span>><span class="plain">;</span>
|
|
<<span class="cwebmacro">Read the command line</span> <span class="cwebmacronumber">2.7</span>><span class="plain">;</span>
|
|
<span class="functiontext">CommandLine::play_back_log</span><span class="plain">();</span>
|
|
<<span class="cwebmacro">Complete the list of targets</span> <span class="cwebmacronumber">2.2</span>><span class="plain">;</span>
|
|
<<span class="cwebmacro">Act on the targets</span> <span class="cwebmacronumber">2.3</span>><span class="plain">;</span>
|
|
<<span class="cwebmacro">Shut down the modules</span> <span class="cwebmacronumber">2.4</span>><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Errors::have_occurred</span><span class="plain">()) </span><span class="reserved">return</span><span class="plain"> 1;</span>
|
|
<span class="reserved">return</span><span class="plain"> 0;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function main is used in 1/ic (<a href="1-ic.html#SP23">§23</a>), 5/kts (<a href="5-kts.html#SP1">§1</a>), 6/st (<a href="6-st.html#SP1">§1</a>).</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP2_1"></a><b>§2.1. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Start up the modules</span> <span class="cwebmacronumber">2.1</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="functiontext">Foundation::start</span><span class="plain">(); </span> <span class="comment">must be started first</span>
|
|
<span class="functiontext">WordsModule::start</span><span class="plain">();</span>
|
|
<span class="functiontext">SyntaxModule::start</span><span class="plain">();</span>
|
|
<span class="functiontext">HTMLModule::start</span><span class="plain">();</span>
|
|
<span class="functiontext">ArchModule::start</span><span class="plain">();</span>
|
|
<span class="functiontext">InbuildModule::start</span><span class="plain">();</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP2">§2</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP2_2"></a><b>§2.2. </b>Targets can arise in three ways:
|
|
</p>
|
|
|
|
<ul class="items"><li>(1) They can be specified at the command line, either as bare names of files
|
|
or paths, or with <code class="display"><span class="extract">-contents-of D</span></code> for a directory <code class="display"><span class="extract">D</span></code>. By the time the code
|
|
in this paragraph runs, those targets are already in the list.
|
|
</li><li>(2) They can be specified by a search request <code class="display"><span class="extract">-matching R</span></code> where <code class="display"><span class="extract">R</span></code> is a
|
|
list of requirements to match. We now add anything found that way. (We didn't
|
|
do so when reading the command line because at that time the search path for
|
|
nests did not yet exist: it is created when <code class="display"><span class="extract">Inbuild::optioneering_complete</span></code>
|
|
is called.)
|
|
</li><li>(3) One copy is always special to Inbuild: the "project", usually an Inform
|
|
project bundle with a pathname like <code class="display"><span class="extract">Counterfeit Monkey.inform</span></code>. We go
|
|
through a little dance with <code class="display"><span class="extract">Inbuild::optioneering_complete</span></code> to ensure that
|
|
if a project is already in the target list, Inbuild will use that; and if not,
|
|
but the user has specified a project to Inbuild already with <code class="display"><span class="extract">-project</span></code> (a
|
|
command-line option recognised by <code class="display"><span class="extract">inbuild</span></code> but not by us), then we add that
|
|
to the target list. Tne net result is that however the user indicates interest
|
|
in an Inform project bundle, it becomes both the Inbuild current project, and
|
|
also a member of our target list. It follows that we cannot have two project
|
|
bundles in the target list, because they cannot both be the current project;
|
|
and to avoid the user being confused when only one is acted on, we throw an
|
|
error in this case.
|
|
</li></ul>
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Complete the list of targets</span> <span class="cwebmacronumber">2.2</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">linked_list</span><span class="plain"> *</span><span class="identifier">L</span><span class="plain"> = </span><span class="functiontext">Main::list_of_targets</span><span class="plain">();</span>
|
|
<span class="reserved">inbuild_copy</span><span class="plain"> *</span><span class="identifier">proj</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="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">, </span><span class="reserved">inbuild_copy</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">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="identifier">project_bundle_genre</span><span class="plain">)</span>
|
|
<span class="identifier">proj</span><span class="plain"> = </span><span class="identifier">C</span><span class="plain">;</span>
|
|
<span class="identifier">proj</span><span class="plain"> = </span><span class="functiontext">Inbuild::optioneering_complete</span><span class="plain">(</span><span class="identifier">proj</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">, &</span><span class="functiontext">Main::load_preform</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">proj</span><span class="plain">) </span><span class="functiontext">Main::add_target</span><span class="plain">(</span><span class="identifier">proj</span><span class="plain">);</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">count</span><span class="plain"> = 0;</span>
|
|
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">, </span><span class="reserved">inbuild_copy</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">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="identifier">project_bundle_genre</span><span class="plain">)</span>
|
|
<span class="identifier">count</span><span class="plain">++;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">count</span><span class="plain"> > 1)</span>
|
|
<span class="functiontext">Errors::with_text</span><span class="plain">(</span><span class="string">"can only work on one project bundle at a time"</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="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">filter_text</span><span class="plain">) > 0) </span><span class="functiontext">Main::add_search_results_as_targets</span><span class="plain">(</span><span class="identifier">filter_text</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP2">§2</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP2_3"></a><b>§2.3. </b>We make the function call <code class="display"><span class="extract">Inbuild::go_operational</span></code> to signal to <code class="display"><span class="extract">inbuild</span></code>
|
|
that we want to start work now.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Act on the targets</span> <span class="cwebmacronumber">2.3</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="functiontext">Inbuild::go_operational</span><span class="plain">();</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">unit_test</span><span class="plain">) > 0) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="identifier">unit_test</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"compatibility"</span><span class="plain">)) </span><span class="functiontext">Compatibility::test</span><span class="plain">(</span><span class="constant">STDOUT</span><span class="plain">);</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="functiontext">Errors::with_text</span><span class="plain">(</span><span class="string">"no such unit test: %S"</span><span class="plain">, </span><span class="identifier">unit_test</span><span class="plain">);</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">use</span><span class="plain"> = </span><span class="constant">SHELL_METHODOLOGY</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">dry_run_mode</span><span class="plain">) </span><span class="identifier">use</span><span class="plain"> = </span><span class="constant">DRY_RUN_METHODOLOGY</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">path_to_tools</span><span class="plain">) </span><span class="identifier">BM</span><span class="plain"> = </span><span class="functiontext">BuildMethodology::new</span><span class="plain">(</span><span class="identifier">path_to_tools</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">, </span><span class="identifier">use</span><span class="plain">);</span>
|
|
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">BM</span><span class="plain"> = </span><span class="functiontext">BuildMethodology::new</span><span class="plain">(</span><span class="functiontext">Pathnames::up</span><span class="plain">(</span><span class="identifier">path_to_inbuild</span><span class="plain">), </span><span class="constant">TRUE</span><span class="plain">, </span><span class="identifier">use</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">build_trace_mode</span><span class="plain">) </span><span class="identifier">trace_ibg</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">linked_list</span><span class="plain"> *</span><span class="identifier">L</span><span class="plain"> = </span><span class="functiontext">Main::list_of_targets</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">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">, </span><span class="reserved">inbuild_copy</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">)</span>
|
|
<<span class="cwebmacro">Carry out the required task on the copy C</span> <span class="cwebmacronumber">2.3.2</span>><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP2">§2</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP2_3_1"></a><b>§2.3.1. </b>The list of possible tasks is as follows; they basically all correspond to
|
|
utility functions in the <code class="display"><span class="extract">inbuild</span></code> module, which we call.
|
|
</p>
|
|
|
|
|
|
<pre class="definitions">
|
|
<span class="definitionkeyword">enum</span> <span class="constant">INSPECT_TTASK</span><span class="definitionkeyword"> from </span><span class="constant">1</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">GRAPH_TTASK</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">USE_NEEDS_TTASK</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">BUILD_NEEDS_TTASK</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">ARCHIVE_TTASK</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">ARCHIVE_TO_TTASK</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">USE_MISSING_TTASK</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">BUILD_MISSING_TTASK</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">BUILD_TTASK</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">REBUILD_TTASK</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">COPY_TO_TTASK</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">SYNC_TO_TTASK</span>
|
|
</pre>
|
|
<p class="inwebparagraph"><a id="SP2_3_2"></a><b>§2.3.2. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Carry out the required task on the copy C</span> <span class="cwebmacronumber">2.3.2</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">inbuild_task</span><span class="plain">) {</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">INSPECT_TTASK</span><span class="plain">: </span><span class="functiontext">Copies::inspect</span><span class="plain">(</span><span class="constant">STDOUT</span><span class="plain">, </span><span class="identifier">C</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">GRAPH_TTASK</span><span class="plain">: </span><span class="functiontext">Copies::show_graph</span><span class="plain">(</span><span class="constant">STDOUT</span><span class="plain">, </span><span class="identifier">C</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">USE_NEEDS_TTASK</span><span class="plain">: </span><span class="functiontext">Copies::show_needs</span><span class="plain">(</span><span class="constant">STDOUT</span><span class="plain">, </span><span class="identifier">C</span><span class="plain">, </span><span class="constant">TRUE</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">BUILD_NEEDS_TTASK</span><span class="plain">: </span><span class="functiontext">Copies::show_needs</span><span class="plain">(</span><span class="constant">STDOUT</span><span class="plain">, </span><span class="identifier">C</span><span class="plain">, </span><span class="constant">FALSE</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">ARCHIVE_TTASK</span><span class="plain">:</span>
|
|
<span class="identifier">destination_nest</span><span class="plain"> = </span><span class="functiontext">Inbuild::materials_nest</span><span class="plain">();</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">destination_nest</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">)</span>
|
|
<span class="functiontext">Errors::with_text</span><span class="plain">(</span><span class="string">"no -project in use, so ignoring -archive"</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
|
|
<span class="reserved">else</span>
|
|
<span class="functiontext">Copies::archive</span><span class="plain">(</span><span class="constant">STDOUT</span><span class="plain">, </span><span class="identifier">C</span><span class="plain">, </span><span class="identifier">destination_nest</span><span class="plain">, </span><span class="identifier">BM</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">ARCHIVE_TO_TTASK</span><span class="plain">: </span><span class="functiontext">Copies::archive</span><span class="plain">(</span><span class="constant">STDOUT</span><span class="plain">, </span><span class="identifier">C</span><span class="plain">, </span><span class="identifier">destination_nest</span><span class="plain">, </span><span class="identifier">BM</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">USE_MISSING_TTASK</span><span class="plain">: </span><span class="functiontext">Copies::show_missing</span><span class="plain">(</span><span class="constant">STDOUT</span><span class="plain">, </span><span class="identifier">C</span><span class="plain">, </span><span class="constant">TRUE</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">BUILD_MISSING_TTASK</span><span class="plain">: </span><span class="functiontext">Copies::show_missing</span><span class="plain">(</span><span class="constant">STDOUT</span><span class="plain">, </span><span class="identifier">C</span><span class="plain">, </span><span class="constant">FALSE</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">BUILD_TTASK</span><span class="plain">: </span><span class="functiontext">Copies::build</span><span class="plain">(</span><span class="constant">STDOUT</span><span class="plain">, </span><span class="identifier">C</span><span class="plain">, </span><span class="identifier">BM</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">REBUILD_TTASK</span><span class="plain">: </span><span class="functiontext">Copies::rebuild</span><span class="plain">(</span><span class="constant">STDOUT</span><span class="plain">, </span><span class="identifier">C</span><span class="plain">, </span><span class="identifier">BM</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_TO_TTASK</span><span class="plain">: </span><span class="functiontext">Nests::copy_to</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">, </span><span class="identifier">destination_nest</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">, </span><span class="identifier">BM</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">SYNC_TO_TTASK</span><span class="plain">: </span><span class="functiontext">Nests::copy_to</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">, </span><span class="identifier">destination_nest</span><span class="plain">, </span><span class="constant">TRUE</span><span class="plain">, </span><span class="identifier">BM</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP2_3">§2.3</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP2_4"></a><b>§2.4. </b><code class="display">
|
|
<<span class="cwebmacrodefn">Shut down the modules</span> <span class="cwebmacronumber">2.4</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="functiontext">ArchModule::end</span><span class="plain">();</span>
|
|
<span class="functiontext">InbuildModule::end</span><span class="plain">();</span>
|
|
<span class="functiontext">HTMLModule::end</span><span class="plain">();</span>
|
|
<span class="functiontext">SyntaxModule::end</span><span class="plain">();</span>
|
|
<span class="functiontext">WordsModule::end</span><span class="plain">();</span>
|
|
<span class="functiontext">Foundation::end</span><span class="plain">(); </span> <span class="comment">must be ended last</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP2">§2</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP2_5"></a><b>§2.5. </b>Preform is the crowning jewel of the <code class="display"><span class="extract">words</span></code> module, and parses excerpts of
|
|
natural-language text against a "grammar". The <code class="display"><span class="extract">inform7</span></code> executable makes very
|
|
heavy-duty use of Preform, but we use a much coarser grammar, which simply
|
|
breaks down source text into sentences, headings and so on. That grammar is
|
|
stored in a file called <code class="display"><span class="extract">Syntax.preform</span></code> inside the installation of Inbuild,
|
|
which is why we need to have worked out <code class="display"><span class="extract">path_to_inbuild</span></code> (the pathname at
|
|
which we are installed) already. Once the following is run, Preform is ready
|
|
for use.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Main::load_preform</span><span class="plain">(</span><span class="reserved">inform_language</span><span class="plain"> *</span><span class="identifier">L</span><span class="plain">) {</span>
|
|
<span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain"> = </span><span class="functiontext">Pathnames::subfolder</span><span class="plain">(</span><span class="identifier">path_to_inbuild</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Tangled"</span><span class="plain">);</span>
|
|
<span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain"> = </span><span class="functiontext">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">"Syntax.preform"</span><span class="plain">);</span>
|
|
<span class="reserved">wording</span><span class="plain"> </span><span class="identifier">W</span><span class="plain"> = </span><span class="functiontext">Preform::load_from_file</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">);</span>
|
|
<span class="functiontext">Preform::parse_preform</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function Main::load_preform is used in <a href="#SP2_2">§2.2</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP2_6"></a><b>§2.6. Target list. </b>This where we keep the list of targets, in which no copy occurs more than
|
|
once. The following code runs quadratically in the number of targets, but for
|
|
Inbuild this number is never likely to be more than about 100 at a time.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">linked_list</span><span class="plain"> *</span><span class="identifier">targets</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">; </span> <span class="comment">of <code class="display"><span class="extract">inbuild_copy</span></code></span>
|
|
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Main::add_target</span><span class="plain">(</span><span class="reserved">inbuild_copy</span><span class="plain"> *</span><span class="identifier">to_add</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">targets</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">targets</span><span class="plain"> = </span><span class="identifier">NEW_LINKED_LIST</span><span class="plain">(</span><span class="reserved">inbuild_copy</span><span class="plain">);</span>
|
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">found</span><span class="plain"> = </span><span class="constant">FALSE</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">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">, </span><span class="reserved">inbuild_copy</span><span class="plain">, </span><span class="identifier">targets</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">to_add</span><span class="plain">)</span>
|
|
<span class="identifier">found</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">found</span><span class="plain"> == </span><span class="constant">FALSE</span><span class="plain">) </span><span class="identifier">ADD_TO_LINKED_LIST</span><span class="plain">(</span><span class="identifier">to_add</span><span class="plain">, </span><span class="reserved">inbuild_copy</span><span class="plain">, </span><span class="identifier">targets</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">linked_list</span><span class="plain"> *</span><span class="functiontext">Main::list_of_targets</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">targets</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">targets</span><span class="plain"> = </span><span class="identifier">NEW_LINKED_LIST</span><span class="plain">(</span><span class="reserved">inbuild_copy</span><span class="plain">);</span>
|
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">targets</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Main::add_search_results_as_targets</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">req_text</span><span class="plain">) {</span>
|
|
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">errors</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::from_text</span><span class="plain">(</span><span class="identifier">req_text</span><span class="plain">, </span><span class="identifier">errors</span><span class="plain">);</span>
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">errors</span><span class="plain">) > 0) {</span>
|
|
<span class="functiontext">Errors::with_text</span><span class="plain">(</span><span class="string">"requirement malformed: %S"</span><span class="plain">, </span><span class="identifier">errors</span><span class="plain">);</span>
|
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
|
<span class="reserved">linked_list</span><span class="plain"> *</span><span class="identifier">L</span><span class="plain"> = </span><span class="identifier">NEW_LINKED_LIST</span><span class="plain">(</span><span class="reserved">inbuild_search_result</span><span class="plain">);</span>
|
|
<span class="functiontext">Nests::search_for</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="identifier">L</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="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">R</span><span class="plain">, </span><span class="reserved">inbuild_search_result</span><span class="plain">, </span><span class="identifier">L</span><span class="plain">)</span>
|
|
<span class="functiontext">Main::add_target</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="plain">}</span>
|
|
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">errors</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Main::add_directory_contents_targets</span><span class="plain">(</span><span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">) {</span>
|
|
<span class="reserved">scan_directory</span><span class="plain"> *</span><span class="identifier">D</span><span class="plain"> = </span><span class="functiontext">Directories::open</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">);</span>
|
|
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">LEAFNAME</span><span class="plain">);</span>
|
|
<span class="reserved">while</span><span class="plain"> (</span><span class="functiontext">Directories::next</span><span class="plain">(</span><span class="identifier">D</span><span class="plain">, </span><span class="identifier">LEAFNAME</span><span class="plain">)) {</span>
|
|
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">FILENAME</span><span class="plain">);</span>
|
|
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">FILENAME</span><span class="plain">, </span><span class="string">"%p%c%S"</span><span class="plain">, </span><span class="identifier">P</span><span class="plain">, </span><span class="constant">FOLDER_SEPARATOR</span><span class="plain">, </span><span class="identifier">LEAFNAME</span><span class="plain">);</span>
|
|
<span class="functiontext">Main::add_file_or_path_as_target</span><span class="plain">(</span><span class="identifier">FILENAME</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">);</span>
|
|
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">FILENAME</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">LEAFNAME</span><span class="plain">);</span>
|
|
<span class="functiontext">Directories::close</span><span class="plain">(</span><span class="identifier">D</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Main::add_file_or_path_as_target</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">arg</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">throwing_error</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">Copies::claim</span><span class="plain">(</span><span class="identifier">arg</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="reserved">if</span><span class="plain"> (</span><span class="identifier">throwing_error</span><span class="plain">) </span><span class="functiontext">Errors::with_text</span><span class="plain">(</span><span class="string">"unable to identify '%S'"</span><span class="plain">, </span><span class="identifier">arg</span><span class="plain">);</span>
|
|
<span class="reserved">return</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="functiontext">Main::add_target</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 Main::add_target is used in <a href="#SP2_2">§2.2</a>.</p>
|
|
|
|
<p class="endnote">The function Main::list_of_targets is used in <a href="#SP2_2">§2.2</a>, <a href="#SP2_3">§2.3</a>.</p>
|
|
|
|
<p class="endnote">The function Main::add_search_results_as_targets is used in <a href="#SP2_2">§2.2</a>.</p>
|
|
|
|
<p class="endnote">The function Main::add_directory_contents_targets is used in <a href="#SP3">§3</a>.</p>
|
|
|
|
<p class="endnote">The function Main::add_file_or_path_as_target is used in <a href="#SP4">§4</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP2_7"></a><b>§2.7. Command line. </b>Note the call below to <code class="display"><span class="extract">Inbuild::declare_options</span></code>, which adds a whole lot of
|
|
other options to the selection defined here.
|
|
</p>
|
|
|
|
|
|
<pre class="definitions">
|
|
<span class="definitionkeyword">define</span> <span class="constant">INTOOL_NAME</span><span class="plain"> </span><span class="string">"inbuild"</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">BUILD_CLSW</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">REBUILD_CLSW</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">GRAPH_CLSW</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">USE_NEEDS_CLSW</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">BUILD_NEEDS_CLSW</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">USE_MISSING_CLSW</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">BUILD_MISSING_CLSW</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">ARCHIVE_CLSW</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">ARCHIVE_TO_CLSW</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">INSPECT_CLSW</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">DRY_CLSW</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">BUILD_TRACE_CLSW</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">TOOLS_CLSW</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">CONTENTS_OF_CLSW</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">MATCHING_CLSW</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">COPY_TO_CLSW</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">SYNC_TO_CLSW</span>
|
|
<span class="definitionkeyword">enum</span> <span class="constant">UNIT_TEST_CLSW</span>
|
|
</pre>
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="cwebmacrodefn">Read the command line</span> <span class="cwebmacronumber">2.7</span>> =
|
|
</code></p>
|
|
|
|
|
|
<pre class="displaydefn">
|
|
<span class="functiontext">CommandLine::declare_heading</span><span class="plain">(</span>
|
|
<span class="identifier">L</span><span class="string">"[[Purpose]]\</span><span class="plain">n</span><span class="string">\</span><span class="plain">n</span><span class="string">"</span>
|
|
<span class="identifier">L</span><span class="string">"usage: inbuild [-TASK] TARGET1 TARGET2 ...\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
|
|
<span class="functiontext">CommandLine::declare_switch</span><span class="plain">(</span><span class="constant">COPY_TO_CLSW</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"copy-to"</span><span class="plain">, 2,</span>
|
|
<span class="identifier">L</span><span class="string">"copy target(s) to nest X"</span><span class="plain">);</span>
|
|
<span class="functiontext">CommandLine::declare_switch</span><span class="plain">(</span><span class="constant">SYNC_TO_CLSW</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"sync-to"</span><span class="plain">, 2,</span>
|
|
<span class="identifier">L</span><span class="string">"forcibly copy target(s) to nest X, even if prior version already there"</span><span class="plain">);</span>
|
|
<span class="functiontext">CommandLine::declare_switch</span><span class="plain">(</span><span class="constant">BUILD_CLSW</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"build"</span><span class="plain">, 1,</span>
|
|
<span class="identifier">L</span><span class="string">"incrementally build target(s)"</span><span class="plain">);</span>
|
|
<span class="functiontext">CommandLine::declare_switch</span><span class="plain">(</span><span class="constant">REBUILD_CLSW</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"rebuild"</span><span class="plain">, 1,</span>
|
|
<span class="identifier">L</span><span class="string">"completely rebuild target(s)"</span><span class="plain">);</span>
|
|
<span class="functiontext">CommandLine::declare_switch</span><span class="plain">(</span><span class="constant">INSPECT_CLSW</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"inspect"</span><span class="plain">, 1,</span>
|
|
<span class="identifier">L</span><span class="string">"show target(s) but take no action"</span><span class="plain">);</span>
|
|
<span class="functiontext">CommandLine::declare_switch</span><span class="plain">(</span><span class="constant">GRAPH_CLSW</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"graph"</span><span class="plain">, 1,</span>
|
|
<span class="identifier">L</span><span class="string">"show dependency graph of target(s) but take no action"</span><span class="plain">);</span>
|
|
<span class="functiontext">CommandLine::declare_switch</span><span class="plain">(</span><span class="constant">USE_NEEDS_CLSW</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"use-needs"</span><span class="plain">, 1,</span>
|
|
<span class="identifier">L</span><span class="string">"show all the extensions, kits and so on needed to use"</span><span class="plain">);</span>
|
|
<span class="functiontext">CommandLine::declare_switch</span><span class="plain">(</span><span class="constant">BUILD_NEEDS_CLSW</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"build-needs"</span><span class="plain">, 1,</span>
|
|
<span class="identifier">L</span><span class="string">"show all the extensions, kits and so on needed to build"</span><span class="plain">);</span>
|
|
<span class="functiontext">CommandLine::declare_switch</span><span class="plain">(</span><span class="constant">USE_MISSING_CLSW</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"use-missing"</span><span class="plain">, 1,</span>
|
|
<span class="identifier">L</span><span class="string">"show the extensions, kits and so on which are needed to use but missing"</span><span class="plain">);</span>
|
|
<span class="functiontext">CommandLine::declare_switch</span><span class="plain">(</span><span class="constant">BUILD_MISSING_CLSW</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"build-missing"</span><span class="plain">, 1,</span>
|
|
<span class="identifier">L</span><span class="string">"show the extensions, kits and so on which are needed to build but missing"</span><span class="plain">);</span>
|
|
<span class="functiontext">CommandLine::declare_switch</span><span class="plain">(</span><span class="constant">ARCHIVE_CLSW</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"archive"</span><span class="plain">, 1,</span>
|
|
<span class="identifier">L</span><span class="string">"sync copies of all extensions, kits and so on needed for -project into Materials"</span><span class="plain">);</span>
|
|
<span class="functiontext">CommandLine::declare_switch</span><span class="plain">(</span><span class="constant">ARCHIVE_TO_CLSW</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"archive-to"</span><span class="plain">, 2,</span>
|
|
<span class="identifier">L</span><span class="string">"sync copies of all extensions, kits and so on needed into nest X"</span><span class="plain">);</span>
|
|
<span class="functiontext">CommandLine::declare_switch</span><span class="plain">(</span><span class="constant">TOOLS_CLSW</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"tools"</span><span class="plain">, 2,</span>
|
|
<span class="identifier">L</span><span class="string">"make X the directory of intools executables, and exit developer mode"</span><span class="plain">);</span>
|
|
<span class="functiontext">CommandLine::declare_boolean_switch</span><span class="plain">(</span><span class="constant">DRY_CLSW</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"dry"</span><span class="plain">, 1,</span>
|
|
<span class="identifier">L</span><span class="string">"make this a dry run (print but do not execute shell commands)"</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">);</span>
|
|
<span class="functiontext">CommandLine::declare_boolean_switch</span><span class="plain">(</span><span class="constant">BUILD_TRACE_CLSW</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"build-trace"</span><span class="plain">, 1,</span>
|
|
<span class="identifier">L</span><span class="string">"show verbose reasoning during -build"</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">);</span>
|
|
<span class="functiontext">CommandLine::declare_switch</span><span class="plain">(</span><span class="constant">MATCHING_CLSW</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"matching"</span><span class="plain">, 2,</span>
|
|
<span class="identifier">L</span><span class="string">"apply to all works in nest(s) matching requirement X"</span><span class="plain">);</span>
|
|
<span class="functiontext">CommandLine::declare_switch</span><span class="plain">(</span><span class="constant">CONTENTS_OF_CLSW</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"contents-of"</span><span class="plain">, 2,</span>
|
|
<span class="identifier">L</span><span class="string">"apply to all targets in the directory X"</span><span class="plain">);</span>
|
|
<span class="functiontext">CommandLine::declare_switch</span><span class="plain">(</span><span class="constant">UNIT_TEST_CLSW</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"unit-test"</span><span class="plain">, 2,</span>
|
|
<span class="identifier">L</span><span class="string">"perform unit test X (for debugging inbuild only)"</span><span class="plain">);</span>
|
|
<span class="functiontext">Inbuild::declare_options</span><span class="plain">();</span>
|
|
|
|
<span class="functiontext">CommandLine::read</span><span class="plain">(</span><span class="identifier">argc</span><span class="plain">, </span><span class="identifier">argv</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, &</span><span class="functiontext">Main::option</span><span class="plain">, &</span><span class="functiontext">Main::bareword</span><span class="plain">);</span>
|
|
|
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">LinkedLists::len</span><span class="plain">(</span><span class="identifier">unsorted_nest_list</span><span class="plain">) == 0)</span>
|
|
<span class="functiontext">Inbuild::add_nest</span><span class="plain">(</span>
|
|
<span class="functiontext">Pathnames::from_text</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"inform7/Internal"</span><span class="plain">), </span><span class="constant">INTERNAL_NEST_TAG</span><span class="plain">);</span>
|
|
|
|
<span class="identifier">path_to_inbuild</span><span class="plain"> = </span><span class="functiontext">Pathnames::installation_path</span><span class="plain">(</span><span class="string">"INBUILD_PATH"</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"inbuild"</span><span class="plain">);</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">This code is used in <a href="#SP2">§2</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP3"></a><b>§3. </b>Here we handle those options not handled by the <code class="display"><span class="extract">inbuild</span></code> module.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Main::option</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">id</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">val</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">arg</span><span class="plain">, </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">state</span><span class="plain">) {</span>
|
|
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">id</span><span class="plain">) {</span>
|
|
<span class="reserved">case</span><span class="plain"> </span><span class="constant">BUILD_CLSW</span><span class="plain">: </span><span class="identifier">inbuild_task</span><span class="plain"> = </span><span class="constant">BUILD_TTASK</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">REBUILD_CLSW</span><span class="plain">: </span><span class="identifier">inbuild_task</span><span class="plain"> = </span><span class="constant">REBUILD_TTASK</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">INSPECT_CLSW</span><span class="plain">: </span><span class="identifier">inbuild_task</span><span class="plain"> = </span><span class="constant">INSPECT_TTASK</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">GRAPH_CLSW</span><span class="plain">: </span><span class="identifier">inbuild_task</span><span class="plain"> = </span><span class="constant">GRAPH_TTASK</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">USE_NEEDS_CLSW</span><span class="plain">: </span><span class="identifier">inbuild_task</span><span class="plain"> = </span><span class="constant">USE_NEEDS_TTASK</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">BUILD_NEEDS_CLSW</span><span class="plain">: </span><span class="identifier">inbuild_task</span><span class="plain"> = </span><span class="constant">BUILD_NEEDS_TTASK</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">ARCHIVE_TO_CLSW</span><span class="plain">:</span>
|
|
<span class="identifier">destination_nest</span><span class="plain"> = </span><span class="functiontext">Nests::new</span><span class="plain">(</span><span class="functiontext">Pathnames::from_text</span><span class="plain">(</span><span class="identifier">arg</span><span class="plain">));</span>
|
|
<span class="identifier">inbuild_task</span><span class="plain"> = </span><span class="constant">ARCHIVE_TO_TTASK</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">ARCHIVE_CLSW</span><span class="plain">: </span><span class="identifier">inbuild_task</span><span class="plain"> = </span><span class="constant">ARCHIVE_TTASK</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">USE_MISSING_CLSW</span><span class="plain">: </span><span class="identifier">inbuild_task</span><span class="plain"> = </span><span class="constant">USE_MISSING_TTASK</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">BUILD_MISSING_CLSW</span><span class="plain">: </span><span class="identifier">inbuild_task</span><span class="plain"> = </span><span class="constant">BUILD_MISSING_TTASK</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">TOOLS_CLSW</span><span class="plain">: </span><span class="identifier">path_to_tools</span><span class="plain"> = </span><span class="functiontext">Pathnames::from_text</span><span class="plain">(</span><span class="identifier">arg</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">MATCHING_CLSW</span><span class="plain">: </span><span class="identifier">filter_text</span><span class="plain"> = </span><span class="functiontext">Str::duplicate</span><span class="plain">(</span><span class="identifier">arg</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">CONTENTS_OF_CLSW</span><span class="plain">:</span>
|
|
<span class="functiontext">Main::add_directory_contents_targets</span><span class="plain">(</span><span class="functiontext">Pathnames::from_text</span><span class="plain">(</span><span class="identifier">arg</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">DRY_CLSW</span><span class="plain">: </span><span class="identifier">dry_run_mode</span><span class="plain"> = </span><span class="identifier">val</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">BUILD_TRACE_CLSW</span><span class="plain">: </span><span class="identifier">build_trace_mode</span><span class="plain"> = </span><span class="identifier">val</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_TO_CLSW</span><span class="plain">: </span><span class="identifier">inbuild_task</span><span class="plain"> = </span><span class="constant">COPY_TO_TTASK</span><span class="plain">;</span>
|
|
<span class="identifier">destination_nest</span><span class="plain"> = </span><span class="functiontext">Nests::new</span><span class="plain">(</span><span class="functiontext">Pathnames::from_text</span><span class="plain">(</span><span class="identifier">arg</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">SYNC_TO_CLSW</span><span class="plain">: </span><span class="identifier">inbuild_task</span><span class="plain"> = </span><span class="constant">SYNC_TO_TTASK</span><span class="plain">;</span>
|
|
<span class="identifier">destination_nest</span><span class="plain"> = </span><span class="functiontext">Nests::new</span><span class="plain">(</span><span class="functiontext">Pathnames::from_text</span><span class="plain">(</span><span class="identifier">arg</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">UNIT_TEST_CLSW</span><span class="plain">: </span><span class="identifier">unit_test</span><span class="plain"> = </span><span class="functiontext">Str::duplicate</span><span class="plain">(</span><span class="identifier">arg</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
|
|
<span class="plain">}</span>
|
|
<span class="functiontext">Inbuild::option</span><span class="plain">(</span><span class="identifier">id</span><span class="plain">, </span><span class="identifier">val</span><span class="plain">, </span><span class="identifier">arg</span><span class="plain">, </span><span class="identifier">state</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function Main::option is used in <a href="#SP2_7">§2.7</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP4"></a><b>§4. </b>This is called for a command-line argument which doesn't appear as
|
|
subordinate to any switch; we take it as the name of a copy.
|
|
</p>
|
|
|
|
|
|
<pre class="display">
|
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Main::bareword</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">id</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">arg</span><span class="plain">, </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">state</span><span class="plain">) {</span>
|
|
<span class="functiontext">Main::add_file_or_path_as_target</span><span class="plain">(</span><span class="identifier">arg</span><span class="plain">, </span><span class="constant">TRUE</span><span class="plain">);</span>
|
|
<span class="plain">}</span>
|
|
</pre>
|
|
|
|
<p class="inwebparagraph"></p>
|
|
|
|
<p class="endnote">The function Main::bareword is used in <a href="#SP2_7">§2.7</a>.</p>
|
|
|
|
<p class="inwebparagraph"><a id="SP5"></a><b>§5. Interface to Words module. </b>We use the mighty Preform natural-language parser only a little when
|
|
Inbuild runs on its own, but it needs to be told what C type to use when
|
|
identifying natural languages.
|
|
</p>
|
|
|
|
|
|
<pre class="definitions">
|
|
<span class="definitionkeyword">define</span> <span class="constant">PREFORM_LANGUAGE_TYPE</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">inform_language</span>
|
|
</pre>
|
|
<p class="inwebparagraph"><a id="SP6"></a><b>§6. Interface to Syntax module. </b>Again, we make a fairly light use of <code class="display"><span class="extract">syntax</span></code> when Inbuild runs alone.
|
|
</p>
|
|
|
|
|
|
<pre class="definitions">
|
|
<span class="definitionkeyword">define</span> <span class="constant">PARSE_TREE_METADATA_SETUP</span><span class="plain"> </span><span class="functiontext">SourceText::node_metadata</span>
|
|
</pre>
|
|
<hr class="tocbar">
|
|
<!--End of weave-->
|
|
</main>
|
|
</body>
|
|
</html>
|
|
|