chiark / gitweb /
sgt-puzzles (20161228.7cae89f-1) unstable; urgency=medium
[sgt-puzzles.git] / debian / patches / 304_combine-binaries.diff
1 Author: Ben Hutchings <ben@decadent.org.uk>
2 Description: Combine puzzles into a single executable
3
4 Link all the puzzles into a single executable and use argv[0]
5 to decide which to run.  This saves a large amount of disk
6 space due to the large amount of code that is otherwise
7 statically linked into multiple executables.
8
9 --- a/gtk.c
10 +++ b/gtk.c
11 @@ -2,6 +2,8 @@
12   * gtk.c: GTK front end for my puzzle collection.
13   */
14  
15 +#define _GNU_SOURCE
16 +
17  #include <stdio.h>
18  #include <assert.h>
19  #include <stdlib.h>
20 @@ -46,6 +48,14 @@
21  
22  /* #undef USE_CAIRO */
23  /* #define NO_THICK_LINE */
24 +
25 +#ifdef COMBINED
26 +static const gameindex *thegameindex;
27 +#define thegame (*thegameindex->game)
28 +#define xpm_icons (thegameindex->xpm_icons)
29 +#define n_xpm_icons (*thegameindex->n_xpm_icons)
30 +#endif
31 +
32  #ifdef DEBUGGING
33  static FILE *debug_fp = NULL;
34  
35 @@ -2190,8 +2200,6 @@ static frontend *new_window(char *arg, i
36      GList *iconlist;
37      int x, y, n;
38      char errbuf[1024];
39 -    extern char *const *const xpm_icons[];
40 -    extern const int n_xpm_icons;
41  
42      fe = snew(frontend);
43  
44 @@ -2585,7 +2593,8 @@ char *fgetline(FILE *fp)
45  
46  int main(int argc, char **argv)
47  {
48 -    char *pname = argv[0];
49 +    char *pname;
50 +    int i;
51      char *error;
52      int ngenerate = 0, print = FALSE, px = 1, py = 1;
53      int time_generation = FALSE, test_solve = FALSE, list_presets = FALSE;
54 @@ -2601,6 +2610,28 @@ int main(int argc, char **argv)
55      char **av = argv;
56      char errbuf[500];
57  
58 +#ifdef COMBINED
59 +    pname = strrchr(argv[0], '/');
60 +    if (pname)
61 +       pname++;
62 +    else
63 +       pname = argv[0];
64 +    if (!strncmp(pname, "sgt-", 4))
65 +       pname += 4;
66 +    for (i = 0; i < gamecount; i++) {
67 +       size_t len = strlen(gamelist[i].name);
68 +       if (!strncmp(pname, gamelist[i].name, len) &&
69 +           (pname[len] == 0 || !strcmp(pname + len, "game"))) {
70 +           thegameindex = &gamelist[i];
71 +           break;
72 +       }
73 +    }
74 +    if (!thegameindex) {
75 +       fprintf(stderr, "puzzles: unknown puzzle '%s'\n", pname);
76 +       exit(2);
77 +    }
78 +#endif
79 +
80      /*
81       * Command line parsing in this function is rather fiddly,
82       * because GTK wants to have a go at argc/argv _first_ - and
83 --- a/Recipe
84 +++ b/Recipe
85 @@ -23,7 +23,7 @@ WINDOWS_COMMON = printing
86           + user32.lib gdi32.lib comctl32.lib comdlg32.lib winspool.lib
87  WINDOWS  = windows WINDOWS_COMMON
88  COMMON   = midend drawing misc malloc random version
89 -GTK      = gtk printing ps
90 +GTK      = gtk[COMBINED] printing ps
91  # Objects needed for auxiliary command-line programs.
92  STANDALONE = nullfe random misc malloc
93  
94 @@ -39,6 +39,7 @@ ALL      = list
95   * it directly, or the changes will be lost next time mkfiles.pl runs.
96   * Instead, edit Recipe and/or its *.R subfiles.
97   */
98 +#define COMBINED
99  #include "puzzles.h"
100  #define GAMELIST(A) \
101  !end
102 @@ -49,10 +50,13 @@ ALL      = list
103  # Then we finish up list.c as follows:
104  !begin >list.c
105  
106 -#define DECL(x) extern const game x;
107 -#define REF(x) &x,
108 +#define DECL(x)                                                \
109 +extern const game x;                                   \
110 +extern const char *const *const x##_xpm_icons[];       \
111 +extern const int x##_n_xpm_icons;
112 +#define REF(x) { #x, &x, x##_xpm_icons, &x##_n_xpm_icons },
113  GAMELIST(DECL)
114 -const game *gamelist[] = { GAMELIST(REF) };
115 +const gameindex gamelist[] = { GAMELIST(REF) };
116  const int gamecount = lenof(gamelist);
117  !end
118  
119 @@ -92,6 +96,12 @@ Puzzles.dmg: Puzzles
120         rm -f raw.dmg devicename
121  !end
122  
123 +# Gtk unified application containing all the puzzles.
124 +puzzles  : [X] GTK COMMON ALL ALL_ICONS
125 +!begin gtk
126 +%-icon.o : override CFLAGS += -Dxpm_icons=$(@:%-icon.o=%)_xpm_icons -Dn_xpm_icons=$(@:%-icon.o=%)_n_xpm_icons
127 +!end
128 +
129  # Version management.
130  !begin vc
131  version.obj: *.c *.h
132 @@ -177,8 +187,11 @@ version2.def: FORCE
133  # make install for Unix.
134  !begin gtk
135  install:
136 +       mkdir -p $(DESTDIR)$(libdir)/sgt-puzzles
137 +       $(INSTALL_PROGRAM) -m 755 puzzles \
138 +               $(DESTDIR)$(libdir)/sgt-puzzles/puzzles
139         for i in $(GAMES); do \
140 -               $(INSTALL_PROGRAM) -m 755 $(BINPREFIX)$$i $(DESTDIR)$(gamesdir)/$(BINPREFIX)$$i \
141 +               ln -s $(libdir)/sgt-puzzles/puzzles $(DESTDIR)$(gamesdir)/$(BINPREFIX)$$i \
142                 || exit 1; \
143         done
144  !end
145 --- a/mkfiles.pl
146 +++ b/mkfiles.pl
147 @@ -1126,6 +1126,7 @@ if (defined $makefiles{'gtk'}) {
148      "prefix=/usr\n",
149      "exec_prefix=\$(prefix)\n",
150      "bindir=\$(exec_prefix)/bin\n",
151 +    "libdir=\$(exec_prefix)/lib\n",
152      "gamesdir=\$(exec_prefix)/games\n",
153      "sharedir=\$(prefix)/share\n",
154      "mandir=\$(sharedir)/man\n",
155 --- a/puzzles.h
156 +++ b/puzzles.h
157 @@ -581,7 +581,13 @@ struct drawing_api {
158   * there's a list of all available puzzles in array form.
159   */
160  #ifdef COMBINED
161 -extern const game *gamelist[];
162 +typedef struct {
163 +    const char *name;
164 +    const game *game;
165 +    const char *const *const *xpm_icons;
166 +    const int *n_xpm_icons;
167 +} gameindex;
168 +extern const gameindex gamelist[];
169  extern const int gamecount;
170  #else
171  extern const game thegame;
172 --- a/blackbox.R
173 +++ b/blackbox.R
174 @@ -5,6 +5,7 @@ blackbox : [X] GTK COMMON blackbox black
175  blackbox : [G] WINDOWS COMMON blackbox blackbox.res|noicon.res
176  
177  ALL += blackbox[COMBINED]
178 +ALL_ICONS += blackbox-icon
179  
180  !begin gtk
181  GAMES += blackbox
182 --- a/bridges.R
183 +++ b/bridges.R
184 @@ -7,6 +7,7 @@ bridges  : [X] GTK COMMON bridges BRIDGE
185  bridges  : [G] WINDOWS COMMON bridges BRIDGES_EXTRA bridges.res|noicon.res
186  
187  ALL += bridges[COMBINED] BRIDGES_EXTRA
188 +ALL_ICONS += bridges-icon
189  
190  !begin gtk
191  GAMES += bridges
192 --- a/cube.R
193 +++ b/cube.R
194 @@ -5,6 +5,7 @@ cube     : [X] GTK COMMON cube cube-icon
195  cube     : [G] WINDOWS COMMON cube cube.res|noicon.res
196  
197  ALL += cube[COMBINED]
198 +ALL_ICONS += cube-icon
199  
200  !begin gtk
201  GAMES += cube
202 --- a/dominosa.R
203 +++ b/dominosa.R
204 @@ -7,6 +7,7 @@ dominosa : [X] GTK COMMON dominosa DOMIN
205  dominosa : [G] WINDOWS COMMON dominosa DOMINOSA_EXTRA dominosa.res|noicon.res
206  
207  ALL += dominosa[COMBINED] DOMINOSA_EXTRA
208 +ALL_ICONS += dominosa-icon
209  
210  !begin gtk
211  GAMES += dominosa
212 --- a/fifteen.R
213 +++ b/fifteen.R
214 @@ -5,6 +5,7 @@ fifteen  : [X] GTK COMMON fifteen fiftee
215  fifteen  : [G] WINDOWS COMMON fifteen fifteen.res|noicon.res
216  
217  ALL += fifteen[COMBINED]
218 +ALL_ICONS += fifteen-icon
219  
220  !begin gtk
221  GAMES += fifteen
222 --- a/filling.R
223 +++ b/filling.R
224 @@ -10,6 +10,7 @@ filling : [X] GTK COMMON filling FILLING
225  filling : [G] WINDOWS COMMON filling FILLING_EXTRA filling.res|noicon.res
226  
227  ALL += filling[COMBINED] FILLING_EXTRA
228 +ALL_ICONS += filling-icon
229  
230  !begin gtk
231  GAMES += filling
232 --- a/flip.R
233 +++ b/flip.R
234 @@ -7,6 +7,7 @@ flip     : [X] GTK COMMON flip FLIP_EXTR
235  flip     : [G] WINDOWS COMMON flip FLIP_EXTRA flip.res|noicon.res
236  
237  ALL += flip[COMBINED] FLIP_EXTRA
238 +ALL_ICONS += flip-icon
239  
240  !begin gtk
241  GAMES += flip
242 --- a/galaxies.R
243 +++ b/galaxies.R
244 @@ -14,6 +14,7 @@ galaxiespicture : [U] galaxies[STANDALON
245  galaxiespicture : [C] galaxies[STANDALONE_PICTURE_GENERATOR] GALAXIES_EXTRA STANDALONE
246  
247  ALL += galaxies[COMBINED] GALAXIES_EXTRA
248 +ALL_ICONS += galaxies-icon
249  
250  !begin gtk
251  GAMES += galaxies
252 --- a/guess.R
253 +++ b/guess.R
254 @@ -5,6 +5,7 @@ guess    : [X] GTK COMMON guess guess-ic
255  guess    : [G] WINDOWS COMMON guess guess.res|noicon.res
256  
257  ALL += guess[COMBINED]
258 +ALL_ICONS += guess-icon
259  
260  !begin gtk
261  GAMES += guess
262 --- a/inertia.R
263 +++ b/inertia.R
264 @@ -5,6 +5,7 @@ inertia  : [X] GTK COMMON inertia inerti
265  inertia  : [G] WINDOWS COMMON inertia inertia.res|noicon.res
266  
267  ALL += inertia[COMBINED]
268 +ALL_ICONS += inertia-icon
269  
270  !begin gtk
271  GAMES += inertia
272 --- a/lightup.R
273 +++ b/lightup.R
274 @@ -10,6 +10,7 @@ lightupsolver : [U] lightup[STANDALONE_S
275  lightupsolver : [C] lightup[STANDALONE_SOLVER] LIGHTUP_EXTRA STANDALONE
276  
277  ALL += lightup[COMBINED] LIGHTUP_EXTRA
278 +ALL_ICONS += lightup-icon
279  
280  !begin gtk
281  GAMES += lightup
282 --- a/loopy.R
283 +++ b/loopy.R
284 @@ -17,6 +17,7 @@ loopysolver :   [C] loopy[STANDALONE_SOL
285  
286  
287  ALL += loopy[COMBINED] LOOPY_EXTRA
288 +ALL_ICONS += loopy-icon
289  
290  !begin gtk
291  GAMES += loopy
292 --- a/map.R
293 +++ b/map.R
294 @@ -10,6 +10,7 @@ mapsolver :     [U] map[STANDALONE_SOLVE
295  mapsolver :     [C] map[STANDALONE_SOLVER] MAP_EXTRA STANDALONE
296  
297  ALL += map[COMBINED] MAP_EXTRA
298 +ALL_ICONS += map-icon
299  
300  !begin gtk
301  GAMES += map
302 --- a/mines.R
303 +++ b/mines.R
304 @@ -10,6 +10,7 @@ mineobfusc :    [U] mines[STANDALONE_OBF
305  mineobfusc :    [C] mines[STANDALONE_OBFUSCATOR] MINES_EXTRA STANDALONE
306  
307  ALL += mines[COMBINED] MINES_EXTRA
308 +ALL_ICONS += mines-icon
309  
310  !begin gtk
311  GAMES += mines
312 --- a/net.R
313 +++ b/net.R
314 @@ -9,6 +9,7 @@ net      : [X] GTK COMMON net NET_EXTRA
315  netgame  : [G] WINDOWS COMMON net NET_EXTRA net.res|noicon.res
316  
317  ALL += net[COMBINED] NET_EXTRA
318 +ALL_ICONS += net-icon
319  
320  !begin gtk
321  GAMES += net
322 --- a/netslide.R
323 +++ b/netslide.R
324 @@ -7,6 +7,7 @@ netslide : [X] GTK COMMON netslide NETSL
325  netslide : [G] WINDOWS COMMON netslide NETSLIDE_EXTRA netslide.res|noicon.res
326  
327  ALL += netslide[COMBINED] NETSLIDE_EXTRA
328 +ALL_ICONS += netslide-icon
329  
330  !begin gtk
331  GAMES += netslide
332 --- a/pattern.R
333 +++ b/pattern.R
334 @@ -8,6 +8,7 @@ patternsolver : [U] pattern[STANDALONE_S
335  patternsolver : [C] pattern[STANDALONE_SOLVER] STANDALONE
336  
337  ALL += pattern[COMBINED]
338 +ALL_ICONS += pattern-icon
339  
340  !begin gtk
341  GAMES += pattern
342 --- a/pegs.R
343 +++ b/pegs.R
344 @@ -7,6 +7,7 @@ pegs     : [X] GTK COMMON pegs PEGS_EXTR
345  pegs     : [G] WINDOWS COMMON pegs PEGS_EXTRA pegs.res|noicon.res
346  
347  ALL += pegs[COMBINED] PEGS_EXTRA
348 +ALL_ICONS += pegs-icon
349  
350  !begin gtk
351  GAMES += pegs
352 --- a/rect.R
353 +++ b/rect.R
354 @@ -5,6 +5,7 @@ rect     : [X] GTK COMMON rect rect-icon
355  rect     : [G] WINDOWS COMMON rect rect.res|noicon.res
356  
357  ALL += rect[COMBINED]
358 +ALL_ICONS += rect-icon
359  
360  !begin gtk
361  GAMES += rect
362 --- a/samegame.R
363 +++ b/samegame.R
364 @@ -5,6 +5,7 @@ samegame : [X] GTK COMMON samegame sameg
365  samegame : [G] WINDOWS COMMON samegame samegame.res|noicon.res
366  
367  ALL += samegame[COMBINED]
368 +ALL_ICONS += samegame-icon
369  
370  !begin gtk
371  GAMES += samegame
372 --- a/sixteen.R
373 +++ b/sixteen.R
374 @@ -5,6 +5,7 @@ sixteen  : [X] GTK COMMON sixteen sixtee
375  sixteen  : [G] WINDOWS COMMON sixteen sixteen.res|noicon.res
376  
377  ALL += sixteen[COMBINED]
378 +ALL_ICONS += sixteen-icon
379  
380  !begin gtk
381  GAMES += sixteen
382 --- a/slant.R
383 +++ b/slant.R
384 @@ -10,6 +10,7 @@ slantsolver :   [U] slant[STANDALONE_SOL
385  slantsolver :   [C] slant[STANDALONE_SOLVER] SLANT_EXTRA STANDALONE
386  
387  ALL += slant[COMBINED] SLANT_EXTRA
388 +ALL_ICONS += slant-icon
389  
390  !begin gtk
391  GAMES += slant
392 --- a/solo.R
393 +++ b/solo.R
394 @@ -10,6 +10,7 @@ solosolver :    [U] solo[STANDALONE_SOLV
395  solosolver :    [C] solo[STANDALONE_SOLVER] SOLO_EXTRA STANDALONE
396  
397  ALL += solo[COMBINED] SOLO_EXTRA
398 +ALL_ICONS += solo-icon
399  
400  !begin gtk
401  GAMES += solo
402 --- a/tents.R
403 +++ b/tents.R
404 @@ -7,6 +7,7 @@ tents    : [X] GTK COMMON tents TENTS_EX
405  tents    : [G] WINDOWS COMMON tents TENTS_EXTRA tents.res|noicon.res
406  
407  ALL += tents[COMBINED] TENTS_EXTRA
408 +ALL_ICONS += tents-icon
409  
410  tentssolver :   [U] tents[STANDALONE_SOLVER] TENTS_EXTRA STANDALONE
411  tentssolver :   [C] tents[STANDALONE_SOLVER] TENTS_EXTRA STANDALONE
412 --- a/twiddle.R
413 +++ b/twiddle.R
414 @@ -5,6 +5,7 @@ twiddle  : [X] GTK COMMON twiddle twiddl
415  twiddle  : [G] WINDOWS COMMON twiddle twiddle.res|noicon.res
416  
417  ALL += twiddle[COMBINED]
418 +ALL_ICONS += twiddle-icon
419  
420  !begin gtk
421  GAMES += twiddle
422 --- a/unequal.R
423 +++ b/unequal.R
424 @@ -13,6 +13,7 @@ latincheck : [U] latin[STANDALONE_LATIN_
425  latincheck : [C] latin[STANDALONE_LATIN_TEST] tree234 maxflow STANDALONE
426  
427  ALL += unequal[COMBINED] UNEQUAL_EXTRA
428 +ALL_ICONS += unequal-icon
429  
430  !begin gtk
431  GAMES += unequal
432 --- a/untangle.R
433 +++ b/untangle.R
434 @@ -7,6 +7,7 @@ untangle : [X] GTK COMMON untangle UNTAN
435  untangle : [G] WINDOWS COMMON untangle UNTANGLE_EXTRA untangle.res|noicon.res
436  
437  ALL += untangle[COMBINED] UNTANGLE_EXTRA
438 +ALL_ICONS += untangle-icon
439  
440  !begin gtk
441  GAMES += untangle
442 --- a/keen.R
443 +++ b/keen.R
444 @@ -11,6 +11,7 @@ keensolver : [U] keen[STANDALONE_SOLVER]
445  keensolver : [C] keen[STANDALONE_SOLVER] latin[STANDALONE_SOLVER] KEEN_LATIN_EXTRA STANDALONE
446  
447  ALL += keen[COMBINED] KEEN_EXTRA
448 +ALL_ICONS += keen-icon
449  
450  !begin gtk
451  GAMES += keen
452 --- a/magnets.R
453 +++ b/magnets.R
454 @@ -10,6 +10,7 @@ magnetssolver :     [U] magnets[STANDALO
455  magnetssolver :     [C] magnets[STANDALONE_SOLVER] MAGNETS_EXTRA STANDALONE
456  
457  ALL += magnets[COMBINED] MAGNETS_EXTRA
458 +ALL_ICONS += magnets-icon
459  
460  !begin gtk
461  GAMES += magnets
462 --- a/singles.R
463 +++ b/singles.R
464 @@ -6,6 +6,7 @@ singles : [X] GTK COMMON singles SINGLES
465  singles : [G] WINDOWS COMMON singles SINGLES_EXTRA singles.res|noicon.res
466  
467  ALL += singles[COMBINED] SINGLES_EXTRA
468 +ALL_ICONS += singles-icon
469  
470  singlessolver : [U] singles[STANDALONE_SOLVER] SINGLES_EXTRA STANDALONE
471  singlessolver : [C] singles[STANDALONE_SOLVER] SINGLES_EXTRA STANDALONE
472 --- a/towers.R
473 +++ b/towers.R
474 @@ -11,6 +11,7 @@ towerssolver : [U] towers[STANDALONE_SOL
475  towerssolver : [C] towers[STANDALONE_SOLVER] latin[STANDALONE_SOLVER] TOWERS_LATIN_EXTRA STANDALONE
476  
477  ALL += towers[COMBINED] TOWERS_EXTRA
478 +ALL_ICONS += towers-icon
479  
480  !begin gtk
481  GAMES += towers
482 --- a/signpost.R
483 +++ b/signpost.R
484 @@ -9,6 +9,7 @@ signpostsolver : [U] signpost[STANDALONE
485  signpostsolver : [C] signpost[STANDALONE_SOLVER] SIGNPOST_EXTRA STANDALONE
486  
487  ALL += signpost[COMBINED] SIGNPOST_EXTRA
488 +ALL_ICONS += signpost-icon
489  
490  !begin gtk
491  GAMES += signpost
492 --- a/range.R
493 +++ b/range.R
494 @@ -5,6 +5,7 @@ range    : [X] GTK COMMON range range-ic
495  range    : [G] WINDOWS COMMON range range.res|noicon.res
496  
497  ALL += range[COMBINED]
498 +ALL_ICONS += range-icon
499  
500  !begin gtk
501  GAMES += range
502 --- a/pearl.R
503 +++ b/pearl.R
504 @@ -9,6 +9,7 @@ pearlbench     : [U] pearl[STANDALONE_SO
505  pearlbench     : [C] pearl[STANDALONE_SOLVER] PEARL_EXTRA STANDALONE
506  
507  ALL += pearl[COMBINED] PEARL_EXTRA
508 +ALL_ICONS += pearl-icon
509  
510  !begin gtk
511  GAMES += pearl
512 --- a/undead.R
513 +++ b/undead.R
514 @@ -4,6 +4,7 @@ undead : [X] GTK COMMON undead undead-ic
515  undead : [G] WINDOWS COMMON undead undead.res|noicon.res
516  
517  ALL += undead[COMBINED]
518 +ALL_ICONS += undead-icon
519  
520  !begin gtk
521  GAMES += undead
522 --- a/unruly.R
523 +++ b/unruly.R
524 @@ -7,6 +7,7 @@ unrulysolver : [U] unruly[STANDALONE_SOL
525  unrulysolver : [C] unruly[STANDALONE_SOLVER] STANDALONE
526  
527  ALL += unruly[COMBINED]
528 +ALL_ICONS += unruly-icon
529  
530  !begin gtk
531  GAMES += unruly