The following is a makefile I use with a windows app:

CFLAGS=		-u -W3 -AM -Gw2 -Os -Zped -FPa -NT _$*
OFILES=		dabout.obj dcommand.obj dfile.obj dinit.obj dmain.obj\
		drect.obj dsigwp.obj dslap.obj dstart.obj dstropen.obj\
		dterm.obj dwndmake.obj dwp.obj dlgopen.obj dlgutil.obj\
		dsig.obj dprint.obj dfind.obj
LIB=		d:\win\lib
LIBS=		$(LIB)\mutilw.lib $(LIB)\utility.lib $(LIB)\mlibw.lib
LFILES=		d.lnk d.res d.def
LFLAGS=		/map/li/align:16

d.exe: 		$(LFILES) $(OFILES) $(LIBS)
		link4 @d.lnk
		mapsym d
		rc d.res

d.res:		d.rc d.dlg d.ico

d.lnk:		makefile	# only regenerate if makefile changes
		make linkfile

# To remake the d.lnk file, first remove it, then add each OBJ file in
# succession (using the loop construct, !), then the rest of the files.
linkfile:	$(OFILES)	# "linkfile" never exists
		-erase d.lnk
		!>>d.lnk $?+
		>>d.lnk $(LFLAGS), d.exe, d.map, $(LIBS), d.def

===================
The following is the make.ini file I also use:

MAKE_TMP=	$(TMP)
AS	=	masm
CC	=	cl
LINK	=	link
OFILE	=
LFLAGS	=

# Other useful macros
BIN	=
ECHO	=	>stdout
LIB	=
LIBS	=
MODEL	=	S
#SETARGV=	$(LIB)\$(MODEL)SETARGV
SETARGV=

.SUFFIXES:	.sym .map .com .exe .lib .obj .c .asm .res .rc .def


.c.exe:
	$(CC) $(CFLAGS) $< $(OFILES) $(SETARGV) -link $(LFLAGS) $(LIBS)
	@ del $(<D)\$*.obj

.exe.com:
	exebin $< $(<D>\$*.com
	@ del $< 

.obj.exe:
	$(LINK) $< $(OFILES) $(LFLAGS) $(SETARGV), $(<D)\$*.exe, , $(LIBS) $(LFLAGS)

.asm.obj:
	$(AS) $<;

.c.obj:
	$(CC) -c $(CFLAGS) $<

.asm.com:
	masm $<;
	$(LINK) $(<D)\$* $(OFILES) $(LFLAGS), $(<D)\$*.exe, , $(LIBS);
	@ del $(<D)\$*.obj
	exe2bin $(<D)\$*.exe $(<D)\$*.com
	@ del $(<D)\$*.exe 

.rc.res:
	rc -r $<

.map.sym:
    mapsym $<

.def.lib:
	implib	$(<D)\$*.lib $<

# A universally useful target so "make clean" always works.
clean:
	-(erase *.bak; erase *.map; erase *.sym)


