Makefile 21 KB

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