!makefile cygwin Makefile.cyg
!makefile osx Makefile.osx
+!srcdir icons/
+
WINDOWS = windows printing
+ user32.lib gdi32.lib comctl32.lib comdlg32.lib winspool.lib
COMMON = midend drawing misc malloc random version
blackbox : [X] GTK COMMON blackbox
-blackbox : [G] WINDOWS COMMON blackbox
+blackbox : [G] WINDOWS COMMON blackbox blackbox.res?
ALL += blackbox
bridges : [X] GTK COMMON BRIDGES
-bridges : [G] WINDOWS COMMON BRIDGES
+bridges : [G] WINDOWS COMMON BRIDGES bridges.res?
ALL += BRIDGES
cube : [X] GTK COMMON cube
-cube : [G] WINDOWS COMMON cube
+cube : [G] WINDOWS COMMON cube cube.res?
ALL += cube
dominosa : [X] GTK COMMON dominosa
-dominosa : [G] WINDOWS COMMON dominosa
+dominosa : [G] WINDOWS COMMON dominosa dominosa.res?
ALL += dominosa
fifteen : [X] GTK COMMON fifteen
-fifteen : [G] WINDOWS COMMON fifteen
+fifteen : [G] WINDOWS COMMON fifteen fifteen.res?
ALL += fifteen
flip : [X] GTK COMMON FLIP
-flip : [G] WINDOWS COMMON FLIP
+flip : [G] WINDOWS COMMON FLIP flip.res?
ALL += FLIP
guess : [X] GTK COMMON guess
-guess : [G] WINDOWS COMMON guess
+guess : [G] WINDOWS COMMON guess guess.res?
ALL += guess
P16D8 = $(patsubst %,%-16d8.png,$(PUZZLES))
P16D4 = $(patsubst %,%-16d4.png,$(PUZZLES))
ICONS = $(patsubst %,%.ico,$(PUZZLES))
+RC = $(patsubst %,%.rc,$(PUZZLES))
BIN = ../
PIC = ./
base: $(BASE)
web: $(WEB)
pngicons: $(P48D24) $(P32D24) $(P16D24)
-icons: $(ICONS)
+winicons: $(ICONS) $(RC)
# Build the base puzzle screenshots from which all the other images
# are derived. Some of them involve showing a move animation
convert -colors 16 -map $(PIC)win16pal.xpm tmp2.png $@
rm -f tmp.png tmp2.png
-# And build the actual icons themselves, by feeding all those PNGs
-# to my icon builder script.
+# Build the actual Windows icons themselves, by feeding all those
+# PNGs to my icon builder script.
$(ICONS): %.ico: %-48d24.png %-48d8.png %-48d4.png \
%-32d24.png %-32d8.png %-32d4.png \
%-16d24.png %-16d8.png %-16d4.png
$(PIC)icon.pl $? > $@
+# Build the .RC files which bind the icons into the applications.
+$(RC): %.rc:
+ echo '200 ICON "$*.ico"' > $@
+
clean:
- rm -f *.png *.ico
+ rm -f *.png *.ico *.rc
inertia : [X] GTK COMMON inertia
-inertia : [G] WINDOWS COMMON inertia
+inertia : [G] WINDOWS COMMON inertia inertia.res?
ALL += inertia
lightup : [X] GTK COMMON LIGHTUP
-lightup : [G] WINDOWS COMMON LIGHTUP
+lightup : [G] WINDOWS COMMON LIGHTUP lightup.res?
lightupsolver : [U] lightup[STANDALONE_SOLVER] combi STANDALONE
lightupsolver : [C] lightup[STANDALONE_SOLVER] combi STANDALONE
loopy : [X] GTK COMMON LOOPY
-loopy : [G] WINDOWS COMMON LOOPY
+loopy : [G] WINDOWS COMMON LOOPY loopy.res?
ALL += LOOPY
map : [X] GTK COMMON MAP
-map : [G] WINDOWS COMMON MAP
+map : [G] WINDOWS COMMON MAP map.res?
mapsolver : [U] map[STANDALONE_SOLVER] dsf STANDALONE m.lib
mapsolver : [C] map[STANDALONE_SOLVER] dsf STANDALONE
mines : [X] GTK COMMON MINES
-mines : [G] WINDOWS COMMON MINES
+mines : [G] WINDOWS COMMON MINES mines.res?
mineobfusc : [U] mines[STANDALONE_OBFUSCATOR] tree234 STANDALONE
mineobfusc : [C] mines[STANDALONE_OBFUSCATOR] tree234 STANDALONE
$i eq "[X]" or $i eq "[U]" or $i eq "[MX]") and defined $prog) {
$type = substr($i,1,(length $i)-2);
} else {
- push @$listref, $i;
- push @allobjs, $i;
+ if ($i =~ /\?$/) {
+ # Source files with a trailing question mark are optional:
+ # the build can proceed fine without them, so we only use
+ # them if they're present.
+ $i =~ s/\?$//;
+ $i = undef unless defined &finddep($i);
+ }
+ if (defined $i) {
+ push @$listref, $i;
+ push @allobjs, $i;
+ }
}
}
if ($prog and $type) {
$programs{$i} = [@list];
foreach $jj (@list) {
$j = $srcname{$jj};
- # Dependencies for "x" start with "x.c" or "x.m" (depending on
- # which one exists).
- # Dependencies for "x.res" start with "x.rc".
- # Dependencies for "x.rsrc" start with "x.r".
- # Both types of file are pushed on the list of files to scan.
- # Libraries (.lib) don't have dependencies at all.
- if ($j =~ /^(.*)\.res$/) {
- $file = "$1.rc";
- $depends{$jj} = [$file];
- push @scanlist, $file;
- } elsif ($j =~ /^(.*)\.rsrc$/) {
- $file = "$1.r";
- $depends{$jj} = [$file];
- push @scanlist, $file;
- } elsif ($j !~ /\./) {
- $file = "$j.c";
- $file = "$j.m" unless &findfile($file);
+ $file = &finddep($j);
+ if (defined $file) {
$depends{$jj} = [$file];
push @scanlist, $file;
}
return $findfilecache{$name};
}
+sub finddep {
+ my $j = shift @_;
+ my $file;
+ # Find the first dependency of an object.
+
+ # Dependencies for "x" start with "x.c" or "x.m" (depending on
+ # which one exists).
+ # Dependencies for "x.res" start with "x.rc".
+ # Dependencies for "x.rsrc" start with "x.r".
+ # Both types of file are pushed on the list of files to scan.
+ # Libraries (.lib) don't have dependencies at all.
+ if ($j =~ /^(.*)\.res$/) {
+ $file = "$1.rc";
+ } elsif ($j =~ /^(.*)\.rsrc$/) {
+ $file = "$1.r";
+ } elsif ($j !~ /\./) {
+ $file = "$j.c";
+ $file = "$j.m" unless &findfile($file);
+ } else {
+ # For everything else, we assume it's its own dependency.
+ $file = $j;
+ }
+ $file = undef unless &findfile($file);
+ return $file;
+}
+
sub objects {
my ($prog, $otmpl, $rtmpl, $ltmpl, $prefix, $dirsep) = @_;
my @ret;
"\n";
if ($d->{obj} =~ /\.res$/) {
print "\trc \$(FWHACK) \$(RCFL) -r -DWIN32 -D_WIN32 ".
- "-DWINVER=0x0400 ".$d->{deps}->[0]."\n";
+ "-DWINVER=0x0400 -fo".$d->{obj}." ".$d->{deps}->[0]."\n";
} else {
$deflist = join "", map { " /D$_" } @{$d->{defs}};
print "\tcl \$(COMPAT) \$(FWHACK) \$(CFLAGS) \$(XFLAGS)$deflist".
# 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
+netgame : [G] WINDOWS COMMON NET net.res?
ALL += NET
netslide : [X] GTK COMMON NETSLIDE
-netslide : [G] WINDOWS COMMON NETSLIDE
+netslide : [G] WINDOWS COMMON NETSLIDE netslide.res?
ALL += NETSLIDE
pattern : [X] GTK COMMON pattern
-pattern : [G] WINDOWS COMMON pattern
+pattern : [G] WINDOWS COMMON pattern pattern.res?
patternsolver : [U] pattern[STANDALONE_SOLVER] STANDALONE
patternsolver : [C] pattern[STANDALONE_SOLVER] STANDALONE
pegs : [X] GTK COMMON PEGS
-pegs : [G] WINDOWS COMMON PEGS
+pegs : [G] WINDOWS COMMON PEGS pegs.res?
ALL += PEGS
rect : [X] GTK COMMON rect
-rect : [G] WINDOWS COMMON rect
+rect : [G] WINDOWS COMMON rect rect.res?
ALL += rect
samegame : [X] GTK COMMON samegame
-samegame : [G] WINDOWS COMMON samegame
+samegame : [G] WINDOWS COMMON samegame samegame.res?
ALL += samegame
sixteen : [X] GTK COMMON sixteen
-sixteen : [G] WINDOWS COMMON sixteen
+sixteen : [G] WINDOWS COMMON sixteen sixteen.res?
ALL += sixteen
slant : [X] GTK COMMON SLANT
-slant : [G] WINDOWS COMMON SLANT
+slant : [G] WINDOWS COMMON SLANT slant.res?
slantsolver : [U] slant[STANDALONE_SOLVER] dsf STANDALONE
slantsolver : [C] slant[STANDALONE_SOLVER] dsf STANDALONE
solo : [X] GTK COMMON solo
-solo : [G] WINDOWS COMMON solo
+solo : [G] WINDOWS COMMON solo solo.res?
solosolver : [U] solo[STANDALONE_SOLVER] STANDALONE
solosolver : [C] solo[STANDALONE_SOLVER] STANDALONE
tents : [X] GTK COMMON TENTS
-tents : [G] WINDOWS COMMON TENTS
+tents : [G] WINDOWS COMMON TENTS tents.res?
ALL += TENTS
twiddle : [X] GTK COMMON twiddle
-twiddle : [G] WINDOWS COMMON twiddle
+twiddle : [G] WINDOWS COMMON twiddle twiddle.res?
ALL += twiddle
untangle : [X] GTK COMMON UNTANGLE
-untangle : [G] WINDOWS COMMON UNTANGLE
+untangle : [G] WINDOWS COMMON UNTANGLE untangle.res?
ALL += UNTANGLE
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = inst;
- wndclass.hIcon = LoadIcon(inst, IDI_APPLICATION);
+ wndclass.hIcon = LoadIcon(inst, MAKEINTRESOURCE(200));
+ if (!wndclass.hIcon) /* in case resource file is absent */
+ wndclass.hIcon = LoadIcon(inst, IDI_APPLICATION);
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
wndclass.hbrBackground = NULL;
wndclass.lpszMenuName = NULL;