chiark / gitweb /
Remove dependencies on Subversion.
[sgt-puzzles.git] / Recipe
1 # -*- makefile -*-
2
3 # This file describes which puzzle binaries are made up from which
4 # object and resource files. It is processed into the various
5 # Makefiles by means of a Perl script. Makefile changes should
6 # really be made by editing this file and/or the Perl script, not
7 # by editing the actual Makefiles.
8
9 !name puzzles
10
11 !makefile gtk Makefile.gtk
12 !makefile am Makefile.am
13 !makefile vc Makefile.vc
14 !makefile wce Makefile.wce
15 !makefile cygwin Makefile.cyg
16 !makefile osx Makefile.osx
17 !makefile gnustep Makefile.gnustep
18 !makefile nestedvm Makefile.nestedvm
19 !makefile emcc Makefile.emcc
20
21 !srcdir icons/
22
23 WINDOWS_COMMON = printing
24          + user32.lib gdi32.lib comctl32.lib comdlg32.lib winspool.lib
25 WINDOWS  = windows WINDOWS_COMMON
26 COMMON   = midend drawing misc malloc random version
27 GTK      = gtk printing ps
28 # Objects needed for auxiliary command-line programs.
29 STANDALONE = nullfe random misc malloc
30
31 ALL      = list
32
33 # First half of list.c.
34 !begin >list.c
35 /*
36  * list.c: List of pointers to puzzle structures, for monolithic
37  * platforms.
38  *
39  * This file is automatically generated by mkfiles.pl. Do not edit
40  * it directly, or the changes will be lost next time mkfiles.pl runs.
41  * Instead, edit Recipe and/or its *.R subfiles.
42  */
43 #include "puzzles.h"
44 #define GAMELIST(A) \
45 !end
46
47 # Now each .R file adds part of the macro definition of GAMELIST to list.c.
48 !include *.R
49
50 # Then we finish up list.c as follows:
51 !begin >list.c
52
53 #define DECL(x) extern const game x;
54 #define REF(x) &x,
55 GAMELIST(DECL)
56 const game *gamelist[] = { GAMELIST(REF) };
57 const int gamecount = lenof(gamelist);
58 !end
59
60 # Unix standalone application for special-purpose obfuscation.
61 obfusc : [U] obfusc STANDALONE
62
63 puzzles  : [G] windows[COMBINED] WINDOWS_COMMON COMMON ALL noicon.res
64
65 # Mac OS X unified application containing all the puzzles.
66 Puzzles  : [MX] osx osx.icns osx-info.plist COMMON ALL
67 # For OS X, we must create the online help and include it in the
68 # application bundle.) Also we add -DCOMBINED to the compiler flags
69 # so as to inform the code that we're building a single binary for
70 # all the puzzles. Then I've also got some code in here to build a
71 # distributable .dmg disk image.
72 !begin osx
73 Puzzles_extra = Puzzles.app/Contents/Resources/Help/index.html
74 Puzzles.app/Contents/Resources/Help/index.html: \
75         Puzzles.app/Contents/Resources/Help osx-help.but puzzles.but
76         cd Puzzles.app/Contents/Resources/Help; \
77                 halibut --html ../../../../osx-help.but ../../../../puzzles.but
78 Puzzles.app/Contents/Resources/Help: Puzzles.app/Contents/Resources
79         mkdir -p Puzzles.app/Contents/Resources/Help
80
81 release: Puzzles.dmg
82 Puzzles.dmg: Puzzles
83         rm -f raw.dmg
84         hdiutil create -megabytes 5 -layout NONE raw.dmg
85         hdid -nomount raw.dmg > devicename
86         newfs_hfs -v "Simon Tatham's Puzzle Collection" `cat devicename`
87         hdiutil eject `cat devicename`
88         hdid raw.dmg | cut -f1 -d' ' > devicename
89         cp -R Puzzles.app /Volumes/"Simon Tatham's Puzzle Collection"
90         hdiutil eject `cat devicename`
91         rm -f Puzzles.dmg
92         hdiutil convert -format UDCO raw.dmg -o Puzzles.dmg
93         rm -f raw.dmg devicename
94 !end
95
96 # Version management.
97 !begin vc
98 version.obj: *.c *.h
99         cl $(VER) $(CFLAGS) /c version.c
100 !end
101 !specialobj vc version
102 !begin wce
103 version.obj: *.c *.h
104         $(CC) $(VER) $(CFLAGS) /c version.c
105 !end
106 !specialobj wce version
107 !begin cygwin
108 version.o: FORCE;
109 FORCE:
110         $(CC) $(COMPAT) $(XFLAGS) $(CFLAGS) $(VER) -c version.c
111 !end
112 !specialobj cygwin version
113 # For Unix, we also need the gross MD5 hack that causes automatic
114 # version number selection in release source archives.
115 !begin gtk
116 version.o: version.c version2.def
117         $(CC) $(COMPAT) $(XFLAGS) $(CFLAGS) `cat version2.def` -c version.c
118 version2.def: FORCE
119         if test -z "$(VER)" && test -f manifest && md5sum -c manifest; then \
120                 cat version.def > version2.def.new; \
121         else \
122                 echo "$(VER)" >version2.def.new; \
123         fi && \
124         if diff -q version2.def.new version2.def; then \
125                 rm version2.def.new; \
126         else \
127                 mv version2.def.new version2.def; \
128         fi
129 .PHONY: FORCE
130 !end
131 !specialobj gtk version
132 # In the automake build, we have to do the whole job by supplying
133 # extra CFLAGS, so we have to put the if statement inside one big
134 # backtick expression. We also force rebuilding via a -D option that
135 # makes version.o include empty.h, which we construct ourselves and
136 # touch whenever any source file is updated.
137 !cflags am version -DINCLUDE_EMPTY_H `if test -z "$(VER)" && (cd $(srcdir) && test -f manifest && md5sum -c manifest >/dev/null 2>&1); then cat $(srcdir)/version.def; else echo "$(VER)"; fi`
138 !begin am
139 BUILT_SOURCES = empty.h
140 CLEANFILES = empty.h
141 empty.h: $(allsources)
142         echo '/* Empty file touched by automake makefile to force rebuild of version.o */' >$@
143 bin_PROGRAMS = $(GAMES)
144 !end
145 !begin am_begin
146 GAMES =
147 !end
148 !begin >empty.h
149 /* Empty file touched by automake makefile to force rebuild of version.o */
150 !end
151 !begin nestedvm
152 version.o: version.c version2.def
153         $(CC) $(COMPAT) $(XFLAGS) $(CFLAGS) `cat version2.def` -c version.c
154 version2.def: FORCE
155         if test -z "$(VER)" && test -f manifest && md5sum -c manifest; then \
156                 cat version.def > version2.def.new; \
157         else \
158                 echo "$(VER)" >version2.def.new; \
159         fi && \
160         if diff -q version2.def.new version2.def; then \
161                 rm version2.def.new; \
162         else \
163                 mv version2.def.new version2.def; \
164         fi
165 .PHONY: FORCE
166 !end
167 !specialobj nestedvm version
168 # For OS X, this is made more fiddly by the fact that we don't have
169 # md5sum readily available. We do, however, have `md5 -r' which
170 # generates _nearly_ the same output, but it has no check function.
171 !begin osx
172 version.ppc.o: version.c version2.def
173         $(CC) -arch ppc $(COMPAT) $(XFLAGS) $(CFLAGS) `cat version2.def` -c version.c -o $@
174 version.i386.o: version.c version2.def
175         $(CC) -arch i386 $(COMPAT) $(XFLAGS) $(CFLAGS) `cat version2.def` -c version.c -o $@
176 version2.def: FORCE
177         if test -z "$(VER)" && test -f manifest && (md5 -r `awk '{print $$2}' manifest` | diff -w manifest -); then \
178                 cat version.def > version2.def.new; \
179         else \
180                 echo "$(VER)" >version2.def.new; \
181         fi && \
182         if diff -q version2.def.new version2.def; then \
183                 rm version2.def.new; \
184         else \
185                 mv version2.def.new version2.def; \
186         fi
187 .PHONY: FORCE
188 !end
189 !specialobj osx version
190
191 # make install for Unix.
192 !begin gtk
193 install:
194         for i in $(GAMES); do \
195                 $(INSTALL_PROGRAM) -m 755 $(BINPREFIX)$$i $(DESTDIR)$(gamesdir)/$(BINPREFIX)$$i \
196                 || exit 1; \
197         done
198 !end
199 !begin nestedvm
200 .PRECIOUS: %.class
201 %.class: %.mips
202         java -cp $(NESTEDVM)/build:$(NESTEDVM)/upstream/build/classgen/build \
203                 org.ibex.nestedvm.Compiler -outformat class -d . \
204                 PuzzleEngine $<
205                 mv PuzzleEngine.class $@
206
207 org:
208         mkdir -p org/ibex/nestedvm/util
209         cp $(NESTEDVM)/build/org/ibex/nestedvm/Registers.class org/ibex/nestedvm
210         cp $(NESTEDVM)/build/org/ibex/nestedvm/UsermodeConstants.class org/ibex/nestedvm
211         cp $(NESTEDVM)/build/org/ibex/nestedvm/Runtime*.class org/ibex/nestedvm
212         cp $(NESTEDVM)/build/org/ibex/nestedvm/util/Platform*.class org/ibex/nestedvm/util
213         cp $(NESTEDVM)/build/org/ibex/nestedvm/util/Seekable*.class org/ibex/nestedvm/util
214         echo "Main-Class: PuzzleApplet" >applet.manifest
215
216 PuzzleApplet.class: PuzzleApplet.java org
217         javac -source 1.3 -target 1.3 PuzzleApplet.java
218
219 %.jar: %.class PuzzleApplet.class org
220         mv $< PuzzleEngine.class
221         jar cfm $@ applet.manifest PuzzleEngine.class PuzzleApplet*.class org
222         echo '<applet archive="'$@'" code="PuzzleApplet" width="700" height="500"></applet>' >$*.html
223         mv PuzzleEngine.class $<
224 !end
225
226 # A benchmarking and testing target for the GTK puzzles.
227 !begin gtk
228 test: benchmark.html benchmark.txt
229
230 benchmark.html: benchmark.txt benchmark.pl
231         ./benchmark.pl benchmark.txt > $@
232
233 benchmark.txt: $(GAMES)
234         for i in $(GAMES); do \
235                 for params in $$(env -i ./$(BINPREFIX)$$i --list-presets | cut -f1 -d' '); do \
236                         env -i ./$(BINPREFIX)$$i --test-solve --time-generation --generate 100 $$params \
237                         || exit 1; \
238                 done; \
239         done > $@
240 !end