#
# Makefile for SVGA textmode manipulation program
#
# Authors : Koen Gadeyne (kmg@barco.be)
#           Linux/Alpha port: David Mosberger-Tang <davidm@cs.arizona.edu>
#           DOS port of grabmode: Kenneth Albanowski <kjahds@kjahds.com>
#

ARCH=$(shell arch)
CFLAGS_alpha = 
CFLAGS_i386  = -s -N -pipe
CFLAGS_i486  = $(CFLAGS_i386) -m486
CFLAGS_i586  = $(CFLAGS_i386)

CDEBUGFLAGS = 

CFLAGS = -Wall -O2 $(CDEBUGFLAGS) $(CFLAGS_$(ARCH))

export CFLAGS

# installation path for SVGATextMode
INSTBINDIR = /usr/sbin

# installation path for TextConfig. This is also the path that will be
# compiled into SVGATextMode.
INSTCONFDIR = /etc

# installation path for the manual files
INSTMANDIR = /usr/man

# misc configuration flags.
#
# possible flags are:
#
#     -DRUN_SECURE         Renounce superuser rights immediately after
#                          getting permission for VGA registers, so the
#                          external programs are NOT run as root.
#                          This is only useful if you set the SUID bits on.
#
CONF_FLAGS = 

############END##OF##USER##CONFIGURATION#################################

VERSION = 0.9

# A getopt module is required to compile grabmode under DOS
GETOPT=e:\bc31\examples\getopt.c



UNIXVERSION = -DVERSION=\"$(VERSION)\"
DOSVERSION = -DVERSION="$(VERSION)"

CONFIGFILE = -DCONFIGFILE=\"$(INSTCONFDIR)/TextConfig\"
XFREELIBS = XFREE/libxf86_hw.a
XFREELINK = -LXFREE -lxf86_hw
XFREEINC = -IXFREE/include

USERPROGS = SVGATextMode clockprobe grabmode set80 ClockProg
HACKPROGS = setVGAreg getVGAreg setpalette getpalette
DOSPROGS = grabmode.exe


default: user

all: user hack

$(XFREELIBS)::
	( cd XFREE ; $(MAKE) all ; cd .. )


user: $(USERPROGS)

hack: $(HACKPROGS)

dos: $(DOSPROGS)


STM_OBJECTS = ttyresize.o messages.o vga_prg.o setclock.o configfile.o SVGATextMode.o \
              parse_clock.o parse_modeline.o parse_opt.o validate.o


OBJECTS = $(STM_OBJECTS) probe.o setVGAreg.o setpalette.o clockprobe.o grabmode.o set80.o \
          modedata.o ClockProg.o


$(OBJECTS): %.o: %.c
	$(CC) -c $(CFLAGS) $(CONF_FLAGS) $(CONFIGFILE) $(XFREEINC) $(UNIXVERSION) $< -o $@
	


SVGATextMode: $(STM_OBJECTS) $(XFREELIBS)
	$(CC) $(CFLAGS) $(STM_OBJECTS) $(XFREELINK) -o SVGATextMode
	
ClockProg: ClockProg.o vga_prg.o messages.o setclock.o parse_opt.o parse_clock.o validate.o configfile.o parse_modeline.o $(XFREELIBS)
	$(CC) $(CFLAGS) ClockProg.o vga_prg.o messages.o setclock.o parse_opt.o parse_clock.o validate.o configfile.o parse_modeline.o $(XFREELINK) -o ClockProg
	
set80: set80.o vga_prg.o setclock.o messages.o ttyresize.o
	$(CC) $(CFLAGS) set80.o vga_prg.o messages.o ttyresize.o -o set80
	
setVGAreg: setVGAreg.o vga_prg.o configfile.o messages.o
	$(CC) $(CFLAGS) setVGAreg.o vga_prg.o configfile.o messages.o -o setVGAreg
	
getVGAreg: setVGAreg
	ln -sf setVGAreg getVGAreg	
	
