1
0
mirror of https://git.tartarus.org/simon/putty.git synced 2025-03-22 14:39:24 -05:00

Add multi-makefile management system

[originally from svn r349]
This commit is contained in:
Simon Tatham 1999-12-13 17:21:42 +00:00
parent 9e6856ef8e
commit 5176e1e9bb
3 changed files with 274 additions and 60 deletions

156
Makefile
View File

@ -1,37 +1,67 @@
# Makefile for PuTTY. Use `FWHACK=/DFWHACK' to cause the firewall hack # Visual C++ Makefile for PuTTY.
# to be built in. (requires rebuild of ssh.obj only) #
# Use `nmake' to build.
#
# Can also build with `VER=/DSNAPSHOT=1999-01-25' or ##-- help
# `VER=/DRELEASE=0.43' to get version numbering; otherwise you'll #
# get `Unidentified build'. # Extra options you can set:
#
# COMPAT=/DWIN32S_COMPAT will produce a binary that works (minimally) # - FWHACK=/DFWHACK
# with Win32s # Enables a hack that tunnels through some firewall proxies.
#
# - VER=/DSNAPSHOT=1999-01-25
# Generates executables whose About box report them as being a
# development snapshot.
#
# - VER=/DRELEASE=0.43
# Generates executables whose About box report them as being a
# release version.
#
# - COMPAT=/DWIN32S_COMPAT
# Generates a binary that works (minimally) with Win32s.
#
##--
CFLAGS = /nologo /W3 /YX /O2 /Yd /D_WINDOWS /DDEBUG /ML /Fd CFLAGS = /nologo /W3 /YX /O2 /Yd /D_WINDOWS /DDEBUG /ML /Fd
.c.obj: .c.obj:
cl $(COMPAT) $(FWHACK) $(CFLAGS) /c $*.c cl $(COMPAT) $(FWHACK) $(CFLAGS) /c $*.c
POBJS1 = window.obj windlg.obj terminal.obj telnet.obj raw.obj OBJ=obj
POBJS2 = xlat.obj ldisc.obj RES=res
OBJS1 = misc.obj noise.obj
OBJS2 = ssh.obj sshcrc.obj sshdes.obj sshmd5.obj sshrsa.obj sshrand.obj ##-- objects putty
OBJS3 = sshsha.obj sshblowf.obj version.obj sizetip.obj POBJS1 = window.$(OBJ) windlg.$(OBJ) terminal.$(OBJ) telnet.$(OBJ) raw.$(OBJ)
RESRC = win_res.res POBJS2 = xlat.$(OBJ) ldisc.$(OBJ) sizetip.$(OBJ) ssh.$(OBJ)
##-- objects pscp
SOBJS = scp.$(OBJ) windlg.$(OBJ) scpssh.$(OBJ)
##-- objects putty pscp
OBJS1 = misc.$(OBJ) noise.$(OBJ)
OBJS2 = sshcrc.$(OBJ) sshdes.$(OBJ) sshmd5.$(OBJ) sshrsa.$(OBJ) sshrand.$(OBJ)
OBJS3 = sshsha.$(OBJ) sshblowf.$(OBJ) version.$(OBJ)
##-- resources putty
PRESRC = win_res.$(RES)
##-- resources pscp
SRESRC = scp.$(RES)
##--
##-- gui-apps
# putty
##-- console-apps
# pscp
##--
LIBS1 = advapi32.lib user32.lib gdi32.lib LIBS1 = advapi32.lib user32.lib gdi32.lib
LIBS2 = wsock32.lib comctl32.lib comdlg32.lib LIBS2 = wsock32.lib comctl32.lib comdlg32.lib
SCPOBJS = scp.obj windlg.obj misc.obj noise.obj
SCPOBJS2 = scpssh.obj sshcrc.obj sshdes.obj sshmd5.obj
SCPOBJS3 = sshrsa.obj sshrand.obj sshsha.obj sshblowf.obj version.obj
all: putty.exe pscp.exe all: putty.exe pscp.exe
putty.exe: $(POBJS1) $(POBJS2) $(OBJS1) $(OBJS2) $(OBJS3) $(RESRC) link.rsp putty.exe: $(POBJS1) $(POBJS2) $(OBJS1) $(OBJS2) $(OBJS3) $(PRESRC) link.rsp
link /debug -out:putty.exe @link.rsp link /debug -out:putty.exe @link.rsp
puttyd.exe: $(POBJS1) $(POBJS2) $(OBJS1) $(OBJS2) $(OBJS3) $(RESRC) link.rsp pscp.exe: $(SOBJS) $(OBJS1) $(OBJS2) $(OBJS3) $(SRESRC) scp.rsp
link /debug -out:puttyd.exe @link.rsp link /debug -out:pscp.exe @scp.rsp
link.rsp: makefile link.rsp: makefile
echo /nologo /subsystem:windows > link.rsp echo /nologo /subsystem:windows > link.rsp
@ -40,55 +70,61 @@ link.rsp: makefile
echo $(OBJS1) >> link.rsp echo $(OBJS1) >> link.rsp
echo $(OBJS2) >> link.rsp echo $(OBJS2) >> link.rsp
echo $(OBJS3) >> link.rsp echo $(OBJS3) >> link.rsp
echo $(RESRC) >> link.rsp echo $(PRESRC) >> link.rsp
echo $(LIBS1) >> link.rsp echo $(LIBS1) >> link.rsp
echo $(LIBS2) >> link.rsp echo $(LIBS2) >> link.rsp
window.obj: window.c putty.h win_res.h
windlg.obj: windlg.c putty.h ssh.h win_res.h
terminal.obj: terminal.c putty.h
sizetip.obj: sizetip.c putty.h
telnet.obj: telnet.c putty.h
raw.obj: raw.c putty.h
xlat.obj: xlat.c putty.h
ldisc.obj: ldisc.c putty.h
misc.obj: misc.c putty.h
noise.obj: noise.c putty.h ssh.h
ssh.obj: ssh.c ssh.h putty.h
sshcrc.obj: sshcrc.c ssh.h
sshdes.obj: sshdes.c ssh.h
sshmd5.obj: sshmd5.c ssh.h
sshrsa.obj: sshrsa.c ssh.h
sshsha.obj: sshsha.c ssh.h
sshrand.obj: sshrand.c ssh.h
sshblowf.obj: sshblowf.c ssh.h
version.obj: versionpseudotarget
@echo (built version.obj)
# Hack to force version.obj to be rebuilt always
versionpseudotarget:
cl $(FWHACK) $(VER) $(CFLAGS) /c version.c
win_res.res: win_res.rc win_res.h putty.ico
rc $(FWHACK) -r -DWIN32 -D_WIN32 -DWINVER=0x0400 win_res.rc
pscp.exe: $(SCPOBJS) $(SCPOBJS2) $(SCPOBJS3) scp.res scp.rsp
link /debug -out:pscp.exe @scp.rsp
scp.rsp: makefile scp.rsp: makefile
echo /nologo /subsystem:console > scp.rsp echo /nologo /subsystem:console > scp.rsp
echo $(SCPOBJS) >> scp.rsp echo $(SOBJS) >> scp.rsp
echo $(SCPOBJS2) >> scp.rsp echo $(OBJS1) >> scp.rsp
echo $(SCPOBJS3) >> scp.rsp echo $(OBJS2) >> scp.rsp
echo scp.res >> scp.rsp echo $(OBJS3) >> scp.rsp
echo $(SRESRC) >> scp.rsp
echo $(LIBS1) >> scp.rsp echo $(LIBS1) >> scp.rsp
echo $(LIBS2) >> scp.rsp echo $(LIBS2) >> scp.rsp
scp.obj: scp.c putty.h scp.h ##-- dependencies
scpssh.obj: scpssh.c putty.h ssh.h scp.h window.$(OBJ): window.c putty.h win_res.h
windlg.$(OBJ): windlg.c putty.h ssh.h win_res.h
terminal.$(OBJ): terminal.c putty.h
sizetip.$(OBJ): sizetip.c putty.h
telnet.$(OBJ): telnet.c putty.h
raw.$(OBJ): raw.c putty.h
xlat.$(OBJ): xlat.c putty.h
ldisc.$(OBJ): ldisc.c putty.h
misc.$(OBJ): misc.c putty.h
noise.$(OBJ): noise.c putty.h ssh.h
ssh.$(OBJ): ssh.c ssh.h putty.h
sshcrc.$(OBJ): sshcrc.c ssh.h
sshdes.$(OBJ): sshdes.c ssh.h
sshmd5.$(OBJ): sshmd5.c ssh.h
sshrsa.$(OBJ): sshrsa.c ssh.h
sshsha.$(OBJ): sshsha.c ssh.h
sshrand.$(OBJ): sshrand.c ssh.h
sshblowf.$(OBJ): sshblowf.c ssh.h
scp.$(OBJ): scp.c putty.h scp.h
scpssh.$(OBJ): scpssh.c putty.h ssh.h scp.h
version.$(OBJ): version.c
##--
scp.res: scp.rc scp.ico # Hack to force version.obj to be rebuilt always
rc -r -DWIN32 -D_WIN32 -DWINVER=0x0400 scp.rc version.obj: versionpseudotarget
@echo (built version.obj)
versionpseudotarget:
cl $(FWHACK) $(VER) $(CFLAGS) /c version.c
##-- dependencies
win_res.$(RES): win_res.rc win_res.h putty.ico
##--
win_res.$(RES):
rc $(FWHACK) -r -DWIN32 -D_WIN32 -DWINVER=0x0400 win_res.rc
##-- dependencies
scp.$(RES): scp.rc scp.ico
##--
scp.$(RES):
rc $(FWHACK) -r -DWIN32 -D_WIN32 -DWINVER=0x0400 scp.rc
clean: clean:
del *.obj del *.obj

