# Makefile for procps.  Chuck Blake.
# Portions of this are highly dependent upon features specific to GNU make

PREFIX     =  #proc# prefix for program names
MAN1DIR    =  /usr/man/man1
MAN8DIR    =  /usr/man/man8
BINDIR     =  /bin
SBINDIR    =  /sbin
USRBINDIR  =  /usr/bin
INSTALLBIN =  install --owner bin --group 0 --mode a=rx --strip
INSTALLMAN =  install --owner 0 --group 0 --mode a=r

BPROG      =  ps #						-> BINDIR
UPROG      =  uptime tload free w top vmstat sessreg watch # -> USRBINDIR
SPROG      =  psupdate #					-> SBINDIR
MAN1       =  ps.1 uptime.1 tload.1 free.1 w.1 top.1 sessreg.1 watch.1
MAN8       =  psupdate.8 vmstat.8

SUBDIRS    =  skill xproc xcpustate # sub-packages to build/install

# easy to command-line override
INCDIRS    =  -I/usr/include/ncurses -I/usr/X11R6/include
CC         =  gcc -O3 $(INCDIRS) -D_GNU_SOURCE#-ggdb
CFLAGS     =  -I. -Wall -Wno-unused
SHARED     =  1# build/install both a static and ELF shared library
SHLIBDIR   =  /lib# where to install the shared library

LDFLAGS    =  -Wl,-warn-common #-s	recommended for ELF systems
#LDFLAGS    =  -qmagic -s#		recommended for a.out systems
#LDFLAGS    =  -Xlinker -qmagic -s#	older a.out systems may need this
#LDFLAGS    =  -N -s#			still older a.out systems use this

BFD_CAPABLE = -DBFD_CAPABLE
AOUT_CAPABLE = #-DAOUT_CAPABLE 
ELF_CAPABLE = #-DELF_CAPABLE

LIBBFD = -lbfd -liberty
LIBCURSES  =  -lncurses# watch is the only thing that needs this
#LIBCURSES  =  -lcurses -ltermcap# BSD Curses requires termcap
LIBTERMCAP =  -ltermcap
EXTRALIBS  =  # -lshadow

#W_SHOWFROM =  -DW_SHOWFROM# show remote host users are logged in from.

#----------------------------------------------------#
# End of user-configurable portion of the Makefile.  #
# You should not need to modify anything below this. #
#----------------------------------------------------#
BUILD = $(BPROG) $(UPROG) $(SPROG) $(SUBDIRS)

# BUILD LIBRARIES + PROGRAMS
all: config $(BUILD)

config:
	for dir in $(SUBDIRS); do \
	  [ -f $$dir/Imakefile ] && (cd $$dir; xmkmf) ; done

# INSTALL PROGRAMS + DOCS
install: $(patsubst %,install_%,$(BUILD) $(MAN1) $(MAN8))
ifeq ($(SHARED),1)
	install --owner 0 --group 0 --mode a=rx $(LIB_TGT) $(SHLIBDIR)
endif

# INSTALL LIBRARIES + HEADERS (OPTIONAL)
libinstall:
	$(MAKE) -C proc install $(LIBPROCPASS)

clean:
	$(RM) -f $(OBJ) $(BPROG) $(UPROG) $(SPROG)
	for i in proc $(SUBDIRS); do $(MAKE) -C $$i clean; done

distclean: clean
	for i in proc $(SUBDIRS); do $(MAKE) -C $$i clean; done
	$(RM) -f $(OBJ) $(BPROG) $(UPROG) $(SPROG) xproc/Makefile* xcpustate/Makefile* \
	      proc/signames.h proc/.depend


#-----------------------------------------------------#
# End of user-callable make targets.                  #
# You should not need to read anything below this.    #
#-----------------------------------------------------#

.PHONY:	all config install libinstall clean distclean
.PHONY: $(patsubst %,install_%, $(BPROG) $(UPROG) $(SPROG))
.PHONY: proc skill xproc xcpustate
.PHONY: $(patsubst %,build_%, proc skill xproc xcpustate)
.PHONY: $(patsubst %,install_%, proc skill xproc xcpustate)

VERSION      =  1
SUBVERSION   =  2
MINORVERSION =  2
ifdef MINORVERSION
LIBPROCPASS  =  SHARED=$(SHARED) SHLIBDIR=$(SHLIBDIR) VERSION=$(VERSION) SUBVERSION=$(SUBVERSION) MINORVERSION=$(MINORVERSION)
else
LIBPROCPASS  =  SHARED=$(SHARED) SHLIBDIR=$(SHLIBDIR) VERSION=$(VERSION) SUBVERSION=$(SUBVERSION)
endif

