1
0
Fork 0
mirror of https://github.com/ganelson/inform.git synced 2024-07-16 22:14:23 +03:00
inform7/scripts/inform.mkscript
Philip Chimento 092683a170 Ensure integration directories exist
This creates the directories in the user interface apps where some of the
files are copied to, if they don't exist yet.
2022-04-26 22:11:05 -07:00

907 lines
38 KiB
Plaintext

# This is "inform.mkscript", a script used to generate the makefile "makefile"
# at the root of the "inform" repository. This isn't for making any single
# executable, but for orchestrating build-like operations across the whole
# suite of tools included in that repository, so a lot of what it does is to
# run make recursively on subsidiary makefiles belonging to the individual tools.
# Do not edit "inform/makefile" directly. Instead, edit this script, and then
# rebuild "inform/makefile" with the command:
# ../inweb/Tangled/inweb -prototype scripts/inform.mkscript -makefile makefile
# (Note that typing "make makers" will remake all of the subsidiary makefiles
# inside the repository from their scripts, but _not_ this one: we don't want
# to have a makefile editing itself.)
# 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 makefile expects to be used with the current working
# directory set to "inform". It should then usually be invoked with just "make".
# -----------------------------------------------------------------------------
# Platform (operating system) dependencies
# -----------------------------------------------------------------------------
# This tells Inweb to incorporate settings for your platform (macos, windows,
# linux, etc.), as set when Inweb was installed.
{platform-settings}
# There is, however, another piece of platform dependency. We want a makefile
# which is capable of "integrating" the Inform toolchain and other resources
# into a UI app (say, the MacOS "Inform.app"), which basically means copying
# a lot of files into place in some hierarchy somewhere. Those hierarchies
# have different locations and naming conventions on the different platforms;
# and the inform repository should not be the place to set those.
# So, then, each platform provides its own "make-integration-settings.mk" file,
# which - if used - should be placed in the directory just outside "inform".
# This is all optional, and command-line users need not have such a file:
# note that the make syntax "-include" means "load this file if it exists but
# continue without any errors if it does not".
# If the file does exist, it will define the symbol INTEGRATION, and make a
# set of other definitions as well, which we will make use of below.
-include ../make-integration-settings.mk
# Note that if you are an app-maker wanting to make a release build of your
# app, always "make" first, and then "make forceintegration". (This ensures
# all resources are copied from the repository into your app, and doesn't
# try to do anything clever about working out the minimum necessary copy.)
# -----------------------------------------------------------------------------
# Where to find webs in this repository
# -----------------------------------------------------------------------------
# The makefile needs to deal with many "literate programs" at various places
# in the repository. A sort of roster of these, called a "colony file", is here:
COLONY = colony.txt
# We will also make use of two webs outside the inform repository, from our
# sidekick projects intest and inweb, which must both also be installed in order
# to test and build inform:
INTEST = ../intest/Tangled/intest
INTESTX = ../intest/Tangled/intest
INTESTWEB = ../intest
INWEB = ../inweb/Tangled/inweb
INWEBX = ../inweb/Tangled/inweb
INWEBWEB = ../inweb
# But the inform repository creates many other webs itself, and those can be
# divided into three: tools (executable code), modules (used to make tools),
# and miscellaneous webs (making something other than executable code). These
# are collectively called "components" below, and we now declare them all,
# beginning with the modules.
{component type: module symbol: WORDS webname: words path: services/words-module set: modules}
{component type: module symbol: SYNTAX webname: syntax path: services/syntax-module set: modules}
{component type: module symbol: HTML webname: html path: services/html-module set: modules}
{component type: module symbol: ARCH webname: arch path: services/arch-module set: modules}
{component type: module symbol: INFLECTIONS webname: inflections path: services/inflections-module set: modules}
{component type: module symbol: LEXICON webname: lexicon path: services/lexicon-module set: modules}
{component type: module symbol: LINGUISTICS webname: linguistics path: services/linguistics-module set: modules}
{component type: module symbol: PROBLEMS webname: problems path: services/problems-module set: modules}
{component type: module symbol: KINDS webname: kinds path: services/kinds-module set: modules}
{component type: module symbol: CALCULUS webname: calculus path: services/calculus-module set: modules}
{component type: module symbol: CORE webname: core path: inform7/core-module set: modules}
{component type: module symbol: ASSERTIONS webname: assertions path: inform7/assertions-module set: modules}
{component type: module symbol: KNOWLEDGE webname: knowledge path: inform7/knowledge-module set: modules}
{component type: module symbol: IMPERATIVE webname: imperative path: inform7/imperative-module set: modules}
{component type: module symbol: RUNTIME webname: runtime path: inform7/runtime-module set: modules}
{component type: module symbol: VALUES webname: values path: inform7/values-module set: modules}
{component type: module symbol: IF webname: if path: inform7/if-module set: modules}
{component type: module symbol: MULTIMEDIA webname: multimedia path: inform7/multimedia-module set: modules}
{component type: module symbol: BYTECODE webname: bytecode path: inter/bytecode-module set: modules}
{component type: module symbol: BUILDING webname: building path: inter/building-module set: modules}
{component type: module symbol: PIPELINE webname: pipeline path: inter/pipeline-module set: modules}
{component type: module symbol: FINAL webname: final path: inter/final-module set: modules}
{component type: module symbol: INDEX webname: index path: inter/index-module set: modules}
{component type: module symbol: SUPERVISOR webname: supervisor path: inbuild/supervisor-module set: modules}
# Next the tools. Note that to each symbol (say, NAME) the following will write
# makefile variable definitions of NAMEWEB, its location; NAMEMAKER, the make
# file for the tool; and NAMEX, the actual executable which will be compiled.
# There are two sets here: the "ctools" are the compiler tools, all made from the
# same inform7 code-base but in different ways; the "otools" are other tools.
{component type: tool symbol: INBLORB webname: inblorb path: inblorb set: otools}
{component type: tool symbol: INDOC webname: indoc path: indoc set: otools}
{component type: tool symbol: INFORM7 webname: inform7 path: inform7 set: ctools}
{component type: tool symbol: INPOLICY webname: inpolicy path: inpolicy set: otools}
{component type: tool symbol: INRTPS webname: inrtps path: inrtps set: otools}
{component type: tool symbol: INBUILD webname: inbuild path: inbuild set: ctools}
{component type: tool symbol: INTER webname: inter path: inter set: ctools}
# Because Inform 6 is not a web, we have to give it special treatment, and define
# its executable location INFORM6X manually. (The directory holding it will be
# called INFORM6WEB for consistency, even though it is not actually a web.)
INFORM6X = inform6/Tangled/inform6
INFORM6WEB = inform6
# The "utools" set of executables provides unit testing for modules:
{component type: tool symbol: SYNTAXTEST webname: syntax-test path: services/syntax-test set: utools}
{component type: tool symbol: WORDSTEST webname: words-test path: services/words-test set: utools}
{component type: tool symbol: ARCHTEST webname: arch-test path: services/arch-test set: utools}
{component type: tool symbol: INFLECTIONSTEST webname: inflections-test path: services/inflections-test set: utools}
{component type: tool symbol: LINGUISTICSTEST webname: linguistics-test path: services/linguistics-test set: utools}
{component type: tool symbol: KINDSTEST webname: kinds-test path: services/kinds-test set: utools}
{component type: tool symbol: CALCULUSTEST webname: calculus-test path: services/calculus-test set: utools}
{component type: tool symbol: PROBLEMSTEST webname: problems-test path: services/problems-test set: utools}
{component type: tool symbol: BUILDINGTEST webname: building-test path: inter/building-test set: utools}
# Then there are webs which make programs other than C executables: kits of Inter
# code and Inform 7 extensions.
{component type: web symbol: BASICINFORMKIT webname: BasicInformKit path: inform7/Internal/Inter/BasicInformKit set: kits}
{component type: web symbol: WORLDMODELKIT webname: WorldModelKit path: inform7/Internal/Inter/WorldModelKit set: kits}
{component type: web symbol: COMMANDPARSERKIT webname: CommandParserKit path: inform7/Internal/Inter/CommandParserKit set: kits}
{component type: web symbol: BASICINFORMEXTRASKIT webname: BasicInformExtrasKit path: inform7/Internal/Inter/BasicInformExtrasKit set: kits}
{component type: web symbol: ENGLISHLANGUAGEKIT webname: EnglishLanguageKit path: inform7/Internal/Inter/EnglishLanguageKit set: kits}
{component type: web symbol: STANDARDRULES webname: standard_rules path: inform7/extensions/standard_rules set: extensions}
{component type: web symbol: BASICINFORM webname: basic_inform path: inform7/extensions/basic_inform set: extensions}
# Those extensions, when tangled from these webs, will need to be placed here:
STANDARDRULESTANGLED = $(INFORM7WEB)/Internal/Extensions/Graham\ Nelson/Standard\ Rules.i7x
BASICINFORMTANGLED = $(INFORM7WEB)/Internal/Extensions/Graham\ Nelson/Basic\ Inform.i7x
# -----------------------------------------------------------------------------
# Targets "all" and "force"
# -----------------------------------------------------------------------------
# "make all", the default target, incrementally makes the tools; "make force"
# makes everything, disregarding all timestamps on files. Note that neither
# one of these performs a "make integration", to push the results of our efforts
# into a surrounding GUI app (if it is present) - that must be done (if desired)
# by "make integration" explicitly.
.PHONY: all
all: tools kits extensions localintegration
.PHONY: force
force: forcetools forcekits forceextensions localintegration
# -----------------------------------------------------------------------------
# Target "localintegration"
# -----------------------------------------------------------------------------
# This is not the same thing as integration into a GUI app. It means taking the
# side-files tangled from the Inform 7 code base out of the inform7 web and
# into the places elsewhere in the repository where they are actually needed:
.PHONY: localintegration
localintegration: \
$(INFORM7WEB)/Internal/Languages/English/Syntax.preform \
$(INFORM7WEB)/Internal/Miscellany/inform7_clib.h \
$(INFORM7WEB)/Internal/Miscellany/inform7_clib.c
# When tangled, the inform7 web most importantly makes inform7.c, of course,
# but it makes three side files as well: Syntax.preform, a grammar file, and
# a small C library used when compiling Inform projects to C.
$(INFORM7WEB)/Internal/Languages/English/Syntax.preform: $(INFORM7WEB)/Tangled/Syntax.preform
cp -f "$(INFORM7WEB)/Tangled/Syntax.preform" "$(INFORM7WEB)/Internal/Languages/English/Syntax.preform"
$(INFORM7WEB)/Internal/Miscellany/inform7_clib.h: $(INFORM7WEB)/Tangled/inform7_clib.h
cp -f "$(INFORM7WEB)/Tangled/inform7_clib.h" "$(INFORM7WEB)/Internal/Miscellany/inform7_clib.h"
$(INFORM7WEB)/Internal/Miscellany/inform7_clib.c: $(INFORM7WEB)/Tangled/inform7_clib.c
cp -f "$(INFORM7WEB)/Tangled/inform7_clib.c" "$(INFORM7WEB)/Internal/Miscellany/inform7_clib.c"
# It is in fact sufficient to tangle just the inter subset of inform7 to make
# the two C-library files:
$(INFORM7WEB)/Tangled/inform7_clib.h: inter/final-module/Chapter\ 5/*.w
$(INWEBX) $(INTERWEB) -tangle
$(INFORM7WEB)/Tangled/inform7_clib.c: inter/final-module/Chapter\ 5/*.w
$(INWEBX) $(INTERWEB) -tangle
# -----------------------------------------------------------------------------
# Target "makers"
# -----------------------------------------------------------------------------
# Each individual tool has its own makefile, stored inside its individual web.
# "make makers" runs through each tool in turn and creates them from their
# respective makescripts. The one makefile we don't make is this one: it really
# doesn't seem safe for a makefile to run a command which overwrites itself.
# Note that {components type: tool}...{end-components} iterates through all the
# components given the type "tool" above.
.PHONY: makers
makers:
{components type: tool}
$(INWEBX) $({SYMBOL}WEB) -makefile $({SYMBOL}MAKER)
{end-components}
$(INWEBX) -prototype $(INFORM6WEB)/inform6.mkscript -makefile $(INFORM6WEB)/inform6.mk
$(INWEBX) -prototype retrospective/retrospective.mkscript -makefile retrospective/makefile
# -----------------------------------------------------------------------------
# Target "gitignores"
# -----------------------------------------------------------------------------
# Each individual web needs its own .gitignore file, and this makes them. No
# overwriting issues time, so we do include the .gitignore at the root of the
# inform repository.
.PHONY: gitignores
gitignores:
$(INWEBX) -prototype scripts/inform.giscript -gitignore .gitignore
{components type: tool}
$(INWEBX) $({SYMBOL}WEB) -gitignore $({SYMBOL}WEB)/.gitignore
{end-components}
$(INWEBX) -prototype $(INFORM6WEB)/inform6.giscript -gitignore $(INFORM6WEB)/.gitignore
# -----------------------------------------------------------------------------
# Target "versions"
# -----------------------------------------------------------------------------
# Asks the tools their current version numbers.
.PHONY: versions
versions:
{components type: tool}
$({SYMBOL}X) -version
{end-components}
$(INFORM6X) -V
# -----------------------------------------------------------------------------
# Targets "extensions" and "forceextensions"
# -----------------------------------------------------------------------------
# "make extensions" incrementally re-tangles any extensions defined by webs
# (such as Basic Inform); "make forceextensions" does so regardless of timestamps.
{define: tangle-extension name: SYMBOL}
$(INWEBX) $({SYMBOL}WEB) -tangle-to $({SYMBOL}TANGLED)
{end-define}
.PHONY: extensions
extensions: {components type: web set: extensions}$({SYMBOL}TANGLED) {end-components}
{components type: web set: extensions}
$({SYMBOL}TANGLED): $({SYMBOL}WEB)/Contents.w $({SYMBOL}WEB)/Sections/*.w
{tangle-extension name: SYMBOL}
{end-components}
PHONY: forceextensions
forceextensions:
{components type: web set: extensions}
{tangle-extension name: {SYMBOL}}
{end-components}
# -----------------------------------------------------------------------------
# Targets "kits" and "forcekits"
# -----------------------------------------------------------------------------
# These are easier because Inbuild already performs a make-like service on
# directories of kits; that saves a great deal of messy make code here.
.PHONY: kits
kits:
$(INBUILDX) -build -contents-of $(INFORM7WEB)/Internal/Inter
.PHONY: forcekits
forcekits:
$(INBUILDX) -rebuild -contents-of $(INFORM7WEB)/Internal/Inter
# -----------------------------------------------------------------------------
# Target "tools"
# -----------------------------------------------------------------------------
# "make tools" builds all of the tools incrementally, i.e., only as necessary.
# Note the use of repeat to make a list: $(INBLORBX) $(INDOCX) ..., etc.
.PHONY: tools
tools: {components type: tool}$({SYMBOL}X) {end-components}$(INFORM6X)
{components type: tool}
$({SYMBOL}X): {dependent-files tool-and-modules: {SYMBOL}}
$(MAKE) -f $({SYMBOL}MAKER)
{end-components}
# As ever, Inform 6 needs special handling:
$(INFORM6X): $(INFORM6WEB)/Inform6/*.c
$(MAKE) -f $(INFORM6WEB)/inform6.mk
# -----------------------------------------------------------------------------
# Target "forcetools"
# -----------------------------------------------------------------------------
# Similarly, but with a single target, since nothing is incremental here.
.PHONY: forcetools
forcetools:
{components type: tool}
$(MAKE) -f $({SYMBOL}MAKER) force
{end-components}
$(MAKE) -f $(INFORM6WEB)/inform6.mk force
# -----------------------------------------------------------------------------
# Target "retrospective"
# -----------------------------------------------------------------------------
# "make retrospective" builds the back catalogue of old releases, but delegates
# all the work to a makefile there:
.PHONY: retrospective
retrospective:
$(MAKE) -f retrospective/makefile
# -----------------------------------------------------------------------------
# Target "check"
# -----------------------------------------------------------------------------
# "make check" invites the make file for every tool to run its own tests.
# I6 must come first, because that guarantees the Z and Glulx interpreters
# are safely built before we need them (as we will in order to test I7).
# -----------------------------------------------------------------------------
.PHONY: check
check:
$(MAKE) -f $(INFORM6WEB)/inform6.mk test
$(INPOLICYX) -silence -check-problems
{components type: tool}
$(MAKE) -f $({SYMBOL}MAKER) test
{end-components}
# -----------------------------------------------------------------------------
# Target "commit"
# -----------------------------------------------------------------------------
# "make commit" should be used only by the Benevolent Overlord of Inform.
# It updates the build code and commits to the repository.
# -----------------------------------------------------------------------------
{define: update-readme}
$(INWEBX) -prototype scripts/inform.rmscript -write-me README.md
{end-define}
.PHONY: commit
commit:
$(INWEBX) -advance-build-file build.txt
{update-readme}
git commit -a
# -----------------------------------------------------------------------------
# Target "pages"
# -----------------------------------------------------------------------------
# "make pages" refreshes the GitHub Pages content in the docs folder.
# -----------------------------------------------------------------------------
.PHONY: pages
pages: readmepage icon diagnostics diagrams navigationpages \
{components type: tool}{SYMBOL}PAGES {end-components} \
{components type: module}{SYMBOL}PAGES {end-components} \
{components type: web}{SYMBOL}PAGES {end-components}
.PHONY: forcepages
forcepages: readmepage icon diagnostics diagrams forcenavigationpages \
{components type: tool}{SYMBOL}FORCEPAGES {end-components} \
{components type: module}{SYMBOL}FORCEPAGES {end-components} \
{components type: web}{SYMBOL}FORCEPAGES {end-components}
# -----------------------------------------------------------------------------
# Just one lonely icon file!
.PHONY: icon
icon:
mkdir -p docs
mkdir -p docs/docs-assets
cp -f docs-src/Inform.png docs/docs-assets
# -----------------------------------------------------------------------------
# See the "make commit" target above.
.PHONY: readmepage
readmepage:
{update-readme}
# -----------------------------------------------------------------------------
# A number of diagrams in the woven form of our webs are automatically created,
# so that they will always be correct to the current state of Inform. The following
# copies them into place in the relevant Figures folders; or, in the case of -help
# listings of command-line settings, creates them in place.
{define: copy-diagram file: FILE into: WEB}
cp -f {FILE} $({WEB})/Figures
{end-define}
{define: update-reference-card for: TOOL}
$({TOOL}X) -help >$({TOOL}WEB)/Figures/help.txt
{end-define}
.PHONY: diagrams
diagrams:
{copy-diagram file: $(LINGUISTICSTESTWEB)/Tests/Test\ Diagrams/_Results_Ideal/*.txt into: LINGUISTICSWEB}
{copy-diagram file: $(LINGUISTICSTESTWEB)/Tests/vocabulary.txt into: LINGUISTICSWEB}
{copy-diagram file: $(INFORM7WEB)/Tests/Test\ Internals/_Results_Ideal/Refine*.txt into: ASSERTIONSWEB}
{copy-diagram file: $(KINDSTESTWEB)/Tests/Test\ Cases/_Results_Ideal/*.txt into: KINDSWEB}
{copy-diagram file: $(CALCULUSTESTWEB)/Tests/Test\ Cases/_Results_Ideal/*.txt into: CALCULUSWEB}
{copy-diagram file: $(INFORM7WEB)/Internal/Pipelines/compile.interpipeline into: INTERWEB}
{copy-diagram file: $(INFORM7WEB)/Internal/Pipelines/compile.interpipeline into: PIPELINEWEB}
{copy-diagram file: $(INFORM7WEB)/Internal/Pipelines/assimilate.interpipeline into: PIPELINEWEB}
{copy-diagram file: $(INFORM7WEB)/Internal/Pipelines/link.interpipeline into: PIPELINEWEB}
{copy-diagram file: $(INFORM7WEB)/Internal/Pipelines/optimise.interpipeline into: PIPELINEWEB}
{copy-diagram file: $(INFORM7WEB)/Internal/Pipelines/build-kit.interpipeline into: PIPELINEWEB}
{components type: tool set: ctools}
{update-reference-card for: {SYMBOL}}
{end-components}
{components type: tool set: otools}
{update-reference-card for: {SYMBOL}}
{end-components}
# -----------------------------------------------------------------------------
# "Diagnostics" are files produced by inform7 to measure its own performance when
# running in a special mode, as it does when intest runs the test GenerateDiagnostics-G.
# We need first to run that test; then the diagnostics files will all be in the
# $(INFORM7WEB)/Figures directory; but in some cases that is not where we want them, so
# we need to move those on to their proper homes.
{define: copy-download file: FILE into: WEB}
cp -f {FILE} $({WEB})/Downloads
{end-define}
.PHONY: diagnostics
diagnostics:
$(INTESTX) inform7 GenerateDiagnostics-G
{copy-download file: $(INFORM7WEB)/Figures/excerpts-diagnostics.txt into: INFORM7WEB}
rm -f $(INFORM7WEB)/Figures/syntax-diagnostics.txt
{copy-download file: $(INFORM7WEB)/Figures/preform-diagnostics.txt into: INFORM7WEB}
rm -f $(INFORM7WEB)/Figures/preform-diagnostics.txt
{copy-diagram file: $(INFORM7WEB)/Figures/excerpts-diagnostics.txt into: LEXICONWEB}
rm -f $(INFORM7WEB)/Figures/excerpts-diagnostics.txt
{copy-diagram file: $(INFORM7WEB)/Figures/stock-diagnostics.txt into: LINGUISTICSWEB}
rm -f $(INFORM7WEB)/Figures/stock-diagnostics.txt
# -----------------------------------------------------------------------------
# These are the special pages at the top of the mini-website, which act as
# navigation points into the interior. They are each little one-file webs in
# their own right, designed just for weaving, not tangling.
# Annoyingly, we can't put overview into this list, because it weaves to a
# file called index.html, not overview.html; and we can't rename overview as
# "index" because that would be a name clash with the "index" module of I7,
# which is already a web in the colony file.
{set name: NAVIGATIONPAGES value: structure, extensions, kits, services, inform6, inbuildn, inform7n, intern, inblorbn, indocn, inrtpsn, inpolicyn, secrets}
{define: weave-one page: PAGE}
$(INWEBX) -colony $(COLONY) -member {PAGE} -weave
{end-define}
.PHONY: navigationpages
navigationpages: docs/index.html {repeat with: PAGE in: {NAVIGATIONPAGES}}docs/{PAGE}.html {end-repeat}
docs/index.html: docs-src/overview.inweb docs-src/nav.html
{weave-one page: overview}
{repeat with: PAGE in: {NAVIGATIONPAGES}}
docs/{PAGE}.html: docs-src/{PAGE}.inweb docs-src/nav.html
{weave-one page: {PAGE}}
{end-repeat}
.PHONY: forcenavigationpages
forcenavigationpages:
rm -f docs/*.html
{weave-one page: overview}
{repeat with: PAGE in: {NAVIGATIONPAGES}}
{weave-one page: {PAGE}}
{end-repeat}
# -----------------------------------------------------------------------------
# Now we have to weave each of the webs for the many component parts. For the
# the web SYMBOL, the following defines two phony targets, SYMBOLPAGES and
# SYMBOLFORCEPAGES. The first weaves the web only if the source has changed
# since the last time; the second weaves it regardless.
{define: weave-target component: SYMBOL}
.PHONY: {SYMBOL}PAGES
{SYMBOL}PAGES: docs/$({SYMBOL}LEAF)/index.html
docs/$({SYMBOL}LEAF)/index.html: {dependent-files tool: {SYMBOL}}
rm -f docs/$({SYMBOL}LEAF)/*.html
$(INWEBX) -colony $(COLONY) -member $({SYMBOL}LEAF) -weave
.PHONY: {SYMBOL}FORCEPAGES
{SYMBOL}FORCEPAGES:
rm -f docs/$({SYMBOL}LEAF)/*.html
$(INWEBX) -colony $(COLONY) -member $({SYMBOL}LEAF) -weave
{end-define}
{define: weave-module-target component: SYMBOL}
.PHONY: {SYMBOL}PAGES
{SYMBOL}PAGES: docs/$({SYMBOL}LEAF)/index.html
docs/$({SYMBOL}LEAF)/index.html: {dependent-files module: {SYMBOL}}
rm -f docs/$({SYMBOL}LEAF)/*.html
$(INWEBX) -colony $(COLONY) -member $({SYMBOL}LEAF) -weave
.PHONY: {SYMBOL}FORCEPAGES
{SYMBOL}FORCEPAGES:
rm -f docs/$({SYMBOL}LEAF)/*.html
$(INWEBX) -colony $(COLONY) -member $({SYMBOL}LEAF) -weave
{end-define}
# And using that:
{components type: tool}
{weave-target component: {SYMBOL}}
{end-components}
{components type: module}
{weave-module-target component: {SYMBOL}}
{end-components}
{components type: web}
{weave-target component: {SYMBOL}}
{end-components}
# -----------------------------------------------------------------------------
# Targets "clean" and "purge"
# -----------------------------------------------------------------------------
# "make clean" removes some inessential files from the Inform source hierarchy;
# "make purge" also removes binaries
# -----------------------------------------------------------------------------
{define: ask-each-tool-makefile to: TARGET}
{components type: tool}
$(MAKE) -f $({SYMBOL}MAKER) {TARGET}
{end-components}
$(MAKE) -f $(INFORM6WEB)/inform6.mk {TARGET}
{end-define}
.PHONY: clean
clean:
{ask-each-tool-makefile to: clean}
.PHONY: purge
purge:
{ask-each-tool-makefile to: purge}
# -----------------------------------------------------------------------------
# Target "ebooks"
# -----------------------------------------------------------------------------
# "make ebooks" generates the two Inform ebook files in ePub format.
# One combines the manuals Writing with Inform and The Inform Recipe Book into
# a single volume, while the other holds the collected change logs.
# -----------------------------------------------------------------------------
{define: clean-ebooks}
rm -f resources/Documentation/Output/OEBPS/images/*
rm -f resources/Documentation/Output/OEBPS/*.*
rm -f resources/Documentation/Output/META-INF/container.xml
rm -f resources/Documentation/Output/mimetype
rm -f resources/Documentation/Output/*.*
rm -f resources/Changes/Output/OEBPS/images/*
rm -f resources/Changes/Output/OEBPS/*.*
rm -f resources/Changes/Output/META-INF/container.xml
rm -f resources/Changes/Output/mimetype
rm -f resources/Changes/Output/*.*
{end-define}
{set name: EBOOKSLIST value: Documentation, Changes}
.PHONY: ebooks
ebooks:
$(call clean-ebooks)
{repeat with: EBOOK in: {EBOOKSLIST}}
$(INDOCX) -from resources/{EBOOK} ebook
$(call clean-ebooks)
{end-repeat}
# =============================================================================
# From here on, everything is to do with integration: that is, with copying files
# from the inform repository (after all is built) into a GUI app. Command-line
# hackers will therefore not use these make targets.
# The rest of the file is inside "ifdef BUILTINCOMPS ... endif", which is in
# effect a test of whether any make-integration-settings.mk has been provided:
# that file has to define this symbol (see below), and the symbol will not
# otherwise have been defined.
ifdef BUILTINCOMPS
# -----------------------------------------------------------------------------
# Targets "integration" and "forceintegration"
# -----------------------------------------------------------------------------
.PHONY: integration
integration: \
transfertools \
transferpreform \
transferindext \
transferkits \
transferinternals \
transferdocumentation \
transferoutcomepages
.PHONY: forceintegration
forceintegration: \
forcetransfertools \
forcetransferpreform \
forcetransferindext \
forcetransferkits \
forcetransferextensions \
forcetransferlanguages \
forcetransferimages \
forcetransferotherinternals \
forcetransferdocumentation \
forcetransferoutcomepages
# -----------------------------------------------------------------------------
# Copying part of the Inform toolchain into the app
# The UI apps do not contain all of the intools: for example, they do not need
# indoc or inpolicy, which are run only at the command line. They do have these:
{set name: TOOLSINAPPS value: INBLORB, INFORM6, INFORM7, INTEST}
# The make-integration-settings.mk file is expected to have defined the symbols
# INBLORBNAME, INFORM6NAME, etc., as the leafnames these executables should be
# given when they are copied into the app: so, for example, if they want to call
# the "inform7" compiler by its old name, "ni", they can do so with INFORM7NAME = ni,
# and similarly if they want to call "inblorb" by its old name "cblorb".
# make-integration-settings.mk must also have set BUILTINCOMPS to the path for
# the built-in compiler tools.
{define: transfer-tool name: SYMBOL}
mkdir -p $(BUILTINCOMPS)
cp -f $({SYMBOL}X) $(BUILTINCOMPS)/$({SYMBOL}NAME)
{end-define}
.PHONY: transfertools
transfertools: {repeat with: SYMBOL in: {TOOLSINAPPS}}$(BUILTINCOMPS)/$({SYMBOL}NAME) {end-repeat}
{repeat with: SYMBOL in: {TOOLSINAPPS}}
$(BUILTINCOMPS)/$({SYMBOL}NAME): $({SYMBOL}X)
{transfer-tool name: {SYMBOL}}
{end-repeat}
.PHONY: forcetransfertools
forcetransfertools:
{repeat with: SYMBOL in: {TOOLSINAPPS}}
{transfer-tool name: {SYMBOL}}
{end-repeat}
# -----------------------------------------------------------------------------
# Copying the main English-language Preform definition file into the app
.PHONY: transferpreform
transferpreform: forcetransferpreform
.PHONY: forcetransferpreform
forcetransferpreform:
mkdir -p "$(INTERNAL)/Languages"
mkdir -p "$(INTERNAL)/Languages/English"
cp -f "$(INFORM7WEB)/Tangled/Syntax.preform" "$(INTERNAL)/Languages/English/Syntax.preform"
# -----------------------------------------------------------------------------
# Copying the indexing structure and localisation files into the app
{set name: LOCALISEDINDEXES value: English, French}
.PHONY: transferindext
transferindext: forcetransferindext
.PHONY: forcetransferindext
forcetransferindext:
mkdir -p "$(INTERNAL)/Miscellany"
cp -f "$(INFORM7WEB)/Internal/Miscellany/Standard.indext" "$(INTERNAL)/Miscellany/Standard.indext"
cp -f "$(INFORM7WEB)/Internal/Miscellany/Basic.indext" "$(INTERNAL)/Miscellany/Basic.indext"
{repeat with: LANGUAGE in: {LOCALISEDINDEXES}}
mkdir -p "$(INTERNAL)/Languages/{LANGUAGE}"
cp -f "$(INFORM7WEB)/Internal/Languages/{LANGUAGE}/Index.txt" "$(INTERNAL)/Languages/{LANGUAGE}/Index.txt"
{end-repeat}
# -----------------------------------------------------------------------------
# Copying kits (and Inter pipelines) into the app
# This is easy, because Inbuild provides a convenient sync facility. Note that
# make-integration-settings.mk is expected to have defined INTERNAL as the
# directory of resources inside itself which will be supplied to its copy of
# inform7 on the command line with the -internal switch.
.PHONY: transferkits
transferkits: forcetransferkits
.PHONY: forcetransferkits
forcetransferkits:
$(INBUILDX) -sync-to $(INTERNAL) -contents-of $(INFORM7WEB)/Internal/Inter
$(INBUILDX) -sync-to $(INTERNAL) -contents-of $(INFORM7WEB)/Internal/Pipelines
# -----------------------------------------------------------------------------
# Copying extensions into the app
# And also the documentation cross-referencing file, since that cross-references
# the Standard Rules and Basic Inform.
{define: transfer-extensions}
mkdir -p $(INTERNAL)
mkdir -p "$(INTERNAL)/Extensions/Eric Eve"
rm -f $(INTERNAL)/Extensions/Eric\ Eve/*
mkdir -p "$(INTERNAL)/Extensions/Emily Short"
rm -f $(INTERNAL)/Extensions/Emily\ Short/*
mkdir -p "$(INTERNAL)/Extensions/Graham Nelson"
rm -f $(INTERNAL)/Extensions/Graham\ Nelson/*
cp -R -f $(INFORM7WEB)/Internal/Extensions $(INTERNAL)/Extensions/..
mkdir -p "$(INTERNAL)/HTML"
cp -f $(INFORM7WEB)/Internal/HTML/xrefs.txt "$(INTERNAL)/HTML"
{end-define}
.PHONY: forcetransferextensions
forcetransferextensions:
{transfer-extensions}
# -----------------------------------------------------------------------------
# Copying language bundles into the app
{define: transfer-languages}
mkdir -p "$(INTERNAL)/Languages"
cp -R -f $(INFORM7WEB)/Internal/Languages $(INTERNAL)/Languages/..
{end-define}
.PHONY: forcetransferlanguages
forcetransferlanguages:
{transfer-languages}
# -----------------------------------------------------------------------------
# Copying website templates into the app
{set name: TEMPLATENAMES value: Standard, Classic, Parchment, Quixe}
{define: transfer-templates}
mkdir -p "$(INTERNAL)/Templates"
{repeat with: INTERPRETER in: {TEMPLATENAMES}}
mkdir -p "$(INTERNAL)/Templates/{INTERPRETER}"
rm -f $(INTERNAL)/Templates/{INTERPRETER}/*
{end-repeat}
cp -R -f $(INFORM7WEB)/Internal/Templates $(INTERNAL)/Templates/..
{end-define}
.PHONY: forcetransfertemplates
forcetransfertemplates:
{transfer-templates}
{define: transfer-other-internals}
mkdir -p "$(INTERNAL)/Miscellany"
rm -f $(INTERNAL)/Miscellany/*
cp -R -f $(INFORM7WEB)/Internal/Miscellany $(INTERNAL)/Miscellany/..
mkdir -p "$(INTERNAL)/HTML"
rm -f $(INTERNAL)/HTML/*
cp -R -f $(INFORM7WEB)/Internal/HTML $(INTERNAL)/HTML/..
{end-define}
.PHONY: forcetransferotherinternals
forcetransferotherinternals:
{transfer-other-internals}
# -----------------------------------------------------------------------------
# Copying images into the app
# Note that make-integration-settings.mk is expected to define BUILTINHTML as
# the directory which will hold the mini-website formed by the in-app manuals.
{set name: IMAGESETLIST value: bg_images, doc_images, map_icons, outcome_images, scene_icons}
{define: transfer-images}
mkdir -p $(BUILTINHTML)
cp -f resources/Imagery/app_images/Welcome*Background.png $(BUILTINHTML)
{repeat with: SET in: {IMAGESETLIST}}
mkdir -p $(BUILTINHTML)/{SET}
rm -f $(BUILTINHTML)/{SET}/*
cp -f resources/Imagery/{SET}/[A-Za-z]*.* $(BUILTINHTML)/{SET}
{end-repeat}
{end-define}
.PHONY: forcetransferimages
forcetransferimages:
{transfer-images}
# -----------------------------------------------------------------------------
# Incrementally copying the internal tree
# This is super-awkward and probably should be dropped in favour of rsync, but
# it's only used by "make integration", not by "make forceintegration". It aims
# to copy only what has changed, out of the extensions, languages, templates,
# images and miscellany files.
# Basically we use the timestamps on these two files to see whether a sync
# is now needed. (If it is, INTERNALEXEMPLUMFROM will be copied to INTERNALEXEMPLUM
# in the process.)
INTERNALEXEMPLUM = $(INTERNAL)/Miscellany/Cover.jpg
INTERNALEXEMPLUMFROM = $(INFORM7WEB)/Internal/Miscellany/Cover.jpg
.PHONY: transferinternals
transferinternals: $(INTERNALEXEMPLUM)
$(INTERNALEXEMPLUMFROM):
$(INTERNALEXEMPLUM)
$(INTERNALEXEMPLUM): \
$(INFORM7WEB)/Internal/Extensions/Eric\ Eve/[A-Za-z]* \
$(INFORM7WEB)/Internal/Extensions/Emily\ Short/[A-Za-z]* \
$(INFORM7WEB)/Internal/Extensions/Graham\ Nelson/[A-Za-z]* \
$(INFORM7WEB)/Internal/Languages/*/about.txt \
$(INFORM7WEB)/Internal/Templates/*/*.* \
$(INFORM7WEB)/Internal/HTML/[A-Za-z]*.* \
{repeat with: INTERPRETER in: {TEMPLATENAMES}}
$(INFORM7WEB)/Internal/Templates/{INTERPRETER}/[A-Za-z]*.* \
{end-repeat}
{repeat with: SET in: {IMAGESETLIST}}
resources/Imagery/{SET}/[A-Za-z]*.* \
{end-repeat}
resources/Imagery/app_images/[A-Za-z]*.* \
$(INFORM7WEB)/Internal/Miscellany/[A-Za-z]*.*
touch $(INTERNALEXEMPLUMFROM)
{transfer-extensions}
{transfer-languages}
{transfer-templates}
{transfer-other-internals}
{transfer-images}
# -----------------------------------------------------------------------------
# Typesetting documentation to HTML inside the app, using indoc
# Note that make-integration-settings.mk is expected to define BUILTINHTMLINNER as
# the directory which will hold the text pages of the mini-website formed by the
# in-app manuals. That may or may not be the same as BUILTINHTML, but whatever
# the relation between the two, the indoc settings for the platform will need to
# agree with that.
{define: compile-inapp-documentation}
mkdir -p "$(INTERNAL)/Documentation"
mkdir -p $(BUILTINHTMLINNER)
$(INDOCX) -from resources/Documentation -xrefs '$(INFORM7WEB)/Internal/HTML/xrefs.txt' $(INDOCOPTS)
{end-define}
.PHONY: transferdocumentation
transferdocumentation: $(BUILTINHTMLINNER)/index.html
$(BUILTINHTMLINNER)/index.html: resources/Documentation/*.txt resources/Documentation/Examples/*.txt
{compile-inapp-documentation}
.PHONY: forcetransferdocumentation
forcetransferdocumentation:
{compile-inapp-documentation}
# -----------------------------------------------------------------------------
# Typesetting the HTML pages used to display run-time problem messages, using inrtps
{define: make-inapp-outcome-pages}
$(INRTPSX) resources/Outcome\ Pages $(BUILTINHTMLINNER) $(INRTPSOPTS)
cp -f resources/Outcome\ Pages/pl404.html $(BUILTINHTMLINNER)
{end-define}
RTPEXEMPLUM = $(BUILTINHTMLINNER)/RTP_P1.html
.PHONY: transferoutcomepages
transferoutcomepages: $(RTPEXEMPLUM)
$(RTPEXEMPLUM): resources/Outcome*Pages/texts.txt resources/Outcome*Pages/*.html
{make-inapp-outcome-pages}
.PHONY: forcetransferoutcomepages
forcetransferoutcomepages:
{make-inapp-outcome-pages}
# =============================================================================
# End of the block which is used only if make-integration-settings.mk is
# provided
endif
# -----------------------------------------------------------------------------