# Configuration for the Makefile # We use $OS from environment if set. ifeq ($(OS),) OS := $(shell uname) endif WARNING_CFLAGS := -Wall -Wsign-compare # Feature configuration options build_suffix := ifeq ($(brotli),no) CFLAGS += -DFZ_ENABLE_BROTLI=0 USE_BROTLI := no else USE_BROTLI := yes endif ifeq ($(mujs),no) CFLAGS += -DFZ_ENABLE_JS=0 USE_MUJS := no else USE_MUJS := yes endif ifeq ($(html),no) USE_HARFBUZZ := no USE_GUMBO := no CFLAGS += -DFZ_ENABLE_HTML_ENGINE=0 CFLAGS += -DFZ_ENABLE_HTML=0 CFLAGS += -DFZ_ENABLE_EPUB=0 CFLAGS += -DFZ_ENABLE_FB2=0 CFLAGS += -DFZ_ENABLE_MOBI=0 CFLAGS += -DFZ_ENABLE_OFFICE=0 CFLAGS += -DFZ_ENABLE_TXT=0 else USE_HARFBUZZ := yes USE_GUMBO := yes endif ifeq ($(xps),no) CFLAGS += -DFZ_ENABLE_XPS=0 endif ifeq ($(svg),no) CFLAGS += -DFZ_ENABLE_SVG=0 endif ifeq ($(extract),no) USE_EXTRACT := no CFLAGS += -DFZ_ENABLE_DOCX_OUTPUT=0 else USE_EXTRACT := yes endif ifeq ($(tesseract),yes) build_suffix := $(build_suffix)-tesseract USE_TESSERACT := yes endif ifeq ($(barcode),yes) build_suffix := $(build_suffix)-barcode USE_ZXINGCPP := yes else CFLAGS += -DFZ_ENABLE_BARCODE=0 endif ifeq ($(tofu),yes) build_suffix := $(build_suffix)-tofu CFLAGS += -DTOFU endif ifeq ($(tofu_cjk),yes) build_suffix := $(build_suffix)-tofu_cjk CFLAGS += -DTOFU_CJK endif ifeq ($(tofu_cjk_ext),yes) build_suffix := $(build_suffix)-tofu_cjk_ext CFLAGS += -DTOFU_CJK_EXT endif ifeq ($(tofu_cjk_lang),yes) build_suffix := $(build_suffix)-tofu_cjk_lang CFLAGS += -DTOFU_CJK_LANG endif ifeq ($(archive),yes) build_suffix := $(build_suffix)-archive USE_LIBARCHIVE := yes endif ifeq ($(commercial),yes) build_suffix := $(build_suffix)-commercial CFLAGS += -DHAVE_SMARTOFFICE HAVE_SMARTOFFICE := yes endif # System specific features ifeq ($(findstring -fembed-bitcode,$(XCFLAGS)),) # clang does not support these in combination with -fembed-bitcode CFLAGS += -ffunction-sections -fdata-sections endif ifeq ($(OS),Darwin) LDREMOVEUNREACH := -Wl,-dead_strip SO := dylib else LDREMOVEUNREACH := -Wl,--gc-sections SO := so endif SANITIZE_FLAGS += -fsanitize=address SANITIZE_FLAGS += -fsanitize=leak ifeq ($(shared),yes) ifeq ($(findstring shared-, $(build_prefix)),) override build_prefix := $(build_prefix)shared- endif LIB_CFLAGS = -fPIC ifeq ($(OS),Darwin) LIB_LDFLAGS = -dynamiclib else ifeq ($(OS),wasm) LIB_LDFLAGS = -shared -sSIDE_MODULE EXE_LDFLAGS = -sMAIN_MODULE else ifeq ($(OS),wasm-mt) LIB_LDFLAGS = -shared -sSIDE_MODULE EXE_LDFLAGS = -sMAIN_MODULE else ifeq ($(OS),pyodide) LIB_LDFLAGS = -shared -sSIDE_MODULE EXE_LDFLAGS = -sMAIN_MODULE # Pyodide's ld does not support -b so we cannot use it to create object # files containing font data, so leave HAVE_OBJCOPY unset. And we need # extra memory when linking. LDFLAGS += -sTOTAL_MEMORY=48MB else ifeq ($(OS),Linux) LIB_LDFLAGS = -shared -Wl,-soname,$(notdir $@) else LIB_LDFLAGS = -shared endif else LIB_CFLAGS = LIB_LDFLAGS = endif ifeq ($(build),debug) CFLAGS += -pipe -g LDFLAGS += -g else ifeq ($(build),release) CFLAGS += -pipe -O2 -DNDEBUG LDFLAGS += $(LDREMOVEUNREACH) -Wl,-s else ifeq ($(build),small) CFLAGS += -pipe -Os -DNDEBUG LDFLAGS += $(LDREMOVEUNREACH) -Wl,-s else ifeq ($(build),valgrind) CFLAGS += -pipe -O2 -DNDEBUG -DPACIFY_VALGRIND LDFLAGS += $(LDREMOVEUNREACH) -Wl,-s else ifeq ($(build),sanitize) CFLAGS += -pipe -g $(SANITIZE_FLAGS) LDFLAGS += -g $(SANITIZE_FLAGS) else ifeq ($(build),sanitize-release) CFLAGS += -pipe -O2 -DNDEBUG $(SANITIZE_FLAGS) LDFLAGS += $(LDREMOVEUNREACH) -Wl,-s $(SANITIZE_FLAGS) else ifeq ($(build),profile) CFLAGS += -pipe -O2 -DNDEBUG -pg LDFLAGS += -pg else ifeq ($(build),coverage) CFLAGS += -pipe -g -pg -fprofile-arcs -ftest-coverage LIBS += -lgcov else ifeq ($(build),native) CFLAGS += -pipe -O2 -DNDEBUG -march=native LDFLAGS += $(LDREMOVEUNREACH) -Wl,-s else ifeq ($(build),memento) CFLAGS += -pipe -g -DMEMENTO -DMEMENTO_MUPDF_HACKS LDFLAGS += -g -rdynamic ifneq ($(HAVE_LIBDL),no) CFLAGS += -DHAVE_LIBDL ifeq ($(OS),OpenBSD) LIBS += -L /usr/local/lib -l execinfo else LIBS += -ldl endif endif else ifeq ($(build),gperf) CFLAGS += -pipe -O2 -DNDEBUG -DGPERF LIBS += -lprofiler else $(error unknown build setting: '$(build)') endif # Default system libraries SYS_FREETYPE_LIBS := -lfreetype2 SYS_HARFBUZZ_LIBS := -lharfbuzz SYS_JBIG2DEC_LIBS := -ljbig2dec SYS_JPEGXR_LIBS := -ljpegxr SYS_LCMS2_LIBS := -llcms2 SYS_LIBJPEG_LIBS := -ljpeg SYS_MUJS_LIBS := -lmujs SYS_OPENJPEG_LIBS := -lopenjp2 SYS_ZLIB_LIBS := -lz SYS_BROTLI_LIBS := -lbrotlidec -lbrotlienc SYS_TESSERACT_LIBS := -ltesseract SYS_LEPTONICA_LIBS := -llept SYS_LIBARCHIVE_LIBS := -larchive SYS_ZXINGCPP_LIBS := -lzxing-cpp -lzint ifneq "$(CLUSTER)" "" CFLAGS += -DCLUSTER endif ifeq ($(OS),Darwin) HAVE_GLUT := yes SYS_GLUT_CFLAGS := -Wno-deprecated-declarations SYS_GLUT_LIBS := -framework GLUT -framework OpenGL CC = xcrun cc AR = xcrun ar LD = xcrun ld RANLIB = xcrun ranlib ifneq ($(ARCHFLAGS),) $(warning "MacOS with ARCHFLAGS set. Assuming we are building for arm64, and setting HAVE_LIBCRYPTO to no.") HAVE_LIBCRYPTO := no else ifeq (, $(shell command -v pkg-config)) $(warning "No pkg-config found, install it for proper integration of libcrypto") else HAVE_LIBCRYPTO := $(shell pkg-config --exists 'libcrypto >= 1.1.0' && echo yes) ifeq ($(HAVE_LIBCRYPTO),yes) LIBCRYPTO_CFLAGS := $(shell pkg-config --cflags libcrypto) -DHAVE_LIBCRYPTO LIBCRYPTO_LIBS := $(shell pkg-config --libs libcrypto) endif endif else ifeq ($(OS),Linux) HAVE_OBJCOPY := yes endif ifeq ($(OS),OpenBSD) LDFLAGS += -pthread endif ifeq ($(shell pkg-config --exists 'freetype2 >= 18.3.12' && echo yes),yes) SYS_FREETYPE_CFLAGS := $(shell pkg-config --cflags freetype2) SYS_FREETYPE_LIBS := $(shell pkg-config --libs freetype2) endif ifeq ($(shell pkg-config --exists 'gumbo >= 0.10.0' && echo yes),yes) SYS_GUMBO_CFLAGS := $(shell pkg-config --cflags gumbo) SYS_GUMBO_LIBS := $(shell pkg-config --libs gumbo) endif ifeq ($(shell pkg-config --exists 'harfbuzz >= 2.0.0' && echo yes),yes) SYS_HARFBUZZ_CFLAGS := $(shell pkg-config --cflags harfbuzz) SYS_HARFBUZZ_LIBS := $(shell pkg-config --libs harfbuzz) endif ifeq ($(shell pkg-config --exists lcms2 && echo yes),yes) SYS_LCMS2_CFLAGS := $(shell pkg-config --cflags lcms2) SYS_LCMS2_LIBS := $(shell pkg-config --libs lcms2) endif ifeq ($(shell pkg-config --exists libjpeg && echo yes),yes) SYS_LIBJPEG_CFLAGS := $(shell pkg-config --cflags libjpeg) SYS_LIBJPEG_LIBS := $(shell pkg-config --libs libjpeg) endif ifeq ($(shell pkg-config --exists 'libopenjp2 >= 2.1.0' && echo yes),yes) SYS_OPENJPEG_CFLAGS := $(shell pkg-config --cflags libopenjp2) SYS_OPENJPEG_LIBS := $(shell pkg-config --libs libopenjp2) endif ifeq ($(shell pkg-config --exists 'zlib >= 1.2.6' && echo yes),yes) SYS_ZLIB_CFLAGS := $(shell pkg-config --cflags zlib) SYS_ZLIB_LIBS := $(shell pkg-config --libs zlib) endif ifeq ($(shell pkg-config --exists 'libbrotlidec libbrotlienc >= 0.6.0' && echo yes),yes) SYS_BROTLI_CFLAGS := $(shell pkg-config --cflags libbrotlidec libbrotlienc) SYS_BROTLI_LIBS := $(shell pkg-config --libs libbrotlidec libbrotlienc) endif HAVE_SYS_LEPTONICA := $(shell pkg-config --exists 'lept >= 1.7.4' && echo yes) ifeq ($(HAVE_SYS_LEPTONICA),yes) SYS_LEPTONICA_CFLAGS := $(shell pkg-config --cflags lept) SYS_LEPTONICA_LIBS := $(shell pkg-config --libs lept) endif HAVE_SYS_TESSERACT := $(shell pkg-config --exists 'tesseract >= 4.0.0' && echo yes) ifeq ($(HAVE_SYS_TESSERACT),yes) SYS_TESSERACT_CFLAGS := $(shell pkg-config --cflags tesseract) SYS_TESSERACT_LIBS := $(shell pkg-config --libs tesseract) endif HAVE_SYS_LIBARCHIVE := $(shell pkg-config --exists 'libarchive' && echo yes) ifeq ($(HAVE_SYS_LIBARCHIVE),yes) SYS_LIBARCHIVE_CFLAGS := $(shell pkg-config --cflags libarchive) SYS_LIBARCHIVE_LIBS := $(shell pkg-config --libs libarchive) endif HAVE_SYS_ZXINGCPP := $(shell pkg-config --exists 'zxing >= 2.0.0' && echo yes) ifeq ($(HAVE_SYS_ZXINGCPP),yes) SYS_ZXINGCPP_CFLAGS := $(shell pkg-config --cflags zxing) SYS_ZXINGCPP_LIBS := $(shell pkg-config --libs zxing) endif HAVE_SYS_CURL := $(shell pkg-config --exists libcurl && echo yes) ifeq ($(HAVE_SYS_CURL),yes) SYS_CURL_CFLAGS := $(shell pkg-config --cflags libcurl) SYS_CURL_LIBS := $(shell pkg-config --libs libcurl) endif ifeq ($(HAVE_GLUT),) HAVE_GLUT := $(shell pkg-config --exists gl x11 xrandr && echo yes) endif ifeq ($(HAVE_GLUT),yes) SYS_GL_CFLAGS := $(shell pkg-config --cflags gl x11 xrandr) SYS_GL_LIBS := $(shell pkg-config --libs gl x11 xrandr) ifeq ($(shell pkg-config --exists glut && echo yes),yes) SYS_GLUT_CFLAGS := $(shell pkg-config --cflags glut) SYS_GLUT_LIBS := $(shell pkg-config --libs glut) else SYS_GLUT_CFLAGS := SYS_GLUT_LIBS := -lglut endif endif ifeq ($(HAVE_X11),) HAVE_X11 := $(shell pkg-config --exists x11 xext && echo yes) endif ifeq ($(HAVE_X11),yes) X11_CFLAGS := $(shell pkg-config --cflags x11 xext) X11_LIBS := $(shell pkg-config --libs x11 xext) endif ifeq ($(HAVE_LIBCRYPTO),) HAVE_LIBCRYPTO := $(shell pkg-config --exists 'libcrypto >= 1.1.0' && echo yes) endif ifeq ($(HAVE_LIBCRYPTO),yes) LIBCRYPTO_CFLAGS := $(shell pkg-config --cflags libcrypto) -DHAVE_LIBCRYPTO LIBCRYPTO_LIBS := $(shell pkg-config --libs libcrypto) endif HAVE_PTHREAD := yes ifeq ($(HAVE_PTHREAD),yes) PTHREAD_CFLAGS := PTHREAD_LIBS := -lpthread endif endif # The following section has various cross compilation configurations. # # Invoke these as: # make OS=wasm # # This does rely on the generated directory being populated with the font files. # Run 'make generate' before doing the cross compile. ifeq "$(OS)" "wasm" build_prefix += wasm/ CC = emcc CXX = em++ AR = emar HAVE_GLUT=no HAVE_X11=no HAVE_OBJCOPY=no HAVE_LIBCRYPTO=no CFLAGS += -mno-nontrapping-fptoint CFLAGS += -fwasm-exceptions CFLAGS += -sSUPPORT_LONGJMP=wasm endif ifeq "$(OS)" "wasm-mt" build_prefix += wasm-mt/ CC = emcc CXX = em++ AR = emar HAVE_GLUT=no HAVE_X11=no HAVE_OBJCOPY=no HAVE_LIBCRYPTO=no CFLAGS += -mno-nontrapping-fptoint CFLAGS += -fwasm-exceptions CFLAGS += -sSUPPORT_LONGJMP=wasm CFLAGS += -pthread endif ifeq "$(OS)" "pyodide" build_prefix += $(OS)/ # We use the provided $CC and $CXX. AR = emar HAVE_GLUT=no HAVE_X11=no HAVE_OBJCOPY=no HAVE_LIBCRYPTO=no CFLAGS += -pthread endif