# libproc setup

ifeq ($(SHARED),1)
    LIB_TGT = proc/libproc.so.$(VERSION).$(SUBVERSION)
else
    LIB_TGT = proc/libproc.a
endif

$(LIB_TGT): $(wildcard proc/*.[ch])
	$(MAKE) -C proc `basename $(LIB_TGT)` $(LIBPROCPASS)

# component package setup -- the pattern should be obvious: A build rule and
# unified executable+documentation install rule. (An extra makefile rule is
# needed for those packages which use Imake.)

skill:              build_skill
build_skill:				; $(MAKE) -C skill
install_skill:      skill		; $(MAKE) -C skill install

xproc:              build_xproc
build_xproc:        xproc/Makefile	; $(MAKE) -C xproc
install_xproc:      xproc		; $(MAKE) -C xproc install
xproc/Makefile:     xproc/Imakefile	; cd xproc; xmkmf -a

xcpustate:          build_xcpustate
build_xcpustate:    xcpustate/Makefile	; $(MAKE) -C xcpustate
install_xcpustate:  xcpustate		; $(MAKE) -C xcpustate install
xcpustate/Makefile: xcpustate/Imakefile	; cd xcpustate; xmkmf -a

# executable dependencies

ps top w uptime tload free vmstat sessreg utmp psupdate : $(LIB_TGT)

# static pattern build/link rules:

%.o : %.c
	$(strip $(CC) $(CFLAGS) -c $^)

top.o: top.c top.h
	$(CC) $(CFLAGS) -fwritable-strings -c $<

ps w uptime tload free vmstat sessreg utmp: % : %.o
	$(strip $(CC) $(LDFLAGS) -o $@ $< $(LIB_TGT) $(EXTRALIBS))


# special instances of link rules (need extra libraries/objects)

CAPABILITIES =
ifdef BFD_CAPABLE
CAPABILITIES += bfdupdate.o
endif
ifdef ELF_CAPABLE
CAPABILITIES += elfupdate.o
endif
ifdef AOUT_CAPABLE
CAPABILITIES += aoutupdate.o
endif

psupdate:%: %.o $(CAPABILITIES)
	$(strip $(CC) $(SLDFLAGS) -o $@ $^ $(EXTRALIBS) $(LIBBFD))

top:   % : %.o
	$(strip $(CC)  $(LDFLAGS) -o $@ $^ $(LIB_TGT) $(LIBTERMCAP) $(EXTRALIBS))

watch:	% : %.o
	$(strip $(CC) $(SLDFLAGS) -o $@ $< $(LIBCURSES) $(EXTRALIBS))


# special instances of compile rules (need extra defines)
w.o:	w.c
	$(strip $(CC) $(CFLAGS) $(W_SHOWFROM) -c $<)

sessreg.o:	sessreg.c
	$(strip $(CC) $(CFLAGS) -DSYSV -c $<)

psupdate.o:	psupdate.c
	$(strip $(CC) $(CFLAGS) $(BFD_CAPABLE) $(ELF_CAPABLE) $(AOUT_CAPABLE) -c $<)

bfdupdate.o:	bfdupdate.c
	$(strip $(CC) $(CFLAGS) $(BFD_CAPABLE) -c $<)

elfupdate.o:	elfupdate.c
	$(strip $(CC) $(CFLAGS) $(ELF_CAPABLE) -c $<)

aoutupdate.o:	aoutupdate.c
	$(strip $(CC) $(CFLAGS) $(AOUT_CAPABLE) -c $<)


# static pattern installation rules

$(patsubst %,install_%,$(BPROG)): install_%: %
	$(INSTALLBIN) $< $(BINDIR)/$(PREFIX)$<
$(patsubst %,install_%,$(UPROG)): install_%: %
	$(INSTALLBIN) $< $(USRBINDIR)/$(PREFIX)$<
$(patsubst %,install_%,$(SPROG)): install_%: %
	$(INSTALLBIN) $< $(SBINDIR)/$(PREFIX)$<
$(patsubst %,install_%,$(MAN1)) : install_%: %
	$(INSTALLMAN) $< $(MAN1DIR)/$(PREFIX)$<
$(patsubst %,install_%,$(MAN8)) : install_%: %
	$(INSTALLMAN) $< $(MAN8DIR)/$(PREFIX)$<

# Find all the source and object files in this directory

SRC      =  $(sort $(wildcard *.c))
OBJ      =  $(SRC:.c=.o)
