CC = gcc
CFLAGS = -O2 -Wall -Werror -Wno-unused -g -I$(INCDIR)
LDFLAGS = -L$(LIBDIR)
LDLIBS = -l$(LIBNAME)
TARGET_ARCH = -m486
ARFLAGS = rs

export

LIBNAME = net
LIBFILENAME = lib$(LIBNAME).a
LIBDIR = lib
LIBSRC = $(LIBDIR)/$(LIBFILENAME)

INCNAME = libnet.h
INCDIR = include
INCSRC = $(INCDIR)/$(INCNAME)


CORE = core channels config
DRIVERS = nonet wsock socks template
TESTS = getdrvnm gentest

ifneq ($(DJGPP),)

 LIBDEST = $(DJDIR)/lib/$(LIBFILENAME)
 INCDEST = $(DJDIR)/include/$(INCNAME)
 EXE_SUFFIX = .exe

 ifneq ($(wildcard $(DJDIR)/bin/rm.exe),)
  RM_F = rm -f
 else           # Argh!  No fileutils!  Now what?
  RM_F = @echo You don\'t have fileutils.  Remove the following files by hand:
 endif

 # `update' is a djgpp-supplied file copier
 CP_F = update

else            # presumably Unix

 LIBDEST = ../$(LIBFILENAME)
 INCDEST = ../$(INCNAME)
 EXE_SUFFIX =
 RM_F = rm -f
 CP_F = cp -f

endif


.PHONY: all lib tests examples clean cleaner veryclean all_msg rebuild dist
.PRECIOUS: %.o tests/%.o


-include testdirs.mak


all: all_msg lib tests examples

all_msg:
	@echo "Please wait..."

lib: $(LIBDEST) $(INCDEST)

$(LIBDEST): $(LIBSRC)
	@echo "Copying $(LIBFILENAME) to library directory..."
	$(CP_F) $(LIBSRC) $(LIBDEST)

$(INCDEST): $(INCSRC)
	@echo "Copying $(INCNAME) to include directory..."
	$(CP_F) $(INCSRC) $(INCDEST)

$(LIBSRC): $(addprefix core/,$(addsuffix .o,$(CORE))) $(addprefix drivers/,$(addsuffix .o,$(DRIVERS)))
	@echo "Updating library..."
	$(AR) $(ARFLAGS) $@ $^


CORE_OBJS = $(addprefix core/, $(addsuffix .o, $(CORE)))

$(CORE_OBJS): $(INCSRC) $(INCDIR)/channels.h $(INCDIR)/drivers.h

core/config.o: $(INCDIR)/config.h


DRIVER_OBJS = $(addprefix drivers/, $(addsuffix .o, $(DRIVERS)))

$(DRIVERS_OBJS): $(INCSRC) $(INCDIR)/config.h

drivers/wsock.o: $(INCDIR)/wsock.h $(INCDIR)/dns.h


TEST_EXES = $(addprefix tests/, $(addsuffix $(EXE_SUFFIX), $(TESTS)))
TEST_OBJS = $(addprefix tests/, $(addsuffix .o, $(TESTS)))

tests: $(TEST_EXES)

ifneq ($(TESTS),)

tests/%$(EXE_SUFFIX): tests/%.o $(LIBDEST)
	$(LINK.o) $^ $(LOADLIBES) $(LDLIBS) -o $@

tests/%.o: tests/%.c $(INCDEST)
	$(COMPILE.c) $< $(OUTPUT_OPTION)

endif


examples:
	$(MAKE) -C examples/


ifneq ($(DJGPP),)
%.exe: %.o
	$(LINK.o) $^ $(LOADLIBES) $(LDLIBS) -o $@
endif


clean:
	@echo "Cleaning..."
	$(RM_F) $(LIBSRC)
	$(RM_F) $(CORE_OBJS) $(DRIVER_OBJS) $(TEST_OBJS)
	$(MAKE) -C examples/ clean


cleaner: clean
	@echo "Scrubbing..."
	$(RM_F) $(TEST_EXES)
	$(MAKE) -C examples/ cleaner


veryclean: cleaner
	@echo "Eradicating..."
	$(RM_F) $(LIBDEST)
	$(RM_F) $(INCDEST)


rebuild: veryclean all



ifneq ($(DJGPP),)

TEMPZIP = $(subst \,/,$(TMP)/libnet~~.zip)
TEMPDISTDIR = $(subst \,/,$(TMP)/libnet~~.tmp)
DISTDEST = $(subst \,/,$(TMP)/libnet.zip)

dist: cleaner
	@echo "Creating distribution archive..."
	-rm -f $(TEMPZIP)
	-rm -rf $(TEMPDISTDIR)
	pkzip -e0 -rp $(TEMPZIP)
	mkdir $(TEMPDISTDIR)
	mkdir $(TEMPDISTDIR)/libnet
	cd $(TEMPDISTDIR)/libnet
	pkunzip -d $(TEMPZIP)
	rm -f $(TEMPZIP)
	cd ..
	pkzip -ex -rp $(TEMPZIP)
	cd ..
	rm -rf $(TEMPDISTDIR)
	mv $(TEMPZIP) $(DISTDEST)

else

dist: cleaner
	@echo "Creating distribution archive..."
	cd ..; tar -cf libnet.tar libnet
	gzip -f ../libnet.tar

endif
