Migrated to new makescript format

This commit is contained in:
Graham Nelson 2022-04-22 00:06:45 +01:00
parent 0772b434b7
commit 162b0283f3
32 changed files with 2405 additions and 1506 deletions

View file

@ -28,6 +28,9 @@ see //foundation: A Brief Guide to Foundation//.
@e macro_CLASS
@e macro_tokens_CLASS
@e macro_usage_CLASS
@e makefile_macro_CLASS
@e makefile_macro_parameter_CLASS
@e makefile_macro_playback_CLASS
@e nonterminal_variable_CLASS
@e para_macro_CLASS
@e paragraph_CLASS
@ -118,6 +121,9 @@ DECLARE_CLASS(language_type)
DECLARE_CLASS(macro_tokens)
DECLARE_CLASS(macro_usage)
DECLARE_CLASS(macro)
DECLARE_CLASS(makefile_macro)
DECLARE_CLASS(makefile_macro_parameter)
DECLARE_CLASS(makefile_macro_playback)
DECLARE_CLASS(nonterminal_variable)
DECLARE_CLASS(para_macro)
DECLARE_CLASS(paragraph_tagging)

View file

@ -390,9 +390,17 @@ folder: failing that, we fall back on a default script belonging to Inweb.
=
void Analyser::write_makefile(web *W, filename *F, module_search *I) {
filename *prototype = Filenames::in(W->md->path_to_web, I"makescript.txt");
pathname *P = W->md->path_to_web;
text_stream *short_name = Pathnames::directory_name(P);
if ((Str::len(short_name) == 0) ||
(Str::eq(short_name, I".")) || (Str::eq(short_name, I"..")))
short_name = I"web";
TEMPORARY_TEXT(leafname)
WRITE_TO(leafname, "%S.mkscript", short_name);
filename *prototype = Filenames::in(P, leafname);
DISCARD_TEXT(leafname)
if (!(TextFiles::exists(prototype)))
prototype = Filenames::in(path_to_inweb_materials, I"makescript.txt");
prototype = Filenames::in(path_to_inweb_materials, I"default.mkscript");
Makefiles::write(W, prototype, F, I);
}

View file

