aboutsummaryrefslogtreecommitdiff
path: root/vcpkg/ports/libmupdf
diff options
context:
space:
mode:
authorEthan Morgan <ethan@gweithio.com>2026-02-14 16:44:06 +0000
committerEthan Morgan <ethan@gweithio.com>2026-02-14 16:44:06 +0000
commit54409423f767d8b1cf30cb7d0efca6b4ca138823 (patch)
treed915ac7828703ce4b963efdd9728a1777ba18c1e /vcpkg/ports/libmupdf
move to own git serverHEADmaster
Diffstat (limited to 'vcpkg/ports/libmupdf')
-rw-r--r--vcpkg/ports/libmupdf/CMakeLists.txt154
-rw-r--r--vcpkg/ports/libmupdf/portfile.cmake63
-rw-r--r--vcpkg/ports/libmupdf/unofficial-libmupdf-config.cmake.in14
-rw-r--r--vcpkg/ports/libmupdf/vcpkg.json38
4 files changed, 269 insertions, 0 deletions
diff --git a/vcpkg/ports/libmupdf/CMakeLists.txt b/vcpkg/ports/libmupdf/CMakeLists.txt
new file mode 100644
index 0000000..39732b9
--- /dev/null
+++ b/vcpkg/ports/libmupdf/CMakeLists.txt
@@ -0,0 +1,154 @@
+cmake_minimum_required(VERSION 3.10)
+project(libmupdf)
+
+# configuration
+
+set(BIN2COFF_EXECUTABLE "bin2coff" CACHE STRING "Host executable for converter (Windows only)")
+
+option(ENABLE_OCR "Build with OCR" OFF)
+
+# dependencies
+
+find_package(freetype CONFIG REQUIRED)
+find_package(harfbuzz CONFIG REQUIRED)
+find_package(JPEG REQUIRED)
+find_package(OpenJPEG CONFIG REQUIRED)
+find_package(unofficial-gumbo CONFIG REQUIRED)
+find_package(ZLIB REQUIRED)
+
+find_path(JBIG2DEC_INCLUDE_DIR NAMES jbig2.h REQUIRED)
+find_library(JBIG2DEC_LIBRARY NAMES jbig2decd jbig2dec NAMES_PER_DIR REQUIRED)
+
+if (ENABLE_OCR)
+ find_package(Leptonica CONFIG REQUIRED)
+ find_package(Tesseract CONFIG REQUIRED)
+endif()
+
+# generation of font resources
+
+if (CMAKE_HOST_WIN32 AND WIN32)
+ if(BIN2COFF_EXECUTABLE STREQUAL "bin2coff")
+ # cf. scripts/fontdump.nmake
+ add_executable(bin2coff EXCLUDE_FROM_ALL scripts/bin2coff.c)
+ install(TARGETS bin2coff DESTINATION manual-tools/libmupdf)
+ endif()
+ # cf. scripts/bin2coff.c
+ if(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86")
+ set(coff_arch "Win32")
+ elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "ARM64")
+ set(coff_arch "aarch64")
+ else()
+ set(coff_arch "x64")
+ endif()
+endif()
+
+# cf. FONT_BIN in Makefile
+# Legal notices should be picked by the portfile.
+file(GLOB fonts
+ "${PROJECT_SOURCE_DIR}/resources/fonts/urw/*.cff"
+ "${PROJECT_SOURCE_DIR}/resources/fonts/han/*.ttc"
+ "${PROJECT_SOURCE_DIR}/resources/fonts/droid/DroidSansFallbackFull.ttf"
+ "${PROJECT_SOURCE_DIR}/resources/fonts/droid/DroidSansFallback.ttf"
+ "${PROJECT_SOURCE_DIR}/resources/fonts/noto/*.otf"
+ "${PROJECT_SOURCE_DIR}/resources/fonts/noto/*.ttf"
+ "${PROJECT_SOURCE_DIR}/resources/fonts/sil/*.cff"
+)
+set(FONT_SOURCES "")
+file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/resources")
+foreach(font IN LISTS fonts)
+ cmake_path(GET font FILENAME name)
+ if (CMAKE_HOST_WIN32 AND WIN32)
+ string(REGEX REPLACE "[-.]" "_" identifier "_binary_${name}")
+ set(font_object "${CMAKE_CURRENT_BINARY_DIR}/resources/${name}.obj")
+ set_source_files_properties("${font_object}" PROPERTIES EXTERNAL_OBJECT 1)
+ add_custom_command(OUTPUT "${font_object}"
+ COMMAND "${BIN2COFF_EXECUTABLE}" "${font}" "${font_object}" "${identifier}" ${coff_arch}
+ VERBATIM
+ )
+ list(APPEND FONT_SOURCES "${font_object}")
+ else()
+ set(font_c_source "${CMAKE_CURRENT_BINARY_DIR}/resources/${name}.c")
+ add_custom_command(OUTPUT "${font_c_source}"
+ COMMAND bash -c "bash ${PROJECT_SOURCE_DIR}/scripts/hexdump.sh '${font}' > '${font_c_source}'"
+ VERBATIM
+ )
+ list(APPEND FONT_SOURCES "${font_c_source}")
+ endif()
+endforeach()
+
+# libmupdf
+
+# cf. Makefile, libmupdf.vcxproj
+file(GLOB_RECURSE SOURCES
+ "source/fitz/*.c" # omitting unused *.cpp
+ "source/pdf/*.c"
+ "source/xps/*.c"
+ "source/svg/*.c"
+ "source/html/*.c"
+ "source/reflow/*.c"
+ "source/cbz/*.c"
+)
+
+if (ENABLE_OCR)
+ list(APPEND SOURCES "source/fitz/tessocr.cpp")
+endif()
+
+add_library(libmupdf ${SOURCES} ${FONT_SOURCES})
+set_target_properties(libmupdf PROPERTIES PREFIX "")
+target_include_directories(libmupdf
+ PUBLIC
+ $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include>
+ $<INSTALL_INTERFACE:include>
+ PRIVATE
+ ${JBIG2DEC_INCLUDE_DIR}
+ ${Leptonica_INCLUDE_DIRS}
+)
+target_compile_definitions(libmupdf
+ INTERFACE
+ $<$<BOOL:${BUILD_SHARED_LIBS}>:FZ_DLL_CLIENT>
+ PRIVATE
+ $<$<BOOL:${BUILD_SHARED_LIBS}>:FZ_DLL>
+ FZ_ENABLE_BROTLI=0 # needs brotli
+ FZ_ENABLE_DOCX_OUTPUT=0 # needs https://github.com/ArtifexSoftware/extract
+ FZ_ENABLE_ICC=0 # needs lcsm2
+ FZ_ENABLE_JS=0 # needs mujs
+ FZ_ENABLE_ODT_OUTPUT=0 # needs FZ_ENABLE_DOCX_OUTPUT
+ MEMENTO_MUPDF_HACKS
+ SHARE_JPEG
+ $<$<NOT:$<BOOL:${ENABLE_OCR}>>:OCR_DISABLED>
+ $<$<BOOL:${ENABLE_OCR}>:HAVE_TESSERACT>
+ $<$<BOOL:${ENABLE_OCR}>:HAVE_LEPTONICA>
+)
+target_link_libraries(libmupdf
+ PRIVATE
+ freetype
+ harfbuzz::harfbuzz
+ ${JBIG2DEC_LIBRARY}
+ JPEG::JPEG
+ openjp2
+ unofficial::gumbo::gumbo
+ ZLIB::ZLIB
+ $<$<BOOL:${ENABLE_OCR}>:leptonica>
+ $<$<BOOL:${ENABLE_OCR}>:Tesseract::libtesseract>
+ $<$<BOOL:${ANDROID}>:log>
+)
+
+# installation
+
+install(DIRECTORY include/mupdf
+ DESTINATION include
+)
+install(TARGETS libmupdf
+ EXPORT unofficial-libmupdf-targets
+ RUNTIME DESTINATION bin
+ LIBRARY DESTINATION lib
+ ARCHIVE DESTINATION lib
+)
+install(EXPORT unofficial-libmupdf-targets
+ NAMESPACE unofficial::libmupdf::
+ DESTINATION share/unofficial-libmupdf
+)
+configure_file(unofficial-libmupdf-config.cmake.in unofficial-libmupdf-config.cmake @ONLY)
+install(FILES "${CMAKE_CURRENT_BINARY_DIR}/unofficial-libmupdf-config.cmake"
+ DESTINATION share/unofficial-libmupdf
+)
diff --git a/vcpkg/ports/libmupdf/portfile.cmake b/vcpkg/ports/libmupdf/portfile.cmake
new file mode 100644
index 0000000..79dd19c
--- /dev/null
+++ b/vcpkg/ports/libmupdf/portfile.cmake
@@ -0,0 +1,63 @@
+if(VCPKG_TARGET_IS_WINDOWS)
+ vcpkg_check_linkage(ONLY_STATIC_LIBRARY) # incomplete DLL exports
+endif()
+
+vcpkg_from_github(
+ OUT_SOURCE_PATH SOURCE_PATH
+ REPO ArtifexSoftware/mupdf
+ REF "${VERSION}"
+ SHA512 c0f802fd2b181587df1748a8db7163bbcd3951b943d1321afcff56fccb515dfe99061288bc691323d0854305a1d4205c99457954b10439adb122975429cbce72
+ HEAD_REF master
+)
+file(COPY "${CMAKE_CURRENT_LIST_DIR}/CMakeLists.txt" DESTINATION "${SOURCE_PATH}")
+file(COPY "${CMAKE_CURRENT_LIST_DIR}/unofficial-libmupdf-config.cmake.in" DESTINATION "${SOURCE_PATH}")
+
+# 1.26.10 lacks bin2coff arm64 changes in host tool.
+vcpkg_download_distfile(BIN2COFF_C
+ URLS "https://github.com/ArtifexSoftware/mupdf/raw/9c1af80cea03987b147b0dffd944075f3b3cf4cb/scripts/bin2coff.c"
+ FILENAME "ArtifexSoftware-mupdf-bin2coff-9c1af80.c"
+ SHA512 9f0e70cc0ade3a39c46425d968ff6493d47f36b9bfef2efbb0ae62aef29f71952690ab9716084c0161c7184cd654abc57c2b2f6a4cc3f9e184863e7bb7b64f52
+)
+file(COPY_FILE "${BIN2COFF_C}" "${SOURCE_PATH}/scripts/bin2coff.c")
+
+vcpkg_check_features(
+ OUT_FEATURE_OPTIONS OPTIONS
+ FEATURES
+ ocr ENABLE_OCR
+)
+
+if(VCPKG_CROSSCOMPILING AND VCPKG_HOST_IS_WINDOWS AND VCPKG_TARGET_IS_WINDOWS)
+ list(APPEND OPTIONS "-DBIN2COFF_EXECUTABLE=${CURRENT_HOST_INSTALLED_DIR}/manual-tools/${PORT}/bin2coff.exe")
+endif()
+
+vcpkg_cmake_configure(
+ SOURCE_PATH "${SOURCE_PATH}"
+ OPTIONS
+ ${OPTIONS}
+)
+vcpkg_cmake_install()
+vcpkg_copy_pdbs()
+vcpkg_cmake_config_fixup(PACKAGE_NAME "unofficial-libmupdf")
+
+file(REMOVE_RECURSE "${CURRENT_PACKAGES_DIR}/debug/include")
+file(REMOVE_RECURSE "${CURRENT_PACKAGES_DIR}/debug/manual-tools")
+
+set(font_licenses "")
+foreach(item IN ITEMS urw/OFL.txt noto/COPYING han/LICENSE.txt droid/NOTICE sil/OFL.txt)
+ string(REPLACE "/" " " new_name "# Fonts - ${item}")
+ set(file "${CURRENT_BUILDTREES_DIR}/${new_name}")
+ file(COPY_FILE "${SOURCE_PATH}/resources/fonts/${item}" "${file}")
+ list(APPEND font_licenses "${file}")
+endforeach()
+
+vcpkg_install_copyright(
+ # Cf. source/fitz/noto.c
+ COMMENT [[
+This software includes Base 14 PDF fonts from URW, Noto fonts from Google.
+Source Han Serif from Adobe for CJK, DroidSansFallback from Android for CJK,
+Charis SIL from SIL.
+]]
+ FILE_LIST
+ "${SOURCE_PATH}/COPYING"
+ ${font_licenses}
+)
diff --git a/vcpkg/ports/libmupdf/unofficial-libmupdf-config.cmake.in b/vcpkg/ports/libmupdf/unofficial-libmupdf-config.cmake.in
new file mode 100644
index 0000000..7c49dda
--- /dev/null
+++ b/vcpkg/ports/libmupdf/unofficial-libmupdf-config.cmake.in
@@ -0,0 +1,14 @@
+if(NOT "@BUILD_SHARED_LIBS@")
+ include(CMakeFindDependencyMacro)
+ find_dependency(freetype CONFIG)
+ find_dependency(harfbuzz CONFIG)
+ find_dependency(JPEG)
+ find_dependency(OpenJPEG CONFIG)
+ find_dependency(unofficial-gumbo CONFIG)
+ find_dependency(ZLIB)
+ if("@ENABLE_OCR@")
+ find_dependency(Leptonica CONFIG)
+ find_dependency(Tesseract CONFIG)
+ endif()
+endif()
+include("${CMAKE_CURRENT_LIST_DIR}/unofficial-libmupdf-targets.cmake")
diff --git a/vcpkg/ports/libmupdf/vcpkg.json b/vcpkg/ports/libmupdf/vcpkg.json
new file mode 100644
index 0000000..0140f47
--- /dev/null
+++ b/vcpkg/ports/libmupdf/vcpkg.json
@@ -0,0 +1,38 @@
+{
+ "name": "libmupdf",
+ "version": "1.26.10",
+ "description": "A lightweight PDF, XPS, and E-book library",
+ "homepage": "https://mupdf.com/core",
+ "documentation": "https://mupdf.readthedocs.io/",
+ "license": "AGPL-3.0-only",
+ "dependencies": [
+ "freetype",
+ "gumbo",
+ "harfbuzz",
+ "jbig2dec",
+ "libjpeg-turbo",
+ {
+ "name": "libmupdf",
+ "host": true
+ },
+ "openjpeg",
+ {
+ "name": "vcpkg-cmake",
+ "host": true
+ },
+ {
+ "name": "vcpkg-cmake-config",
+ "host": true
+ },
+ "zlib"
+ ],
+ "features": {
+ "ocr": {
+ "description": "Enable OCR support",
+ "dependencies": [
+ "leptonica",
+ "tesseract"
+ ]
+ }
+ }
+}