# Halibut master makefile

# Currently depends on gcc, because:
#  - the dependency tracking uses -MD in order to avoid needing an
#    explicit `make depend' step
#  - the definition of CFLAGS includes the gcc-specific flag
#    `-Wall'
#
# Currently depends on GNU make, because:
#  - the Makefile uses GNU ifdef / ifndef commands and GNU make `%'
#    pattern rules
#  - we use .PHONY

prefix=/usr/local
exec_prefix=$(prefix)
bindir=$(exec_prefix)/bin
INSTALL=install -c

.PHONY: all install clean spotless topclean release

ifdef RELEASE
ifndef VERSION
VERSION := $(RELEASE)
endif
else
CFLAGS += -g
endif

ifeq (x$(VERSION)y,xy)
RELDIR := halibut
else
RELDIR := halibut-$(VERSION)
endif

# `make' from top level will build in directory `build'
# `make BUILDDIR=foo' from top level will build in directory foo
ifndef REALBUILD
ifndef BUILDDIR
ifdef TEST
BUILDDIR := test
else
BUILDDIR := build
endif
endif

all install:
	@test -d $(BUILDDIR) || mkdir $(BUILDDIR)
	@$(MAKE) -C $(BUILDDIR) -f ../Makefile $@ REALBUILD=yes

spotless: topclean
	@test -d $(BUILDDIR) || mkdir $(BUILDDIR)
	@$(MAKE) -C $(BUILDDIR) -f ../Makefile spotless REALBUILD=yes

clean: topclean
	@test -d $(BUILDDIR) || mkdir $(BUILDDIR)
	@$(MAKE) -C $(BUILDDIR) -f ../Makefile clean REALBUILD=yes

# Remove Halibut output files in the source directory (may
# have been created by running, for example, `build/halibut
# inputs/test.but').
topclean:
	rm -f *.html output.* *.tar.gz

# Make a release archive. If $(VERSION) is specified, this will
# also contain a `manifest' file which will be used to decide the
# version number automatically.
release: release.sh
	./release.sh $(RELDIR) $(VERSION)

else

# The `real' makefile part.

CFLAGS += -Wall -W -ansi -pedantic

ifdef TEST
CFLAGS += -DLOGALLOC
LIBS += -lefence
endif

ifndef VER
ifdef VERSION
VER := $(VERSION)
endif
endif
ifdef VER
VDEF = -DVERSION=\"$(VER)\"
else
VDEF = `(cd $(SRC); md5sum -c manifest >/dev/null 2>&1 && cat version)`
endif

all: halibut

SRC := ../

ifeq ($(shell test -d $(SRC)charset && echo yes),yes)
LIBCHARSET_SRCDIR = $(SRC)charset/
else
LIBCHARSET_SRCDIR = $(SRC)../charset/
endif
LIBCHARSET_OBJDIR = ./#
LIBCHARSET_OBJPFX = cs-#
LIBCHARSET_GENPFX = charset-#
MD = -MD
CFLAGS += -I$(LIBCHARSET_SRCDIR) -I$(LIBCHARSET_OBJDIR)
include $(LIBCHARSET_SRCDIR)Makefile

MODULES := main malloc ustring error help licence version misc tree234
MODULES += input in_afm in_pf in_sfnt keywords contents index biblio
MODULES += bk_text bk_html bk_whlp bk_man bk_info bk_paper bk_ps bk_pdf
MODULES += winhelp deflate psdata wcwidth

OBJECTS := $(addsuffix .o,$(MODULES)) $(LIBCHARSET_OBJS)
DEPS := $(addsuffix .d,$(MODULES))

halibut: $(OBJECTS)
	$(CC) $(LFLAGS) -o halibut $(OBJECTS) $(LIBS)

%.o: $(SRC)%.c
	$(CC) $(CFLAGS) -MD -c $<

version.o: FORCE
	$(CC) $(VDEF) -MD -c $(SRC)version.c

spotless:: clean
	rm -f *.d

clean::
	rm -f *.o halibut core

install:
	$(INSTALL) -m 755 halibut $(bindir)/halibut
	$(MAKE) -C ../doc install prefix="$(prefix)" INSTALL="$(INSTALL)"

FORCE: # phony target to force version.o to be rebuilt every time

-include $(DEPS)

endif
