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

export PREFIX     =  #proc# prefix for program names
export DESTDIR    =
export MANDIR     =  /usr/share/man
export MAN1DIR    =  $(DESTDIR)$(MANDIR)/man1
export MAN5DIR    =  $(DESTDIR)$(MANDIR)/man5
export MAN8DIR    =  $(DESTDIR)$(MANDIR)/man8
export BINDIR     =  $(DESTDIR)/bin
export SBINDIR    =  $(DESTDIR)/sbin
export USRBINDIR  =  $(DESTDIR)/usr/bin
export PROCDIR    =  $(DESTDIR)/usr/bin# /usr/proc/bin for Solaris devotees
export OWNERGROUP =  --owner 0 --group 0
export INSTALLBIN =  install
export INSTALLLIB =  install
export INSTALLMAN =  install --mode a=r

UPROG      =  uptime tload free w top vmstat watch skill snice pmap slabtop
PPROG      =  pgrep pkill
SPROG      =  sysctl
MAN1       =  uptime.1 tload.1 free.1 w.1 top.1 watch.1 skill.1 snice.1 \
	      slabtop.1 pgrep.1 pkill.1 pmap.1
MAN5       =  sysctl.conf.5
MAN8       =  vmstat.8 sysctl.8

SUBDIRS    =  ps # sub-packages to build/install

# easy to command-line override
export GCC_WARN   =  -Wall -W -Wstrict-prototypes -Wshadow
export INCDIRS    =  -I/usr/include/ncurses
export CC         =  gcc
export OPT        =  -O2
export CFLAGS     =  -D_GNU_SOURCE $(OPT) $(GCC_WARN) -I$(shell pwd) $(INCDIRS)
export SHARED     =  1# build/install both a static and ELF shared library
export SHLIBDIR   =  $(DESTDIR)/lib
export LDFLAGS    =  -Wl,-warn-common
export SHLDFLAGS  =  $(LDFLAGS)

LIBCURSES  =  -lncurses# watch is the only thing that needs this

#----------------------------------------------------#
# End of user-configurable portion of the Makefile.  #
# You should not need to modify anything below this. #
#----------------------------------------------------#

# Procps VERSION, could be higher than LIBVERSION...
# Note: if you change this, please adjust procps.spec too
VERSION      = 2
SUBVERSION   = 0
MINORVERSION = 16

# Note: LIBVERSION may be less than $(VERSION).$(SUBVERSION).$(MINORVERSION)
# LIBVERSION is only set to current $(VERSION).$(SUBVERSION).$(MINORVERSION)
# when an incompatible change is made in libproc.
LIBVERSION   =  2.0.16

BUILD = $(UPROG) $(PPROG) $(SPROG) $(SUBDIRS)

# BUILD LIBRARIES + PROGRAMS
all: $(BUILD)

# INSTALL PROGRAMS + DOCS
install: $(patsubst %,install_%,$(BUILD) $(MAN1) $(MAN5) $(MAN8))
ifeq ($(SHARED),1)
	$(INSTALLLIB) $(OWNERGROUP) $(LIB_TGT) $(SHLIBDIR)
endif

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

clean:
	@echo 'Making clean'
	@$(RM) -f $(OBJ) $(UPROG) $(PPROG) $(SPROG)
	@for i in proc $(SUBDIRS); do $(MAKE) -C $$i clean; done

distclean: clean
	@echo 'Making distclean'
	@for i in proc $(SUBDIRS); do $(MAKE) -C $$i clean; done
	@$(RM) -f $(OBJ) $(UPROG) $(SPROG) proc/signames.h proc/.depend
	@find . -name SCCS -prune -o -name BitKeeper -prune -o \
		\( -not -type d \) -and \
		\( -name '*.orig' -o -name '*.rej' -o -name '*~' \
		-o -name '*.bak' -o -name core -o -name '*.o' \
		-o -name '*.tmp' -o -size 0 \) \
		-type f -print | xargs rm -rf


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

.PHONY:	all install libinstall clean distclean
.PHONY: $(patsubst %,install_%, $(UPROG) $(SPROG))
.PHONY: proc ps
.PHONY: $(patsubst %,build_%, proc ps)
.PHONY: $(patsubst %,install_%, proc ps)

LIBPROCPASS  =  SHARED=$(SHARED) SHLIBDIR=$(SHLIBDIR) VERSION=$(VERSION) SUBVERSION=$(SUBVERSION) MINORVERSION=$(MINORVERSION) LIBVERSION=$(LIBVERSION)

# libproc setup

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

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

proc/signames.h:
	$(MAKE) -C proc `basename $@`

# 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.)

ps:              build_ps
build_ps:				; $(MAKE) -C ps
install_ps:      ps		; $(MAKE) -C ps install

# executable dependencies
skill snice top w uptime tload free vmstat sysctl slabtop: $(LIB_TGT)

# static pattern build/link rules:

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

w uptime tload free vmstat pgrep pmap: % : %.o
	$(strip $(CC) $(LDFLAGS) -o $@ $< $(LIB_TGT))


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

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

watch:	% : %.o
	$(strip $(CC)  $(LDFLAGS) -o $@ $< $(LIB_TGT) $(LIBCURSES))

slabtop: % : %.o
	$(strip $(CC)  $(LDFLAGS) -o $@ $^ $(LIB_TGT) $(LIBCURSES))

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

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

snice:	skill
	ln -f skill snice

pkill:	pgrep
	ln -f pgrep pkill

# static pattern installation rules

$(patsubst %,install_%,$(SPROG)): install_%: %
	$(INSTALLBIN) $< $(SBINDIR)/$(PREFIX)$<
$(patsubst %,install_%,$(filter-out snice,$(UPROG))): install_%: %
	$(INSTALLBIN) $< $(USRBINDIR)/$(PREFIX)$<
$(patsubst %,install_%,$(filter-out pkill,$(PPROG))): install_%: %
	$(INSTALLBIN) $< $(PROCDIR)/$(PREFIX)$<
$(patsubst %,install_%,$(MAN1)) : install_%: %
	$(INSTALLMAN) $< $(MAN1DIR)/$(PREFIX)$<
$(patsubst %,install_%,$(MAN5)) : install_%: %
	$(INSTALLMAN) $< $(MAN5DIR)/$(PREFIX)$<
$(patsubst %,install_%,$(MAN8)) : install_%: %
	$(INSTALLMAN) $< $(MAN8DIR)/$(PREFIX)$<

# special case install rules
install_snice: snice install_skill
	cd $(USRBINDIR) && ln -f skill snice
install_pkill: pgrep install_pgrep
	cd $(USRBINDIR) && ln -f pgrep pkill

# Find all the source and object files in this directory

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