diff options
| author | Ethan Morgan <ethan@gweithio.com> | 2026-02-14 16:44:06 +0000 |
|---|---|---|
| committer | Ethan Morgan <ethan@gweithio.com> | 2026-02-14 16:44:06 +0000 |
| commit | 54409423f767d8b1cf30cb7d0efca6b4ca138823 (patch) | |
| tree | d915ac7828703ce4b963efdd9728a1777ba18c1e /vcpkg/ports/libmupdf | |
Diffstat (limited to 'vcpkg/ports/libmupdf')
| -rw-r--r-- | vcpkg/ports/libmupdf/CMakeLists.txt | 154 | ||||
| -rw-r--r-- | vcpkg/ports/libmupdf/portfile.cmake | 63 | ||||
| -rw-r--r-- | vcpkg/ports/libmupdf/unofficial-libmupdf-config.cmake.in | 14 | ||||
| -rw-r--r-- | vcpkg/ports/libmupdf/vcpkg.json | 38 |
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" + ] + } + } +} |