setpalette: setpalette.o vga_prg.o configfile.o messages.o 
	$(CC) $(CFLAGS) setpalette.o vga_prg.o configfile.o messages.o -o setpalette
	
getpalette: setpalette
	ln -sf setpalette getpalette	
	
clockprobe: clockprobe.o probe.o vga_prg.o messages.o 
	$(CC) $(CFLAGS) clockprobe.o probe.o vga_prg.o messages.o -o clockprobe

grabmode: grabmode.o modedata.o probe.o vga_prg.o messages.o
	$(CC) $(CFLAGS) grabmode.o modedata.o probe.o vga_prg.o messages.o -o grabmode

#
# DOS targets
#

grabmode.exe: grabmode.c probe.c vga_prg.c messages.c
	bcc -DDOS -w-pro $(DOSVERSION) grabmode.c probe.c vga_prg.c messages.c $(GETOPT)

#
# install/clean targets
#

bininstall: $(USERPROGS)
	install -s -m 755 SVGATextMode $(INSTBINDIR)/SVGATextMode
	
maninstall:
	install -m 644 doc/SVGATextMode.man $(INSTMANDIR)/man8/SVGATextMode.8
	install -m 644 doc/TextConfig.man $(INSTMANDIR)/man5/TextConfig.5
	
install: bininstall
	@echo "NOTE:"
	@echo "You must also have an '$(INSTCONFDIR)/TextConfig' file."
	@echo "There's an example of such a file in the main SVGATextMode directory."
	@echo "(or type 'make newinstall' to install the TextConfig file together with the rest)"

newinstall: bininstall	
	install -m 644 TextConfig $(INSTCONFDIR)/TextConfig



clean:
	rm -f *~ $(OBJECTS) *.bak *.orig *.rej
	( cd XFREE ; $(MAKE) clean )

pristine: mrproper

distclean: clean
	rm -f $(HACKPROGS) DEADJOE 
	rm -f `find . -name "*~"`

mrproper: distclean
	rm -f $(USERPROGS) 
	( cd XFREE ; $(MAKE) mrproper )

depend:
	@gcc -MM *.c
	
#
# dependencies (gcc -MM *.c)
#
ClockProg.o: ClockProg.c misc.h vga_prg.h setclock.h XFREE/xfree_compat.h \
  XFREE/common_hw/xf86_HWlib.h confdefs.h messages.h
SVGATextMode.o: SVGATextMode.c misc.h ttyresize.h vga_prg.h confdefs.h \
  setclock.h parse_clock.h parse_modeline.h configfile.h messages.h
clockprobe.o: clockprobe.c misc.h vga_prg.h confdefs.h messages.h probe.h
configfile.o: configfile.c misc.h configfile.h confdefs.h messages.h
grabmode.o: grabmode.c misc.h messages.h modedata.h
messages.o: messages.c misc.h messages.h
modedata.o: modedata.c misc.h vga_prg.h confdefs.h messages.h probe.h modedata.h
parse_clock.o: parse_clock.c misc.h confdefs.h setclock.h configfile.h \
  messages.h parse_clock.h
parse_modeline.o: parse_modeline.c misc.h configfile.h confdefs.h \
  parse_modeline.h messages.h
probe.o: probe.c misc.h vga_prg.h configfile.h confdefs.h messages.h
set80.o: set80.c misc.h ttyresize.h vga_prg.h confdefs.h setclock.h messages.h \
  textregs.h
setVGAreg.o: setVGAreg.c misc.h vga_prg.h configfile.h confdefs.h messages.h
setclock.o: setclock.c misc.h vga_prg.h confdefs.h setclock.h messages.h \
  XFREE/xfree_compat.h XFREE/common_hw/xf86_HWlib.h
setpalette.o: setpalette.c misc.h vga_prg.h messages.h configfile.h confdefs.h
ttyresize.o: ttyresize.c misc.h messages.h ttyresize.h
validate.o: validate.c misc.h confdefs.h parse_clock.h setclock.h \
  parse_modeline.h configfile.h messages.h
vga_prg.o: vga_prg.c misc.h vga_prg.h confdefs.h messages.h
