comparison mupdf-source/Makefile @ 3:2c135c81b16c

MERGE: upstream PyMuPDF 1.26.4 with MuPDF 1.26.7
author Franz Glasner <fzglas.hg@dom66.de>
date Mon, 15 Sep 2025 11:44:09 +0200
parents b50eed0cc0ef
children
comparison
equal deleted inserted replaced
0:6015a75abc2d 3:2c135c81b16c
1 # GNU Makefile
2
3 -include user.make
4
5 ifndef build
6 build := release
7 endif
8
9 default: apps libs
10
11 include Makerules
12
13 ifndef OUT
14 OUT := build/$(build_prefix)$(build)$(build_suffix)
15 endif
16
17 include Makethird
18
19 # --- Configuration ---
20
21 # Do not specify CFLAGS, LDFLAGS, LIB_LDFLAGS, EXE_LDFLAGS or LIBS on the make
22 # invocation line - specify XCFLAGS, XLDFLAGS, XLIB_LDFLAGS, XEXE_LDFLAGS or
23 # XLIBS instead. Make ignores any lines in the makefile that set a variable
24 # that was set on the command line.
25 CFLAGS += $(XCFLAGS) -Iinclude
26 LIBS += $(XLIBS) -lm
27
28 LDFLAGS += $(XLDFLAGS)
29 LIB_LDFLAGS += $(XLIB_LDFLAGS)
30 EXE_LDFLAGS += $(XEXE_LDFLAGS)
31
32 ifneq ($(threading),no)
33 ifeq ($(HAVE_PTHREAD),yes)
34 THREADING_CFLAGS := $(PTHREAD_CFLAGS) -DHAVE_PTHREAD
35 THREADING_LIBS := $(PTHREAD_LIBS)
36 endif
37 endif
38
39 VERSION_MAJOR = $(shell grep "define FZ_VERSION_MAJOR" include/mupdf/fitz/version.h | cut -d ' ' -f 3)
40 VERSION_MINOR = $(shell grep "define FZ_VERSION_MINOR" include/mupdf/fitz/version.h | cut -d ' ' -f 3)
41 VERSION_PATCH = $(shell grep "define FZ_VERSION_PATCH" include/mupdf/fitz/version.h | cut -d ' ' -f 3)
42
43 ifneq ($(OS),Darwin)
44 ifneq ($(USE_SONAME),no)
45 SO_VERSION_MAJOR = .$(VERSION_MINOR)
46 SO_VERSION = .$(VERSION_MINOR).$(VERSION_PATCH)
47 endif
48 endif
49
50 # workaround argument list too long errors
51 ifeq (4.0,$(firstword $(sort $(MAKE_VERSION) 4.0)))
52 USE_ARGUMENT_FILE=yes
53 else
54 USE_ARGUMENT_FILE=no
55 endif
56
57 # --- Commands ---
58
59 ifneq ($(verbose),yes)
60 QUIET_AR = @ echo " AR $@" ;
61 QUIET_RANLIB = @ echo " RANLIB $@" ;
62 QUIET_CC = @ echo " CC $@" ;
63 QUIET_CXX = @ echo " CXX $@" ;
64 QUIET_GEN = @ echo " GEN $@" ;
65 QUIET_LINK = @ echo " LINK $@" ;
66 QUIET_LINK_SO = @ echo " LINK_SO $@" ;
67 QUIET_RM = @ echo " RM $@" ;
68 QUIET_TAGS = @ echo " TAGS $@" ;
69 QUIET_OBJCOPY = @ echo " OBJCOPY $@" ;
70 QUIET_SYMLINK = @ echo " SYMLINK $@" ;
71 endif
72
73 MKTGTDIR = mkdir -p $(dir $@)
74 CC_CMD = $(QUIET_CC) $(MKTGTDIR) ; $(CC) $(CFLAGS) -MMD -MP -o $@ -c $<
75 CXX_CMD = $(QUIET_CXX) $(MKTGTDIR) ; $(CXX) $(CFLAGS) $(XCXXFLAGS) -MMD -MP -o $@ -c $<
76 ifeq ($(USE_ARGUMENT_FILE),yes)
77 AR_CMD = $(QUIET_AR) $(MKTGTDIR) ; $(AR) cr $@ $(file > $@.in,$^) @$@.in
78 else
79 AR_CMD = $(QUIET_AR) $(MKTGTDIR) ; $(AR) cr $@ $^
80 endif
81 ifdef RANLIB
82 RANLIB_CMD = $(QUIET_RANLIB) $(RANLIB) $@
83 endif
84 LINK_CMD = $(QUIET_LINK) $(MKTGTDIR) ; $(CC) $(EXE_LDFLAGS) $(LDFLAGS) -o $@ $^ $(LIBS)
85 TAGS_CMD = $(QUIET_TAGS) ctags
86 OBJCOPY_CMD = $(QUIET_OBJCOPY) $(MKTGTDIR) ; $(LD) -r -b binary -z noexecstack -o $@ $<
87 SYMLINK_CMD = $(QUIET_SYMLINK) $(MKTGTDIR) ; ln -sf
88
89 ifeq ($(shared),yes)
90 ifeq ($(USE_ARGUMENT_FILE),yes)
91 LINK_SO_CMD = $(QUIET_LINK_SO) $(MKTGTDIR) ; $(CC) $(LIB_LDFLAGS) $(LDFLAGS) -o $@ $(file > $@.in,$^) @$@.in
92 else
93 LINK_SO_CMD = $(QUIET_LINK_SO) $(MKTGTDIR) ; $(CC) $(LIB_LDFLAGS) $(LDFLAGS) -o $@ $^
94 endif
95 ifeq ($(OS),OpenBSD)
96 # OpenBSD linker magic doesn't use soname; so fake it by using -L$(OUT) and -lmupdf.
97 LINK_CMD = $(QUIET_LINK) $(MKTGTDIR) ; $(CC) $(EXE_LDFLAGS) $(LDFLAGS) -o $@ -L$(OUT) \
98 $(subst $(OUT)/libmupdf.$(SO)$(SO_VERSION),-lmupdf,$^) \
99 $(LIBS)
100 endif
101 endif
102
103 # --- Rules ---
104
105 $(OUT)/%.a :
106 $(AR_CMD)
107 $(RANLIB_CMD)
108
109 $(OUT)/source/helpers/mu-threads/%.o : source/helpers/mu-threads/%.c
110 $(CC_CMD) $(WARNING_CFLAGS) $(LIB_CFLAGS) $(THREADING_CFLAGS)
111
112 $(OUT)/source/helpers/pkcs7/%.o : source/helpers/pkcs7/%.c
113 $(CC_CMD) $(WARNING_CFLAGS) $(LIB_CFLAGS) $(LIBCRYPTO_CFLAGS)
114
115 $(OUT)/source/tools/%.o : source/tools/%.c
116 $(CC_CMD) $(LIB_CFLAGS) $(WARNING_CFLAGS) $(THIRD_CFLAGS) $(THREADING_CFLAGS)
117
118 $(OUT)/generated/%.o : generated/%.c
119 $(CC_CMD) $(WARNING_CFLAGS) $(LIB_CFLAGS) -O0
120
121 $(OUT)/platform/x11/%.o : platform/x11/%.c
122 $(CC_CMD) $(WARNING_CFLAGS) $(X11_CFLAGS)
123
124 $(OUT)/platform/x11/curl/%.o : platform/x11/%.c
125 $(CC_CMD) $(WARNING_CFLAGS) $(X11_CFLAGS) $(CURL_CFLAGS)
126
127 $(OUT)/platform/gl/%.o : platform/gl/%.c
128 $(CC_CMD) $(WARNING_CFLAGS) $(THIRD_CFLAGS) $(THIRD_GLUT_CFLAGS)
129
130 ifeq ($(HAVE_OBJCOPY),yes)
131 $(OUT)/source/fitz/noto.o : source/fitz/noto.c
132 $(CC_CMD) $(WARNING_CFLAGS) -Wdeclaration-after-statement -DHAVE_OBJCOPY $(LIB_CFLAGS) $(THIRD_CFLAGS)
133 endif
134
135 $(OUT)/source/fitz/memento.o : source/fitz/memento.c
136 $(CC_CMD) $(WARNING_CFLAGS) $(LIB_CFLAGS) $(THIRD_CFLAGS) -DMEMENTO_MUPDF_HACKS
137
138 $(OUT)/source/%.o : source/%.c
139 $(CC_CMD) $(WARNING_CFLAGS) -Wdeclaration-after-statement $(LIB_CFLAGS) $(THIRD_CFLAGS)
140
141 $(OUT)/thirdparty/so/source/%.o : thirdparty/so/source/%.c
142 $(CC_CMD) $(WARNING_CFLAGS) -Wdeclaration-after-statement $(LIB_CFLAGS) $(THIRD_CFLAGS)
143
144 $(OUT)/source/%.o : source/%.cpp
145 $(CXX_CMD) $(WARNING_CFLAGS) $(LIB_CFLAGS) $(THIRD_CFLAGS)
146
147 ifeq ($(HAVE_TESSERACT),yes)
148 $(OUT)/source/fitz/tessocr.o : source/fitz/tessocr.cpp
149 $(CXX_CMD) $(WARNING_CFLAGS) $(LIB_CFLAGS) $(THIRD_CFLAGS) $(TESSERACT_CFLAGS) $(TESSERACT_DEFINES) $(TESSERACT_LANGFLAGS) $(LEPTONICA_CFLAGS)
150 endif
151
152 ifeq ($(HAVE_LEPTONICA),yes)
153 $(OUT)/source/fitz/leptonica-wrap.o : source/fitz/leptonica-wrap.c
154 $(CC_CMD) $(WARNING_CFLAGS) $(LIB_CFLAGS) $(THIRD_CFLAGS) $(LEPTONICA_CFLAGS) $(LEPTONICA_DEFINES)
155 endif
156
157 $(OUT)/source/fitz/barcode.o : source/fitz/barcode.cpp
158 $(CXX_CMD) $(WARNING_CFLAGS) $(LIB_CFLAGS) $(THIRD_CFLAGS) $(ZXINGCPP_CFLAGS) $(ZXINGCPP_LANGFLAGS)
159
160 $(OUT)/platform/%.o : platform/%.c
161 $(CC_CMD) $(WARNING_CFLAGS)
162
163 .PRECIOUS : $(OUT)/%.o # Keep intermediates from chained rules
164
165 # --- File lists ---
166
167 THIRD_OBJ := $(THIRD_SRC:%.c=$(OUT)/%.o)
168 THIRD_OBJ := $(THIRD_OBJ:%.cc=$(OUT)/%.o)
169 THIRD_OBJ := $(THIRD_OBJ:%.cpp=$(OUT)/%.o)
170
171 THIRD_GLUT_OBJ := $(THIRD_GLUT_SRC:%.c=$(OUT)/%.o)
172
173 MUPDF_SRC := $(sort $(wildcard source/fitz/*.c))
174 MUPDF_SRC += $(sort $(wildcard source/fitz/*.cpp))
175 MUPDF_SRC += $(sort $(wildcard source/pdf/*.c))
176 ifneq ($(xps),no)
177 MUPDF_SRC += $(sort $(wildcard source/xps/*.c))
178 endif
179 ifneq ($(svg),no)
180 MUPDF_SRC += $(sort $(wildcard source/svg/*.c))
181 endif
182 ifneq ($(html),no)
183 MUPDF_SRC += $(sort $(wildcard source/html/*.c))
184 endif
185 MUPDF_SRC += $(sort $(wildcard source/reflow/*.c))
186 MUPDF_SRC += $(sort $(wildcard source/cbz/*.c))
187
188 MUPDF_OBJ := $(MUPDF_SRC:%.c=$(OUT)/%.o)
189 MUPDF_OBJ := $(MUPDF_OBJ:%.cpp=$(OUT)/%.o)
190
191 THREAD_SRC := source/helpers/mu-threads/mu-threads.c
192 THREAD_OBJ := $(THREAD_SRC:%.c=$(OUT)/%.o)
193
194 PKCS7_SRC += source/helpers/pkcs7/pkcs7-openssl.c
195 PKCS7_OBJ := $(PKCS7_SRC:%.c=$(OUT)/%.o)
196
197 # --- Generated embedded font files ---
198
199 HEXDUMP_SH := scripts/hexdump.sh
200
201 FONT_BIN := $(sort $(wildcard resources/fonts/urw/*.cff))
202 FONT_BIN += $(sort $(wildcard resources/fonts/han/*.ttc))
203 FONT_BIN += $(sort $(wildcard resources/fonts/droid/DroidSansFallbackFull.ttf))
204 FONT_BIN += $(sort $(wildcard resources/fonts/droid/DroidSansFallback.ttf))
205 FONT_BIN += $(sort $(wildcard resources/fonts/noto/*.otf))
206 FONT_BIN += $(sort $(wildcard resources/fonts/noto/*.ttf))
207 FONT_BIN += $(sort $(wildcard resources/fonts/sil/*.cff))
208
209 # Note: The tests here must match the equivalent tests in noto.c
210
211 ifneq ($(filter -DTOFU_CJK,$(CFLAGS)),)
212 FONT_BIN := $(filter-out resources/fonts/han/%.ttc, $(FONT_BIN))
213 FONT_BIN := $(filter-out resources/fonts/droid/DroidSansFallbackFull.ttf, $(FONT_BIN))
214 FONT_BIN := $(filter-out resources/fonts/droid/DroidSansFallback.ttf, $(FONT_BIN))
215 endif
216
217 ifneq ($(filter -DTOFU_CJK_EXT,$(CFLAGS)),)
218 FONT_BIN := $(filter-out resources/fonts/han/%.ttc, $(FONT_BIN))
219 FONT_BIN := $(filter-out resources/fonts/droid/DroidSansFallbackFull.ttf, $(FONT_BIN))
220 endif
221
222 ifneq ($(filter -DTOFU_CJK_LANG,$(CFLAGS)),)
223 FONT_BIN := $(filter-out resources/fonts/han/%.ttc, $(FONT_BIN))
224 endif
225
226 ifneq ($(filter -DTOFU,$(CFLAGS)),)
227 FONT_BIN := $(filter-out resources/fonts/noto/%.otf,$(FONT_BIN))
228 FONT_BIN := $(filter-out resources/fonts/noto/%.ttf,$(FONT_BIN))
229 FONT_BIN := $(filter-out resources/fonts/sil/%.cff,$(FONT_BIN))
230 endif
231
232 ifneq ($(filter -DTOFU_NOTO,$(CFLAGS)),)
233 FONT_BIN := $(filter-out resources/fonts/noto/%.otf,$(FONT_BIN))
234 FONT_BIN := $(filter-out resources/fonts/noto/%.ttf,$(FONT_BIN))
235 endif
236
237 ifneq ($(filter -DTOFU_SIL,$(CFLAGS)),)
238 FONT_BIN := $(filter-out resources/fonts/sil/%.cff,$(FONT_BIN))
239 endif
240
241 FONT_GEN := $(FONT_BIN:%=generated/%.c)
242
243 generated/%.cff.c : %.cff $(HEXDUMP_SH) ; $(QUIET_GEN) $(MKTGTDIR) ; bash $(HEXDUMP_SH) > $@ $<
244 generated/%.otf.c : %.otf $(HEXDUMP_SH) ; $(QUIET_GEN) $(MKTGTDIR) ; bash $(HEXDUMP_SH) > $@ $<
245 generated/%.ttf.c : %.ttf $(HEXDUMP_SH) ; $(QUIET_GEN) $(MKTGTDIR) ; bash $(HEXDUMP_SH) > $@ $<
246 generated/%.ttc.c : %.ttc $(HEXDUMP_SH) ; $(QUIET_GEN) $(MKTGTDIR) ; bash $(HEXDUMP_SH) > $@ $<
247
248 ifeq ($(HAVE_OBJCOPY),yes)
249 MUPDF_OBJ += $(FONT_BIN:%=$(OUT)/%.o)
250 $(OUT)/%.cff.o : %.cff ; $(OBJCOPY_CMD)
251 $(OUT)/%.otf.o : %.otf ; $(OBJCOPY_CMD)
252 $(OUT)/%.ttf.o : %.ttf ; $(OBJCOPY_CMD)
253 $(OUT)/%.ttc.o : %.ttc ; $(OBJCOPY_CMD)
254 else
255 MUPDF_OBJ += $(FONT_GEN:%.c=$(OUT)/%.o)
256 endif
257
258 generate: $(FONT_GEN)
259
260 # --- Generated ICC profiles ---
261
262 source/fitz/icc/%.icc.h: resources/icc/%.icc
263 $(QUIET_GEN) xxd -i $< | \
264 sed 's/unsigned/static const unsigned/' | \
265 sed '1i// This is an automatically generated file. Do not edit.' \
266 > $@
267
268 generate: source/fitz/icc/gray.icc.h
269 generate: source/fitz/icc/rgb.icc.h
270 generate: source/fitz/icc/cmyk.icc.h
271 generate: source/fitz/icc/lab.icc.h
272
273 # --- Generated CMap files ---
274
275 CMAP_GEN := $(notdir $(sort $(wildcard resources/cmaps/*)))
276 CMAP_GEN := $(CMAP_GEN:%=source/pdf/cmaps/%.h)
277
278 source/pdf/cmaps/%.h: resources/cmaps/% scripts/cmapdump.py
279 $(QUIET_GEN) python3 scripts/cmapdump.py > $@ $<
280
281 generate: $(CMAP_GEN)
282
283 # --- Generated embedded javascript files ---
284
285 source/pdf/js/%.js.h: source/pdf/js/%.js scripts/jsdump.sed
286 $(QUIET_GEN) sed -f scripts/jsdump.sed < $< > $@
287
288 generate: source/pdf/js/util.js.h
289
290 # --- Generated perfect hash source files ---
291
292 source/html/css-properties.h: source/html/css-properties.gperf
293 $(QUIET_GEN) gperf > $@ $<
294
295 generate: source/html/css-properties.h
296
297 # --- Library ---
298
299 ifeq ($(shared),yes)
300 $(OUT)/libmupdf.$(SO)$(SO_VERSION): $(MUPDF_OBJ) $(THIRD_OBJ)
301 $(LINK_SO_CMD) $(THIRD_LIBS) $(LIBCRYPTO_LIBS) $(LIBS)
302 ifeq ($(OS),OpenBSD)
303 # should never create symlink
304 MUPDF_LIB = $(OUT)/libmupdf.$(SO)$(SO_VERSION)
305 else
306 MUPDF_LIB = $(OUT)/libmupdf.$(SO)
307 ifneq ($(SO_VERSION),)
308 # create symlink with soname if needed
309 $(OUT)/libmupdf.$(SO): $(OUT)/libmupdf.$(SO)$(SO_VERSION)
310 $(SYMLINK_CMD) $(notdir $<) $@
311 endif
312 endif
313 else
314 MUPDF_LIB = $(OUT)/libmupdf.a
315 THIRD_LIB = $(OUT)/libmupdf-third.a
316 $(MUPDF_LIB) : $(MUPDF_OBJ)
317 $(THIRD_LIB) : $(THIRD_OBJ)
318 endif
319
320 ifneq ($(USE_SYSTEM_GLUT),yes)
321 THIRD_GLUT_LIB = $(OUT)/libmupdf-glut.a
322 $(THIRD_GLUT_LIB) : $(THIRD_GLUT_OBJ)
323 endif
324
325 THREAD_LIB = $(OUT)/libmupdf-threads.a
326 $(THREAD_LIB) : $(THREAD_OBJ)
327
328 PKCS7_LIB = $(OUT)/libmupdf-pkcs7.a
329 $(PKCS7_LIB) : $(PKCS7_OBJ)
330
331 # --- Main tools and viewers ---
332
333 MUTOOL_SRC := source/tools/mutool.c
334 MUTOOL_SRC += source/tools/muconvert.c
335 MUTOOL_SRC += source/tools/mudraw.c
336 MUTOOL_SRC += source/tools/murun.c
337 MUTOOL_SRC += source/tools/mutrace.c
338 MUTOOL_SRC += source/tools/mubar.c
339 MUTOOL_SRC += source/tools/cmapdump.c
340 MUTOOL_SRC += $(sort $(wildcard source/tools/pdf*.c))
341 MUTOOL_OBJ := $(MUTOOL_SRC:%.c=$(OUT)/%.o)
342 MUTOOL_EXE := $(OUT)/mutool
343 $(MUTOOL_EXE) : $(MUTOOL_OBJ) $(MUPDF_LIB) $(THIRD_LIB) $(PKCS7_LIB) $(THREAD_LIB)
344 $(LINK_CMD) $(THIRD_LIBS) $(THREADING_LIBS) $(LIBCRYPTO_LIBS)
345 TOOL_APPS += $(MUTOOL_EXE)
346
347 MURASTER_OBJ := $(OUT)/source/tools/muraster.o
348 MURASTER_EXE := $(OUT)/muraster
349 $(MURASTER_EXE) : $(MURASTER_OBJ) $(MUPDF_LIB) $(THIRD_LIB) $(PKCS7_LIB) $(THREAD_LIB)
350 $(LINK_CMD) $(THIRD_LIBS) $(THREADING_LIBS) $(LIBCRYPTO_LIBS)
351 EXTRA_TOOL_APPS += $(MURASTER_EXE)
352
353 ifeq ($(HAVE_GLUT),yes)
354 MUVIEW_GLUT_SRC += $(sort $(wildcard platform/gl/*.c))
355 MUVIEW_GLUT_OBJ := $(MUVIEW_GLUT_SRC:%.c=$(OUT)/%.o)
356 MUVIEW_GLUT_EXE := $(OUT)/mupdf-gl
357 $(MUVIEW_GLUT_EXE) : $(MUVIEW_GLUT_OBJ) $(MUPDF_LIB) $(THIRD_LIB) $(THIRD_GLUT_LIB) $(PKCS7_LIB)
358 $(LINK_CMD) $(THIRD_LIBS) $(LIBCRYPTO_LIBS) $(THIRD_GLUT_LIBS)
359 VIEW_APPS += $(MUVIEW_GLUT_EXE)
360 endif
361
362 ifeq ($(HAVE_X11),yes)
363 MUVIEW_X11_EXE := $(OUT)/mupdf-x11
364 MUVIEW_X11_OBJ += $(OUT)/platform/x11/pdfapp.o
365 MUVIEW_X11_OBJ += $(OUT)/platform/x11/x11_main.o
366 MUVIEW_X11_OBJ += $(OUT)/platform/x11/x11_image.o
367 $(MUVIEW_X11_EXE) : $(MUVIEW_X11_OBJ) $(MUPDF_LIB) $(THIRD_LIB) $(PKCS7_LIB)
368 $(LINK_CMD) $(THIRD_LIBS) $(X11_LIBS) $(LIBCRYPTO_LIBS)
369 VIEW_APPS += $(MUVIEW_X11_EXE)
370 endif
371
372 ifeq ($(HAVE_X11),yes)
373 ifeq ($(HAVE_CURL),yes)
374 ifeq ($(HAVE_PTHREAD),yes)
375 MUVIEW_X11_CURL_EXE := $(OUT)/mupdf-x11-curl
376 MUVIEW_X11_CURL_OBJ += $(OUT)/platform/x11/curl/pdfapp.o
377 MUVIEW_X11_CURL_OBJ += $(OUT)/platform/x11/curl/x11_main.o
378 MUVIEW_X11_CURL_OBJ += $(OUT)/platform/x11/curl/x11_image.o
379 MUVIEW_X11_CURL_OBJ += $(OUT)/platform/x11/curl/curl_stream.o
380 MUVIEW_X11_CURL_OBJ += $(OUT)/platform/x11/curl/prog_stream.o
381 $(MUVIEW_X11_CURL_EXE) : $(MUVIEW_X11_CURL_OBJ) $(MUPDF_LIB) $(THIRD_LIB) $(PKCS7_LIB) $(CURL_LIB)
382 $(LINK_CMD) $(THIRD_LIBS) $(X11_LIBS) $(LIBCRYPTO_LIBS) $(CURL_LIBS) $(PTHREAD_LIBS)
383 EXTRA_VIEW_APPS += $(MUVIEW_X11_CURL_EXE)
384 endif
385 endif
386 endif
387
388 # --- Generated dependencies ---
389
390 -include $(MUPDF_OBJ:%.o=%.d)
391 -include $(PKCS7_OBJ:%.o=%.d)
392 -include $(THREAD_OBJ:%.o=%.d)
393 -include $(THIRD_OBJ:%.o=%.d)
394 -include $(THIRD_GLUT_OBJ:%.o=%.d)
395
396 -include $(MUTOOL_OBJ:%.o=%.d)
397 -include $(MUVIEW_GLUT_OBJ:%.o=%.d)
398 -include $(MUVIEW_X11_OBJ:%.o=%.d)
399
400 -include $(MURASTER_OBJ:%.o=%.d)
401 -include $(MUVIEW_X11_CURL_OBJ:%.o=%.d)
402
403 # --- Examples ---
404
405 examples: $(OUT)/example $(OUT)/multi-threaded $(OUT)/storytest
406
407 $(OUT)/example: docs/examples/example.c $(MUPDF_LIB) $(THIRD_LIB)
408 $(LINK_CMD) $(CFLAGS) $(THIRD_LIBS)
409 $(OUT)/multi-threaded: docs/examples/multi-threaded.c $(MUPDF_LIB) $(THIRD_LIB)
410 $(LINK_CMD) $(CFLAGS) $(THIRD_LIBS) -lpthread
411 $(OUT)/storytest: docs/examples/storytest.c $(MUPDF_LIB) $(THIRD_LIB)
412 $(LINK_CMD) $(CFLAGS) $(THIRD_LIBS)
413
414 # --- Format man pages ---
415
416 %.txt: %.1
417 nroff -man $< | col -b | expand > $@
418
419 MAN_FILES := $(sort $(wildcard docs/man/*.1))
420 TXT_FILES := $(MAN_FILES:%.1=%.txt)
421
422 catman: $(TXT_FILES)
423
424 # --- Install ---
425
426 prefix ?= /usr/local
427 bindir ?= $(prefix)/bin
428 libdir ?= $(prefix)/lib
429 incdir ?= $(prefix)/include
430 mandir ?= $(prefix)/share/man
431 docdir ?= $(prefix)/share/doc/mupdf
432 pydir ?= $(shell python3 -c "import sysconfig; print(sysconfig.get_path('platlib'))")
433 SO_INSTALL_MODE ?= 644
434
435 third: $(THIRD_LIB)
436 extra-libs: $(THIRD_GLUT_LIB)
437 libs: $(MUPDF_LIB) $(THIRD_LIB) $(COMMERCIAL_LIBS)
438 commercial-libs: $(COMMERCIAL_LIBS)
439 tools: $(TOOL_APPS)
440 apps: $(TOOL_APPS) $(VIEW_APPS)
441 extra-apps: $(EXTRA_TOOL_APPS) $(EXTRA_VIEW_APPS)
442 libmupdf-threads: $(THREAD_LIB)
443
444 install-headers:
445 install -d $(DESTDIR)$(incdir)/mupdf
446 install -d $(DESTDIR)$(incdir)/mupdf/fitz
447 install -d $(DESTDIR)$(incdir)/mupdf/pdf
448 install -m 644 include/mupdf/*.h $(DESTDIR)$(incdir)/mupdf
449 install -m 644 include/mupdf/fitz/*.h $(DESTDIR)$(incdir)/mupdf/fitz
450 install -m 644 include/mupdf/pdf/*.h $(DESTDIR)$(incdir)/mupdf/pdf
451
452 install-libs: libs install-headers
453 install -d $(DESTDIR)$(libdir)
454 ifeq ($(shared),yes)
455 install -m $(SO_INSTALL_MODE) $(OUT)/libmupdf.$(SO)$(SO_VERSION) $(DESTDIR)$(libdir)/libmupdf.$(SO)$(SO_VERSION)
456 ifneq ($(OS),OpenBSD)
457 ln -sf libmupdf.$(SO)$(SO_VERSION) $(DESTDIR)$(libdir)/libmupdf.$(SO)$(SO_VERSION_MAJOR)
458 ln -sf libmupdf.$(SO)$(SO_VERSION) $(DESTDIR)$(libdir)/libmupdf.$(SO)
459 endif
460 else
461 install -m 644 $(MUPDF_LIB) $(DESTDIR)$(libdir)
462 install -m 644 $(THIRD_LIB) $(DESTDIR)$(libdir)
463 endif
464
465 install-tools: tools
466 install -d $(DESTDIR)$(bindir)
467 install -m 755 $(TOOL_APPS) $(DESTDIR)$(bindir)
468
469 install-apps: apps
470 install -d $(DESTDIR)$(bindir)
471 install -m 755 $(TOOL_APPS) $(VIEW_APPS) $(DESTDIR)$(bindir)
472
473 install-extra-apps: install-apps extra-apps
474 install -d $(DESTDIR)$(bindir)
475 install -m 755 $(EXTRA_TOOL_APPS) $(EXTRA_VIEW_APPS) $(DESTDIR)$(bindir)
476
477 install-docs:
478 install -d $(DESTDIR)$(mandir)/man1
479 install -m 644 docs/man/*.1 $(DESTDIR)$(mandir)/man1
480 install -d $(DESTDIR)$(docdir)
481 install -d $(DESTDIR)$(docdir)/examples
482 install -m 644 README CHANGES $(DESTDIR)$(docdir)
483 install -m 644 $(wildcard COPYING LICENSE) $(DESTDIR)$(docdir)
484 install -m 644 docs/examples/* $(DESTDIR)$(docdir)/examples
485
486 install: install-libs install-apps install-docs
487
488 docs:
489 bash scripts/build-docs.sh
490
491 docs-live:
492 bash scripts/build-docs-live.sh
493
494 docs-markdown:
495 bash scripts/build-docs-markdown.sh
496
497 docs-clean:
498 rm -rf build/docs
499 rm -rf build/venv-docs
500 rm -rf build/.doctrees
501
502 install-docs-html: docs
503 mkdir -p $(DESTDIR)$(docdir)
504 cp -r build/docs/* $(DESTDIR)$(docdir)
505
506 tarball:
507 bash scripts/archive.sh
508
509 # --- Clean and Default ---
510
511 WATCH_SRCS = $(shell find include source platform -type f -name '*.[ch]')
512 watch:
513 @ inotifywait -q -e modify $(WATCH_SRCS)
514
515 watch-recompile:
516 @ while ! inotifywait -q -e modify $(WATCH_SRCS) ; do time -p $(MAKE) ; done
517
518 java:
519 $(MAKE) -C platform/java build=$(build)
520
521 java-clean:
522 $(MAKE) -C platform/java build=$(build) clean
523
524 wasm:
525 $(MAKE) -C platform/wasm
526
527 wasm-clean:
528 $(MAKE) -C platform/wasm clean
529
530 extract-test:
531 $(MAKE) debug
532 $(MAKE) -C thirdparty/extract mutool=../../build/debug/mutool test-mutool
533
534 TAG_HDR_FILES=$(shell git ls-files | grep -v '^\(docs\|scripts\|generated\)' | grep '\.h$$')
535 TAG_SRC_FILES=$(shell git ls-files | grep -v '^\(docs\|scripts\|generated\)' | grep -v '\.h$$')
536
537 tags:
538 $(TAGS_CMD) --sort=no --c-kinds=+p-t $(TAG_SRC_FILES)
539 $(TAGS_CMD) -a --sort=no --c-kinds=+p-t $(TAG_HDR_FILES)
540 $(TAGS_CMD) -a --sort=no --c-kinds=t $(TAG_SRC_FILES) $(TAG_HDR_FILES)
541
542 find-try-return:
543 @ bash scripts/find-try-return.sh
544
545 cscope.files: $(shell find include source platform -name '*.[ch]')
546 @ echo $^ | tr ' ' '\n' > $@
547
548 cscope.out: cscope.files
549 cscope -b
550
551 all: libs apps extra-apps
552
553 clean:
554 rm -rf $(OUT)
555 nuke:
556 rm -rf build/*
557 rm -rf generated/resources/fonts/droid
558 rm -rf generated/resources/fonts/han
559 rm -rf generated/resources/fonts/noto
560 rm -rf generated/resources/fonts/sil
561
562 release:
563 $(MAKE) build=release
564 debug:
565 $(MAKE) build=debug
566 sanitize:
567 $(MAKE) build=sanitize
568
569 shared: shared-$(build)
570
571 shared-release:
572 $(MAKE) shared=yes build=release
573 shared-debug:
574 $(MAKE) shared=yes build=debug
575 shared-clean:
576 rm -rf build/shared-*
577
578 android: generate
579 ndk-build -j8 \
580 APP_BUILD_SCRIPT=platform/java/Android.mk \
581 APP_PROJECT_PATH=build/android \
582 APP_PLATFORM=android-16 \
583 APP_OPTIM=$(build)
584
585 # --- C++, Python and C#, and system installation ---
586
587 c++: c++-$(build)
588 python: python-$(build)
589 csharp: csharp-$(build)
590
591 c++-clean:
592 rm -rf platform/c++
593 python-clean:
594 rm -rf platform/python
595 csharp-clean:
596 rm -rf platform/csharp
597
598 # $(OUT) only contains the `shared-` infix if shared=yes and targets that
599 # require shared-libraries only work if shared=yes. So if this is not the case,
600 # we re-run ourselves with `$(MAKE) shared=yes $@`.
601
602 ifeq ($(shared),yes)
603
604 # We can build targets that require shared libraries and use $(OUT).
605
606 # Assert that $(OUT) contains `shared`.
607 ifeq ($(findstring shared, $(OUT)),)
608 $(error OUT=$(OUT) does not contain shared)
609 endif
610
611 # C++, Python and C# shared libraries.
612 #
613 # To disable automatic use of a venv, use `make VENV_FLAG= ...` or `VENV_FLAG=
614 # make ...`.
615 #
616 VENV_FLAG ?= --venv
617 c++-%: shared-%
618 ./scripts/mupdfwrap.py $(VENV_FLAG) -d $(OUT) -b 01
619 python-%: c++-%
620 ./scripts/mupdfwrap.py $(VENV_FLAG) -d $(OUT) -b 23
621 csharp-%: c++-%
622 ./scripts/mupdfwrap.py $(VENV_FLAG) -d $(OUT) -b --csharp 23
623
624 # Installs of C, C++, Python and C# shared libraries
625 #
626 # We only allow install of shared libraries if we are not using any libraries
627 # in thirdparty/.
628 install-shared-check:
629 ifneq ($(shared),yes)
630 @ echo "install-shared-* requires that shared=yes."
631 @ false
632 endif
633 ifneq ($(USE_SYSTEM_LIBS),yes)
634 @ echo "install-shared-* requires that USE_SYSTEM_LIBS=yes."
635 @ false
636 endif
637
638 install-shared-c: install-shared-check install-libs install-headers
639
640 install-shared-c++: install-shared-c c++
641 install -m 644 platform/c++/include/mupdf/*.h $(DESTDIR)$(incdir)/mupdf
642 install -m $(SO_INSTALL_MODE) $(OUT)/libmupdfcpp.$(SO)$(SO_VERSION) $(DESTDIR)$(libdir)/
643 ifneq ($(OS),OpenBSD)
644 ln -sf libmupdfcpp.$(SO)$(SO_VERSION) $(DESTDIR)$(libdir)/libmupdfcpp.$(SO)
645 ln -sf libmupdfcpp.$(SO)$(SO_VERSION) $(DESTDIR)$(libdir)/libmupdfcpp.$(SO)$(SO_VERSION_MAJOR)
646 endif
647
648 install-shared-python: install-shared-c++ python
649 install -d $(DESTDIR)$(pydir)/mupdf
650 install -m $(SO_INSTALL_MODE) $(OUT)/_mupdf.$(SO) $(DESTDIR)$(pydir)/mupdf
651 install -m 644 $(OUT)/mupdf.py $(DESTDIR)$(pydir)/mupdf/__init__.py
652
653 else
654
655 # $(shared) != yes. For all targets that require a shared-library build and use
656 # $(OUT), we need to re-run ourselves with shared=yes.
657 install-% c++-% python-% csharp-%:
658 # Running: $(MAKE) shared=yes $@
659 $(MAKE) shared=yes $@
660
661 endif
662
663 .PHONY: all clean nuke install third libs apps generate tags docs
664 .PHONY: shared shared-debug shared-clean
665 .PHONY: c++-% python-% csharp-%
666 .PHONY: c++-clean python-clean csharp-clean