I'm sick of repeatedly adding and removing local changes to Recipe

when testing a new game, so here's a new architecture for the Recipe
file. mkfiles.pl now supports several new features:

 - an `!include' directive, which accepts wildcards
 - += to append to an existing object group definition
 - the ability to divert output to an arbitrary file.

So now each puzzle has a `.R' file containing a fragment of Recipe
code describing that puzzle, and the central Recipe does `!include
*.R' to construct the Makefiles. That way, I can keep as many
experimental half-finished puzzles lying around my working directory
as I like, and I won't have to keep reverting Recipe when I check in
any other changes.

As part of this change, list.c is no longer a version-controlled
file; it's now constructed by mkfiles.pl, so that it too can take
advantage of this mechanism.

[originally from svn r6781]
This commit is contained in:
Simon Tatham
2006-08-05 17:20:29 +00:00
parent f05c25347d
commit cf880225ed
30 changed files with 512 additions and 195 deletions

127
Recipe
View File

@ -16,95 +16,38 @@
WINDOWS = windows printing
+ user32.lib gdi32.lib comctl32.lib comdlg32.lib winspool.lib
COMMON = midend drawing misc malloc random version
NET = net tree234 dsf
NETSLIDE = netslide tree234
MINES = mines tree234
FLIP = flip tree234
PEGS = pegs tree234
UNTANGLE = untangle tree234
SLANT = slant dsf
MAP = map dsf
LOOPY = loopy tree234 dsf
LIGHTUP = lightup combi
TENTS = tents maxflow
BRIDGES = bridges dsf
ALL = list NET NETSLIDE cube fifteen sixteen rect pattern solo twiddle
+ MINES samegame FLIP guess PEGS dominosa UNTANGLE blackbox SLANT
+ LIGHTUP MAP LOOPY inertia TENTS BRIDGES
GTK = gtk printing ps
net : [X] GTK COMMON NET
netslide : [X] GTK COMMON NETSLIDE
cube : [X] GTK COMMON cube
fifteen : [X] GTK COMMON fifteen
sixteen : [X] GTK COMMON sixteen
rect : [X] GTK COMMON rect
pattern : [X] GTK COMMON pattern
solo : [X] GTK COMMON solo
twiddle : [X] GTK COMMON twiddle
mines : [X] GTK COMMON MINES
samegame : [X] GTK COMMON samegame
flip : [X] GTK COMMON FLIP
guess : [X] GTK COMMON guess
pegs : [X] GTK COMMON PEGS
dominosa : [X] GTK COMMON dominosa
untangle : [X] GTK COMMON UNTANGLE
blackbox : [X] GTK COMMON blackbox
slant : [X] GTK COMMON SLANT
lightup : [X] GTK COMMON LIGHTUP
map : [X] GTK COMMON MAP
loopy : [X] GTK COMMON LOOPY
inertia : [X] GTK COMMON inertia
tents : [X] GTK COMMON TENTS
bridges : [X] GTK COMMON BRIDGES
# Auxiliary command-line programs.
# Objects needed for auxiliary command-line programs.
STANDALONE = nullfe random misc malloc
solosolver : [U] solo[STANDALONE_SOLVER] STANDALONE
patternsolver : [U] pattern[STANDALONE_SOLVER] STANDALONE
mineobfusc : [U] mines[STANDALONE_OBFUSCATOR] tree234 STANDALONE
slantsolver : [U] slant[STANDALONE_SOLVER] dsf STANDALONE
mapsolver : [U] map[STANDALONE_SOLVER] dsf STANDALONE m.lib
lightupsolver : [U] lightup[STANDALONE_SOLVER] combi STANDALONE
tentssolver : [U] tents[STANDALONE_SOLVER] maxflow STANDALONE
ALL = list
solosolver : [C] solo[STANDALONE_SOLVER] STANDALONE
patternsolver : [C] pattern[STANDALONE_SOLVER] STANDALONE
mineobfusc : [C] mines[STANDALONE_OBFUSCATOR] tree234 STANDALONE
slantsolver : [C] slant[STANDALONE_SOLVER] dsf STANDALONE
mapsolver : [C] map[STANDALONE_SOLVER] dsf STANDALONE
lightupsolver : [C] lightup[STANDALONE_SOLVER] combi STANDALONE
tentssolver : [C] tents[STANDALONE_SOLVER] maxflow STANDALONE
# First half of list.c.
!begin >list.c
/*
* list.c: List of pointers to puzzle structures, for monolithic
* platforms.
*
* This file is automatically generated by mkfiles.pl. Do not edit
* it directly, or the changes will be lost next time mkfiles.pl runs.
* Instead, edit Recipe and/or its *.R subfiles.
*/
#include "puzzles.h"
#define GAMELIST(A) \
!end
# The Windows Net shouldn't be called `net.exe' since Windows
# already has a reasonably important utility program by that name!
netgame : [G] WINDOWS COMMON NET
netslide : [G] WINDOWS COMMON NETSLIDE
cube : [G] WINDOWS COMMON cube
fifteen : [G] WINDOWS COMMON fifteen
sixteen : [G] WINDOWS COMMON sixteen
rect : [G] WINDOWS COMMON rect
pattern : [G] WINDOWS COMMON pattern
solo : [G] WINDOWS COMMON solo
twiddle : [G] WINDOWS COMMON twiddle
mines : [G] WINDOWS COMMON MINES
samegame : [G] WINDOWS COMMON samegame
flip : [G] WINDOWS COMMON FLIP
guess : [G] WINDOWS COMMON guess
pegs : [G] WINDOWS COMMON PEGS
dominosa : [G] WINDOWS COMMON dominosa
untangle : [G] WINDOWS COMMON UNTANGLE
blackbox : [G] WINDOWS COMMON blackbox
slant : [G] WINDOWS COMMON SLANT
lightup : [G] WINDOWS COMMON LIGHTUP
map : [G] WINDOWS COMMON MAP
loopy : [G] WINDOWS COMMON LOOPY
inertia : [G] WINDOWS COMMON inertia
tents : [G] WINDOWS COMMON TENTS
bridges : [G] WINDOWS COMMON BRIDGES
# Now each .R file adds part of the macro definition of GAMELIST to list.c.
!include *.R
# Then we finish up list.c as follows:
!begin >list.c
#define DECL(x) extern const game x;
#define REF(x) &x,
GAMELIST(DECL)
const game *gamelist[] = { GAMELIST(REF) };
const int gamecount = lenof(gamelist);
!end
# Mac OS X unified application containing all the puzzles.
Puzzles : [MX] osx osx.icns osx-info.plist COMMON ALL
@ -138,17 +81,6 @@ Puzzles.dmg: Puzzles
rm -f raw.dmg devicename
!end
# The `nullgame' source file is a largely blank one, which contains
# all the correct function definitions to compile and link, but
# which defines the null game in which nothing is ever drawn and
# there are no valid moves. Its main purpose is to act as a
# template for writing new game definition source files. I include
# it in the Makefile because it will be worse than useless if it
# ever fails to compile, so it's important that it should actually
# be built on a regular basis.
nullgame : [X] GTK COMMON nullgame
nullgame : [G] WINDOWS COMMON nullgame
# Version management.
!begin vc
version.obj: *.c *.h
@ -194,10 +126,7 @@ FORCE:
# make install for Unix.
!begin gtk
install:
for i in cube net netslide fifteen sixteen twiddle \
pattern rect solo mines samegame flip guess \
pegs dominosa untangle blackbox slant lightup \
map loopy inertia tents bridges; do \
for i in $(GAMES); do \
$(INSTALL_PROGRAM) -m 755 $$i $(DESTDIR)$(gamesdir)/$$i \
|| exit 1; \
done