[libmupdf] Update, fix CMake (#47698)

This commit is contained in:
Kai Pastor
2025-10-13 16:04:32 +02:00
committed by GitHub
parent 67c3c209ac
commit 4b81ab323a
15 changed files with 249 additions and 129 deletions

View File

@@ -1,93 +1,154 @@
cmake_minimum_required(VERSION 3.9)
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)
set(CMAKE_DEBUG_POSTFIX d)
# dependencies
if(WIN32)
execute_process(
COMMAND "cmd.exe" "/c" "platform\\win32\\generate.bat"
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
)
else()
find_program(MAKE_EXE NAMES make REQUIRED)
execute_process(
COMMAND ${MAKE_EXE} "generate"
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
)
endif()
find_package(freetype NO_MODULE REQUIRED)
find_package(freetype CONFIG REQUIRED)
find_package(harfbuzz CONFIG REQUIRED)
find_package(JPEG REQUIRED)
find_path(HARFBUZZ_INCLUDE hb.h PATH_SUFFIXES harfbuzz)
find_library(HARFBUZZ_LIBRARIES harfbuzz)
find_package(ZLIB REQUIRED)
find_package(OpenJPEG CONFIG REQUIRED)
find_library(JBIG2DEC_LIB NAMES jbig2decd jbig2dec)
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()
file(GLOB_RECURSE SOURCES "source/*.c" "generated/*.c" "source/*.h")
list(FILTER SOURCES EXCLUDE REGEX "source/tools/[a-z]*\\.c$")
list(FILTER SOURCES EXCLUDE REGEX "source/tests/.*.c$")
list(FILTER SOURCES EXCLUDE REGEX "source/fitz/output-docx.c")
# 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})
if(WIN32)
target_compile_definitions(libmupdf PRIVATE -DSHARE_JPEG -DFZ_ENABLE_JS=0 -DFZ_ENABLE_ICC=0 -DMEMENTO_MUPDF_HACKS -DFZ_ENABLE_DOCX_OUTPUT=0 -DFZ_ENABLE_ODT_OUTPUT=0)
else()
target_compile_definitions(libmupdf PRIVATE -DHAVE_PTHREAD=1 -DSHARE_JPEG -DFZ_ENABLE_JS=0 -DFZ_ENABLE_ICC=0 -DMEMENTO_MUPDF_HACKS -DFZ_ENABLE_DOCX_OUTPUT=0 -DFZ_ENABLE_ODT_OUTPUT=0)
endif()
if (ENABLE_OCR)
target_compile_definitions(libmupdf PRIVATE -DHAVE_TESSERACT=1 -DHAVE_LEPTONICA=1)
else()
target_compile_definitions(libmupdf PRIVATE -DOCR_DISABLED=1)
endif()
add_library(libmupdf ${SOURCES} ${FONT_SOURCES})
set_target_properties(libmupdf PROPERTIES PREFIX "")
target_include_directories(libmupdf
PUBLIC
include
PRIVATE
generated
${JPEG_INCLUDE_DIR}
${HARFBUZZ_INCLUDE}
)
if (ENABLE_OCR)
target_include_directories(libmupdf
$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include>
PRIVATE
${JBIG2DEC_INCLUDE_DIR}
${Leptonica_INCLUDE_DIRS}
)
endif()
target_link_libraries(libmupdf PRIVATE
openjp2
freetype
${JPEG_LIBRARIES}
${HARFBUZZ_LIBRARIES}
${JBIG2DEC_LIB}
ZLIB::ZLIB
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
)
if(BUILD_EXAMPLES)
add_executable(mu-office-test source/tests/mu-office-test.c)
target_link_libraries(mu-office-test PRIVATE libmupdf)
endif()
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
)

View File

