+
+ECHO=echo
+
+ifndef OS
+OS=$(shell uname)
+endif
+
+CFLAGS=-Wall -pedantic -ansi -O2 -g -DASSERT_CORE -DHAVE_HSTRERROR
+ifeq ($(OS), FreeBSD)
+CFLAGS+= -DHAVE_POLL_H
+endif
+
+ifeq ($(OS), Linux)
+CFLAGS+= -DHAVE_SYS_POLL_H -D_GNU_SOURCE -D_LARGE_FILES -D_FILE_OFFSET_BITS=64
+endif
+
+CFLAGS+=$(EXTRAFLAGS)
+
+CC=gcc
+AR=ar
+RANLIB=ranlib
+LD=ld
+LIB=-lm $(EXTRALIB)
+
+
+INCLUDE=-I$(topbuilddir)/include -I. $(EXTRAINCLUDE)
+ARFLAGS=rcv
+LDFLAGS=-r
+
+ifdef SUBOBJ
+SUBSYS=SUBSYS.o
+endif
+
+ifdef SUBDIRS
+SUBDIROBJS := $(SUBDIRS:%=%/SUBSYS.o)
+endif
+
+.SUFFIXES: .o.c
+
+.c.o:
+ $(CC) $(CFLAGS) $(INCLUDE) -c $<
+
+all: $(SUBSYS) $(LIBRARY) $(PROGRAM)
+
+define prog_dep
+ $(1): $$(PROGRAMOBJ_$(1))
+endef
+
+$(foreach prog,$(PROGRAM),$(eval $(call prog_dep,$(prog))))
+
+ifdef PROGRAM
+ifdef LIBRARY
+$(PROGRAM): $(LIBRARY)
+endif
+
+$(PROGRAM): %: %.o
+ $(CC) -o $@ $< $(PROGRAMOBJ_$(@)) $(LIBRARY) $(LIB)
+endif
+
+ifdef LIBRARY
+$(LIBRARY): $(LIBOBJ) $(SUBDIROBJS)
+ $(AR) $(ARFLAGS) $@ $(LIBOBJ) $(SUBDIROBJS)
+ $(RANLIB) $@
+endif
+
+ifdef SUBOBJ
+$(SUBSYS): $(SUBOBJ)
+ $(LD) $(LDFLAGS) -o $@ $(SUBOBJ)
+endif
+
+ifdef SUBDIRS
+$(SUBDIROBJS): $(SUBDIRS:%=%-recursive) ;
+
+$(SUBDIRS:%=%-recursive):
+ $(MAKE) -C $(subst -recursive,,$@) -f Makefile OS=$(OS) SUBSYS.o
+endif
+
+clean:
+ifdef LIBOBJ
+ rm -rf $(LIBOBJ)
+endif
+ifdef PROGRAM
+ rm -rf $(PROGRAM)
+ rm -rf $(foreach P, $(PROGRAM), $P.o $(PROGRAMOBJ_$(P)))
+ rm -rf *core core.*
+endif
+ifdef LIBRARY
+ rm -rf $(LIBRARY)
+endif
+ifdef SUBOBJ
+ rm -rf $(SUBOBJ) $(SUBSYS)
+endif
+ifdef SUBDIRS
+ for dir in $(SUBDIRS); do $(MAKE) -f Makefile -C $$dir OS=$(OS) clean || exit; done
+endif