summaryrefslogtreecommitdiffstats
path: root/Makefile
blob: e882672b0d6b4df9ba3545fb4cf1d97e185cd879 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
# 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: ;

BUILDRULES ?= libtool
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 QPDF_SKIP_TEST_COMPARE_IMAGES
export QPDF_LARGE_FILE_TEST_PATH

clean:: $(CLEAN_TARGETS)

.PHONY: $(CLEAN_TARGETS)
$(foreach B,$(BUILD_ITEMS),$(eval \
  clean_$(B): ; \
	$(RM) -r $(B)/$(OUTPUT_DIR)))

AUTOFILES = configure aclocal.m4 libqpdf/qpdf/qpdf-config.h.in
autofiles.zip: $(AUTOFILES)
	$(RM) autofiles.zip
	zip autofiles.zip $(AUTOFILES)

distclean: clean
	$(RM) -r autoconf.mk autom4te.cache config.log config.status libtool
	$(RM) libqpdf/qpdf/qpdf-config.h
	$(RM) manual/html.xsl
	$(RM) manual/print.xsl
	$(RM) doc/*.1
	$(RM) libqpdf.pc

maintainer-clean: distclean
	$(RM) configure doc/qpdf-manual.* libqpdf/qpdf/qpdf-config.h.in
	$(RM) aclocal.m4
	$(RM) -r install-mingw install-msvc external-libs
	$(RM) autofiles.zip

.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 targets are in the make directory in the rules-specific make
# fragments.

QTEST=$(abspath qtest/bin/qtest-driver)
$(TEST_TARGETS):
	@echo running qtest-driver for $(subst check_,,$@)
	@(cd $(subst check_,,$@)/$(OUTPUT_DIR); \
         if TC_SRCS="$(foreach T,$(TC_SRCS_$(subst check_,,$@)),../../$(T))" \
	 $(QTEST) -bindirs .:.. -datadir ../qtest -covdir ..; then \
	    true; \
	 else \
	    if test "$(SHOW_FAILED_TEST_OUTPUT)" = "1"; then \
	       cat -v qtest.log; \
	    fi; \
	    false; \
	 fi)