@ -5,11 +5,41 @@ Constructing a suitable makefile for a simple inweb project.
@ This section offers just one function, which constructs a makefile by
following a "prototype".
@d MAX_MAKEFILE_MACRO_PARAMETERS 8
@d MAX_MAKEFILE_MACRO_LINES 128
=
typedef struct makefile_macro {
struct text_stream *identifier;
struct makefile_macro_parameter *parameters[MAX_MAKEFILE_MACRO_PARAMETERS];
int no_parameters;
struct text_stream *lines[MAX_MAKEFILE_MACRO_LINES];
int no_lines;
CLASS_DEFINITION
} makefile_macro;
typedef struct makefile_macro_parameter {
struct text_stream *name;
struct text_stream *definition_token;
int optional;
CLASS_DEFINITION
} makefile_macro_parameter;
typedef struct makefile_macro_playback {
struct makefile_macro *which;
struct text_stream *parameter_values[MAX_MAKEFILE_MACRO_PARAMETERS];
int line_position;
struct makefile_macro_playback *prior_to_this;
struct text_stream *text_to_follow;
CLASS_DEFINITION
} makefile_macro_playback;
typedef struct makefile_state {
struct web *for_web;
struct text_stream to_makefile;
struct text_stream *repeat_block; /* a "repeatblock" body being scanned */
struct makefile_macro *defining; /* a "define" body being scanned */
struct makefile_macro_playback *playing_back;
int inside_block; /* scanning a "repeatblock" into that text? */
int last_line_was_blank; /* used to suppress runs of multiple blank lines */
int allow_commands; /* permit the prototype to use special commands */
@ -26,6 +56,8 @@ void Makefiles::write(web *W, filename *prototype, filename *F, module_search *I
MS.for_web = W;
MS.last_line_was_blank = TRUE;
MS.repeat_block = Str::new();
MS.defining = NULL;
MS.playing_back = NULL;
MS.inside_block = FALSE;
MS.allow_commands = TRUE;
MS.tools_dictionary = Dictionaries::new(16, FALSE);
@ -53,6 +85,10 @@ void Makefiles::scan_makefile_line(text_stream *line, text_file_position *tfp, v
match_results mr = Regexp::create_mr();
if (Regexp::match(&mr, line, L" *#%c*")) { Regexp::dispose_of(&mr); return; } // Skip comment lines
if (MS->allow_commands) {
if (Regexp::match(&mr, line, L" *{define: *(%C+) (%c*)} *")) @<Begin a definition@>;
if (Regexp::match(&mr, line, L" *{end-define} *")) @<End a definition@>;
if (MS->defining) @<Continue a definition@>;
if (Regexp::match(&mr, line, L" *{repeat-tools-block:(%C*)} *"))
@<Begin a repeat tool block@>;
if (Regexp::match(&mr, line, L" *{repeat-webs-block:(%C*)} *"))
@ -83,12 +119,152 @@ void Makefiles::scan_makefile_line(text_stream *line, text_file_position *tfp, v
@<Expand dependent-files-for-tool@>;
if (Regexp::match(&mr, line, L"(%c*?) *{dependent-files-for-module} *(%C+)"))
@<Expand dependent-files-for-module@>;
if (Regexp::match(&mr, line, L"(%c*?) *{(%C+) *(%c+?)} *(%c*?)")) @<Expand a macro@>;
}
Regexp::dispose_of(&mr);
@<And otherwise copy the line straight through@>;
}
@<Begin a definition@> =
if (MS->defining) Errors::in_text_file("nested definitions are not allowed", tfp);
text_stream *name = mr.exp[0];
text_stream *parameter_specification = mr.exp[1];
makefile_macro *new_macro = CREATE(makefile_macro);
new_macro->identifier = Str::duplicate(name);
new_macro->no_parameters = 0;
new_macro->no_lines = 0;
match_results mr2 = Regexp::create_mr();
while (Regexp::match(&mr2, parameter_specification, L" *(%C+): *(%C+) *(%c*)")) {
if (new_macro->no_parameters >= MAX_MAKEFILE_MACRO_PARAMETERS) {
Errors::in_text_file("too many parameters in this definition", tfp);
break;
}
makefile_macro_parameter *new_parameter = CREATE(makefile_macro_parameter);
new_parameter->name = Str::duplicate(mr2.exp[0]);
new_parameter->definition_token = Str::duplicate(mr2.exp[1]);
new_parameter->optional = FALSE;
if (Str::get_first_char(new_parameter->name) == '?') {
new_parameter->optional = TRUE;
Str::delete_first_character(new_parameter->name);
}
new_macro->parameters[new_macro->no_parameters++] = new_parameter;
Str::clear(parameter_specification);
Str::copy(parameter_specification, mr2.exp[2]);
}
Regexp::dispose_of(&mr2);
if (Str::is_whitespace(parameter_specification) == FALSE)
Errors::in_text_file("parameter list for this definition is malformed", tfp);
MS->defining = new_macro;
Regexp::dispose_of(&mr);
return;
@<Continue a definition@> =
if (MS->defining->no_lines >= MAX_MAKEFILE_MACRO_LINES) {
Errors::in_text_file("too many lines in this definition", tfp);
} else {
MS->defining->lines[MS->defining->no_lines++] = Str::duplicate(line);
}
Regexp::dispose_of(&mr);
return;
@<End a definition@> =
if (MS->defining == NULL) Errors::in_text_file("{end-define} without {define: ...}", tfp);
MS->defining = NULL;
Regexp::dispose_of(&mr);
return;
@<Expand a macro@> =
text_stream *before_matter = mr.exp[0];
text_stream *identifier = mr.exp[1];
text_stream *parameter_settings = mr.exp[2];
text_stream *after_matter = mr.exp[3];
makefile_macro_playback *playback = CREATE(makefile_macro_playback);
playback->which = NULL;
makefile_macro *mm;
LOOP_OVER(mm, makefile_macro)
if (Str::eq(mm->identifier, identifier))
playback->which = mm;
if (playback->which == NULL) {
Errors::in_text_file("unknown macro or command in braces", tfp);
Regexp::dispose_of(&mr);
return;
}
for (int i=0; i<MAX_MAKEFILE_MACRO_PARAMETERS; i++)
playback->parameter_values[i] = NULL;
match_results mr2 = Regexp::create_mr();
while (Regexp::match(&mr2, parameter_settings, L" *(%C+): *(%C+) *(%c*)")) {
text_stream *setting = mr2.exp[0];
text_stream *value = mr2.exp[1];
text_stream *remainder = mr2.exp[2];
int found = FALSE;
for (int i=0; i<playback->which->no_parameters; i++)
if (Str::eq(setting, playback->which->parameters[i]->name)) {
found = TRUE;
playback->parameter_values[i] = Str::duplicate(value);
}
if (found == FALSE) Errors::in_text_file("unknown parameter in this macro", tfp);
Str::clear(parameter_settings);
Str::copy(parameter_settings, remainder);
}
Regexp::dispose_of(&mr2);
if (Str::is_whitespace(parameter_settings) == FALSE)
Errors::in_text_file("parameter list for this macro is malformed", tfp);
for (int i=0; i<playback->which->no_parameters; i++)
if (playback->parameter_values[i] == NULL)
if (playback->which->parameters[i]->optional == FALSE)
Errors::in_text_file("compulsory macro parameter not given", tfp);
playback->line_position = 0;
playback->prior_to_this = MS->playing_back;
playback->text_to_follow = NULL;
if (Str::is_whitespace(after_matter) == FALSE)
playback->text_to_follow = Str::duplicate(after_matter);
MS->playing_back = playback;
WRITE("%S", before_matter);
for (int i=0; i<playback->which->no_lines; i++) {
TEMPORARY_TEXT(line)
text_stream *from = playback->which->lines[i];
for (int j=0; j<Str::len(from); j++) {
if (Str::get_at(from, j) == '{') {
int closed = FALSE, old_j = j;
TEMPORARY_TEXT(token)
for (j++; j<Str::len(from); j++) {
if (Str::get_at(from, j) == '}') { closed = TRUE; break; }
PUT_TO(token, Str::get_at(from, j));
}
if (closed) {
int found = FALSE;
for (int i=0; i<playback->which->no_parameters; i++)
if (Str::eq(token, playback->which->parameters[i]->definition_token)) {
found = TRUE;
WRITE_TO(line, "%S", playback->parameter_values[i]);
}
if (found == FALSE) closed = FALSE;
}
DISCARD_TEXT(token)
if (closed == FALSE) { j = old_j; PUT_TO(line, '{'); }
} else {
PUT_TO(line, Str::get_at(from, j));
}
}
Makefiles::scan_makefile_line(line, tfp, (void *) MS);
DISCARD_TEXT(line)
}
MS->playing_back = playback->prior_to_this;
if (Str::is_whitespace(after_matter) == FALSE)
WRITE("%S\n", after_matter);
Regexp::dispose_of(&mr);
return;
@<Begin a repeat tool block@> =
int marker = MAKEFILE_TOOL_MOM;
@<Begin a repeat block@>;
@ -145,11 +321,22 @@ void Makefiles::scan_makefile_line(text_stream *line, text_file_position *tfp, v
@<Expand platform-settings@> =
filename *prototype = Filenames::in(path_to_inweb, I"platform-settings.mk");
MS->allow_commands = FALSE;
TextFiles::read(prototype, FALSE, "can't open make settings file",
TRUE, Makefiles::scan_makefile_line, NULL, MS);
text_stream *INWEBPLATFORM = Str::new();
TextFiles::read(prototype, FALSE, "can't open platform settings file",
TRUE, Makefiles::seek_INWEBPLATFORM, NULL, INWEBPLATFORM);
if (Str::len(INWEBPLATFORM) == 0) {
Errors::in_text_file(
"found platform settings file, but it does not set INWEBPLATFORM", tfp);
} else {
pathname *P = Pathnames::down(path_to_inweb, I"Materials");
P = Pathnames::down(P, I"platforms");
WRITE_TO(INWEBPLATFORM, ".mkscript");
filename *F = Filenames::in(P, INWEBPLATFORM);
TextFiles::read(F, FALSE, "can't open platform definitions file",
TRUE, Makefiles::scan_makefile_line, NULL, MS);
WRITE_TO(STDOUT, "(Read definitions from %f)\n", F);
}
Regexp::dispose_of(&mr);
MS->allow_commands = TRUE;
return;
@<Expand identity-settings@> =
@ -342,3 +529,15 @@ void Makefiles::repeat(OUTPUT_STREAM, text_stream *prefix, int every_time, text_
}
}
}
@ This is used to scan the platform settings file for a definition line in the
shape INWEBPLATFORM = PLATFORM, in order to find out what PLATFORM the make file
will be used on.
=
void Makefiles::seek_INWEBPLATFORM(text_stream *line, text_file_position *tfp, void *X) {
text_stream *OUT = (text_stream *) X;
match_results mr = Regexp::create_mr();
if (Regexp::match(&mr, line, L" *INWEBPLATFORM = (%C+) *")) WRITE("%S", mr.exp[0]);
Regexp::dispose_of(&mr);
}

View file

@ -0,0 +1,61 @@
# This is "default.mkscript", a script which "inweb -makefile" uses in order to
# generate makefiles for tools which do not provide a special script of their own.
# In the Inform project, for example, it produces makefiles for the numerous
# unit test tools.
# See the inweb manual for documentation on the *.mkscript file format, i.e.,
# the format in which this file is written. But it is essentially just a makefile
# with a number of special macro and loop features whose syntax involves braces
# { ... }, so anywhere that you see braces, you're looking at something special
# to *.mkscript; anything else is straightforward make syntax.
# -----------------------------------------------------------------------------
{platform-settings}
{identity-settings}
# Making the program:
$(ME)/Tangled/$(MYNAME): {dependent-files}
$(call make-me)
.PHONY: force
force:
$(call make-me)
define make-me
$(INWEB) $(ME) -import-from modules -tangle
{compile from: $(ME)/Tangled/$(MYNAME).c to: $(ME)/Tangled/$(MYNAME).o}
{link from: $(ME)/Tangled/$(MYNAME).o to: $(ME)/Tangled/$(MYNAME)$(EXEEXTENSION)}
endef
# Testing the program:
.PHONY: test
test:
$(INTEST) -from $(ME) all
# Weaving the web for GitHub Pages:
.PHONY: pages
pages:
mkdir -p $(ME)/docs/$(MYNAME)
$(INWEB) $(ME) -weave-docs -weave-into $(ME)/docs/$(MYNAME)
# Cleaning up:
.PHONY: clean
clean:
$(call clean-up)
.PHONY: purge
purge:
$(call clean-up)
rm -f $(ME)/Tangled/$(MYNAME)
define clean-up
rm -f $(ME)/Tangled/*.o
rm -f $(ME)/Tangled/*.c
rm -f $(ME)/Tangled/*.h
endef

View file

@ -1,87 +0,0 @@
# Make settings for integrating Inform's user interface and core software.
# This file contains only those settings likely to differ on different
# platforms, and the idea is that each user interface maintainer will keep
# his or her own version of this file.
# This is the Gnome version, by Philip Chimento
INTEST = intest/Tangled/intest
INWEB = inweb/Tangled/inweb
# First, the locations to which resources must be copied, inside the
# application. These pathnames mustn't contain spaces:
BUILTINCOMPS = gnome-inform7/src/ni
INTERNAL = gnome-inform7/data
BUILTINHTML = gnome-inform7/data/Resources
BUILTINHTMLINNER = gnome-inform7/data/Resources/en
# The I6 compiler is one of the tools living in the BUILTINCOMPS folder, but
# its name customarily differs between platforms.
I6COMPILERNAME = inform6
# The I6 source code needs a constant defined to tell it what platform it'll
# be used on, so:
INFORM6OS = LINUX
# The following should contain "--rewrite-standard-rules" only for Mac OS X,
# and then probably only for Graham Nelson's master copy. (The rewriting in
# question reconciles the documentation cross-references in the application,
# by changing the "Document X at Y" sentences in the Standard Rules.)
# For instance, for Windows this should be simply be "windows_app".
INDOCOPTS = gnome_app
# -multi in the following runs "make check" with processes divided among what
# are expected to be four processors, for a substantial speed gain, but doesn't
# change the outcome:
INTESTOPTS = -platform=gnome
# On most Linux systems GCC is installed and not Clang.
GCC = gcc
GCCOPTS = -D_BSD_SOURCE -DPLATFORM_UNIX -fdiagnostics-color=auto
# To excuse these warning waivers:
# -Wno-pointer-to-int-cast: we use the gcc extension allowing (void *) pointers to increment
# -Wno-unused-parameter: we don't much care if a function argument isn't used
# -Wno-unused-but-set-variable: we don't much care about this either
# -Wno-unknown-pragmas: there is plenty of #pragma clang and we don't want a warning every time it is encountered
GCCWARNINGS = -Wall -Wextra -Wno-pointer-to-int-cast -Wno-unused-parameter -Wno-unused-but-set-variable -Wno-unknown-pragmas
# (For cblorb, where we make a lot of use of sscanf, it's a nuisance to be warned
# about entirely legal format strings passed as variables.)
CBLORBWARNINGS = -Wno-format-nonliteral
# The following is needed when compiling glulxe, as part of dumb-glulx, which
# is used in testing. For Mac OS X and probably all Unix-based systems, it
# wants to be OS_UNIX; for Windows it probably wants to be WIN32. See the file
# osdepend.c in the glulxe distribution.
GLULXEOS = OS_UNIX
# On Mac OS X, no special options are needed for linking, but on some Unix
# builds we need to use ld rather than gcc and to apply various options.
LINK = $(GCC) $(GCCOPTS) -g
LINKEROPTS = -lm
# On some platforms, executables have a specific file extension, which we
# define here.
EXEEXTENSION =
# On most systems, the following will be the traditional archiver "ar -r", but
# for modern Mac OS X use we need to use Apple's replacement "libtool", which
# is able to cope with fat (i.e., multiple-architecture) binaries.
ARTOOL = ar -r

View file

@ -1,87 +0,0 @@
# The intools, a suite of command-line programs needed by Inform, need to
# be compiled by a C compiler. This is done by the standard "make" tool,
# but the details (what C compiler to use, for example) have to be different
# on different operating systems. This file, make-intools-settings.mk,
# contains those details.
# This is make-intools-settings.mk for Mac OS X.
# (0) Before we get under way, a few definitions which should apply on all
# platforms.
INTEST = intest/Tangled/intest
INWEB = inweb/Tangled/inweb
# (1) Our C compiler, "CC", must accept gcc-compatible command line switches,
# so it should probably be either gcc itself or else clang. We should define
# two symbols, "CC", our general-purpose C compiler, and "INDULGENTCC",
# set up to be rather more forgiving about warning conditions. "CC" will be
# used for code in active development, to keep us on the straight and narrow.
# "INDULGENTCC" is for code from older or externally written projects, which
# wouldn't stand up to the same scrutiny.
CC = clang -std=c99 -c $(MANYWARNINGS) $(CCOPTS) -g
INDULGENTCC = clang -std=c99 -c $(FEWERWARNINGS) $(CCOPTS) -g
# On Mac OS X, we assume the user has the Developer Tools installed:
CCOPTS = -DPLATFORM_MACOS=1 -mmacosx-version-min=10.4 -arch i386 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk
# The strictness of "CC" comes about by enabling all warnings except:
# -Wno-pointer-arith: we use the gcc extension allowing (void *) pointers to increment, don't complain
# -Wno-variadic-macros: we use the gcc extension for variadic macros, don't complain
# -Wno-cast-align, -Wno-padded: we don't care about address alignments of structure elements
# -Wno-missing-noreturn: a few fatal-error functions could be marked with
# __attribute__((noreturn)) to prevent this, but gcc doesn't accept
# this except in a predeclaration, which is inconvenient for us
# -Wno-shadow: we don't care if an inner block defines a variable of the same name
# -Wno-unused-macros: a few constants are defined to document external formats rather than for use here
# -Wno-unused-parameter: we don't much care if a function argument isn't used
# -Wno-missing-prototypes: because Preform-defined routines aren't predeclared with prototypes
# -Wno-missing-variable-declarations: these are not for linking, so don't care about extern/static
# -Wno-unreachable-code-break: these derive from Preform-compiled switches, and are harmless
# -Wno-class-varargs: for some reason clang thinks structs shouldn't be passed to variable-argument functions
# -Wno-format-nonliteral: similarly, it thinks all format strings in |printf| should be literals
# -Wno-cast-qual: in OS X 10.11, clang became bothered by casts from (void *) if it thought they were const
# -Wno-double-promotion: in OS X 10.12, clang began warning of possible precision loss: we only need about 1% accuracy anyway
# -Wno-commas: in OS X 10.13, clang began warning about "possible misuse of comma operator" - by misuse, it means use
# -Wno-strict-prototypes: in OS X 10.13, clang began objecting to (some) function prototypes generated by macros
# -Wno-extra-semi-stmt: in OS X 10.15, clang began objecting to redundant semicolons after macros had expanded,
# which is a little tiresome: though it's off by default (on MacOS with -Weverything), we explicitly disable it
MANYWARNINGS = -Weverything -Wno-pointer-arith -Wno-unused-macros -Wno-shadow -Wno-cast-align -Wno-variadic-macros -Wno-missing-noreturn -Wno-missing-prototypes -Wno-unused-parameter -Wno-padded -Wno-missing-variable-declarations -Wno-unreachable-code-break -Wno-class-varargs -Wno-format-nonliteral -Wno-cast-qual -Wno-double-promotion -Wno-comma -Wno-strict-prototypes -Wno-extra-semi-stmt -ferror-limit=1000
FEWERWARNINGS = -Wno-implicit-int -Wno-dangling-else -Wno-pointer-sign -Wno-format-extra-args -Wno-tautological-compare -Wno-deprecated-declarations -Wno-logical-op-parentheses -Wno-format -Wno-extra-semi-stmt
# (2) We need a linker, "LINK". Nowadays some C compilers (e.g. clang on
# Mac OS X) can happily do their own linking, but on some Unix platforms
# we still want to use ld, so these symbols exist to make it possible to
# specify that.
LINK = clang $(CCOPTS) -g
LINKEROPTS =
# On some platforms, executables have a specific file extension, which we
# define here.
EXEEXTENSION =
# (3) We need an archive tool, "ARTOOL". The traditional archiver "ar -r"
# should be fine on most Unix systems, but for example OS X prefers a more
# modern replacement which can handle multiple-architecture binaries.
ARTOOL = libtool -o
# (4) Platform definition symbols.
# The I6 source code needs a constant defined to tell it what platform it'll
# be used on, so:
INFORM6OS = OSX
# The following is needed when compiling glulxe, as part of dumb-glulx, which
# is used in testing. For Mac OS X and probably all Unix-based systems, it
# wants to be OS_UNIX; for Windows it probably wants to be WIN32. See the file
# osdepend.c in the glulxe distribution.
GLULXEOS = OS_UNIX

View file

@ -1,50 +0,0 @@
# This is the script from which inweb -makefile will construct a makefile.
{platform-settings}
{identity-settings}
# Making the program:
$(ME)/Tangled/$(MYNAME): {dependent-files}
$(call make-me)
.PHONY: force
force:
$(call make-me)
define make-me
$(INWEB) $(ME) -import-from modules -tangle
$(CC) -o $(ME)/Tangled/$(MYNAME).o $(ME)/Tangled/$(MYNAME).c
$(LINK) -o $(ME)/Tangled/$(MYNAME)$(EXEEXTENSION) $(ME)/Tangled/$(MYNAME).o $(LINKEROPTS)
endef
# Testing the program:
.PHONY: test
test:
$(INTEST) -from $(ME) all
# Weaving the web for GitHub Pages:
.PHONY: pages
pages:
mkdir -p $(ME)/docs/$(MYNAME)
$(INWEB) $(ME) -weave-docs -weave-into $(ME)/docs/$(MYNAME)
# Cleaning up:
.PHONY: clean
clean:
$(call clean-up)
.PHONY: purge
purge:
$(call clean-up)
rm -f $(ME)/Tangled/$(MYNAME)
define clean-up
rm -f $(ME)/Tangled/*.o
rm -f $(ME)/Tangled/*.c
rm -f $(ME)/Tangled/*.h
endef

View file

@ -0,0 +1,16 @@
# This makefile was automatically written by inweb -makefile
# and is not intended for human editing
INWEBPLATFORM = linux
INFORM6OS = LINUX
GLULXEOS = OS_UNIX
EXEEXTENSION =
INTEST = intest/Tangled/intest
INWEB = inweb/Tangled/inweb
GCCWARNINGS = -Wall -Wextra -Wno-pointer-to-int-cast -Wno-unused-parameter -Wno-unused-but-set-variable -Wno-unknown-pragmas

View file

@ -0,0 +1,87 @@
# This is "linux.mkscript", a script which defines build settings used in
# inweb, intest, inform and all of their subsidiary tools for the platform
# "linux", used for tools compiled for use in the Gnome app. The maintainer
# of this file is Philip Chimento.
# The script is used for two purposes. Firstly, it is used to generate the
# file "linux.mk" of platform settings. If an inweb user selects linux as
# platform on a first run, then this is the file copied into place as
# inweb/platform-settings.mk. But secondly, it also defines macros which
# can be used by any *.mkscript files being converted to *.mk files on
# this platform.
# Do not edit "linux.mk" directly. Instead, edit this script, and then
# rebuild "linux.mk" by setting the current working directory to the directory
# _above_ "inweb", and using the command:
# inweb/Tangled/inweb inweb -prototype inweb/Materials/platforms/linux.mkscript -makefile inweb/Materials/platforms/linux.mk
# Or simply:
# make -f inweb/inweb.mk makers
# which recreates all of the make-files in the inweb repository from their
# scripts, including linux.mk among them.
# See the inweb manual for documentation on the *.mkscript file format, i.e.,
# the format in which this file is written. But it is essentially just a makefile
# with a number of special macro and loop features whose syntax involves braces
# { ... }, so anywhere that you see braces, you're looking at something special
# to *.mkscript; anything else is straightforward make syntax.
# -----------------------------------------------------------------------------
# The first definition in this file must set INWEBPLATFORM to the platform
# name, which is the same as the leafname of this file without the ".mkscript"
# file extension. So:
INWEBPLATFORM = linux
# The I6 source code has its own set of symbolic names for operating systems,
# not always the same as inweb's names for platforms, so:
INFORM6OS = LINUX
# And similarly for glulxe, which is used as part of the dumb-glulx interpreter,
# which is used in testing Inform on the command line:
GLULXEOS = OS_UNIX
# On some platforms, executables have a specific file extension, which we define here:
EXEEXTENSION =
# -----------------------------------------------------------------------------
# These are likely to be the same on all platforms:
INTEST = intest/Tangled/intest
INWEB = inweb/Tangled/inweb
# -----------------------------------------------------------------------------
# Now three macro definitions: two for compiling C code to *.o object files
# (one being strict about warnings, the other indulgently suppressing them);
# and one for linking those *.o files into an executable.
{define: compile to: TO from: FROM ?options: OPTS}
gcc -c -D_BSD_SOURCE -DPLATFORM_UNIX -fdiagnostics-color=auto $(GCCWARNINGS) -g {OPTS} -o {TO} {FROM}
{end-define}
{define: compile-indulgently to: TO from: FROM ?options: OPTS}
gcc -c -D_BSD_SOURCE -DPLATFORM_UNIX -fdiagnostics-color=auto $(GCCWARNINGS) -g {OPTS} -o {TO} {FROM}
{end-define}
{define: link to: TO from: FROM ?options: OPTS}
gcc -D_BSD_SOURCE -DPLATFORM_UNIX -fdiagnostics-color=auto -g -o {TO} {FROM} {OPTS} -lm
{end-define}
# On this platform we use the same set of warnings whichever way we compile. To
# excuse these warning waivers:
GCCWARNINGS = -Wall -Wextra -Wno-pointer-to-int-cast -Wno-unused-parameter -Wno-unused-but-set-variable -Wno-unknown-pragmas
# -Wno-pointer-to-int-cast: we use the gcc extension allowing (void *) pointers to increment
# -Wno-unused-parameter: we don't much care if a function argument isn't used
# -Wno-unused-but-set-variable: we don't much care about this either
# -Wno-unknown-pragmas: there is plenty of #pragma clang and we don't want a warning every time it is encountered

View file

@ -0,0 +1,20 @@
# This makefile was automatically written by inweb -makefile
# and is not intended for human editing
INWEBPLATFORM = macos
INFORM6OS = MACOS
GLULXEOS = OS_UNIX
EXEEXTENSION =
INTEST = intest/Tangled/intest
INWEB = inweb/Tangled/inweb
CCOPTS = -DPLATFORM_MACOS=1 -mmacosx-version-min=10.6 -arch x86_64 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk
MANYWARNINGS = -Weverything -Wno-pointer-arith -Wno-unused-macros -Wno-shadow -Wno-cast-align -Wno-variadic-macros -Wno-missing-noreturn -Wno-missing-prototypes -Wno-unused-parameter -Wno-padded -Wno-missing-variable-declarations -Wno-unreachable-code-break -Wno-class-varargs -Wno-format-nonliteral -Wno-cast-qual -Wno-double-promotion -Wno-comma -Wno-strict-prototypes -Wno-extra-semi-stmt -Wno-c11-extensions -Wno-unreachable-code-return -ferror-limit=1000
FEWERWARNINGS = -Wno-implicit-int -Wno-dangling-else -Wno-pointer-sign -Wno-format-extra-args -Wno-tautological-compare -Wno-deprecated-declarations -Wno-logical-op-parentheses -Wno-format -Wno-extra-semi-stmt -Wno-c11-extensions -Wno-unreachable-code-return

View file

@ -1,33 +1,87 @@
# The intools, a suite of command-line programs needed by Inform, need to
# be compiled by a C compiler. This is done by the standard "make" tool,
# but the details (what C compiler to use, for example) have to be different
# on different operating systems. This file, make-intools-settings.mk,
# contains those details.
# This is "macos.mkscript", a script which defines build settings used in
# inweb, intest, inform and all of their subsidiary tools for the platform
# "macos". The maintainer of this file is Graham Nelson.
# This is make-intools-settings.mk for Mac OS X.
# The script is used for two purposes. Firstly, it is used to generate the
# file "macos.mk" of platform settings. If an inweb user selects macos as
# platform on a first run, then this is the file copied into place as
# inweb/platform-settings.mk. But secondly, it also defines macros which
# can be used by any *.mkscript files being converted to *.mk files on
# this platform.
# (0) Before we get under way, a few definitions which should apply on all
# platforms.
# Do not edit "macos.mk" directly. Instead, edit this script, and then
# rebuild "macos.mk" by setting the current working directory to the directory
# _above_ "inweb", and using the command:
# inweb/Tangled/inweb inweb -prototype inweb/Materials/platforms/macos.mkscript -makefile inweb/Materials/platforms/macos.mk
# Or simply:
# make -f inweb/inweb.mk makers
# which recreates all of the make-files in the inweb repository from their
# scripts, including macos.mk among them.
# See the inweb manual for documentation on the *.mkscript file format, i.e.,
# the format in which this file is written. But it is essentially just a makefile
# with a number of special macro and loop features whose syntax involves braces
# { ... }, so anywhere that you see braces, you're looking at something special
# to *.mkscript; anything else is straightforward make syntax.
# -----------------------------------------------------------------------------
# The first definition in this file should set INWEBPLATFORM to the platform
# name, which is the same as the leafname of this file without the ".mkscript"
# file extension. So:
INWEBPLATFORM = macos
# The I6 source code has its own set of symbolic names for operating systems,
# not always the same as inweb's names for platforms, so:
INFORM6OS = MACOS
# And similarly for glulxe, which is used as part of the dumb-glulx interpreter,
# which is used in testing Inform on the command line:
GLULXEOS = OS_UNIX
# On some platforms, executables have a specific file extension, which we define here:
EXEEXTENSION =
# -----------------------------------------------------------------------------
# These are likely to be the same on all platforms:
INTEST = intest/Tangled/intest
INWEB = inweb/Tangled/inweb
# (1) Our C compiler, "CC", must accept gcc-compatible command line switches,
# so it should probably be either gcc itself or else clang. We should define
# two symbols, "CC", our general-purpose C compiler, and "INDULGENTCC",
# set up to be rather more forgiving about warning conditions. "CC" will be
# used for code in active development, to keep us on the straight and narrow.
# "INDULGENTCC" is for code from older or externally written projects, which
# wouldn't stand up to the same scrutiny.
# -----------------------------------------------------------------------------
CC = clang -std=c11 -c $(MANYWARNINGS) $(CCOPTS) -g
INDULGENTCC = clang -std=c11 -c $(FEWERWARNINGS) $(CCOPTS) -g
# Now three macro definitions: two for compiling C code to *.o object files
# (one being strict about warnings, the other indulgently suppressing them);
# and one for linking those *.o files into an executable.
# On Mac OS X, we assume the user has the Developer Tools installed:
{define: compile to: TO from: FROM ?options: OPTS}
clang -std=c11 -c $(MANYWARNINGS) $(CCOPTS) -g {OPTS} -o {TO} {FROM}
{end-define}
{define: compile-indulgently to: TO from: FROM ?options: OPTS}
clang -std=c99 -c $(FEWERWARNINGS) $(CCOPTS) -g {OPTS} -o {TO} {FROM}
{end-define}
{define: link to: TO from: FROM ?options: OPTS}
clang $(CCOPTS) -g -o {TO} {FROM} {OPTS}
{end-define}
# Where:
CCOPTS = -DPLATFORM_MACOS=1 -mmacosx-version-min=10.6 -arch x86_64 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk
# The strictness of "CC" comes about by enabling all warnings except:
MANYWARNINGS = -Weverything -Wno-pointer-arith -Wno-unused-macros -Wno-shadow -Wno-cast-align -Wno-variadic-macros -Wno-missing-noreturn -Wno-missing-prototypes -Wno-unused-parameter -Wno-padded -Wno-missing-variable-declarations -Wno-unreachable-code-break -Wno-class-varargs -Wno-format-nonliteral -Wno-cast-qual -Wno-double-promotion -Wno-comma -Wno-strict-prototypes -Wno-extra-semi-stmt -Wno-c11-extensions -Wno-unreachable-code-return -ferror-limit=1000
# To explain those:
# -Wno-pointer-arith: we use the gcc extension allowing (void *) pointers to increment, don't complain
# -Wno-variadic-macros: we use the gcc extension for variadic macros, don't complain
@ -52,38 +106,4 @@ CCOPTS = -DPLATFORM_MACOS=1 -mmacosx-version-min=10.6 -arch x86_64 -isysroot /Ap
# -Wno-c11-extensions: we want to allow ourselves use of _Noreturn, a C11 annotation...
# -Wno-unreachable-code-return: ...which means some compilers can prove some of our return statements unnecessary
MANYWARNINGS = -Weverything -Wno-pointer-arith -Wno-unused-macros -Wno-shadow -Wno-cast-align -Wno-variadic-macros -Wno-missing-noreturn -Wno-missing-prototypes -Wno-unused-parameter -Wno-padded -Wno-missing-variable-declarations -Wno-unreachable-code-break -Wno-class-varargs -Wno-format-nonliteral -Wno-cast-qual -Wno-double-promotion -Wno-comma -Wno-strict-prototypes -Wno-extra-semi-stmt -Wno-c11-extensions -Wno-unreachable-code-return -ferror-limit=1000
FEWERWARNINGS = -Wno-implicit-int -Wno-dangling-else -Wno-pointer-sign -Wno-format-extra-args -Wno-tautological-compare -Wno-deprecated-declarations -Wno-logical-op-parentheses -Wno-format -Wno-extra-semi-stmt -Wno-c11-extensions -Wno-unreachable-code-return
# (2) We need a linker, "LINK". Nowadays some C compilers (e.g. clang on
# Mac OS X) can happily do their own linking, but on some Unix platforms
# we still want to use ld, so these symbols exist to make it possible to
# specify that.
LINK = clang $(CCOPTS) -g
LINKEROPTS =
# On some platforms, executables have a specific file extension, which we
# define here.
EXEEXTENSION =
# (3) We need an archive tool, "ARTOOL". The traditional archiver "ar -r"
# should be fine on most Unix systems, but for example OS X prefers a more
# modern replacement which can handle multiple-architecture binaries.
ARTOOL = libtool -o
# (4) Platform definition symbols.
# The I6 source code needs a constant defined to tell it what platform it'll
# be used on, so:
INFORM6OS = MACOS
# The following is needed when compiling glulxe, as part of dumb-glulx, which
# is used in testing. For Mac OS X and probably all Unix-based systems, it
# wants to be OS_UNIX; for Windows it probably wants to be WIN32. See the file
# osdepend.c in the glulxe distribution.
GLULXEOS = OS_UNIX

View file

@ -0,0 +1,20 @@
# This makefile was automatically written by inweb -makefile
# and is not intended for human editing
INWEBPLATFORM = macos32
INFORM6OS = MACOS
GLULXEOS = OS_UNIX
EXEEXTENSION =
INTEST = intest/Tangled/intest
INWEB = inweb/Tangled/inweb
CCOPTS = -DPLATFORM_MACOS=1 -mmacosx-version-min=10.4 -arch i386 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk
MANYWARNINGS = -Weverything -Wno-pointer-arith -Wno-unused-macros -Wno-shadow -Wno-cast-align -Wno-variadic-macros -Wno-missing-noreturn -Wno-missing-prototypes -Wno-unused-parameter -Wno-padded -Wno-missing-variable-declarations -Wno-unreachable-code-break -Wno-class-varargs -Wno-format-nonliteral -Wno-cast-qual -Wno-double-promotion -Wno-comma -Wno-strict-prototypes -Wno-extra-semi-stmt -ferror-limit=1000
FEWERWARNINGS = -Wno-implicit-int -Wno-dangling-else -Wno-pointer-sign -Wno-format-extra-args -Wno-tautological-compare -Wno-deprecated-declarations -Wno-logical-op-parentheses -Wno-format -Wno-extra-semi-stmt

View file

@ -0,0 +1,88 @@
# This is "macos32.mkscript", a script which defines build settings used in
# inweb, intest, inform and all of their subsidiary tools for the platform
# "macos32". This is for making 32-bit executable tools on MacOS, though that
# can now only be useful on very old versions of the operating system: use one
# of the more modern MacOS platforms if possible.
# The maintainer of this file is Graham Nelson.
# The script is used for two purposes. Firstly, it is used to generate the
# file "macos32.mk" of platform settings. If an inweb user selects macos32 as
# platform on a first run, then this is the file copied into place as
# inweb/platform-settings.mk. But secondly, it also defines macros which
# can be used by any *.mkscript files being converted to *.mk files on
# this platform.
# Do not edit "macos32.mk" directly. Instead, edit this script, and then
# rebuild "macos32.mk" by setting the current working directory to the directory
# _above_ "inweb", and using the command:
# inweb/Tangled/inweb inweb -prototype inweb/Materials/platforms/macos32.mkscript -makefile inweb/Materials/platforms/macos32.mk
# Or simply:
# make -f inweb/inweb.mk makers
# which recreates all of the make-files in the inweb repository from their
# scripts, including macos32.mk among them.
# See the inweb manual for documentation on the *.mkscript file format, i.e.,
# the format in which this file is written. But it is essentially just a makefile
# with a number of special macro and loop features whose syntax involves braces
# { ... }, so anywhere that you see braces, you're looking at something special
# to *.mkscript; anything else is straightforward make syntax.
# -----------------------------------------------------------------------------
# The first definition in this file must set INWEBPLATFORM to the platform
# name, which is the same as the leafname of this file without the ".mkscript"
# file extension. So:
INWEBPLATFORM = macos32
# The I6 source code has its own set of symbolic names for operating systems,
# not always the same as inweb's names for platforms, so:
INFORM6OS = MACOS
# And similarly for glulxe, which is used as part of the dumb-glulx interpreter,
# which is used in testing Inform on the command line:
GLULXEOS = OS_UNIX
# On some platforms, executables have a specific file extension, which we define here:
EXEEXTENSION =
# -----------------------------------------------------------------------------
# These are likely to be the same on all platforms:
INTEST = intest/Tangled/intest
INWEB = inweb/Tangled/inweb
# -----------------------------------------------------------------------------
# Now three macro definitions: two for compiling C code to *.o object files
# (one being strict about warnings, the other indulgently suppressing them);
# and one for linking those *.o files into an executable.
{define: compile to: TO from: FROM ?options: OPTS}
clang -std=c11 -c $(MANYWARNINGS) $(CCOPTS) -g {OPTS} -o {TO} {FROM}
{end-define}
{define: compile-indulgently to: TO from: FROM ?options: OPTS}
clang -std=c99 -c $(FEWERWARNINGS) $(CCOPTS) -g {OPTS} -o {TO} {FROM}
{end-define}
{define: link to: TO from: FROM ?options: OPTS}
clang $(CCOPTS) -g -o {TO} {FROM} {OPTS}
{end-define}
# Where:
CCOPTS = -DPLATFORM_MACOS=1 -mmacosx-version-min=10.4 -arch i386 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk
MANYWARNINGS = -Weverything -Wno-pointer-arith -Wno-unused-macros -Wno-shadow -Wno-cast-align -Wno-variadic-macros -Wno-missing-noreturn -Wno-missing-prototypes -Wno-unused-parameter -Wno-padded -Wno-missing-variable-declarations -Wno-unreachable-code-break -Wno-class-varargs -Wno-format-nonliteral -Wno-cast-qual -Wno-double-promotion -Wno-comma -Wno-strict-prototypes -Wno-extra-semi-stmt -ferror-limit=1000
FEWERWARNINGS = -Wno-implicit-int -Wno-dangling-else -Wno-pointer-sign -Wno-format-extra-args -Wno-tautological-compare -Wno-deprecated-declarations -Wno-logical-op-parentheses -Wno-format -Wno-extra-semi-stmt

View file

@ -0,0 +1,20 @@
# This makefile was automatically written by inweb -makefile
# and is not intended for human editing
INWEBPLATFORM = unix
INFORM6OS = LINUX
GLULXEOS = OS_UNIX
EXEEXTENSION =
INTEST = intest/Tangled/intest
INWEB = inweb/Tangled/inweb
CCOPTS = -Wno-unused -DPLATFORM_UNIX -DUNIX64 -DCPU_WORDSIZE_MULTIPLIER=2 -O2
MANYWARNINGS = -Weverything -Wno-pointer-arith -Wno-unused-macros -Wno-shadow -Wno-cast-align -Wno-variadic-macros -Wno-missing-noreturn -Wno-missing-prototypes -Wno-unused-parameter -Wno-padded -Wno-missing-variable-declarations -Wno-unreachable-code-break -Wno-class-varargs -Wno-format-nonliteral -Wno-cast-qual -Wno-double-promotion -Wno-comma -Wno-strict-prototypes -Wno-extra-semi-stmt -Wno-c11-extensions -Wno-unreachable-code-return -ferror-limit=1000
FEWERWARNINGS = -Wno-implicit-int -Wno-dangling-else -Wno-pointer-sign -Wno-format-extra-args -Wno-tautological-compare -Wno-deprecated-declarations -Wno-logical-op-parentheses -Wno-format -Wno-extra-semi-stmt -Wno-c11-extensions -Wno-unreachable-code-return

View file

@ -0,0 +1,84 @@
# This is "unix.mkscript", a script which defines build settings used in
# inweb, intest, inform and all of their subsidiary tools for the platform
# "unix". The maintainer of this file is Adam Thornton.
# The script is used for two purposes. Firstly, it is used to generate the
# file "unix.mk" of platform settings. If an inweb user selects unix as
# platform on a first run, then this is the file copied into place as
# inweb/platform-settings.mk. But secondly, it also defines macros which
# can be used by any *.mkscript files being converted to *.mk files on
# this platform.
# Do not edit "unix.mk" directly. Instead, edit this script, and then
# rebuild "unix.mk" by setting the current working directory to the directory
# _above_ "inweb", and using the command:
# inweb/Tangled/inweb inweb -prototype inweb/Materials/platforms/unix.mkscript -makefile inweb/Materials/platforms/unix.mk
# Or simply:
# make -f inweb/inweb.mk makers
# which recreates all of the make-files in the inweb repository from their
# scripts, including unix.mk among them.
# See the inweb manual for documentation on the *.mkscript file format, i.e.,
# the format in which this file is written. But it is essentially just a makefile
# with a number of special macro and loop features whose syntax involves braces
# { ... }, so anywhere that you see braces, you're looking at something special
# to *.mkscript; anything else is straightforward make syntax.
# -----------------------------------------------------------------------------
# The first definition in this file must set INWEBPLATFORM to the platform
# name, which is the same as the leafname of this file without the ".mkscript"
# file extension. So:
INWEBPLATFORM = unix
# The I6 source code has its own set of symbolic names for operating systems,
# not always the same as inweb's names for platforms, so:
INFORM6OS = LINUX
# And similarly for glulxe, which is used as part of the dumb-glulx interpreter,
# which is used in testing Inform on the command line:
GLULXEOS = OS_UNIX
# On some platforms, executables have a specific file extension, which we define here:
EXEEXTENSION =
# -----------------------------------------------------------------------------
# These are likely to be the same on all platforms:
INTEST = intest/Tangled/intest
INWEB = inweb/Tangled/inweb
# -----------------------------------------------------------------------------
# Now three macro definitions: two for compiling C code to *.o object files
# (one being strict about warnings, the other indulgently suppressing them);
# and one for linking those *.o files into an executable.
{define: compile to: TO from: FROM ?options: OPTS}
clang -std=c11 -c $(MANYWARNINGS) $(CCOPTS) -g {OPTS} -o {TO} {FROM}
{end-define}
{define: compile-indulgently to: TO from: FROM ?options: OPTS}
clang -std=c99 -c $(FEWERWARNINGS) $(CCOPTS) -g {OPTS} -o {TO} {FROM}
{end-define}
{define: link to: TO from: FROM ?options: OPTS}
clang -lm -lpthread -static -g -o {TO} {FROM} {OPTS}
{end-define}
# Where:
CCOPTS = -Wno-unused -DPLATFORM_UNIX -DUNIX64 -DCPU_WORDSIZE_MULTIPLIER=2 -O2
MANYWARNINGS = -Weverything -Wno-pointer-arith -Wno-unused-macros -Wno-shadow -Wno-cast-align -Wno-variadic-macros -Wno-missing-noreturn -Wno-missing-prototypes -Wno-unused-parameter -Wno-padded -Wno-missing-variable-declarations -Wno-unreachable-code-break -Wno-class-varargs -Wno-format-nonliteral -Wno-cast-qual -Wno-double-promotion -Wno-comma -Wno-strict-prototypes -Wno-extra-semi-stmt -Wno-c11-extensions -Wno-unreachable-code-return -ferror-limit=1000
FEWERWARNINGS = -Wno-implicit-int -Wno-dangling-else -Wno-pointer-sign -Wno-format-extra-args -Wno-tautological-compare -Wno-deprecated-declarations -Wno-logical-op-parentheses -Wno-format -Wno-extra-semi-stmt -Wno-c11-extensions -Wno-unreachable-code-return

View file

@ -1,24 +1,20 @@
# This is make-intools-settings.mk for Windows.
# To use, you will need to install Cygwin with the Mingw-w64 clang compiler.
# This makefile was automatically written by inweb -makefile
# and is not intended for human editing
INWEBPLATFORM = windows
INFORM6OS = PC_WIN32
GLULXEOS = OS_WIN32
EXEEXTENSION = .exe
INTEST = intest/Tangled/intest
INWEB = inweb/Tangled/inweb
# Use the MinGW x64 clang compiler
CC = x86_64-w64-mingw32-clang -std=c11 -c $(MANYWARNINGS) $(CCOPTS)
INDULGENTCC = x86_64-w64-mingw32-clang -std=c11 -c $(FEWERWARNINGS) $(CCOPTS)
# Define the Windows platform preprocessor symbol
CCOPTS = -DPLATFORM_WINDOWS=1 -D_WIN32_WINNT=0x0600
MANYWARNINGS = -Weverything -Wno-pointer-arith -Wno-unused-macros -Wno-shadow -Wno-cast-align -Wno-variadic-macros -Wno-missing-noreturn -Wno-missing-prototypes -Wno-unused-parameter -Wno-padded -Wno-missing-variable-declarations -Wno-unreachable-code-break -Wno-class-varargs -Wno-format-nonliteral -Wno-cast-qual -Wno-double-promotion -Wno-comma -Wno-strict-prototypes -Wno-extra-semi-stmt -Wno-used-but-marked-unused -Wno-unreachable-code-return -ferror-limit=1000
FEWERWARNINGS = -Wno-implicit-int -Wno-dangling-else -Wno-pointer-sign -Wno-format-extra-args -Wno-tautological-compare -Wno-deprecated-declarations -Wno-logical-op-parentheses -Wno-format -Wno-extra-semi-stmt -Wno-unreachable-code-return
LINK = x86_64-w64-mingw32-clang $(CCOPTS)
LINKEROPTS = -lshlwapi
# Set the standard Windows executable file extension
EXEEXTENSION = .exe
ARTOOL = ar -r
INFORM6OS = PC_WIN32
GLULXEOS = OS_WIN32

View file

@ -0,0 +1,86 @@
# This is "windows.mkscript", a script which defines build settings used in
# inweb, intest, inform and all of their subsidiary tools for the platform
# "windows". The maintainer of this file is David Kinder.
# To use, you will need to install Cygwin with the Mingw-w64 clang compiler.
# The script is used for two purposes. Firstly, it is used to generate the
# file "windows.mk" of platform settings. If an inweb user selects windows as
# platform on a first run, then this is the file copied into place as
# inweb/platform-settings.mk. But secondly, it also defines macros which
# can be used by any *.mkscript files being converted to *.mk files on
# this platform.
# Do not edit "windows.mk" directly. Instead, edit this script, and then
# rebuild "windows.mk" by setting the current working directory to the directory
# _above_ "inweb", and using the command:
# inweb/Tangled/inweb inweb -prototype inweb/Materials/platforms/windows.mkscript -makefile inweb/Materials/platforms/windows.mk
# Or simply:
# make -f inweb/inweb.mk makers
# which recreates all of the make-files in the inweb repository from their
# scripts, including windows.mk among them.
# See the inweb manual for documentation on the *.mkscript file format, i.e.,
# the format in which this file is written. But it is essentially just a makefile
# with a number of special macro and loop features whose syntax involves braces
# { ... }, so anywhere that you see braces, you're looking at something special
# to *.mkscript; anything else is straightforward make syntax.
# -----------------------------------------------------------------------------
# The first definition in this file must set INWEBPLATFORM to the platform
# name, which is the same as the leafname of this file without the ".mkscript"
# file extension. So:
INWEBPLATFORM = windows
# The I6 source code has its own set of symbolic names for operating systems,
# not always the same as inweb's names for platforms, so:
INFORM6OS = PC_WIN32
# And similarly for glulxe, which is used as part of the dumb-glulx interpreter,
# which is used in testing Inform on the command line:
GLULXEOS = OS_WIN32
# On some platforms, executables have a specific file extension, which we define here:
EXEEXTENSION = .exe
# -----------------------------------------------------------------------------
# These are likely to be the same on all platforms:
INTEST = intest/Tangled/intest
INWEB = inweb/Tangled/inweb
# -----------------------------------------------------------------------------
# Now three macro definitions: two for compiling C code to *.o object files
# (one being strict about warnings, the other indulgently suppressing them);
# and one for linking those *.o files into an executable.
{define: compile to: TO from: FROM ?options: OPTS}
x86_64-w64-mingw32-clang -std=c11 -c $(MANYWARNINGS) $(CCOPTS) -g {OPTS} -o {TO} {FROM}
{end-define}
{define: compile-indulgently to: TO from: FROM ?options: OPTS}
x86_64-w64-mingw32-clang -std=c99 -c $(FEWERWARNINGS) $(CCOPTS) -g {OPTS} -o {TO} {FROM}
{end-define}
{define: link to: TO from: FROM ?options: OPTS}
x86_64-w64-mingw32-clang $(CCOPTS) -g -o {TO} {FROM} -lshlwapi {OPTS}
{end-define}
# Where:
CCOPTS = -DPLATFORM_WINDOWS=1 -D_WIN32_WINNT=0x0600
MANYWARNINGS = -Weverything -Wno-pointer-arith -Wno-unused-macros -Wno-shadow -Wno-cast-align -Wno-variadic-macros -Wno-missing-noreturn -Wno-missing-prototypes -Wno-unused-parameter -Wno-padded -Wno-missing-variable-declarations -Wno-unreachable-code-break -Wno-class-varargs -Wno-format-nonliteral -Wno-cast-qual -Wno-double-promotion -Wno-comma -Wno-strict-prototypes -Wno-extra-semi-stmt -Wno-used-but-marked-unused -Wno-unreachable-code-return -ferror-limit=1000
FEWERWARNINGS = -Wno-implicit-int -Wno-dangling-else -Wno-pointer-sign -Wno-format-extra-args -Wno-tautological-compare -Wno-deprecated-declarations -Wno-logical-op-parentheses -Wno-format -Wno-extra-semi-stmt -Wno-unreachable-code-return

View file

@ -1,92 +0,0 @@
INTEST = intest/Tangled/intest
INWEB = inweb/Tangled/inweb
# First, the locations to which resources must be copied, inside the
# application. These pathnames mustn't contain spaces:
BUILTINCOMPS = i7/Compilers
INTERNAL = i7/Internal
BUILTINHTML = i7/Documentation
BUILTINHTMLINNER = i7/Documentation/Sections
# The I6 compiler is one of the tools living in the BUILTINCOMPS folder, but
# its name customarily differs between platforms.
I6COMPILERNAME = inform6
# The I6 source code needs a constant defined to tell it what platform it'll
# be used on, so:
INFORM6OS = LINUX
# The following should contain "--rewrite-standard-rules" only for Mac OS X,
# and then probably only for Graham Nelson's master copy. (The rewriting in
# question reconciles the documentation cross-references in the application,
# by changing the "Document X at Y" sentences in the Standard Rules.)
# For instance, for Windows this should be simply be "windows_app".
INDOCOPTS = linux_app
# -multi in the following runs "make check" with processes divided among what
# are expected to be four processors, for a substantial speed gain, but doesn't
# change the outcome:
INTESTOPTS = -platform linux -threads=1
# We will use Apple's superior clang, rather than gcc itself; they're
# very close to being identical, but clang is faster and gives better errors.
GCC = clang
GCCOPTS = -Wno-unused -DPLATFORM_UNIX -DUNIX64 -DCPU_WORDSIZE_MULTIPLIER=2 -O2
# To excuse these warning waivers:
#     -Wno-pointer-arith: we use the gcc extension allowing (void *) pointers to increment
#     -Wno-variadic-macros: we use the gcc extension for variadic macros
#     -Wno-cast-align, -Wno-padded: we don't care about address alignments of structure elements
#     -Wno-missing-noreturn: a few fatal-error functions could be marked with
#          __attribute__((noreturn)) to prevent this, but gcc doesn't accept
#          this except in a predeclaration, which is inconvenient for us
#     -Wno-shadow: we don't care if an inner block defines a variable of the same name
#     -Wno-unused-macros: a few constants are defined to document external formats rather than for use here
#     -Wno-unused-parameter: we don't much care if a function argument isn't used
#     -Wno-missing-prototypes: because Preform-defined routines aren't predeclared with prototypes
#     -Wno-missing-variable-declarations: these are not for linking, so don't care about extern/static
#     -Wno-unreachable-code-break: these derive from Preform-compiled switches, and are harmless
#  -Wno-class-varargs: for some reason clang thinks structs shouldn't be passed to variable-argument functions
#     -Wno-format-nonliteral: similarly, it thinks all format strings in |printf| should be literals
#     -Wno-cast-qual: in OS X 10.11, clang became bothered by casts from (void *) if it thought they were const
GCCWARNINGS = -Weverything -Wno-pointer-arith -Wno-unused-macros -Wno-shadow -Wno-cast-align -Wno-variadic-macros -Wno-missing-noreturn -Wno-missing-prototypes -Wno-unused-parameter -Wno-padded -Wno-missing-variable-declarations -Wno-unreachable-code-break -Wno-class-varargs -Wno-format-nonliteral -Wno-cast-qual
# (For cblorb, where we make a lot of use of sscanf, it's a nuisance to be warned
# about entirely legal format strings passed as variables.)
CBLORBWARNINGS = -Wno-format-nonliteral
# The following is needed when compiling glulxe, as part of dumb-glulx, which
# is used in testing. For Mac OS X and probably all Unix-based systems, it
# wants to be OS_UNIX; for Windows it probably wants to be WIN32. See the file
# osdepend.c in the glulxe distribution.
GLULXEOS = OS_UNIX
# On Mac OS X, no special options are needed for linking, but on some Unix
# builds we need to use ld rather than gcc and to apply various options.
LINK = $(GCC) $(LINKEROPTS)
LINKEROPTS = -lm -lpthread -static
# On some platforms, executables have a specific file extension, which we
# define here.
EXEEXTENSION =
# On most systems, the following will be the traditional archiver "ar -r", but
# for modern Mac OS X use we need to use Apple's replacement "libtool", which
# is able to cope with fat (i.e., multiple-architecture) binaries.
ARTOOL = ar -r

View file

@ -1,6 +1,6 @@
# Inweb 7
v7-alpha.1+1A90 'Escape to Danger' (19 April 2022)
v7-alpha.1+1A91 'Escape to Danger' (22 April 2022)
## About Inweb

File diff suppressed because it is too large Load diff

View file

@ -1,3 +1,3 @@
Prerelease: alpha.1
Build Date: 19 April 2022
Build Number: 1A90
Build Date: 22 April 2022
Build Number: 1A91

Binary file not shown.

View file

@ -69,6 +69,9 @@ see <a href="../foundation-module/P-abgtf.html" class="internal">A Brief Guide t
<span class="definition-keyword">enum</span> <span class="constant-syntax">macro_CLASS</span>
<span class="definition-keyword">enum</span> <span class="constant-syntax">macro_tokens_CLASS</span>
<span class="definition-keyword">enum</span> <span class="constant-syntax">macro_usage_CLASS</span>
<span class="definition-keyword">enum</span> <span class="constant-syntax">makefile_macro_CLASS</span>
<span class="definition-keyword">enum</span> <span class="constant-syntax">makefile_macro_parameter_CLASS</span>
<span class="definition-keyword">enum</span> <span class="constant-syntax">makefile_macro_playback_CLASS</span>
<span class="definition-keyword">enum</span> <span class="constant-syntax">nonterminal_variable_CLASS</span>
<span class="definition-keyword">enum</span> <span class="constant-syntax">para_macro_CLASS</span>
<span class="definition-keyword">enum</span> <span class="constant-syntax">paragraph_CLASS</span>
@ -159,6 +162,9 @@ see <a href="../foundation-module/P-abgtf.html" class="internal">A Brief Guide t
<span class="identifier-syntax">DECLARE_CLASS</span><span class="plain-syntax">(</span><span class="reserved-syntax">macro_tokens</span><span class="plain-syntax">)</span>
<span class="identifier-syntax">DECLARE_CLASS</span><span class="plain-syntax">(</span><span class="reserved-syntax">macro_usage</span><span class="plain-syntax">)</span>
<span class="identifier-syntax">DECLARE_CLASS</span><span class="plain-syntax">(</span><span class="reserved-syntax">macro</span><span class="plain-syntax">)</span>
<span class="identifier-syntax">DECLARE_CLASS</span><span class="plain-syntax">(</span><span class="reserved-syntax">makefile_macro</span><span class="plain-syntax">)</span>
<span class="identifier-syntax">DECLARE_CLASS</span><span class="plain-syntax">(</span><span class="reserved-syntax">makefile_macro_parameter</span><span class="plain-syntax">)</span>
<span class="identifier-syntax">DECLARE_CLASS</span><span class="plain-syntax">(</span><span class="reserved-syntax">makefile_macro_playback</span><span class="plain-syntax">)</span>
<span class="identifier-syntax">DECLARE_CLASS</span><span class="plain-syntax">(</span><span class="reserved-syntax">nonterminal_variable</span><span class="plain-syntax">)</span>
<span class="identifier-syntax">DECLARE_CLASS</span><span class="plain-syntax">(</span><span class="reserved-syntax">para_macro</span><span class="plain-syntax">)</span>
<span class="identifier-syntax">DECLARE_CLASS</span><span class="plain-syntax">(</span><span class="reserved-syntax">paragraph_tagging</span><span class="plain-syntax">)</span>

View file

@ -152,7 +152,7 @@ each of which has a list of <span class="extract"><span class="extract-syntax">s
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">web_md</span><span class="plain-syntax"> *</span><span class="function-syntax">Reader::load_web_md</span><button class="popup" onclick="togglePopup('usagePopup1')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup1">Usage of <span class="code-font"><span class="function-syntax">Reader::load_web_md</span></span>:<br/>Makefiles - <a href="6-mkf.html#SP2_11_1">&#167;2.11.1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">pathname</span><span class="plain-syntax"> *</span><span class="identifier-syntax">P</span><span class="plain-syntax">, </span><span class="reserved-syntax">filename</span><span class="plain-syntax"> *</span><span class="identifier-syntax">alt_F</span><span class="plain-syntax">, </span><span class="reserved-syntax">module_search</span><span class="plain-syntax"> *</span><span class="identifier-syntax">I</span><span class="plain-syntax">,</span>
<span class="reserved-syntax">web_md</span><span class="plain-syntax"> *</span><span class="function-syntax">Reader::load_web_md</span><button class="popup" onclick="togglePopup('usagePopup1')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup1">Usage of <span class="code-font"><span class="function-syntax">Reader::load_web_md</span></span>:<br/>Makefiles - <a href="6-mkf.html#SP2_15_1">&#167;2.15.1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">pathname</span><span class="plain-syntax"> *</span><span class="identifier-syntax">P</span><span class="plain-syntax">, </span><span class="reserved-syntax">filename</span><span class="plain-syntax"> *</span><span class="identifier-syntax">alt_F</span><span class="plain-syntax">, </span><span class="reserved-syntax">module_search</span><span class="plain-syntax"> *</span><span class="identifier-syntax">I</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">including_modules</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="../foundation-module/8-ws.html#SP5" class="function-link"><span class="function-syntax">WebMetadata::get</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">P</span><span class="plain-syntax">, </span><span class="identifier-syntax">alt_F</span><span class="plain-syntax">, </span><span class="identifier-syntax">default_inweb_syntax</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="plain-syntax">, </span><span class="identifier-syntax">verbose_mode</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">including_modules</span><span class="plain-syntax">, </span><span class="identifier-syntax">path_to_inweb</span><span class="plain-syntax">);</span>

View file

@ -478,9 +478,17 @@ folder: failing that, we fall back on a default script belonging to Inweb.
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Analyser::write_makefile</span><button class="popup" onclick="togglePopup('usagePopup15')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup15">Usage of <span class="code-font"><span class="function-syntax">Analyser::write_makefile</span></span>:<br/>Program Control - <a href="1-pc.html#SP7_4_1">&#167;7.4.1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">web</span><span class="plain-syntax"> *</span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="reserved-syntax">filename</span><span class="plain-syntax"> *</span><span class="identifier-syntax">F</span><span class="plain-syntax">, </span><span class="reserved-syntax">module_search</span><span class="plain-syntax"> *</span><span class="identifier-syntax">I</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">filename</span><span class="plain-syntax"> *</span><span class="identifier-syntax">prototype</span><span class="plain-syntax"> = </span><a href="../foundation-module/3-fln.html#SP2" class="function-link"><span class="function-syntax">Filenames::in</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">md</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">path_to_web</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"makescript.txt"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">pathname</span><span class="plain-syntax"> *</span><span class="identifier-syntax">P</span><span class="plain-syntax"> = </span><span class="identifier-syntax">W</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">md</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">path_to_web</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">short_name</span><span class="plain-syntax"> = </span><a href="../foundation-module/3-pth.html#SP7" class="function-link"><span class="function-syntax">Pathnames::directory_name</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">P</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><a href="../foundation-module/4-sm.html#SP8" class="function-link"><span class="function-syntax">Str::len</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">short_name</span><span class="plain-syntax">) == </span><span class="constant-syntax">0</span><span class="plain-syntax">) ||</span>
<span class="plain-syntax"> (</span><a href="../foundation-module/4-sm.html#SP19" class="function-link"><span class="function-syntax">Str::eq</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">short_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"."</span><span class="plain-syntax">)) || (</span><a href="../foundation-module/4-sm.html#SP19" class="function-link"><span class="function-syntax">Str::eq</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">short_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">".."</span><span class="plain-syntax">)))</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">short_name</span><span class="plain-syntax"> = </span><span class="identifier-syntax">I</span><span class="string-syntax">"web"</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">TEMPORARY_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">leafname</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">leafname</span><span class="plain-syntax">, </span><span class="string-syntax">"%S.mkscript"</span><span class="plain-syntax">, </span><span class="identifier-syntax">short_name</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">filename</span><span class="plain-syntax"> *</span><span class="identifier-syntax">prototype</span><span class="plain-syntax"> = </span><a href="../foundation-module/3-fln.html#SP2" class="function-link"><span class="function-syntax">Filenames::in</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">P</span><span class="plain-syntax">, </span><span class="identifier-syntax">leafname</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">DISCARD_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">leafname</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (!(</span><a href="../foundation-module/4-tf.html#SP1" class="function-link"><span class="function-syntax">TextFiles::exists</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">prototype</span><span class="plain-syntax">)))</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">prototype</span><span class="plain-syntax"> = </span><a href="../foundation-module/3-fln.html#SP2" class="function-link"><span class="function-syntax">Filenames::in</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">path_to_inweb_materials</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"makescript.txt"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">prototype</span><span class="plain-syntax"> = </span><a href="../foundation-module/3-fln.html#SP2" class="function-link"><span class="function-syntax">Filenames::in</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">path_to_inweb_materials</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"default.mkscript"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="6-mkf.html#SP1" class="function-link"><span class="function-syntax">Makefiles::write</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">prototype</span><span class="plain-syntax">, </span><span class="identifier-syntax">F</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>

View file

@ -240,7 +240,7 @@ currently inside.
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">pl</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<ul class="endnotetexts"><li>The structure language_reader_state is private to this section.</li></ul>
<ul class="endnotetexts"><li>The structure language_reader_state is accessed in 6/mkf and here.</li></ul>
<p class="commentary firstcommentary"><a id="SP7_1" class="paragraph-anchor"></a><b>&#167;7.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Initialise the language to a plain-text state</span><span class="named-paragraph-number">7.1</span></span><span class="comment-syntax"> =</span>
</p>

View file

@ -109,7 +109,7 @@ directory holding a multi-section web.
<span class="plain-syntax"> </span><span class="constant-syntax">CLASS_DEFINITION</span>
<span class="plain-syntax">} </span><span class="reserved-syntax">colony_member</span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>The structure colony_member is accessed in 2/trs, 1/cnf, 1/ts, 3/tc, 5/wt, 6/cs, 6/rw and here.</li></ul>
<ul class="endnotetexts"><li>The structure colony_member is accessed in 2/trs, 1/cnf, 1/ts, 3/tc, 5/wt, 6/mkf, 6/cs, 6/rw and here.</li></ul>
<p class="commentary firstcommentary"><a id="SP4" class="paragraph-anchor"></a><b>&#167;4. </b>And the following reads a colony file <span class="extract"><span class="extract-syntax">F</span></span> and produces a suitable <span class="extract"><span class="extract-syntax">colony</span></span>
object from it. This, for example, is the colony file for the Inweb repository
at GitHub:

View file

@ -261,7 +261,7 @@ memory is cheap. It's easier to keep a duplicate list.
<span class="plain-syntax"> </span><span class="constant-syntax">CLASS_DEFINITION</span>
<span class="plain-syntax">} </span><span class="reserved-syntax">defined_constant</span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>The structure defined_constant is accessed in 2/trs, 1/apacs, 5/wt, 6/rw, 6/cln and here.</li></ul>
<ul class="endnotetexts"><li>The structure defined_constant is accessed in 2/trs, 1/apacs, 5/wt, 6/mkf, 6/rw, 6/cln and here.</li></ul>
<p class="commentary firstcommentary"><a id="SP5" class="paragraph-anchor"></a><b>&#167;5. </b>This is called for any <span class="extract"><span class="extract-syntax">@d</span></span> or <span class="extract"><span class="extract-syntax">@e</span></span> constant name, then:
</p>

View file

@ -54,11 +54,41 @@ function togglePopup(material_id) {
following a "prototype".
</p>
<pre class="definitions code-font"><span class="definition-keyword">define</span> <span class="constant-syntax">MAX_MAKEFILE_MACRO_PARAMETERS</span><span class="plain-syntax"> </span><span class="constant-syntax">8</span>
<span class="definition-keyword">define</span> <span class="constant-syntax">MAX_MAKEFILE_MACRO_LINES</span><span class="plain-syntax"> </span><span class="constant-syntax">128</span>
</pre>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">typedef</span><span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">makefile_macro</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">identifier</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">makefile_macro_parameter</span><span class="plain-syntax"> *</span><span class="identifier-syntax">parameters</span><span class="plain-syntax">[</span><span class="constant-syntax">MAX_MAKEFILE_MACRO_PARAMETERS</span><span class="plain-syntax">];</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">no_parameters</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">lines</span><span class="plain-syntax">[</span><span class="constant-syntax">MAX_MAKEFILE_MACRO_LINES</span><span class="plain-syntax">];</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">no_lines</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="constant-syntax">CLASS_DEFINITION</span>
<span class="plain-syntax">} </span><span class="reserved-syntax">makefile_macro</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">typedef</span><span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">makefile_macro_parameter</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">name</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">definition_token</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">optional</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="constant-syntax">CLASS_DEFINITION</span>
<span class="plain-syntax">} </span><span class="reserved-syntax">makefile_macro_parameter</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">typedef</span><span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">makefile_macro_playback</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">makefile_macro</span><span class="plain-syntax"> *</span><span class="identifier-syntax">which</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">parameter_values</span><span class="plain-syntax">[</span><span class="constant-syntax">MAX_MAKEFILE_MACRO_PARAMETERS</span><span class="plain-syntax">];</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">line_position</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">makefile_macro_playback</span><span class="plain-syntax"> *</span><span class="identifier-syntax">prior_to_this</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">text_to_follow</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="constant-syntax">CLASS_DEFINITION</span>
<span class="plain-syntax">} </span><span class="reserved-syntax">makefile_macro_playback</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">typedef</span><span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">makefile_state</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">web</span><span class="plain-syntax"> *</span><span class="identifier-syntax">for_web</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">text_stream</span><span class="plain-syntax"> </span><span class="identifier-syntax">to_makefile</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">repeat_block</span><span class="plain-syntax">; </span><span class="comment-syntax"> a "repeatblock" body being scanned</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">makefile_macro</span><span class="plain-syntax"> *</span><span class="identifier-syntax">defining</span><span class="plain-syntax">; </span><span class="comment-syntax"> a "define" body being scanned</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="reserved-syntax">makefile_macro_playback</span><span class="plain-syntax"> *</span><span class="identifier-syntax">playing_back</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">inside_block</span><span class="plain-syntax">; </span><span class="comment-syntax"> scanning a "repeatblock" into that text?</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">last_line_was_blank</span><span class="plain-syntax">; </span><span class="comment-syntax"> used to suppress runs of multiple blank lines</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">allow_commands</span><span class="plain-syntax">; </span><span class="comment-syntax"> permit the prototype to use special commands</span>
@ -75,6 +105,8 @@ following a "prototype".
<span class="plain-syntax"> </span><span class="identifier-syntax">MS</span><span class="plain-syntax">.</span><span class="element-syntax">for_web</span><span class="plain-syntax"> = </span><span class="identifier-syntax">W</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">MS</span><span class="plain-syntax">.</span><span class="element-syntax">last_line_was_blank</span><span class="plain-syntax"> = </span><span class="constant-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">MS</span><span class="plain-syntax">.</span><span class="element-syntax">repeat_block</span><span class="plain-syntax"> = </span><a href="../foundation-module/4-sm.html#SP2" class="function-link"><span class="function-syntax">Str::new</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">MS</span><span class="plain-syntax">.</span><span class="element-syntax">defining</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">MS</span><span class="plain-syntax">.</span><span class="element-syntax">playing_back</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">MS</span><span class="plain-syntax">.</span><span class="element-syntax">inside_block</span><span class="plain-syntax"> = </span><span class="constant-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">MS</span><span class="plain-syntax">.</span><span class="element-syntax">allow_commands</span><span class="plain-syntax"> = </span><span class="constant-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">MS</span><span class="plain-syntax">.</span><span class="element-syntax">tools_dictionary</span><span class="plain-syntax"> = </span><a href="../foundation-module/2-dct.html#SP2" class="function-link"><span class="function-syntax">Dictionaries::new</span></a><span class="plain-syntax">(16, </span><span class="constant-syntax">FALSE</span><span class="plain-syntax">);</span>
@ -94,78 +126,238 @@ following a "prototype".
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="constant-syntax">STDOUT</span><span class="plain-syntax">, </span><span class="string-syntax">"Wrote makefile '%f' from script '%f'\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">F</span><span class="plain-syntax">, </span><span class="identifier-syntax">prototype</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
</pre>
<ul class="endnotetexts"><li>The structure makefile_state is accessed in 3/tc, 6/gs and here.</li></ul>
<ul class="endnotetexts"><li>The structure makefile_macro is private to this section.</li><li>The structure makefile_macro_parameter is accessed in 2/trs, 5/wt, 6/cs, 6/rw, 6/cln and here.</li><li>The structure makefile_macro_playback is accessed in 4/tf and here.</li><li>The structure makefile_state is accessed in 3/tc, 4/pl, 6/gs and here.</li></ul>
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>&#167;2. </b></p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Makefiles::scan_makefile_line</span><button class="popup" onclick="togglePopup('usagePopup2')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup2">Usage of <span class="code-font"><span class="function-syntax">Makefiles::scan_makefile_line</span></span>:<br/><a href="6-mkf.html#SP1">&#167;1</a>, <a href="6-mkf.html#SP2_9">&#167;2.9</a>, <a href="6-mkf.html#SP4">&#167;4</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">line</span><span class="plain-syntax">, </span><span class="reserved-syntax">text_file_position</span><span class="plain-syntax"> *</span><span class="identifier-syntax">tfp</span><span class="plain-syntax">, </span><span class="reserved-syntax">void</span><span class="plain-syntax"> *</span><span class="identifier-syntax">X</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Makefiles::scan_makefile_line</span><button class="popup" onclick="togglePopup('usagePopup2')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup2">Usage of <span class="code-font"><span class="function-syntax">Makefiles::scan_makefile_line</span></span>:<br/><a href="6-mkf.html#SP1">&#167;1</a>, <a href="6-mkf.html#SP2_4">&#167;2.4</a>, <a href="6-mkf.html#SP2_13">&#167;2.13</a>, <a href="6-mkf.html#SP4">&#167;4</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">line</span><span class="plain-syntax">, </span><span class="reserved-syntax">text_file_position</span><span class="plain-syntax"> *</span><span class="identifier-syntax">tfp</span><span class="plain-syntax">, </span><span class="reserved-syntax">void</span><span class="plain-syntax"> *</span><span class="identifier-syntax">X</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">makefile_state</span><span class="plain-syntax"> *</span><span class="identifier-syntax">MS</span><span class="plain-syntax"> = (</span><span class="reserved-syntax">makefile_state</span><span class="plain-syntax"> *) </span><span class="identifier-syntax">X</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">OUT</span><span class="plain-syntax"> = &amp;(</span><span class="identifier-syntax">MS</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">to_makefile</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">match_results</span><span class="plain-syntax"> </span><span class="identifier-syntax">mr</span><span class="plain-syntax"> = </span><a href="../foundation-module/4-pm.html#SP9" class="function-link"><span class="function-syntax">Regexp::create_mr</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="../foundation-module/4-pm.html#SP10" class="function-link"><span class="function-syntax">Regexp::match</span></a><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">mr</span><span class="plain-syntax">, </span><span class="identifier-syntax">line</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">" *#%c*"</span><span class="plain-syntax">)) { </span><a href="../foundation-module/4-pm.html#SP9" class="function-link"><span class="function-syntax">Regexp::dispose_of</span></a><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">mr</span><span class="plain-syntax">); </span><span class="reserved-syntax">return</span><span class="plain-syntax">; } </span><span class="comment-syntax"> Skip comment lines</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">MS</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">allow_commands</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="../foundation-module/4-pm.html#SP10" class="function-link"><span class="function-syntax">Regexp::match</span></a><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">mr</span><span class="plain-syntax">, </span><span class="identifier-syntax">line</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">" *{define: *(%C+) (%c*)} *"</span><span class="plain-syntax">)) </span><span class="named-paragraph-container code-font"><a href="6-mkf.html#SP2_1" class="named-paragraph-link"><span class="named-paragraph">Begin a definition</span><span class="named-paragraph-number">2.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="../foundation-module/4-pm.html#SP10" class="function-link"><span class="function-syntax">Regexp::match</span></a><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">mr</span><span class="plain-syntax">, </span><span class="identifier-syntax">line</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">" *{end-define} *"</span><span class="plain-syntax">)) </span><span class="named-paragraph-container code-font"><a href="6-mkf.html#SP2_3" class="named-paragraph-link"><span class="named-paragraph">End a definition</span><span class="named-paragraph-number">2.3</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">MS</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">defining</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="6-mkf.html#SP2_2" class="named-paragraph-link"><span class="named-paragraph">Continue a definition</span><span class="named-paragraph-number">2.2</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="../foundation-module/4-pm.html#SP10" class="function-link"><span class="function-syntax">Regexp::match</span></a><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">mr</span><span class="plain-syntax">, </span><span class="identifier-syntax">line</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">" *{repeat-tools-block:(%C*)} *"</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="6-mkf.html#SP2_1" class="named-paragraph-link"><span class="named-paragraph">Begin a repeat tool block</span><span class="named-paragraph-number">2.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="6-mkf.html#SP2_5" class="named-paragraph-link"><span class="named-paragraph">Begin a repeat tool block</span><span class="named-paragraph-number">2.5</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="../foundation-module/4-pm.html#SP10" class="function-link"><span class="function-syntax">Regexp::match</span></a><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">mr</span><span class="plain-syntax">, </span><span class="identifier-syntax">line</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">" *{repeat-webs-block:(%C*)} *"</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="6-mkf.html#SP2_2" class="named-paragraph-link"><span class="named-paragraph">Begin a repeat web block</span><span class="named-paragraph-number">2.2</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="6-mkf.html#SP2_6" class="named-paragraph-link"><span class="named-paragraph">Begin a repeat web block</span><span class="named-paragraph-number">2.6</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="../foundation-module/4-pm.html#SP10" class="function-link"><span class="function-syntax">Regexp::match</span></a><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">mr</span><span class="plain-syntax">, </span><span class="identifier-syntax">line</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">" *{repeat-modules-block:(%C*)} *"</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="6-mkf.html#SP2_3" class="named-paragraph-link"><span class="named-paragraph">Begin a repeat module block</span><span class="named-paragraph-number">2.3</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="../foundation-module/4-pm.html#SP10" class="function-link"><span class="function-syntax">Regexp::match</span></a><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">mr</span><span class="plain-syntax">, </span><span class="identifier-syntax">line</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">" *{end-block} *"</span><span class="plain-syntax">)) </span><span class="named-paragraph-container code-font"><a href="6-mkf.html#SP2_5" class="named-paragraph-link"><span class="named-paragraph">End a repeat block</span><span class="named-paragraph-number">2.5</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">MS</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">inside_block</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="6-mkf.html#SP2_4" class="named-paragraph-link"><span class="named-paragraph">Deal with a line in a repeat block</span><span class="named-paragraph-number">2.4</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="6-mkf.html#SP2_7" class="named-paragraph-link"><span class="named-paragraph">Begin a repeat module block</span><span class="named-paragraph-number">2.7</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="../foundation-module/4-pm.html#SP10" class="function-link"><span class="function-syntax">Regexp::match</span></a><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">mr</span><span class="plain-syntax">, </span><span class="identifier-syntax">line</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">" *{end-block} *"</span><span class="plain-syntax">)) </span><span class="named-paragraph-container code-font"><a href="6-mkf.html#SP2_9" class="named-paragraph-link"><span class="named-paragraph">End a repeat block</span><span class="named-paragraph-number">2.9</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">MS</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">inside_block</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="6-mkf.html#SP2_8" class="named-paragraph-link"><span class="named-paragraph">Deal with a line in a repeat block</span><span class="named-paragraph-number">2.8</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="../foundation-module/4-pm.html#SP10" class="function-link"><span class="function-syntax">Regexp::match</span></a><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">mr</span><span class="plain-syntax">, </span><span class="identifier-syntax">line</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">"(%c*){repeat-tools-span}(%c*?){end-span}(%c*)"</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="6-mkf.html#SP2_6" class="named-paragraph-link"><span class="named-paragraph">Deal with a repeat span</span><span class="named-paragraph-number">2.6</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="6-mkf.html#SP2_10" class="named-paragraph-link"><span class="named-paragraph">Deal with a repeat span</span><span class="named-paragraph-number">2.10</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="../foundation-module/4-pm.html#SP10" class="function-link"><span class="function-syntax">Regexp::match</span></a><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">mr</span><span class="plain-syntax">, </span><span class="identifier-syntax">line</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">"(%c*){repeat-webs-span}(%c*?){end-span}(%c*)"</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="6-mkf.html#SP2_7" class="named-paragraph-link"><span class="named-paragraph">Deal with a repeat web span</span><span class="named-paragraph-number">2.7</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="6-mkf.html#SP2_11" class="named-paragraph-link"><span class="named-paragraph">Deal with a repeat web span</span><span class="named-paragraph-number">2.11</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="../foundation-module/4-pm.html#SP10" class="function-link"><span class="function-syntax">Regexp::match</span></a><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">mr</span><span class="plain-syntax">, </span><span class="identifier-syntax">line</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">"(%c*){repeat-modules-span}(%c*?){end-span}(%c*)"</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="6-mkf.html#SP2_8" class="named-paragraph-link"><span class="named-paragraph">Deal with a repeat module span</span><span class="named-paragraph-number">2.8</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="6-mkf.html#SP2_12" class="named-paragraph-link"><span class="named-paragraph">Deal with a repeat module span</span><span class="named-paragraph-number">2.12</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="../foundation-module/4-pm.html#SP10" class="function-link"><span class="function-syntax">Regexp::match</span></a><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">mr</span><span class="plain-syntax">, </span><span class="identifier-syntax">line</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">" *{identity-settings} *"</span><span class="plain-syntax">)) </span><span class="named-paragraph-container code-font"><a href="6-mkf.html#SP2_10" class="named-paragraph-link"><span class="named-paragraph">Expand identity-settings</span><span class="named-paragraph-number">2.10</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="../foundation-module/4-pm.html#SP10" class="function-link"><span class="function-syntax">Regexp::match</span></a><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">mr</span><span class="plain-syntax">, </span><span class="identifier-syntax">line</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">" *{platform-settings} *"</span><span class="plain-syntax">)) </span><span class="named-paragraph-container code-font"><a href="6-mkf.html#SP2_9" class="named-paragraph-link"><span class="named-paragraph">Expand platform-settings</span><span class="named-paragraph-number">2.9</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="../foundation-module/4-pm.html#SP10" class="function-link"><span class="function-syntax">Regexp::match</span></a><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">mr</span><span class="plain-syntax">, </span><span class="identifier-syntax">line</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">" *{identity-settings} *"</span><span class="plain-syntax">)) </span><span class="named-paragraph-container code-font"><a href="6-mkf.html#SP2_14" class="named-paragraph-link"><span class="named-paragraph">Expand identity-settings</span><span class="named-paragraph-number">2.14</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="../foundation-module/4-pm.html#SP10" class="function-link"><span class="function-syntax">Regexp::match</span></a><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">mr</span><span class="plain-syntax">, </span><span class="identifier-syntax">line</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">" *{platform-settings} *"</span><span class="plain-syntax">)) </span><span class="named-paragraph-container code-font"><a href="6-mkf.html#SP2_13" class="named-paragraph-link"><span class="named-paragraph">Expand platform-settings</span><span class="named-paragraph-number">2.13</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="../foundation-module/4-pm.html#SP10" class="function-link"><span class="function-syntax">Regexp::match</span></a><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">mr</span><span class="plain-syntax">, </span><span class="identifier-syntax">line</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">" *{tool} *(%C+) (%C+) (%c+) (%C+) *"</span><span class="plain-syntax">)) </span><span class="named-paragraph-container code-font"><a href="6-mkf.html#SP2_11" class="named-paragraph-link"><span class="named-paragraph">Declare a tool</span><span class="named-paragraph-number">2.11</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="../foundation-module/4-pm.html#SP10" class="function-link"><span class="function-syntax">Regexp::match</span></a><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">mr</span><span class="plain-syntax">, </span><span class="identifier-syntax">line</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">" *{web} *(%C+) (%C+) (%c+) (%C+) *"</span><span class="plain-syntax">)) </span><span class="named-paragraph-container code-font"><a href="6-mkf.html#SP2_12" class="named-paragraph-link"><span class="named-paragraph">Declare a web</span><span class="named-paragraph-number">2.12</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="../foundation-module/4-pm.html#SP10" class="function-link"><span class="function-syntax">Regexp::match</span></a><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">mr</span><span class="plain-syntax">, </span><span class="identifier-syntax">line</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">" *{module} *(%C+) (%C+) (%c+) (%C+) *"</span><span class="plain-syntax">)) </span><span class="named-paragraph-container code-font"><a href="6-mkf.html#SP2_13" class="named-paragraph-link"><span class="named-paragraph">Declare a module</span><span class="named-paragraph-number">2.13</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="../foundation-module/4-pm.html#SP10" class="function-link"><span class="function-syntax">Regexp::match</span></a><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">mr</span><span class="plain-syntax">, </span><span class="identifier-syntax">line</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">" *{tool} *(%C+) (%C+) (%c+) (%C+) *"</span><span class="plain-syntax">)) </span><span class="named-paragraph-container code-font"><a href="6-mkf.html#SP2_15" class="named-paragraph-link"><span class="named-paragraph">Declare a tool</span><span class="named-paragraph-number">2.15</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="../foundation-module/4-pm.html#SP10" class="function-link"><span class="function-syntax">Regexp::match</span></a><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">mr</span><span class="plain-syntax">, </span><span class="identifier-syntax">line</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">" *{web} *(%C+) (%C+) (%c+) (%C+) *"</span><span class="plain-syntax">)) </span><span class="named-paragraph-container code-font"><a href="6-mkf.html#SP2_16" class="named-paragraph-link"><span class="named-paragraph">Declare a web</span><span class="named-paragraph-number">2.16</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="../foundation-module/4-pm.html#SP10" class="function-link"><span class="function-syntax">Regexp::match</span></a><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">mr</span><span class="plain-syntax">, </span><span class="identifier-syntax">line</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">" *{module} *(%C+) (%C+) (%c+) (%C+) *"</span><span class="plain-syntax">)) </span><span class="named-paragraph-container code-font"><a href="6-mkf.html#SP2_17" class="named-paragraph-link"><span class="named-paragraph">Declare a module</span><span class="named-paragraph-number">2.17</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="../foundation-module/4-pm.html#SP10" class="function-link"><span class="function-syntax">Regexp::match</span></a><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">mr</span><span class="plain-syntax">, </span><span class="identifier-syntax">line</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">"(%c*?) *{dependent-files} *"</span><span class="plain-syntax">)) </span><span class="named-paragraph-container code-font"><a href="6-mkf.html#SP2_14" class="named-paragraph-link"><span class="named-paragraph">Expand dependent-files</span><span class="named-paragraph-number">2.14</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="../foundation-module/4-pm.html#SP10" class="function-link"><span class="function-syntax">Regexp::match</span></a><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">mr</span><span class="plain-syntax">, </span><span class="identifier-syntax">line</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">"(%c*?) *{dependent-files} *"</span><span class="plain-syntax">)) </span><span class="named-paragraph-container code-font"><a href="6-mkf.html#SP2_18" class="named-paragraph-link"><span class="named-paragraph">Expand dependent-files</span><span class="named-paragraph-number">2.18</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="../foundation-module/4-pm.html#SP10" class="function-link"><span class="function-syntax">Regexp::match</span></a><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">mr</span><span class="plain-syntax">, </span><span class="identifier-syntax">line</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">"(%c*?) *{dependent-files-for-tool-alone} *(%C+)"</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="6-mkf.html#SP2_16" class="named-paragraph-link"><span class="named-paragraph">Expand dependent-files-for-tool-alone</span><span class="named-paragraph-number">2.16</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="6-mkf.html#SP2_20" class="named-paragraph-link"><span class="named-paragraph">Expand dependent-files-for-tool-alone</span><span class="named-paragraph-number">2.20</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="../foundation-module/4-pm.html#SP10" class="function-link"><span class="function-syntax">Regexp::match</span></a><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">mr</span><span class="plain-syntax">, </span><span class="identifier-syntax">line</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">"(%c*?) *{dependent-files-for-tool-and-modules} *(%C+)"</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="6-mkf.html#SP2_15" class="named-paragraph-link"><span class="named-paragraph">Expand dependent-files-for-tool</span><span class="named-paragraph-number">2.15</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="6-mkf.html#SP2_19" class="named-paragraph-link"><span class="named-paragraph">Expand dependent-files-for-tool</span><span class="named-paragraph-number">2.19</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="../foundation-module/4-pm.html#SP10" class="function-link"><span class="function-syntax">Regexp::match</span></a><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">mr</span><span class="plain-syntax">, </span><span class="identifier-syntax">line</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">"(%c*?) *{dependent-files-for-module} *(%C+)"</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="6-mkf.html#SP2_17" class="named-paragraph-link"><span class="named-paragraph">Expand dependent-files-for-module</span><span class="named-paragraph-number">2.17</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="6-mkf.html#SP2_21" class="named-paragraph-link"><span class="named-paragraph">Expand dependent-files-for-module</span><span class="named-paragraph-number">2.21</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="../foundation-module/4-pm.html#SP10" class="function-link"><span class="function-syntax">Regexp::match</span></a><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">mr</span><span class="plain-syntax">, </span><span class="identifier-syntax">line</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">"(%c*?) *{(%C+) *(%c+?)} *(%c*?)"</span><span class="plain-syntax">)) </span><span class="named-paragraph-container code-font"><a href="6-mkf.html#SP2_4" class="named-paragraph-link"><span class="named-paragraph">Expand a macro</span><span class="named-paragraph-number">2.4</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><a href="../foundation-module/4-pm.html#SP9" class="function-link"><span class="function-syntax">Regexp::dispose_of</span></a><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">mr</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="6-mkf.html#SP2_18" class="named-paragraph-link"><span class="named-paragraph">And otherwise copy the line straight through</span><span class="named-paragraph-number">2.18</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="6-mkf.html#SP2_22" class="named-paragraph-link"><span class="named-paragraph">And otherwise copy the line straight through</span><span class="named-paragraph-number">2.22</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP2_1" class="paragraph-anchor"></a><b>&#167;2.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Begin a repeat tool block</span><span class="named-paragraph-number">2.1</span></span><span class="comment-syntax"> =</span>
<p class="commentary firstcommentary"><a id="SP2_1" class="paragraph-anchor"></a><b>&#167;2.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Begin a definition</span><span class="named-paragraph-number">2.1</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">MS</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">defining</span><span class="plain-syntax">) </span><a href="../foundation-module/3-em.html#SP5" class="function-link"><span class="function-syntax">Errors::in_text_file</span></a><span class="plain-syntax">(</span><span class="string-syntax">"nested definitions are not allowed"</span><span class="plain-syntax">, </span><span class="identifier-syntax">tfp</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">name</span><span class="plain-syntax"> = </span><span class="identifier-syntax">mr</span><span class="plain-syntax">.</span><span class="element-syntax">exp</span><span class="plain-syntax">[0];</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">parameter_specification</span><span class="plain-syntax"> = </span><span class="identifier-syntax">mr</span><span class="plain-syntax">.</span><span class="element-syntax">exp</span><span class="plain-syntax">[1];</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">makefile_macro</span><span class="plain-syntax"> *</span><span class="identifier-syntax">new_macro</span><span class="plain-syntax"> = </span><span class="identifier-syntax">CREATE</span><span class="plain-syntax">(</span><span class="reserved-syntax">makefile_macro</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">new_macro</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">identifier</span><span class="plain-syntax"> = </span><a href="../foundation-module/4-sm.html#SP3" class="function-link"><span class="function-syntax">Str::duplicate</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">name</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">new_macro</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">no_parameters</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">new_macro</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">no_lines</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">match_results</span><span class="plain-syntax"> </span><span class="identifier-syntax">mr2</span><span class="plain-syntax"> = </span><a href="../foundation-module/4-pm.html#SP9" class="function-link"><span class="function-syntax">Regexp::create_mr</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">while</span><span class="plain-syntax"> (</span><a href="../foundation-module/4-pm.html#SP10" class="function-link"><span class="function-syntax">Regexp::match</span></a><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">mr2</span><span class="plain-syntax">, </span><span class="identifier-syntax">parameter_specification</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">" *(%C+): *(%C+) *(%c*)"</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">new_macro</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">no_parameters</span><span class="plain-syntax"> &gt;= </span><span class="constant-syntax">MAX_MAKEFILE_MACRO_PARAMETERS</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><a href="../foundation-module/3-em.html#SP5" class="function-link"><span class="function-syntax">Errors::in_text_file</span></a><span class="plain-syntax">(</span><span class="string-syntax">"too many parameters in this definition"</span><span class="plain-syntax">, </span><span class="identifier-syntax">tfp</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">makefile_macro_parameter</span><span class="plain-syntax"> *</span><span class="identifier-syntax">new_parameter</span><span class="plain-syntax"> = </span><span class="identifier-syntax">CREATE</span><span class="plain-syntax">(</span><span class="reserved-syntax">makefile_macro_parameter</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">new_parameter</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">name</span><span class="plain-syntax"> = </span><a href="../foundation-module/4-sm.html#SP3" class="function-link"><span class="function-syntax">Str::duplicate</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">mr2</span><span class="plain-syntax">.</span><span class="element-syntax">exp</span><span class="plain-syntax">[0]);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">new_parameter</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">definition_token</span><span class="plain-syntax"> = </span><a href="../foundation-module/4-sm.html#SP3" class="function-link"><span class="function-syntax">Str::duplicate</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">mr2</span><span class="plain-syntax">.</span><span class="element-syntax">exp</span><span class="plain-syntax">[1]);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">new_parameter</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">optional</span><span class="plain-syntax"> = </span><span class="constant-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="../foundation-module/4-sm.html#SP13" class="function-link"><span class="function-syntax">Str::get_first_char</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">new_parameter</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">name</span><span class="plain-syntax">) == </span><span class="character-syntax">'?'</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">new_parameter</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">optional</span><span class="plain-syntax"> = </span><span class="constant-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><a href="../foundation-module/4-sm.html#SP25" class="function-link"><span class="function-syntax">Str::delete_first_character</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">new_parameter</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">name</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">new_macro</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">parameters</span><span class="plain-syntax">[</span><span class="identifier-syntax">new_macro</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">no_parameters</span><span class="plain-syntax">++] = </span><span class="identifier-syntax">new_parameter</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><a href="../foundation-module/4-sm.html#SP15" class="function-link"><span class="function-syntax">Str::clear</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">parameter_specification</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="../foundation-module/4-sm.html#SP17" class="function-link"><span class="function-syntax">Str::copy</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">parameter_specification</span><span class="plain-syntax">, </span><span class="identifier-syntax">mr2</span><span class="plain-syntax">.</span><span class="element-syntax">exp</span><span class="plain-syntax">[2]);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><a href="../foundation-module/4-pm.html#SP9" class="function-link"><span class="function-syntax">Regexp::dispose_of</span></a><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">mr2</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="../foundation-module/4-sm.html#SP23" class="function-link"><span class="function-syntax">Str::is_whitespace</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">parameter_specification</span><span class="plain-syntax">) == </span><span class="constant-syntax">FALSE</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><a href="../foundation-module/3-em.html#SP5" class="function-link"><span class="function-syntax">Errors::in_text_file</span></a><span class="plain-syntax">(</span><span class="string-syntax">"parameter list for this definition is malformed"</span><span class="plain-syntax">, </span><span class="identifier-syntax">tfp</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">MS</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">defining</span><span class="plain-syntax"> = </span><span class="identifier-syntax">new_macro</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><a href="../foundation-module/4-pm.html#SP9" class="function-link"><span class="function-syntax">Regexp::dispose_of</span></a><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">mr</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="6-mkf.html#SP2">&#167;2</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP2_2" class="paragraph-anchor"></a><b>&#167;2.2. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Continue a definition</span><span class="named-paragraph-number">2.2</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">MS</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">defining</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">no_lines</span><span class="plain-syntax"> &gt;= </span><span class="constant-syntax">MAX_MAKEFILE_MACRO_LINES</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><a href="../foundation-module/3-em.html#SP5" class="function-link"><span class="function-syntax">Errors::in_text_file</span></a><span class="plain-syntax">(</span><span class="string-syntax">"too many lines in this definition"</span><span class="plain-syntax">, </span><span class="identifier-syntax">tfp</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">MS</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">defining</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">lines</span><span class="plain-syntax">[</span><span class="identifier-syntax">MS</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">defining</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">no_lines</span><span class="plain-syntax">++] = </span><a href="../foundation-module/4-sm.html#SP3" class="function-link"><span class="function-syntax">Str::duplicate</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">line</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><a href="../foundation-module/4-pm.html#SP9" class="function-link"><span class="function-syntax">Regexp::dispose_of</span></a><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">mr</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="6-mkf.html#SP2">&#167;2</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP2_3" class="paragraph-anchor"></a><b>&#167;2.3. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">End a definition</span><span class="named-paragraph-number">2.3</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">MS</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">defining</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><a href="../foundation-module/3-em.html#SP5" class="function-link"><span class="function-syntax">Errors::in_text_file</span></a><span class="plain-syntax">(</span><span class="string-syntax">"{end-define} without {define: ...}"</span><span class="plain-syntax">, </span><span class="identifier-syntax">tfp</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">MS</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">defining</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><a href="../foundation-module/4-pm.html#SP9" class="function-link"><span class="function-syntax">Regexp::dispose_of</span></a><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">mr</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="6-mkf.html#SP2">&#167;2</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP2_4" class="paragraph-anchor"></a><b>&#167;2.4. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Expand a macro</span><span class="named-paragraph-number">2.4</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">before_matter</span><span class="plain-syntax"> = </span><span class="identifier-syntax">mr</span><span class="plain-syntax">.</span><span class="element-syntax">exp</span><span class="plain-syntax">[0];</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">identifier</span><span class="plain-syntax"> = </span><span class="identifier-syntax">mr</span><span class="plain-syntax">.</span><span class="identifier-syntax">exp</span><span class="plain-syntax">[1];</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">parameter_settings</span><span class="plain-syntax"> = </span><span class="identifier-syntax">mr</span><span class="plain-syntax">.</span><span class="element-syntax">exp</span><span class="plain-syntax">[2];</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">after_matter</span><span class="plain-syntax"> = </span><span class="identifier-syntax">mr</span><span class="plain-syntax">.</span><span class="element-syntax">exp</span><span class="plain-syntax">[3];</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">makefile_macro_playback</span><span class="plain-syntax"> *</span><span class="identifier-syntax">playback</span><span class="plain-syntax"> = </span><span class="identifier-syntax">CREATE</span><span class="plain-syntax">(</span><span class="reserved-syntax">makefile_macro_playback</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">playback</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">which</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">makefile_macro</span><span class="plain-syntax"> *</span><span class="identifier-syntax">mm</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER</span><span class="plain-syntax">(</span><span class="identifier-syntax">mm</span><span class="plain-syntax">, </span><span class="reserved-syntax">makefile_macro</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="../foundation-module/4-sm.html#SP19" class="function-link"><span class="function-syntax">Str::eq</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">mm</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">identifier</span><span class="plain-syntax">, </span><span class="identifier-syntax">identifier</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">playback</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">which</span><span class="plain-syntax"> = </span><span class="identifier-syntax">mm</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">playback</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">which</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><a href="../foundation-module/3-em.html#SP5" class="function-link"><span class="function-syntax">Errors::in_text_file</span></a><span class="plain-syntax">(</span><span class="string-syntax">"unknown macro or command in braces"</span><span class="plain-syntax">, </span><span class="identifier-syntax">tfp</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="../foundation-module/4-pm.html#SP9" class="function-link"><span class="function-syntax">Regexp::dispose_of</span></a><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">mr</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">i</span><span class="plain-syntax">=0; </span><span class="identifier-syntax">i</span><span class="plain-syntax">&lt;</span><span class="constant-syntax">MAX_MAKEFILE_MACRO_PARAMETERS</span><span class="plain-syntax">; </span><span class="identifier-syntax">i</span><span class="plain-syntax">++)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">playback</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">parameter_values</span><span class="plain-syntax">[</span><span class="identifier-syntax">i</span><span class="plain-syntax">] = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">match_results</span><span class="plain-syntax"> </span><span class="identifier-syntax">mr2</span><span class="plain-syntax"> = </span><a href="../foundation-module/4-pm.html#SP9" class="function-link"><span class="function-syntax">Regexp::create_mr</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">while</span><span class="plain-syntax"> (</span><a href="../foundation-module/4-pm.html#SP10" class="function-link"><span class="function-syntax">Regexp::match</span></a><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">mr2</span><span class="plain-syntax">, </span><span class="identifier-syntax">parameter_settings</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">" *(%C+): *(%C+) *(%c*)"</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">setting</span><span class="plain-syntax"> = </span><span class="identifier-syntax">mr2</span><span class="plain-syntax">.</span><span class="element-syntax">exp</span><span class="plain-syntax">[0];</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">value</span><span class="plain-syntax"> = </span><span class="identifier-syntax">mr2</span><span class="plain-syntax">.</span><span class="identifier-syntax">exp</span><span class="plain-syntax">[1];</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">remainder</span><span class="plain-syntax"> = </span><span class="identifier-syntax">mr2</span><span class="plain-syntax">.</span><span class="element-syntax">exp</span><span class="plain-syntax">[2];</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">found</span><span class="plain-syntax"> = </span><span class="constant-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">i</span><span class="plain-syntax">=0; </span><span class="identifier-syntax">i</span><span class="function-syntax">&lt;playback-&gt;which-&gt;</span><span class="element-syntax">no_parameters</span><span class="plain-syntax">; </span><span class="identifier-syntax">i</span><span class="plain-syntax">++)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="../foundation-module/4-sm.html#SP19" class="function-link"><span class="function-syntax">Str::eq</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">setting</span><span class="plain-syntax">, </span><span class="identifier-syntax">playback</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">which</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">parameters</span><span class="plain-syntax">[</span><span class="identifier-syntax">i</span><span class="plain-syntax">]-&gt;</span><span class="element-syntax">name</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">found</span><span class="plain-syntax"> = </span><span class="constant-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">playback</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">parameter_values</span><span class="plain-syntax">[</span><span class="identifier-syntax">i</span><span class="plain-syntax">] = </span><a href="../foundation-module/4-sm.html#SP3" class="function-link"><span class="function-syntax">Str::duplicate</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">value</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">found</span><span class="plain-syntax"> == </span><span class="constant-syntax">FALSE</span><span class="plain-syntax">) </span><a href="../foundation-module/3-em.html#SP5" class="function-link"><span class="function-syntax">Errors::in_text_file</span></a><span class="plain-syntax">(</span><span class="string-syntax">"unknown parameter in this macro"</span><span class="plain-syntax">, </span><span class="identifier-syntax">tfp</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="../foundation-module/4-sm.html#SP15" class="function-link"><span class="function-syntax">Str::clear</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">parameter_settings</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="../foundation-module/4-sm.html#SP17" class="function-link"><span class="function-syntax">Str::copy</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">parameter_settings</span><span class="plain-syntax">, </span><span class="identifier-syntax">remainder</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><a href="../foundation-module/4-pm.html#SP9" class="function-link"><span class="function-syntax">Regexp::dispose_of</span></a><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">mr2</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="../foundation-module/4-sm.html#SP23" class="function-link"><span class="function-syntax">Str::is_whitespace</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">parameter_settings</span><span class="plain-syntax">) == </span><span class="constant-syntax">FALSE</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><a href="../foundation-module/3-em.html#SP5" class="function-link"><span class="function-syntax">Errors::in_text_file</span></a><span class="plain-syntax">(</span><span class="string-syntax">"parameter list for this macro is malformed"</span><span class="plain-syntax">, </span><span class="identifier-syntax">tfp</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">i</span><span class="plain-syntax">=0; </span><span class="identifier-syntax">i</span><span class="function-syntax">&lt;playback-&gt;which-&gt;</span><span class="element-syntax">no_parameters</span><span class="plain-syntax">; </span><span class="identifier-syntax">i</span><span class="plain-syntax">++)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">playback</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">parameter_values</span><span class="plain-syntax">[</span><span class="identifier-syntax">i</span><span class="plain-syntax">] == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">playback</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">which</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">parameters</span><span class="plain-syntax">[</span><span class="identifier-syntax">i</span><span class="plain-syntax">]-&gt;</span><span class="element-syntax">optional</span><span class="plain-syntax"> == </span><span class="constant-syntax">FALSE</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><a href="../foundation-module/3-em.html#SP5" class="function-link"><span class="function-syntax">Errors::in_text_file</span></a><span class="plain-syntax">(</span><span class="string-syntax">"compulsory macro parameter not given"</span><span class="plain-syntax">, </span><span class="identifier-syntax">tfp</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">playback</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">line_position</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">playback</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">prior_to_this</span><span class="plain-syntax"> = </span><span class="identifier-syntax">MS</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">playing_back</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">playback</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">text_to_follow</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="../foundation-module/4-sm.html#SP23" class="function-link"><span class="function-syntax">Str::is_whitespace</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">after_matter</span><span class="plain-syntax">) == </span><span class="constant-syntax">FALSE</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">playback</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">text_to_follow</span><span class="plain-syntax"> = </span><a href="../foundation-module/4-sm.html#SP3" class="function-link"><span class="function-syntax">Str::duplicate</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">after_matter</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">MS</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">playing_back</span><span class="plain-syntax"> = </span><span class="identifier-syntax">playback</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"%S"</span><span class="plain-syntax">, </span><span class="identifier-syntax">before_matter</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">i</span><span class="plain-syntax">=0; </span><span class="identifier-syntax">i</span><span class="function-syntax">&lt;playback-&gt;which-&gt;</span><span class="element-syntax">no_lines</span><span class="plain-syntax">; </span><span class="identifier-syntax">i</span><span class="plain-syntax">++) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">TEMPORARY_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">line</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">from</span><span class="plain-syntax"> = </span><span class="identifier-syntax">playback</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">which</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">lines</span><span class="plain-syntax">[</span><span class="identifier-syntax">i</span><span class="plain-syntax">];</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">j</span><span class="plain-syntax">=0; </span><span class="identifier-syntax">j</span><span class="plain-syntax">&lt;</span><a href="../foundation-module/4-sm.html#SP8" class="function-link"><span class="function-syntax">Str::len</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">from</span><span class="plain-syntax">); </span><span class="identifier-syntax">j</span><span class="plain-syntax">++) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="../foundation-module/4-sm.html#SP13" class="function-link"><span class="function-syntax">Str::get_at</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">from</span><span class="plain-syntax">, </span><span class="identifier-syntax">j</span><span class="plain-syntax">) == </span><span class="character-syntax">'{'</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">closed</span><span class="plain-syntax"> = </span><span class="constant-syntax">FALSE</span><span class="plain-syntax">, </span><span class="identifier-syntax">old_j</span><span class="plain-syntax"> = </span><span class="identifier-syntax">j</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">TEMPORARY_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">token</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">j</span><span class="plain-syntax">++; </span><span class="identifier-syntax">j</span><span class="plain-syntax">&lt;</span><a href="../foundation-module/4-sm.html#SP8" class="function-link"><span class="function-syntax">Str::len</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">from</span><span class="plain-syntax">); </span><span class="identifier-syntax">j</span><span class="plain-syntax">++) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="../foundation-module/4-sm.html#SP13" class="function-link"><span class="function-syntax">Str::get_at</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">from</span><span class="plain-syntax">, </span><span class="identifier-syntax">j</span><span class="plain-syntax">) == </span><span class="character-syntax">'}'</span><span class="plain-syntax">) { </span><span class="identifier-syntax">closed</span><span class="plain-syntax"> = </span><span class="constant-syntax">TRUE</span><span class="plain-syntax">; </span><span class="reserved-syntax">break</span><span class="plain-syntax">; }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">PUT_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">token</span><span class="plain-syntax">, </span><a href="../foundation-module/4-sm.html#SP13" class="function-link"><span class="function-syntax">Str::get_at</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">from</span><span class="plain-syntax">, </span><span class="identifier-syntax">j</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">closed</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">found</span><span class="plain-syntax"> = </span><span class="constant-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">i</span><span class="plain-syntax">=0; </span><span class="identifier-syntax">i</span><span class="function-syntax">&lt;playback-&gt;which-&gt;</span><span class="element-syntax">no_parameters</span><span class="plain-syntax">; </span><span class="identifier-syntax">i</span><span class="plain-syntax">++)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="../foundation-module/4-sm.html#SP19" class="function-link"><span class="function-syntax">Str::eq</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">token</span><span class="plain-syntax">, </span><span class="identifier-syntax">playback</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">which</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">parameters</span><span class="plain-syntax">[</span><span class="identifier-syntax">i</span><span class="plain-syntax">]-&gt;</span><span class="element-syntax">definition_token</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">found</span><span class="plain-syntax"> = </span><span class="constant-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">line</span><span class="plain-syntax">, </span><span class="string-syntax">"%S"</span><span class="plain-syntax">, </span><span class="identifier-syntax">playback</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">parameter_values</span><span class="plain-syntax">[</span><span class="identifier-syntax">i</span><span class="plain-syntax">]);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">found</span><span class="plain-syntax"> == </span><span class="constant-syntax">FALSE</span><span class="plain-syntax">) </span><span class="identifier-syntax">closed</span><span class="plain-syntax"> = </span><span class="constant-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">DISCARD_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">token</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">closed</span><span class="plain-syntax"> == </span><span class="constant-syntax">FALSE</span><span class="plain-syntax">) { </span><span class="identifier-syntax">j</span><span class="plain-syntax"> = </span><span class="identifier-syntax">old_j</span><span class="plain-syntax">; </span><span class="identifier-syntax">PUT_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">line</span><span class="plain-syntax">, </span><span class="character-syntax">'{'</span><span class="plain-syntax">); }</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">PUT_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">line</span><span class="plain-syntax">, </span><a href="../foundation-module/4-sm.html#SP13" class="function-link"><span class="function-syntax">Str::get_at</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">from</span><span class="plain-syntax">, </span><span class="identifier-syntax">j</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><a href="6-mkf.html#SP2" class="function-link"><span class="function-syntax">Makefiles::scan_makefile_line</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">line</span><span class="plain-syntax">, </span><span class="identifier-syntax">tfp</span><span class="plain-syntax">, (</span><span class="reserved-syntax">void</span><span class="plain-syntax"> *) </span><span class="identifier-syntax">MS</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">DISCARD_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">line</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">MS</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">playing_back</span><span class="plain-syntax"> = </span><span class="identifier-syntax">playback</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">prior_to_this</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="../foundation-module/4-sm.html#SP23" class="function-link"><span class="function-syntax">Str::is_whitespace</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">after_matter</span><span class="plain-syntax">) == </span><span class="constant-syntax">FALSE</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"%S\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">after_matter</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="../foundation-module/4-pm.html#SP9" class="function-link"><span class="function-syntax">Regexp::dispose_of</span></a><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">mr</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="6-mkf.html#SP2">&#167;2</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP2_5" class="paragraph-anchor"></a><b>&#167;2.5. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Begin a repeat tool block</span><span class="named-paragraph-number">2.5</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">marker</span><span class="plain-syntax"> = </span><span class="constant-syntax">MAKEFILE_TOOL_MOM</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="6-mkf.html#SP2_1_1" class="named-paragraph-link"><span class="named-paragraph">Begin a repeat block</span><span class="named-paragraph-number">2.1.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="6-mkf.html#SP2_5_1" class="named-paragraph-link"><span class="named-paragraph">Begin a repeat block</span><span class="named-paragraph-number">2.5.1</span></a></span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="6-mkf.html#SP2">&#167;2</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP2_2" class="paragraph-anchor"></a><b>&#167;2.2. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Begin a repeat web block</span><span class="named-paragraph-number">2.2</span></span><span class="comment-syntax"> =</span>
<p class="commentary firstcommentary"><a id="SP2_6" class="paragraph-anchor"></a><b>&#167;2.6. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Begin a repeat web block</span><span class="named-paragraph-number">2.6</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">marker</span><span class="plain-syntax"> = </span><span class="constant-syntax">MAKEFILE_WEB_MOM</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="6-mkf.html#SP2_1_1" class="named-paragraph-link"><span class="named-paragraph">Begin a repeat block</span><span class="named-paragraph-number">2.1.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="6-mkf.html#SP2_5_1" class="named-paragraph-link"><span class="named-paragraph">Begin a repeat block</span><span class="named-paragraph-number">2.5.1</span></a></span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="6-mkf.html#SP2">&#167;2</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP2_3" class="paragraph-anchor"></a><b>&#167;2.3. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Begin a repeat module block</span><span class="named-paragraph-number">2.3</span></span><span class="comment-syntax"> =</span>
<p class="commentary firstcommentary"><a id="SP2_7" class="paragraph-anchor"></a><b>&#167;2.7. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Begin a repeat module block</span><span class="named-paragraph-number">2.7</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">marker</span><span class="plain-syntax"> = </span><span class="constant-syntax">MAKEFILE_MODULE_MOM</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="6-mkf.html#SP2_1_1" class="named-paragraph-link"><span class="named-paragraph">Begin a repeat block</span><span class="named-paragraph-number">2.1.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="6-mkf.html#SP2_5_1" class="named-paragraph-link"><span class="named-paragraph">Begin a repeat block</span><span class="named-paragraph-number">2.5.1</span></a></span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="6-mkf.html#SP2">&#167;2</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP2_1_1" class="paragraph-anchor"></a><b>&#167;2.1.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Begin a repeat block</span><span class="named-paragraph-number">2.1.1</span></span><span class="comment-syntax"> =</span>
<p class="commentary firstcommentary"><a id="SP2_5_1" class="paragraph-anchor"></a><b>&#167;2.5.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Begin a repeat block</span><span class="named-paragraph-number">2.5.1</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
@ -177,8 +369,8 @@ following a "prototype".
<span class="plain-syntax"> </span><a href="../foundation-module/4-pm.html#SP9" class="function-link"><span class="function-syntax">Regexp::dispose_of</span></a><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">mr</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="6-mkf.html#SP2_1">&#167;2.1</a>, <a href="6-mkf.html#SP2_2">&#167;2.2</a>, <a href="6-mkf.html#SP2_3">&#167;2.3</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP2_4" class="paragraph-anchor"></a><b>&#167;2.4. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Deal with a line in a repeat block</span><span class="named-paragraph-number">2.4</span></span><span class="comment-syntax"> =</span>
<ul class="endnotetexts"><li>This code is used in <a href="6-mkf.html#SP2_5">&#167;2.5</a>, <a href="6-mkf.html#SP2_6">&#167;2.6</a>, <a href="6-mkf.html#SP2_7">&#167;2.7</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP2_8" class="paragraph-anchor"></a><b>&#167;2.8. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Deal with a line in a repeat block</span><span class="named-paragraph-number">2.8</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
@ -186,7 +378,7 @@ following a "prototype".
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="6-mkf.html#SP2">&#167;2</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP2_5" class="paragraph-anchor"></a><b>&#167;2.5. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">End a repeat block</span><span class="named-paragraph-number">2.5</span></span><span class="comment-syntax"> =</span>
<p class="commentary firstcommentary"><a id="SP2_9" class="paragraph-anchor"></a><b>&#167;2.9. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">End a repeat block</span><span class="named-paragraph-number">2.9</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
@ -199,31 +391,31 @@ following a "prototype".
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="6-mkf.html#SP2">&#167;2</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP2_6" class="paragraph-anchor"></a><b>&#167;2.6. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Deal with a repeat span</span><span class="named-paragraph-number">2.6</span></span><span class="comment-syntax"> =</span>
<p class="commentary firstcommentary"><a id="SP2_10" class="paragraph-anchor"></a><b>&#167;2.10. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Deal with a repeat span</span><span class="named-paragraph-number">2.10</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">marker</span><span class="plain-syntax"> = </span><span class="constant-syntax">MAKEFILE_TOOL_MOM</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="6-mkf.html#SP2_6_1" class="named-paragraph-link"><span class="named-paragraph">Begin a repeat span</span><span class="named-paragraph-number">2.6.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="6-mkf.html#SP2_10_1" class="named-paragraph-link"><span class="named-paragraph">Begin a repeat span</span><span class="named-paragraph-number">2.10.1</span></a></span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="6-mkf.html#SP2">&#167;2</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP2_7" class="paragraph-anchor"></a><b>&#167;2.7. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Deal with a repeat web span</span><span class="named-paragraph-number">2.7</span></span><span class="comment-syntax"> =</span>
<p class="commentary firstcommentary"><a id="SP2_11" class="paragraph-anchor"></a><b>&#167;2.11. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Deal with a repeat web span</span><span class="named-paragraph-number">2.11</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">marker</span><span class="plain-syntax"> = </span><span class="constant-syntax">MAKEFILE_WEB_MOM</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="6-mkf.html#SP2_6_1" class="named-paragraph-link"><span class="named-paragraph">Begin a repeat span</span><span class="named-paragraph-number">2.6.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="6-mkf.html#SP2_10_1" class="named-paragraph-link"><span class="named-paragraph">Begin a repeat span</span><span class="named-paragraph-number">2.10.1</span></a></span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="6-mkf.html#SP2">&#167;2</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP2_8" class="paragraph-anchor"></a><b>&#167;2.8. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Deal with a repeat module span</span><span class="named-paragraph-number">2.8</span></span><span class="comment-syntax"> =</span>
<p class="commentary firstcommentary"><a id="SP2_12" class="paragraph-anchor"></a><b>&#167;2.12. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Deal with a repeat module span</span><span class="named-paragraph-number">2.12</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">marker</span><span class="plain-syntax"> = </span><span class="constant-syntax">MAKEFILE_MODULE_MOM</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="6-mkf.html#SP2_6_1" class="named-paragraph-link"><span class="named-paragraph">Begin a repeat span</span><span class="named-paragraph-number">2.6.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="6-mkf.html#SP2_10_1" class="named-paragraph-link"><span class="named-paragraph">Begin a repeat span</span><span class="named-paragraph-number">2.10.1</span></a></span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="6-mkf.html#SP2">&#167;2</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP2_6_1" class="paragraph-anchor"></a><b>&#167;2.6.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Begin a repeat span</span><span class="named-paragraph-number">2.6.1</span></span><span class="comment-syntax"> =</span>
<p class="commentary firstcommentary"><a id="SP2_10_1" class="paragraph-anchor"></a><b>&#167;2.10.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Begin a repeat span</span><span class="named-paragraph-number">2.10.1</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
@ -234,21 +426,32 @@ following a "prototype".
<span class="plain-syntax"> </span><a href="../foundation-module/4-pm.html#SP9" class="function-link"><span class="function-syntax">Regexp::dispose_of</span></a><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">mr</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="6-mkf.html#SP2_6">&#167;2.6</a>, <a href="6-mkf.html#SP2_7">&#167;2.7</a>, <a href="6-mkf.html#SP2_8">&#167;2.8</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP2_9" class="paragraph-anchor"></a><b>&#167;2.9. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Expand platform-settings</span><span class="named-paragraph-number">2.9</span></span><span class="comment-syntax"> =</span>
<ul class="endnotetexts"><li>This code is used in <a href="6-mkf.html#SP2_10">&#167;2.10</a>, <a href="6-mkf.html#SP2_11">&#167;2.11</a>, <a href="6-mkf.html#SP2_12">&#167;2.12</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP2_13" class="paragraph-anchor"></a><b>&#167;2.13. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Expand platform-settings</span><span class="named-paragraph-number">2.13</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">filename</span><span class="plain-syntax"> *</span><span class="identifier-syntax">prototype</span><span class="plain-syntax"> = </span><a href="../foundation-module/3-fln.html#SP2" class="function-link"><span class="function-syntax">Filenames::in</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">path_to_inweb</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"platform-settings.mk"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">MS</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">allow_commands</span><span class="plain-syntax"> = </span><span class="constant-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><a href="../foundation-module/4-tf.html#SP5" class="function-link"><span class="function-syntax">TextFiles::read</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">prototype</span><span class="plain-syntax">, </span><span class="constant-syntax">FALSE</span><span class="plain-syntax">, </span><span class="string-syntax">"can't open make settings file"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="constant-syntax">TRUE</span><span class="plain-syntax">, </span><a href="6-mkf.html#SP2" class="function-link"><span class="function-syntax">Makefiles::scan_makefile_line</span></a><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">MS</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">INWEBPLATFORM</span><span class="plain-syntax"> = </span><a href="../foundation-module/4-sm.html#SP2" class="function-link"><span class="function-syntax">Str::new</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><a href="../foundation-module/4-tf.html#SP5" class="function-link"><span class="function-syntax">TextFiles::read</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">prototype</span><span class="plain-syntax">, </span><span class="constant-syntax">FALSE</span><span class="plain-syntax">, </span><span class="string-syntax">"can't open platform settings file"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="constant-syntax">TRUE</span><span class="plain-syntax">, </span><a href="6-mkf.html#SP5" class="function-link"><span class="function-syntax">Makefiles::seek_INWEBPLATFORM</span></a><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">INWEBPLATFORM</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="../foundation-module/4-sm.html#SP8" class="function-link"><span class="function-syntax">Str::len</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">INWEBPLATFORM</span><span class="plain-syntax">) == </span><span class="constant-syntax">0</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><a href="../foundation-module/3-em.html#SP5" class="function-link"><span class="function-syntax">Errors::in_text_file</span></a><span class="plain-syntax">(</span>
<span class="plain-syntax"> </span><span class="string-syntax">"found platform settings file, but it does not set INWEBPLATFORM"</span><span class="plain-syntax">, </span><span class="identifier-syntax">tfp</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">pathname</span><span class="plain-syntax"> *</span><span class="identifier-syntax">P</span><span class="plain-syntax"> = </span><a href="../foundation-module/3-pth.html#SP4" class="function-link"><span class="function-syntax">Pathnames::down</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">path_to_inweb</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"Materials"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">P</span><span class="plain-syntax"> = </span><a href="../foundation-module/3-pth.html#SP4" class="function-link"><span class="function-syntax">Pathnames::down</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">P</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"platforms"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">INWEBPLATFORM</span><span class="plain-syntax">, </span><span class="string-syntax">".mkscript"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">filename</span><span class="plain-syntax"> *</span><span class="identifier-syntax">F</span><span class="plain-syntax"> = </span><a href="../foundation-module/3-fln.html#SP2" class="function-link"><span class="function-syntax">Filenames::in</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">P</span><span class="plain-syntax">, </span><span class="identifier-syntax">INWEBPLATFORM</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="../foundation-module/4-tf.html#SP5" class="function-link"><span class="function-syntax">TextFiles::read</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">F</span><span class="plain-syntax">, </span><span class="constant-syntax">FALSE</span><span class="plain-syntax">, </span><span class="string-syntax">"can't open platform definitions file"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="constant-syntax">TRUE</span><span class="plain-syntax">, </span><a href="6-mkf.html#SP2" class="function-link"><span class="function-syntax">Makefiles::scan_makefile_line</span></a><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">, </span><span class="identifier-syntax">MS</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="constant-syntax">STDOUT</span><span class="plain-syntax">, </span><span class="string-syntax">"(Read definitions from %f)\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">F</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><a href="../foundation-module/4-pm.html#SP9" class="function-link"><span class="function-syntax">Regexp::dispose_of</span></a><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">mr</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">MS</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">allow_commands</span><span class="plain-syntax"> = </span><span class="constant-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="6-mkf.html#SP2">&#167;2</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP2_10" class="paragraph-anchor"></a><b>&#167;2.10. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Expand identity-settings</span><span class="named-paragraph-number">2.10</span></span><span class="comment-syntax"> =</span>
<p class="commentary firstcommentary"><a id="SP2_14" class="paragraph-anchor"></a><b>&#167;2.14. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Expand identity-settings</span><span class="named-paragraph-number">2.14</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
@ -265,34 +468,34 @@ following a "prototype".
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="6-mkf.html#SP2">&#167;2</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP2_11" class="paragraph-anchor"></a><b>&#167;2.11. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Declare a tool</span><span class="named-paragraph-number">2.11</span></span><span class="comment-syntax"> =</span>
<p class="commentary firstcommentary"><a id="SP2_15" class="paragraph-anchor"></a><b>&#167;2.15. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Declare a tool</span><span class="named-paragraph-number">2.15</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">marker</span><span class="plain-syntax"> = </span><span class="constant-syntax">MAKEFILE_TOOL_MOM</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">dictionary</span><span class="plain-syntax"> *</span><span class="identifier-syntax">D</span><span class="plain-syntax"> = </span><span class="identifier-syntax">MS</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">tools_dictionary</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="6-mkf.html#SP2_11_1" class="named-paragraph-link"><span class="named-paragraph">Declare something</span><span class="named-paragraph-number">2.11.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="6-mkf.html#SP2_15_1" class="named-paragraph-link"><span class="named-paragraph">Declare something</span><span class="named-paragraph-number">2.15.1</span></a></span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="6-mkf.html#SP2">&#167;2</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP2_12" class="paragraph-anchor"></a><b>&#167;2.12. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Declare a web</span><span class="named-paragraph-number">2.12</span></span><span class="comment-syntax"> =</span>
<p class="commentary firstcommentary"><a id="SP2_16" class="paragraph-anchor"></a><b>&#167;2.16. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Declare a web</span><span class="named-paragraph-number">2.16</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">marker</span><span class="plain-syntax"> = </span><span class="constant-syntax">MAKEFILE_WEB_MOM</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">dictionary</span><span class="plain-syntax"> *</span><span class="identifier-syntax">D</span><span class="plain-syntax"> = </span><span class="identifier-syntax">MS</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">webs_dictionary</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="6-mkf.html#SP2_11_1" class="named-paragraph-link"><span class="named-paragraph">Declare something</span><span class="named-paragraph-number">2.11.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="6-mkf.html#SP2_15_1" class="named-paragraph-link"><span class="named-paragraph">Declare something</span><span class="named-paragraph-number">2.15.1</span></a></span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="6-mkf.html#SP2">&#167;2</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP2_13" class="paragraph-anchor"></a><b>&#167;2.13. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Declare a module</span><span class="named-paragraph-number">2.13</span></span><span class="comment-syntax"> =</span>
<p class="commentary firstcommentary"><a id="SP2_17" class="paragraph-anchor"></a><b>&#167;2.17. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Declare a module</span><span class="named-paragraph-number">2.17</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">marker</span><span class="plain-syntax"> = </span><span class="constant-syntax">MAKEFILE_MODULE_MOM</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">dictionary</span><span class="plain-syntax"> *</span><span class="identifier-syntax">D</span><span class="plain-syntax"> = </span><span class="identifier-syntax">MS</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">modules_dictionary</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="6-mkf.html#SP2_11_1" class="named-paragraph-link"><span class="named-paragraph">Declare something</span><span class="named-paragraph-number">2.11.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="6-mkf.html#SP2_15_1" class="named-paragraph-link"><span class="named-paragraph">Declare something</span><span class="named-paragraph-number">2.15.1</span></a></span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="6-mkf.html#SP2">&#167;2</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP2_11_1" class="paragraph-anchor"></a><b>&#167;2.11.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Declare something</span><span class="named-paragraph-number">2.11.1</span></span><span class="comment-syntax"> =</span>
<p class="commentary firstcommentary"><a id="SP2_15_1" class="paragraph-anchor"></a><b>&#167;2.15.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Declare something</span><span class="named-paragraph-number">2.15.1</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
@ -310,8 +513,8 @@ following a "prototype".
<span class="plain-syntax"> </span><a href="../foundation-module/4-pm.html#SP9" class="function-link"><span class="function-syntax">Regexp::dispose_of</span></a><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">mr</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="6-mkf.html#SP2_11">&#167;2.11</a>, <a href="6-mkf.html#SP2_12">&#167;2.12</a>, <a href="6-mkf.html#SP2_13">&#167;2.13</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP2_14" class="paragraph-anchor"></a><b>&#167;2.14. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Expand dependent-files</span><span class="named-paragraph-number">2.14</span></span><span class="comment-syntax"> =</span>
<ul class="endnotetexts"><li>This code is used in <a href="6-mkf.html#SP2_15">&#167;2.15</a>, <a href="6-mkf.html#SP2_16">&#167;2.16</a>, <a href="6-mkf.html#SP2_17">&#167;2.17</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP2_18" class="paragraph-anchor"></a><b>&#167;2.18. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Expand dependent-files</span><span class="named-paragraph-number">2.18</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
@ -323,7 +526,7 @@ following a "prototype".
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="6-mkf.html#SP2">&#167;2</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP2_15" class="paragraph-anchor"></a><b>&#167;2.15. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Expand dependent-files-for-tool</span><span class="named-paragraph-number">2.15</span></span><span class="comment-syntax"> =</span>
<p class="commentary firstcommentary"><a id="SP2_19" class="paragraph-anchor"></a><b>&#167;2.19. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Expand dependent-files-for-tool</span><span class="named-paragraph-number">2.19</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
@ -344,7 +547,7 @@ following a "prototype".
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="6-mkf.html#SP2">&#167;2</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP2_16" class="paragraph-anchor"></a><b>&#167;2.16. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Expand dependent-files-for-tool-alone</span><span class="named-paragraph-number">2.16</span></span><span class="comment-syntax"> =</span>
<p class="commentary firstcommentary"><a id="SP2_20" class="paragraph-anchor"></a><b>&#167;2.20. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Expand dependent-files-for-tool-alone</span><span class="named-paragraph-number">2.20</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
@ -365,7 +568,7 @@ following a "prototype".
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="6-mkf.html#SP2">&#167;2</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP2_17" class="paragraph-anchor"></a><b>&#167;2.17. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Expand dependent-files-for-module</span><span class="named-paragraph-number">2.17</span></span><span class="comment-syntax"> =</span>
<p class="commentary firstcommentary"><a id="SP2_21" class="paragraph-anchor"></a><b>&#167;2.21. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Expand dependent-files-for-module</span><span class="named-paragraph-number">2.21</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
@ -383,7 +586,7 @@ following a "prototype".
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="6-mkf.html#SP2">&#167;2</a>.</li></ul>
<p class="commentary firstcommentary"><a id="SP2_18" class="paragraph-anchor"></a><b>&#167;2.18. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">And otherwise copy the line straight through</span><span class="named-paragraph-number">2.18</span></span><span class="comment-syntax"> =</span>
<p class="commentary firstcommentary"><a id="SP2_22" class="paragraph-anchor"></a><b>&#167;2.22. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">And otherwise copy the line straight through</span><span class="named-paragraph-number">2.22</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
@ -399,7 +602,7 @@ following a "prototype".
<p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>&#167;3. </b></p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Makefiles::pathname_slashed</span><button class="popup" onclick="togglePopup('usagePopup3')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup3">Usage of <span class="code-font"><span class="function-syntax">Makefiles::pathname_slashed</span></span>:<br/><a href="6-mkf.html#SP2_10">&#167;2.10</a></span></button><span class="plain-syntax">(</span><span class="constant-syntax">OUTPUT_STREAM</span><span class="plain-syntax">, </span><span class="reserved-syntax">pathname</span><span class="plain-syntax"> *</span><span class="identifier-syntax">P</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Makefiles::pathname_slashed</span><button class="popup" onclick="togglePopup('usagePopup3')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup3">Usage of <span class="code-font"><span class="function-syntax">Makefiles::pathname_slashed</span></span>:<br/><a href="6-mkf.html#SP2_14">&#167;2.14</a></span></button><span class="plain-syntax">(</span><span class="constant-syntax">OUTPUT_STREAM</span><span class="plain-syntax">, </span><span class="reserved-syntax">pathname</span><span class="plain-syntax"> *</span><span class="identifier-syntax">P</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">TEMPORARY_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">PT</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">PT</span><span class="plain-syntax">, </span><span class="string-syntax">"%p"</span><span class="plain-syntax">, </span><span class="identifier-syntax">P</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_THROUGH_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">pos</span><span class="plain-syntax">, </span><span class="identifier-syntax">PT</span><span class="plain-syntax">) {</span>
@ -410,7 +613,7 @@ following a "prototype".
<span class="plain-syntax"> </span><span class="identifier-syntax">DISCARD_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">PT</span><span class="plain-syntax">)</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Makefiles::pattern</span><button class="popup" onclick="togglePopup('usagePopup4')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup4">Usage of <span class="code-font"><span class="function-syntax">Makefiles::pattern</span></span>:<br/><a href="6-mkf.html#SP2_14">&#167;2.14</a>, <a href="6-mkf.html#SP2_15">&#167;2.15</a>, <a href="6-mkf.html#SP2_16">&#167;2.16</a>, <a href="6-mkf.html#SP2_17">&#167;2.17</a></span></button><span class="plain-syntax">(</span><span class="constant-syntax">OUTPUT_STREAM</span><span class="plain-syntax">, </span><span class="reserved-syntax">linked_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">L</span><span class="plain-syntax">, </span><span class="reserved-syntax">filename</span><span class="plain-syntax"> *</span><span class="identifier-syntax">F</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Makefiles::pattern</span><button class="popup" onclick="togglePopup('usagePopup4')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup4">Usage of <span class="code-font"><span class="function-syntax">Makefiles::pattern</span></span>:<br/><a href="6-mkf.html#SP2_18">&#167;2.18</a>, <a href="6-mkf.html#SP2_19">&#167;2.19</a>, <a href="6-mkf.html#SP2_20">&#167;2.20</a>, <a href="6-mkf.html#SP2_21">&#167;2.21</a></span></button><span class="plain-syntax">(</span><span class="constant-syntax">OUTPUT_STREAM</span><span class="plain-syntax">, </span><span class="reserved-syntax">linked_list</span><span class="plain-syntax"> *</span><span class="identifier-syntax">L</span><span class="plain-syntax">, </span><span class="reserved-syntax">filename</span><span class="plain-syntax"> *</span><span class="identifier-syntax">F</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">dictionary</span><span class="plain-syntax"> *</span><span class="identifier-syntax">patterns_done</span><span class="plain-syntax"> = </span><a href="../foundation-module/2-dct.html#SP2" class="function-link"><span class="function-syntax">Dictionaries::new</span></a><span class="plain-syntax">(16, </span><span class="constant-syntax">TRUE</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">F</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="6-mkf.html#SP3_1" class="named-paragraph-link"><span class="named-paragraph">Add pattern for file F, if not already given</span><span class="named-paragraph-number">3.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">section_md</span><span class="plain-syntax"> *</span><span class="identifier-syntax">Sm</span><span class="plain-syntax">;</span>
@ -454,7 +657,7 @@ following a "prototype".
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Makefiles::repeat</span><button class="popup" onclick="togglePopup('usagePopup5')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup5">Usage of <span class="code-font"><span class="function-syntax">Makefiles::repeat</span></span>:<br/><a href="6-mkf.html#SP2_5">&#167;2.5</a>, <a href="6-mkf.html#SP2_6_1">&#167;2.6.1</a></span></button><span class="plain-syntax">(</span><span class="constant-syntax">OUTPUT_STREAM</span><span class="plain-syntax">, </span><span class="reserved-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">prefix</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">every_time</span><span class="plain-syntax">, </span><span class="reserved-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">matter</span><span class="plain-syntax">,</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Makefiles::repeat</span><button class="popup" onclick="togglePopup('usagePopup5')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup5">Usage of <span class="code-font"><span class="function-syntax">Makefiles::repeat</span></span>:<br/><a href="6-mkf.html#SP2_9">&#167;2.9</a>, <a href="6-mkf.html#SP2_10_1">&#167;2.10.1</a></span></button><span class="plain-syntax">(</span><span class="constant-syntax">OUTPUT_STREAM</span><span class="plain-syntax">, </span><span class="reserved-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">prefix</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">every_time</span><span class="plain-syntax">, </span><span class="reserved-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">matter</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">as_lines</span><span class="plain-syntax">, </span><span class="reserved-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">suffix</span><span class="plain-syntax">, </span><span class="reserved-syntax">text_file_position</span><span class="plain-syntax"> *</span><span class="identifier-syntax">tfp</span><span class="plain-syntax">, </span><span class="reserved-syntax">makefile_state</span><span class="plain-syntax"> *</span><span class="identifier-syntax">MS</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">over</span><span class="plain-syntax">, </span><span class="reserved-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">tag</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">module</span><span class="plain-syntax"> *</span><span class="identifier-syntax">M</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">c</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
@ -486,6 +689,19 @@ following a "prototype".
<span class="plain-syntax"> }</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP5" class="paragraph-anchor"></a><b>&#167;5. </b>This is used to scan the platform settings file for a definition line in the
shape INWEBPLATFORM = PLATFORM, in order to find out what PLATFORM the make file
will be used on.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Makefiles::seek_INWEBPLATFORM</span><button class="popup" onclick="togglePopup('usagePopup6')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup6">Usage of <span class="code-font"><span class="function-syntax">Makefiles::seek_INWEBPLATFORM</span></span>:<br/><a href="6-mkf.html#SP2_13">&#167;2.13</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">line</span><span class="plain-syntax">, </span><span class="reserved-syntax">text_file_position</span><span class="plain-syntax"> *</span><span class="identifier-syntax">tfp</span><span class="plain-syntax">, </span><span class="reserved-syntax">void</span><span class="plain-syntax"> *</span><span class="identifier-syntax">X</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">OUT</span><span class="plain-syntax"> = (</span><span class="reserved-syntax">text_stream</span><span class="plain-syntax"> *) </span><span class="identifier-syntax">X</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">match_results</span><span class="plain-syntax"> </span><span class="identifier-syntax">mr</span><span class="plain-syntax"> = </span><a href="../foundation-module/4-pm.html#SP9" class="function-link"><span class="function-syntax">Regexp::create_mr</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="../foundation-module/4-pm.html#SP10" class="function-link"><span class="function-syntax">Regexp::match</span></a><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">mr</span><span class="plain-syntax">, </span><span class="identifier-syntax">line</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">" *INWEBPLATFORM = (%C+) *"</span><span class="plain-syntax">)) </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"%S"</span><span class="plain-syntax">, </span><span class="identifier-syntax">mr</span><span class="plain-syntax">.</span><span class="element-syntax">exp</span><span class="plain-syntax">[0]);</span>
<span class="plain-syntax"> </span><a href="../foundation-module/4-pm.html#SP9" class="function-link"><span class="function-syntax">Regexp::dispose_of</span></a><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">mr</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
</pre>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="5-tu.html">&#10094;</a></li><li class="progresschapter"><a href="M-iti.html">M</a></li><li class="progresschapter"><a href="P-htpw.html">P</a></li><li class="progresschapter"><a href="1-bsc.html">1</a></li><li class="progresschapter"><a href="2-tr.html">2</a></li><li class="progresschapter"><a href="3-ta.html">3</a></li><li class="progresschapter"><a href="4-pl.html">4</a></li><li class="progresschapter"><a href="5-wt.html">5</a></li><li class="progresscurrentchapter">6</li><li class="progresscurrent">mkf</li><li class="progresssection"><a href="6-gs.html">gs</a></li><li class="progresssection"><a href="6-cs.html">cs</a></li><li class="progresssection"><a href="6-rw.html">rw</a></li><li class="progresssection"><a href="6-cln.html">cln</a></li><li class="progressnext"><a href="6-gs.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->

View file

@ -149,7 +149,7 @@ parameters.
<span class="plain-syntax"> </span><span class="constant-syntax">CLASS_DEFINITION</span>
<span class="plain-syntax">} </span><span class="reserved-syntax">macro_tokens</span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>The structure macro is accessed in 2/trs, 3/twot, 5/wt, 5/fm, 5/ptf, 5/tf, 5/hf, 5/df, 6/cs, 6/cln and here.</li><li>The structure macro_tokens is private to this section.</li></ul>
<ul class="endnotetexts"><li>The structure macro is accessed in 2/trs, 3/twot, 5/wt, 5/fm, 5/ptf, 5/tf, 5/hf, 5/df, 6/mkf, 6/cs, 6/cln and here.</li><li>The structure macro_tokens is private to this section.</li></ul>
<p class="commentary firstcommentary"><a id="SP4" class="paragraph-anchor"></a><b>&#167;4. </b></p>
<pre class="displayed-code all-displayed-code code-font">
@ -344,7 +344,7 @@ assume that the version complies with any format).
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="../foundation-module/4-sm.html#SP19" class="function-link"><span class="function-syntax">Str::eq</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">datum</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"Version Number"</span><span class="plain-syntax">)) </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"%S"</span><span class="plain-syntax">, </span><span class="identifier-syntax">A</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">version</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
</pre>
<ul class="endnotetexts"><li>The structure writeme_asset is accessed in 2/trs, 5/wt, 6/cs, 6/cln and here.</li></ul>
<ul class="endnotetexts"><li>The structure writeme_asset is accessed in 2/trs, 5/wt, 6/mkf, 6/cs, 6/cln and here.</li></ul>
<p class="commentary firstcommentary"><a id="SP9" class="paragraph-anchor"></a><b>&#167;9. </b>That just leaves the business of inspecting assets to obtain their metadata.
</p>

View file

@ -1,6 +1,23 @@
# This makefile was automatically written by inweb -makefile
# and is not intended for human editing
INWEBPLATFORM = macos
INFORM6OS = MACOS
GLULXEOS = OS_UNIX
EXEEXTENSION =
INTEST = intest/Tangled/intest
INWEB = inweb/Tangled/inweb
CCOPTS = -DPLATFORM_MACOS=1 -mmacosx-version-min=10.6 -arch x86_64 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk
MANYWARNINGS = -Weverything -Wno-pointer-arith -Wno-unused-macros -Wno-shadow -Wno-cast-align -Wno-variadic-macros -Wno-missing-noreturn -Wno-missing-prototypes -Wno-unused-parameter -Wno-padded -Wno-missing-variable-declarations -Wno-unreachable-code-break -Wno-class-varargs -Wno-format-nonliteral -Wno-cast-qual -Wno-double-promotion -Wno-comma -Wno-strict-prototypes -Wno-extra-semi-stmt -Wno-c11-extensions -Wno-unreachable-code-return -ferror-limit=1000
FEWERWARNINGS = -Wno-implicit-int -Wno-dangling-else -Wno-pointer-sign -Wno-format-extra-args -Wno-tautological-compare -Wno-deprecated-declarations -Wno-logical-op-parentheses -Wno-format -Wno-extra-semi-stmt -Wno-c11-extensions -Wno-unreachable-code-return
ME = inweb
FTEST = $(ME)/foundation-test
SAFETYCOPY = $(ME)/Tangled/inweb_dev
@ -24,47 +41,52 @@ force: $(ME)/platform-settings.mk
$(call make-me)
$(call make-ftest)
.PHONY: makers
makers:
$(INWEB) $(FTEST) -makefile $(FTEST)/foundation-test.mk
$(INWEB) -prototype $(ME)/Materials/platforms/macos.mkscript -makefile $(ME)/Materials/platforms/macos.mk
$(INWEB) -prototype $(ME)/Materials/platforms/macos32.mkscript -makefile $(ME)/Materials/platforms/macos32.mk
$(INWEB) -prototype $(ME)/Materials/platforms/windows.mkscript -makefile $(ME)/Materials/platforms/windows.mk
$(INWEB) -prototype $(ME)/Materials/platforms/linux.mkscript -makefile $(ME)/Materials/platforms/linux.mk
$(INWEB) -prototype $(ME)/Materials/platforms/unix.mkscript -makefile $(ME)/Materials/platforms/unix.mk
.PHONY: macos
macos:
cp -f $(ME)/Materials/macos-make-settings.mk $(ME)/platform-settings.mk
echo "=== Platform set to 64-bit MacOS. Now: make -f inweb/inweb.mk initial ==="
cp -f $(ME)/Materials/platforms/macos.mk $(ME)/platform-settings.mk
echo "=== Platform set to 'macos'. Now: make -f inweb/inweb.mk initial ==="
.PHONY: macos32
macos32:
cp -f $(ME)/Materials/macos32-make-settings.mk $(ME)/platform-settings.mk
echo "=== Platform set to 32-bit MacOS. Now: make -f inweb/inweb.mk initial ==="
macos32:
cp -f $(ME)/Materials/platforms/macos32.mk $(ME)/platform-settings.mk
echo "=== Platform set to 'macos32'. Now: make -f inweb/inweb.mk initial ==="
.PHONY: windows
windows:
cp -f $(ME)/Materials/windows-make-settings.mk $(ME)/platform-settings.mk
echo "=== Platform set to Windows. Now: make -f inweb/inweb.mk initial ==="
cp -f $(ME)/Materials/platforms/windows.mk $(ME)/platform-settings.mk
echo "=== Platform set to 'windows'. Now: make -f inweb/inweb.mk initial ==="
.PHONY: linux
linux:
cp -f $(ME)/Materials/linux-make-settings.mk $(ME)/platform-settings.mk
echo "=== Platform set to Linux. Now: make -f inweb/inweb.mk initial ==="
cp -f $(ME)/Materials/platforms/linux.mk $(ME)/platform-settings.mk
echo "=== Platform set to 'linux'. Now: make -f inweb/inweb.mk initial ==="
.PHONY: unix
unix:
cp -f $(ME)/Materials/unix-make-settings.mk $(ME)/platform-settings.mk
echo "=== Platform set to generic Unix (non-Linux, non-MacOS, non-Android). Now: make -f inweb/inweb.mk initial ==="
.PHONY: android
android:
cp -f $(ME)/Materials/android-make-settings.mk $(ME)/platform-settings.mk
echo "=== Platform set to Android. Now: make -f inweb/inweb.mk initial ==="
cp -f $(ME)/Materials/platforms/unix.mk $(ME)/platform-settings.mk
echo "=== Platform set to 'unix'. Now: make -f inweb/inweb.mk initial ==="
.PHONY: initial
initial: $(ME)/platform-settings.mk
$(call make-me-once-tangled)
$(call make-ftest)
.PHONY: safe
safe:
$(call make-me-using-safety-copy)
define make-me-once-tangled
$(CC) -o $(ME)/Tangled/$(ME).o $(ME)/Tangled/$(ME).c
$(LINK) -o $(ME)/Tangled/$(ME)$(EXEEXTENSION) $(ME)/Tangled/$(ME).o $(LINKEROPTS)
clang -std=c11 -c $(MANYWARNINGS) $(CCOPTS) -g -o $(ME)/Tangled/$(ME).o $(ME)/Tangled/$(ME).c
clang $(CCOPTS) -g -o $(ME)/Tangled/$(ME)$(EXEEXTENSION) $(ME)/Tangled/$(ME).o
endef
define make-me

View file

@ -1,9 +1,24 @@
# This is a makefile for "inweb". It expects the current working folder to be
# the one above the one holding this file (unusually), so it's best called
# with e.g. "make -f inweb/inweb.mk".
#
# To generate inweb.mk from its source, use e.g.:
# inweb/Tangled/inweb inweb -prototype inweb/scripts/makescript.txt -makefile inweb/inweb.mk
# This is "inweb.mkscript", a script used to generate the makefile "inweb.mk"
# used to build the tool "inweb". Do not edit "inweb.mk" directly. Instead,
# edit this script, and then rebuild "inweb.mk" with the command:
# inweb/Tangled/inweb inweb -prototype inweb/scripts/inweb.mkscript -makefile inweb/inweb.mk
# See the inweb manual for documentation on the *.mkscript file format, i.e.,
# the format in which this file is written. But it is essentially just a makefile
# with a number of special macro and loop features whose syntax involves braces
# { ... }, so anywhere that you see braces, you're looking at something special
# to *.mkscript; anything else is straightforward make syntax.
# -----------------------------------------------------------------------------
# Note that the resulting makescript expects to be used from a current working
# directory which is the _one above_ "inweb", _not_ from "inweb" itself. So it
# should usually be invoked as e.g. "make -f inweb/inweb.mk".
# -----------------------------------------------------------------------------
{platform-settings}
ME = inweb
FTEST = $(ME)/foundation-test
@ -33,35 +48,32 @@ force: $(ME)/platform-settings.mk
$(call make-me)
$(call make-ftest)
.PHONY: macos
macos:
cp -f $(ME)/Materials/macos-make-settings.mk $(ME)/platform-settings.mk
echo "=== Platform set to 64-bit MacOS. Now: make -f inweb/inweb.mk initial ==="
{define: make-settings platform: PLATFORM}
$(INWEB) -prototype $(ME)/Materials/platforms/{PLATFORM}.mkscript -makefile $(ME)/Materials/platforms/{PLATFORM}.mk
{end-define}
.PHONY: macos32
macos32:
cp -f $(ME)/Materials/macos32-make-settings.mk $(ME)/platform-settings.mk
echo "=== Platform set to 32-bit MacOS. Now: make -f inweb/inweb.mk initial ==="
.PHONY: makers
makers:
$(INWEB) $(FTEST) -makefile $(FTEST)/foundation-test.mk
{make-settings platform: macos}
{make-settings platform: macos32}
{make-settings platform: windows}
{make-settings platform: linux}
{make-settings platform: unix}
.PHONY: windows
windows:
cp -f $(ME)/Materials/windows-make-settings.mk $(ME)/platform-settings.mk
echo "=== Platform set to Windows. Now: make -f inweb/inweb.mk initial ==="
{define: target-to-choose platform: PLATFORM}
.PHONY: {PLATFORM}
{PLATFORM}:
cp -f $(ME)/Materials/platforms/{PLATFORM}.mk $(ME)/platform-settings.mk
echo "=== Platform set to '{PLATFORM}'. Now: make -f inweb/inweb.mk initial ==="
.PHONY: linux
linux:
cp -f $(ME)/Materials/linux-make-settings.mk $(ME)/platform-settings.mk
echo "=== Platform set to Linux. Now: make -f inweb/inweb.mk initial ==="
{end-define}
.PHONY: unix
unix:
cp -f $(ME)/Materials/unix-make-settings.mk $(ME)/platform-settings.mk
echo "=== Platform set to generic Unix (non-Linux, non-MacOS, non-Android). Now: make -f inweb/inweb.mk initial ==="
.PHONY: android
android:
cp -f $(ME)/Materials/android-make-settings.mk $(ME)/platform-settings.mk
echo "=== Platform set to Android. Now: make -f inweb/inweb.mk initial ==="
{target-to-choose platform: macos}
{target-to-choose platform: macos32}
{target-to-choose platform: windows}
{target-to-choose platform: linux}
{target-to-choose platform: unix}
.PHONY: initial
initial: $(ME)/platform-settings.mk
@ -78,8 +90,8 @@ safe:
# Inform tarball. The following builds inweb from this:
define make-me-once-tangled
$(CC) -o $(ME)/Tangled/$(ME).o $(ME)/Tangled/$(ME).c
$(LINK) -o $(ME)/Tangled/$(ME)$(EXEEXTENSION) $(ME)/Tangled/$(ME).o $(LINKEROPTS)
{compile from: $(ME)/Tangled/$(ME).c to: $(ME)/Tangled/$(ME).o}
{link from: $(ME)/Tangled/$(ME).o to: $(ME)/Tangled/$(ME)$(EXEEXTENSION)}
endef
# If inweb exists already, we can compile it using itself like so: