aboutsummaryrefslogtreecommitdiffstats
path: root/Makefile
diff options
context:
space:
mode:
Diffstat (limited to 'Makefile')
-rw-r--r--Makefile144
1 files changed, 144 insertions, 0 deletions
diff --git a/Makefile b/Makefile
new file mode 100644
index 00000000..5f3db8b7
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,144 @@
+
+# This makefile is inspired by abuild (http://www.abuild.org), which
+# was used during the development of qpdf. The goal here is to have a
+# non-recursive build with all the proper dependencies so we can start
+# the build from anywhere and get the right stuff. Each directory has
+# a build.mk that is included from here and is written from this
+# directory's perspective. Each directory also has a proxy Makefile
+# that allows you to start the build from any directory and get
+# reasonable semantics for the all, check, and clean targets.
+
+# Our "build items" are directories. They are listed here such that
+# no item precedes any item it depends on. Therefore, each item can
+# safely reference variables set in its predecessors.
+
+# For each build item B, you can run make build_B, make check_B, or
+# make clean_B to build, test, or clean B. Full dependencies are
+# represented across all the items, so it is possible to start
+# anywhere. From the top level, the "all", "check", and "clean"
+# targets build, test, or clean everything.
+
+# Although this is not a GNU package and does not use automake, you
+# can still run make clean to remove everything that is compiled, make
+# distclean to remove everything that is generated by the end user,
+# and make maintainer-clean to remove everything that is generated
+# including things distributed with the source distribution. You can
+# pass CLEAN=1 to prevent this Makefile from complaining if
+# ./configure has not been run.
+
+# The install target works as usual and obeys --prefix and so forth
+# passed to ./configure. You can also pass DESTDIR=/dir to make
+# install to install in a separate location. This is useful for
+# packagers.
+
+BUILD_ITEMS = manual libqpdf zlib-flate libtests qpdf examples
+OUTPUT_DIR = build
+ALL_TARGETS =
+
+.PHONY: default
+default: all
+
+CLEAN ?=
+ifneq ($(CLEAN),1)
+ifeq ($(words $(wildcard autoconf.mk)),0)
+DUMMY := $(shell echo 1>&2)
+DUMMY := $(shell echo 1>&2 Please run ./configure before running $(MAKE))
+DUMMY := $(shell echo 1>&2)
+$(error unable to continue with build)
+endif
+
+autoconf.mk:
+
+include autoconf.mk
+
+endif
+
+# Prevent gnu make from trying to rebuild .dep files
+$(foreach B,$(BUILD_ITEMS),$(eval \
+ $(B)/$(OUTPUT_DIR)/%.dep: ;))
+
+# Prevent gnu make from trying to rebuild .mk files
+$(foreach B,$(BUILD_ITEMS),$(eval \
+ $(B)/%.mk: ;))
+%.mk: ;
+make/%.mk: ;
+
+include make/rules.mk
+
+DUMMY := $(shell mkdir $(foreach B,$(BUILD_ITEMS),$(B)/$(OUTPUT_DIR)) 2>/dev/null)
+
+include $(foreach B,$(BUILD_ITEMS),$(B)/build.mk)
+
+ALL_TARGETS = $(foreach B,$(BUILD_ITEMS),$(TARGETS_$(B)))
+
+TEST_ITEMS = $(foreach D,\
+ $(wildcard $(foreach B,$(BUILD_ITEMS),$(B)/qtest)),\
+ $(subst /,,$(dir $(D))))
+
+TEST_TARGETS = $(foreach B,$(TEST_ITEMS),check_$(B))
+
+CLEAN_TARGETS = $(foreach B,$(BUILD_ITEMS),clean_$(B))
+
+# For test suitse
+export QPDF_BIN = $(abspath qpdf/$(OUTPUT_DIR)/qpdf)
+export SKIP_TEST_COMPARE_IMAGES
+
+clean: $(CLEAN_TARGETS)
+
+.PHONY: $(CLEAN_TARGETS)
+$(foreach B,$(BUILD_ITEMS),$(eval \
+ clean_$(B): ; \
+ $(RM) -r $(B)/$(OUTPUT_DIR)))
+
+distclean: clean
+ $(RM) -r autoconf.mk autom4te.cache config.log config.status libtool
+ $(RM) manual/html.xsl
+ $(RM) manual/print.xsl
+ $(RM) doc/*.1
+
+maintainer-clean: distclean
+ $(RM) configure doc/qpdf-manual.*
+
+.PHONY: $(TEST_TARGETS)
+$(foreach B,$(TEST_ITEMS),$(eval \
+ check_$(B): $(TARGETS_$(B))))
+
+.PHONY: $(foreach B,$(BUILD_ITEMS),build_$(B))
+$(foreach B,$(BUILD_ITEMS),$(eval \
+ build_$(B): $(TARGETS_$(B))))
+
+.PHONY: all
+all: $(ALL_TARGETS) ;
+
+check: $(TEST_TARGETS)
+
+install_docs::
+install: all
+ ./mkinstalldirs $(DESTDIR)$(libdir)
+ ./mkinstalldirs $(DESTDIR)$(bindir)
+ ./mkinstalldirs $(DESTDIR)$(includedir)/qpdf
+ ./mkinstalldirs $(DESTDIR)$(docdir)
+ ./mkinstalldirs $(DESTDIR)$(mandir)/man1
+ $(LIBTOOL) --mode=install install -s -c \
+ libqpdf/$(OUTPUT_DIR)/libqpdf.la \
+ $(DESTDIR)$(libdir)/libqpdf.la
+ $(LIBTOOL) --finish $(DESTDIR)$(libdir)
+ $(LIBTOOL) --mode=install install -s -c \
+ qpdf/$(OUTPUT_DIR)/qpdf \
+ $(DESTDIR)$(bindir)/qpdf
+ $(LIBTOOL) --mode=install install -s -c \
+ zlib-flate/$(OUTPUT_DIR)/zlib-flate \
+ $(DESTDIR)$(bindir)/zlib-flate
+ cp qpdf/fix-qdf $(DESTDIR)$(bindir)
+ cp include/qpdf/*.hh $(DESTDIR)$(includedir)/qpdf
+ cp doc/stylesheet.css $(DESTDIR)$(docdir)
+ cp doc/qpdf-manual.html $(DESTDIR)$(docdir)
+ cp doc/qpdf-manual.pdf $(DESTDIR)$(docdir)
+ cp doc/*.1 $(DESTDIR)$(mandir)/man1
+
+QTEST=$(abspath qtest/bin/qtest-driver)
+$(TEST_TARGETS):
+ @echo running qtest-driver for $(subst check_,,$@)
+ @(cd $(subst check_,,$@)/$(OUTPUT_DIR); \
+ TC_SRCS="$(foreach T,$(TC_SRCS_$(subst check_,,$@)),../../$(T))" \
+ $(QTEST) -bindirs .:.. -datadir ../qtest -covdir ..)