6
README
View File

@ -19,6 +19,12 @@ problem while compiling PuTTY under VS6, you should:
Alternatively disable the /ZI option, replacing it with a saner Alternatively disable the /ZI option, replacing it with a saner
value, such as /Zi. value, such as /Zi.
For other compilers, some alternative Makefiles are provided. These
Makefiles are generated automatically from the master `Makefile' by
the Perl script `mkfiles.pl'. Additions and corrections to the
script are more useful than additions and corrections to the
alternative Makefiles themselves.
The PuTTY home web site is The PuTTY home web site is
http://www.chiark.greenend.org.uk/~sgtatham/putty.html http://www.chiark.greenend.org.uk/~sgtatham/putty.html

172
mkfiles.pl Executable file
View File

@ -0,0 +1,172 @@
#!/usr/bin/env perl
#
# Makefile generator.
# Produces the other PuTTY makefiles from the master one.
open IN,"Makefile";
@current = ();
while (<IN>) {
chomp;
if (/^##--/) {
@words = split /\s+/,$_;
shift @words; # remove ##--
$i = shift @words; # first word
if (!defined $i) { # no words
@current = ();
} elsif (!defined $words[0]) { # only one word
@current = ($i);
} else { # at least two words
@current = map { $i . "." . $_ } @words;
foreach $i (@words) { $projects{$i} = $i; }
push @current, "objdefs";
}
} else {
foreach $i (@current) { $store{$i} .= $_ . "\n"; }
}
}
close IN;
@projects = keys %projects;
foreach $i (split '\n',$store{'gui-apps'}) {
$i =~ s/^# //;
$gui{$i} = 1;
}
foreach $i (split '\n',$store{'console-apps'}) {
$i =~ s/^# //;
$gui{$i} = -0;
}
sub project {
my ($p) = @_;
my ($q) = $store{"$p"} . $store{"objects.$p"} . $store{"resources.$p"};
$q =~ s/(\S+)\s[^\n]*\n/\$($1) /gs;
$q =~ s/ $//;
$q;
}
sub projlist {
my ($p) = @_;
my ($q) = $store{"$p"} . $store{"objects.$p"} . $store{"resources.$p"};
$q =~ s/(\S+)\s[^\n]*\n/$1 /gs;
my (@q) = split ' ',$q;
@q;
}
##-- CygWin makefile
open OUT, ">Makefile.cyg"; select OUT;
print
"# Makefile for PuTTY under cygwin.\n";
# gcc command line option is -D not /D
($_ = $store{"help"}) =~ s/=\/D/=-D/gs;
print $_;
print
"\n".
"# You can define this path to point at your tools if you need to\n".
"# TOOLPATH = c:\\cygwin\\bin\\ # or similar, if you're running Windows\n".
"# TOOLPATH = /pkg/mingw32msvc/i386-mingw32msvc/bin/\n".
"CC = \$(TOOLPATH)gcc\n".
"RC = \$(TOOLPATH)windres\n".
"# You may also need to tell windres where to find include files:\n".
"# RCINC = --include-dir c:\\cygwin\\include\\\n".
"\n".
"CFLAGS = -g -O2 -D_WINDOWS -DDEBUG\n".
"RCFLAGS = \$(RCINC) --define WIN32=1 --define _WIN32=1 --define WINVER=0x0400\n".
"LIBS = -ladvapi32 -luser32 -lgdi32 -lwsock32 -lcomctl32 -lcomdlg32\n".
"OBJ=o\n".
"RES=res\n".
"\n";
print $store{"objdefs"};
print
"\n".
".SUFFIXES:\n".
"\n".
"%.o %.obj: %.c\n".
"\t\$(CC) \$(FWHACK) \$(CFLAGS) -c \$<\n".
"\n".
"%.res: %.rc\n".
"\t\$(RC) \$(FWHACK) \$(RCFLAGS) \$<\n".
"\n";
foreach $p (@projects) {
print $p, ".exe: ", &project($p), "\n";
print "\t\$(CC) \$(LDFLAGS) -o \$@ " . &project($p), " \$(LIBS)\n\n";
}
print $store{"dependencies"};
print
"\n".
"version.o: FORCE\n".
"# Hack to force version.o to be rebuilt always\n".
"FORCE:\n".
"\t\$(CC) \$(FWHACK) \$(CFLAGS) \$(VER) -c \$<\n\n".
"clean:\n".
"\trm -f *.o *.exe *.res\n".
"\n";
select STDOUT; close OUT;
##-- Borland makefile
open OUT, ">Makefile.bor"; select OUT;
print
"# Makefile for PuTTY under Borland C.\n";
# bcc32 command line option is -D not /D
($_ = $store{"help"}) =~ s/=\/D/=-D/gs;
print $_;
print
"\n".
"# If you rename this file to `Makefile', you should change this line,\n".
"# so that the .rsp files still depend on the correct makefile.\n".
"MAKEFILE = Makefile.bor\n".
"\n".
"# Stop windows.h including winsock2.h which would conflict with winsock 1\n".
"CFLAGS = -DWIN32_LEAN_AND_MEAN\n".
"\n".
"# Get include directory for resource compiler\n".
"!if !\$d(BCB)\n".
"BCB = \$(MAKEDIR)\\..\n".
"!endif\n".
"\n".
".c.obj:\n".
"\tbcc32 \$(COMPAT) \$(FWHACK) \$(CFLAGS) /c \$*.c\n".
".rc.res:\n".
"\tbrc32 \$(FWHACK) -i \$(BCB)\\include \\\n".
"\t\t-r -DWIN32 -D_WIN32 -DWINVER=0x0400 \$*.rc\n".
"\n".
"OBJ=obj\n".
"RES=res\n".
"\n";
print $store{"objdefs"};
print "\n";
print "all:";
print map { " $_.exe" } @projects;
print "\n\n";
foreach $p (@projects) {
print $p, ".exe: ", &project($p), " $p.rsp\n";
$tw = $gui{$p} ? " -tW" : "";
print "\tbcc32$tw -e$p.exe \@$p.rsp\n";
print "\tbrc32 -fe$p.exe " . (join " ", &project("resources.$p")) . "\n\n";
}
foreach $p (@projects) {
print $p, ".rsp: \$(MAKEFILE)\n";
$arrow = ">";
foreach $i (&projlist("objects.$p")) {
print "\techo \$($i) $arrow $p.rsp\n";
$arrow = ">>";
}
print "\n";
}
print $store{"dependencies"};
print
"\n".
"version.o: FORCE\n".
"# Hack to force version.o to be rebuilt always\n".
"FORCE:\n".
"\tbcc32 \$(FWHACK) \$(VER) \$(CFLAGS) /c version.c\n\n".
"clean:\n".
"\tdel *.obj\n".
"\tdel *.exe\n".
"\tdel *.res\n".
"\tdel *.pch\n".
"\tdel *.aps\n".
"\tdel *.ilk\n".
"\tdel *.pdb\n".
"\tdel *.rsp\n";
select STDOUT; close OUT;