@@ -1,20 +0,0 @@
diff --git a/Makethird b/Makethird
index f9c7896..63799b1 100644
--- a/Makethird
+++ b/Makethird
@@ -253,6 +253,7 @@ endif
# --- EXTRACT ---
+ifeq (0, 1)
THIRD_CFLAGS += $(EXTRACT_CFLAGS)
THIRD_LIBS += $(EXTRACT_LIBS)
THIRD_SRC += $(EXTRACT_SRC)
@@ -283,6 +284,7 @@ thirdparty/extract/src/odt_template.c: thirdparty/extract/src/template.odt third
@touch $@
generate: thirdparty/extract/src/docx_template.c
+endif
# --- LIBARCHIVE ---

View File

@@ -1,22 +0,0 @@
diff --git a/source/fitz/geometry.c b/source/fitz/geometry.c
index 473d1dc..b02ab39 100644
--- a/source/fitz/geometry.c
+++ b/source/fitz/geometry.c
@@ -29,6 +29,8 @@
#define MAX4(a,b,c,d) fz_max(fz_max(a,b), fz_max(c,d))
#define MIN4(a,b,c,d) fz_min(fz_min(a,b), fz_min(c,d))
+#define MY_NAN (0.0 / 0.0)
+
/* A useful macro to add with overflow detection and clamping.
We want to do "b = a + x", but to allow for overflow. Consider the
@@ -388,7 +390,7 @@ const fz_irect fz_invalid_irect = { 0, 0, -1, -1 };
const fz_irect fz_unit_bbox = { 0, 0, 1, 1 };
const fz_quad fz_infinite_quad = { { -INFINITY, INFINITY}, {INFINITY, INFINITY}, {-INFINITY, -INFINITY}, {INFINITY, -INFINITY} };
-const fz_quad fz_invalid_quad = { {NAN, NAN}, {NAN, NAN}, {NAN, NAN}, {NAN, NAN} };
+const fz_quad fz_invalid_quad = { {MY_NAN, MY_NAN}, {MY_NAN, MY_NAN}, {MY_NAN, MY_NAN}, {MY_NAN, MY_NAN} };
fz_irect
fz_irect_from_rect(fz_rect r)

View File

@@ -1,36 +1,63 @@
vcpkg_check_linkage(ONLY_STATIC_LIBRARY)
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 76b0cd9ea2ea203ae37ce17dd2de8fceb13d0ff2fc24a31483306c6a6ecd4851d2ecb81e177c3ebc1e4eea7404697b4aeba451883dd40b21f10bb3eb101da411
SHA512 c0f802fd2b181587df1748a8db7163bbcd3951b943d1321afcff56fccb515dfe99061288bc691323d0854305a1d4205c99457954b10439adb122975429cbce72
HEAD_REF master
PATCHES
dont-generate-extract-3rd-party-things.patch
fix-NAN-on-Win11.patch # https://github.com/ArtifexSoftware/mupdf/pull/54
)
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 FEATURE_OPTIONS
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}"
DISABLE_PARALLEL_CONFIGURE
OPTIONS
-DBUILD_EXAMPLES=OFF
${FEATURE_OPTIONS}
${OPTIONS}
)
vcpkg_cmake_install()
file(COPY "${SOURCE_PATH}/include/mupdf" DESTINATION "${CURRENT_PACKAGES_DIR}/include")
vcpkg_copy_pdbs()
vcpkg_cmake_config_fixup(PACKAGE_NAME "unofficial-libmupdf")
vcpkg_install_copyright(FILE_LIST "${SOURCE_PATH}/COPYING")
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}
)

View File

@@ -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")

View File

@@ -1,23 +1,29 @@
{
"name": "libmupdf",
"version": "1.25.4",
"description": "a lightweight PDF, XPS, and E-book library",
"homepage": "https://github.com/ArtifexSoftware/mupdf",
"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",
"supports": "!osx",
"dependencies": [
"curl",
"freetype",
"glfw3",
"gumbo",
"harfbuzz",
"jbig2dec",
"libjpeg-turbo",
{
"name": "libmupdf",
"host": true
},
"openjpeg",
{
"name": "vcpkg-cmake",
"host": true
},
{
"name": "vcpkg-cmake-config",
"host": true
},
"zlib"
],
"features": {

View File

@@ -44,6 +44,9 @@ vcpkg_replace_string("${CURRENT_PACKAGES_DIR}/share/tesseract/TesseractConfig.cm
find_dependency(CURL)
find_dependency(Leptonica)
find_dependency(LibArchive)
if(ANDROID)
find_dependency(CpuFeaturesNdkCompat CONFIG)
endif()
]]
)

View File

@@ -1,6 +1,7 @@
{
"name": "tesseract",
"version": "5.5.1",
"port-version": 1,
"description": "An OCR Engine that was developed at HP Labs between 1985 and 1995... and now at Google.",
"homepage": "https://github.com/tesseract-ocr/tesseract",
"license": "Apache-2.0",

View File

@@ -231,7 +231,6 @@ libmicrodns:x64-uwp=fail
libmodman:x64-windows-static=fail
libmodplug:arm-uwp=fail
libmodplug:x64-uwp=fail
libmupdf:x64-osx=fail
libopensp(android)=fail
libopusenc:arm-uwp=fail
libopusenc:x64-uwp=fail

View File

@@ -0,0 +1,16 @@
set(VCPKG_POLICY_EMPTY_PACKAGE enabled)
vcpkg_from_github(
OUT_SOURCE_PATH SOURCE_PATH
REPO ArtifexSoftware/mupdf
REF 1.26.10
SHA512 c0f802fd2b181587df1748a8db7163bbcd3951b943d1321afcff56fccb515dfe99061288bc691323d0854305a1d4205c99457954b10439adb122975429cbce72
HEAD_REF master
)
vcpkg_cmake_configure(
SOURCE_PATH "${CURRENT_PORT_DIR}/project"
OPTIONS
"-DSOURCE_PATH=${SOURCE_PATH}"
)
vcpkg_cmake_build()

View File

@@ -0,0 +1,7 @@
cmake_minimum_required(VERSION 3.10)
project(libmupdf-test C CXX)
find_package(unofficial-libmupdf REQUIRED)
add_executable(example "${SOURCE_PATH}/docs/examples/example.c")
target_link_libraries(example PRIVATE unofficial::libmupdf::libmupdf)

View File

@@ -0,0 +1,13 @@
{
"name": "vcpkg-ci-libmupdf",
"version-string": "ci",
"description": "Port to validate libmupdf within CI",
"homepage": "https://github.com/microsoft/vcpkg",
"dependencies": [
"libmupdf",
{
"name": "vcpkg-cmake",
"host": true
}
]
}

View File

@@ -5169,7 +5169,7 @@
"port-version": 0
},
"libmupdf": {
"baseline": "1.25.4",
"baseline": "1.26.10",
"port-version": 0
},
"libmypaint": {
@@ -9614,7 +9614,7 @@
},
"tesseract": {
"baseline": "5.5.1",
"port-version": 0
"port-version": 1
},
"tevclient": {
"baseline": "2023-12-04",

View File

@@ -1,5 +1,15 @@
{
"versions": [
{
"git-tree": "6a6a9dce93fed820cf02fcbc4180356f41728949",
"version": "1.26.10",
"port-version": 0
},
{
"git-tree": "c55cff1d6a734c7de6805b2ba9176c69e4035d23",
"version": "1.25.4",
"port-version": 1
},
{
"git-tree": "65e136bdf19dd4b45315fecf575097d670ea16e1",
"version": "1.25.4",

View File

@@ -1,5 +1,10 @@
{
"versions": [
{
"git-tree": "5e3fdcd84fb65d4a9db9034093d5f8b78b5d91ba",
"version": "5.5.1",
"port-version": 1
},
{
"git-tree": "d8ba16ca377162ad75388a69c6e023e950a985cc",
"version": "5.5.1",