diff --git a/ci_config.json b/ci_config.json index f719697348..4f04ab6652 100644 --- a/ci_config.json +++ b/ci_config.json @@ -1311,6 +1311,53 @@ "pkgconf:tests=disabled" ] }, + "poppler": { + "_comment": [ + "- fontconfig warns on v1 wraps; fixed in next release", + "- alpine stable doesn't know gpgmepp-dev, yet", + "- skip old dependency for Qt5 wrapper" + ], + "build_options": [ + "cairo:fontconfig=enabled" + ], + "alpine_packages": [ + "cairo-dev", + "glib-dev", + "nss-dev", + "qt6-qtbase-dev" + ], + "debian_packages": [ + "libcairo2-dev", + "libglib2.0-dev", + "libgpgmepp-dev", + "libnss3-dev", + "qt6-base-dev" + ], + "brew_packages": [ + "boost", + "gpgmepp", + "nss", + "qt@6" + ], + "msys_packages": [ + "boost", + "nss", + "qt6-base" + ], + "build_options": [ + "poppler:gobject_introspection=disabled" + ], + "skip_dependency_check": [ + "poppler-cpp", + "poppler-glib", + "poppler-qt5", + "poppler-qt6" + ], + "skip_program_check": [ + "pdftocairo" + ], + "fatal_warnings": false + }, "protobuf": { "_comment": "Getting patched version elsewhere until abseil-cpp/issues/1510 is fixed, because cannot patch wrapdb version", "msys_packages": [ diff --git a/releases.json b/releases.json index d3746440e1..77a21c1f64 100644 --- a/releases.json +++ b/releases.json @@ -3696,6 +3696,33 @@ "1.9.0-1" ] }, + "poppler": { + "dependency_names": [ + "poppler", + "poppler-cpp", + "poppler-glib", + "poppler-qt5", + "poppler-qt6" + ], + "program_names": [ + "pdfattach", + "pdfdetach", + "pdffonts", + "pdfimages", + "pdfinfo", + "pdfseparate", + "pdfsig", + "pdftocairo", + "pdftohtml", + "pdftoppm", + "pdftops", + "pdftotext", + "pdfunite" + ], + "versions": [ + "26.03.0-1" + ] + }, "protobuf": { "dependency_names": [ "protobuf-lite", diff --git a/subprojects/glib.wrap b/subprojects/glib.wrap index d7474bc11e..cce14044bf 100644 --- a/subprojects/glib.wrap +++ b/subprojects/glib.wrap @@ -1,6 +1,5 @@ [wrap-file] directory = glib-2.86.4 - source_url = https://download.gnome.org/sources/glib/2.86/glib-2.86.4.tar.xz source_fallback_url = https://ftp.acc.umu.se/pub/gnome/sources/glib/2.86/glib-2.86.4.tar.xz source_filename = glib-2.86.4.tar.xz diff --git a/subprojects/packagefiles/poppler/cpp/meson.build b/subprojects/packagefiles/poppler/cpp/meson.build new file mode 100644 index 0000000000..fbc92178c1 --- /dev/null +++ b/subprojects/packagefiles/poppler/cpp/meson.build @@ -0,0 +1,95 @@ +if iconv_dep.found() + poppler_cpp_library_version = '3.0.0' + poppler_cpp_library_so_version = '3' + + poppler_cpp_library_cpp_arguments = [] + if get_option('default_library') == 'static' + poppler_cpp_library_cpp_arguments += '-DPOPPLER_CPP_STATIC_DEFINE' + else + poppler_cpp_library_cpp_arguments += '-DPOPPLER_CPP_EXPORTS' + endif + + poppler_cpp_library_dependencies = [ + iconv_dep, + poppler_library_dep, + ] + + poppler_cpp_library_include_directories = include_directories('.') + + poppler_cpp_library_sources = [ + 'poppler-destination.cpp', + 'poppler-document.cpp', + 'poppler-embedded-file.cpp', + 'poppler-font.cpp', + 'poppler-global.cpp', + 'poppler-image.cpp', + 'poppler-page.cpp', + 'poppler-page-renderer.cpp', + 'poppler-page-transition.cpp', + 'poppler-private.cpp', + 'poppler-rectangle.cpp', + 'poppler-toc.cpp', + 'poppler-version.cpp', + ] + poppler_cpp_library_sources += configure_file( + configuration: poppler_configuration, + input: 'poppler-version.h.in', + output: 'poppler-version.h', + install: true, + install_dir: get_option('includedir') / meson.project_name() / 'cpp', + ) + poppler_cpp_library_sources += configure_file( + input: poppler_exports_h_in, + output: 'poppler_cpp_export.h', + configuration: { + 'NAME': 'CPP', + 'PUBLIC_DEFINE': 'POPPLER_CPP_EXPORT', + }, + install: true, + install_dir: get_option('includedir') / meson.project_name() / 'cpp', + ) + + poppler_cpp_library = library( + 'poppler-cpp', + cpp_args: poppler_cpp_library_cpp_arguments, + dependencies: poppler_cpp_library_dependencies, + include_directories: poppler_cpp_library_include_directories, + install: true, + sources: poppler_cpp_library_sources, + soversion: poppler_cpp_library_so_version, + version: poppler_cpp_library_version, + ) + + pkgconfig_module.generate( + poppler_cpp_library, + description: 'C++ wrapper for Poppler PDF rendering library.', + ) + + poppler_cpp_library_dep = declare_dependency( + link_with: poppler_cpp_library, + dependencies: poppler_cpp_library_dependencies, + include_directories: poppler_cpp_library_include_directories, + ) + + meson.override_dependency('poppler-cpp', poppler_cpp_library_dep) + + install_headers( + 'poppler-destination.h', + 'poppler-document.h', + 'poppler-embedded-file.h', + 'poppler-font.h', + 'poppler-font-private.h', + 'poppler-global.h', + 'poppler-image.h', + 'poppler-page.h', + 'poppler-page-renderer.h', + 'poppler-page-transition.h', + 'poppler-rectangle.h', + 'poppler-toc.h', + subdir: meson.project_name() / 'cpp', + ) + + subdir('tests') +endif + +summary('C++ wrapper', iconv_dep.found()) diff --git a/subprojects/packagefiles/poppler/cpp/tests/meson.build b/subprojects/packagefiles/poppler/cpp/tests/meson.build new file mode 100644 index 0000000000..1a9b42ea7f --- /dev/null +++ b/subprojects/packagefiles/poppler/cpp/tests/meson.build @@ -0,0 +1,15 @@ +poppler_dump_executable = executable( + 'poppler-dump', + dependencies: [poppler_cpp_library_dep], + include_directories: utils_include_directory, + sources: ['poppler-dump.cpp', utils_parseargs_cc], +) + +poppler_render_executable = executable( + 'poppler-render', + dependencies: [poppler_cpp_library_dep], + include_directories: utils_include_directory, + sources: ['poppler-render.cpp', utils_parseargs_cc], +) + +# @todo fuzz tests diff --git a/subprojects/packagefiles/poppler/glib/demo/meson.build b/subprojects/packagefiles/poppler/glib/demo/meson.build new file mode 100644 index 0000000000..31a488ccb6 --- /dev/null +++ b/subprojects/packagefiles/poppler/glib/demo/meson.build @@ -0,0 +1,32 @@ +if gtk3_dep.found() + poppler_glib_demo_sources = files( + 'annots.c', + 'attachments.c', + 'find.c', + 'fonts.c', + 'forms.c', + 'images.c', + 'info.cc', + 'layers.c', + 'links.c', + 'main.c', + 'outline.c', + 'page.c', + 'print.c', + 'render.c', + 'selections.c', + 'signature.c', + 'taggedstruct.c', + 'text.c', + 'transitions.c', + 'utils.c', + ) + + poppler_glib_demo_executable = executable( + 'poppler-glib-demo', + sources: poppler_glib_demo_sources, + dependencies: [poppler_glib_library_dep, gtk3_dep], + ) +endif + +summary(' GLib demo', gtk3_dep.found()) diff --git a/subprojects/packagefiles/poppler/glib/meson.build b/subprojects/packagefiles/poppler/glib/meson.build new file mode 100644 index 0000000000..fdf96b24c5 --- /dev/null +++ b/subprojects/packagefiles/poppler/glib/meson.build @@ -0,0 +1,145 @@ +if building_glib_wrapper + poppler_glib_library_version = '8.31.0' + poppler_glib_library_so_version = '8' + + poppler_glib_library_include_directories = include_directories('.') + + poppler_glib_library_sources = [ + poppler_cairo_sources, + 'poppler-action.cc', + 'poppler-date.cc', + 'poppler-document.cc', + 'poppler-page.cc', + 'poppler-attachment.cc', + 'poppler-form-field.cc', + 'poppler-annot.cc', + 'poppler-layer.cc', + 'poppler-movie.cc', + 'poppler-media.cc', + 'poppler.cc', + 'poppler-cached-file-loader.cc', + 'poppler-input-stream.cc', + 'poppler-structure-element.cc', + ] + poppler_glib_library_features_h = configure_file( + configuration: poppler_configuration, + input: 'poppler-features.h.cmake', + output: 'poppler-features.h', + format: 'cmake', + install: true, + install_dir: get_option('includedir') / meson.project_name() / 'glib', + ) + poppler_glib_library_sources += poppler_glib_library_features_h + poppler_glib_library_macros_h = configure_file( + input: poppler_exports_h_in, + output: 'poppler-macros.h', + configuration: { + 'NAME': 'GLIB', + 'PUBLIC_DEFINE': 'POPPLER_PUBLIC', + }, + install: true, + install_dir: get_option('includedir') / meson.project_name() / 'blib', + ) + poppler_glib_library_sources += poppler_glib_library_macros_h + + poppler_glib_library_headers = files( + 'poppler-action.h', + 'poppler-annot.h', + 'poppler-attachment.h', + 'poppler-date.h', + 'poppler-document.h', + 'poppler-form-field.h', + 'poppler-layer.h', + 'poppler-media.h', + 'poppler-movie.h', + 'poppler-page.h', + 'poppler-structure-element.h', + 'poppler.h', + ) + + gnome_module = import('gnome') + poppler_glib_library_enums = gnome_module.mkenums( + 'bogus', + c_template: 'poppler-enums.c.template', + h_template: 'poppler-enums.h.template', + install_header: true, + install_dir: get_option('includedir') / meson.project_name() / 'glib', + sources: poppler_glib_library_headers, + ) + poppler_glib_library_sources += poppler_glib_library_enums + + poppler_glib_library_cpp_arguments = [] + if get_option('default_library') == 'static' + poppler_glib_library_cpp_arguments += '-DPOPPLER_GLIB_STATIC_DEFINE' + else + poppler_glib_library_cpp_arguments += '-DPOPPLER_GLIB_EXPORTS' + endif + + poppler_glib_library_dependencies = [ + cairo_dep, + gio_dep, + glib_dep, + gobject_dep, + poppler_library_dep, + ] + + poppler_glib_library = library( + 'poppler-glib', + cpp_args: poppler_glib_library_cpp_arguments, + dependencies: poppler_glib_library_dependencies, + include_directories: poppler_glib_library_include_directories, + install: true, + sources: poppler_glib_library_sources, + soversion: poppler_glib_library_so_version, + version: poppler_glib_library_version, + ) + + pkgconfig_module.generate( + poppler_glib_library, + description: 'GLib wrapper for Poppler PDF rendering library.', + ) + + poppler_glib_library_dep = declare_dependency( + link_with: poppler_glib_library, + dependencies: poppler_glib_library_dependencies, + include_directories: poppler_glib_library_include_directories, + sources: [ + poppler_glib_library_enums, + poppler_glib_library_features_h, + poppler_glib_library_macros_h, + ], + ) + + meson.override_dependency('poppler-glib', poppler_glib_library_dep) + + install_headers( + poppler_glib_library_headers, + subdir: meson.project_name() / 'glib', + ) + + if get_option('gobject_introspection').allowed() and get_option( + 'default_library', + ) == 'shared' or get_option( + 'default_library', + ) == 'both' + summary(' GObject introspection', true) + gnome_module.generate_gir( + poppler_glib_library, + namespace: 'Poppler', + nsversion: '0.18', + includes: ['GObject-2.0', 'Gio-2.0', 'cairo-1.0'], + sources: poppler_glib_library_sources + poppler_glib_library_headers, + header: 'poppler.h', + install: true, + ) + else + summary(' GObject introspection', false) + endif + + # @todo Gtk docs + + subdir('tests') + subdir('demo') +endif + +summary('GLib wrapper', building_glib_wrapper) diff --git a/subprojects/packagefiles/poppler/glib/tests/meson.build b/subprojects/packagefiles/poppler/glib/tests/meson.build new file mode 100644 index 0000000000..c6f493408f --- /dev/null +++ b/subprojects/packagefiles/poppler/glib/tests/meson.build @@ -0,0 +1,111 @@ +if get_option('tests') and gtk3_dep.found() + # pdfdrawbb + poppler_glib_pdfdrawbb_executable = executable( + 'pdfdrawbb', + sources: 'pdfdrawbb.c', + dependencies: poppler_glib_library_dep, + ) + + # check-text + poppler_glib_check_text_executable = executable( + 'poppler-check-text', + sources: 'check_text.c', + dependencies: [poppler_glib_library_dep, gtk3_dep], + c_args: ['-DTESTDATADIR="@0@"'.format(poppler_test_directory)], + ) + test('poppler-check-text', poppler_glib_check_text_executable) + + # check-bb + poppler_glib_check_bb_executable = executable( + 'poppler-check-bb', + sources: 'check_bb.c', + dependencies: [poppler_glib_library_dep, gtk3_dep], + ) + + poppler_glib_check_bb_tests = { + 'shapes+attachments.pdf': ['42.5', '42.5', '557.5', '557.5'], + 'orientation.pdf': [ + '34', + '34', + '83.74', + '49', + '793', + '34', + '808', + '97.19', + '488.02', + '793', + '561', + '808', + '34', + '503.61', + '49', + '561', + ], + 'xr01.pdf': ['148.71', '126.35', '308.11', '704.57'], + 'xr02.pdf': [ + '133.77', + '124.81', + '308.11', + '704.57', + '133.77', + '124.80', + '308.11', + '704.57', + ], + 'russian.pdf': ['71.5', '76.81', '197.69', '131.09'], + 'vis_policy_test.pdf': ['90', '77.93', '312.01', '265.13'], + 'searchAcrossLines.pdf': [ + '107.15', + '105.23', + '523.85', + '691', + '85.04', + '94', + '538.59', + '762.19', + ], + 'deseret.pdf': ['56.8', '57.15', '109.5', '72.8'], + 'fieldWithUtf16Names.pdf': ['56.65', '56.65', '264.55', '83.05'], + 'bug7063.pdf': ['56.8', '57.46', '244.29', '118.79'], + 'WithActualText.pdf': ['100', '90.72', '331.01', '102.35'], + 'Issue637.pdf': ['70.87', '53', '293', '105.37'], + 'truetype.pdf': ['17.5', '17.5', '577.5', '225.62'], + 'form_set_icon.pdf': ['0', '0', '362.835', '272.126'], + 'imageretrieve+attachment.pdf': ['0', '0', '610.56', '792'], + 'checkbox_issue_159.pdf': ['2.84', '14.17', '553.18', '840.87'], + 'NestedLayers.pdf': ['0', '191', '612', '792'], + 'A6EmbeddedFiles.pdf': ['18', '18', '558.36', '751.92'], + 'latex-hyperref-checkbox-issue-655.pdf': [ + '148.71', + '123.81', + '308.11', + '704.57', + ], + 'utf16le-annot.pdf': ['55.47', '54.78', '98.74', '96.12'], + 'type3.pdf': [ + '-p', + '10', + '125.80', + '130', + '509.30', + '695', + '125.80', + '132', + '538.03', + '693', + ], + } + + foreach poppler_glib_check_bb_test_name, poppler_glib_check_bb_test_arguments : poppler_glib_check_bb_tests + test( + 'poppler-check-bb-' + poppler_glib_check_bb_test_name, + poppler_glib_check_bb_executable, + args: [ + poppler_test_directory / 'unittestcases' / poppler_glib_check_bb_test_name, + ] + poppler_glib_check_bb_test_arguments, + ) + endforeach + + # @todo fuzz tests +endif diff --git a/subprojects/packagefiles/poppler/meson.build b/subprojects/packagefiles/poppler/meson.build new file mode 100644 index 0000000000..e490047f69 --- /dev/null +++ b/subprojects/packagefiles/poppler/meson.build @@ -0,0 +1,538 @@ +# @todo Functionality missing from this port yet: +# - check minimum dependency versions +# - poppler-data +# - Gtk documentation +# - manual and unit tests in test +# - fuzz tests +# - gperf +# - libjpeg version test +# - version script for linker? + + +project( + 'poppler', + 'cpp', + 'c', + version: '26.03.0', + license: 'GPL-2.0', + meson_version: '>=1.3.0', + default_options: { + 'cpp_std': ['c++23', 'c++latest'], + 'c_std': 'c17', + }, +) + +poppler_configuration = configuration_data() +poppler_configuration.set('POPPLER_VERSION', meson.project_version()) +poppler_version_parts = meson.project_version().split('.') +poppler_configuration.set('POPPLER_MAJOR_VERSION', poppler_version_parts[0]) +poppler_configuration.set('POPPLER_MINOR_VERSION', poppler_version_parts[1]) +poppler_configuration.set('POPPLER_MICRO_VERSION', poppler_version_parts[2]) +poppler_library_so_version = 158 +poppler_library_version = poppler_library_so_version.to_string() + '.0.0' + +cpp_compiler = meson.get_compiler('cpp') +poppler_configuration.set10('HAVE_FSEEK64', cpp_compiler.has_function('fseek64')) +poppler_configuration.set10( + 'HAVE_FSEEKO', + cpp_compiler.has_header_symbol('stdio.h', 'fseeko'), +) +poppler_configuration.set10( + 'HAVE_GMTIME_R', + cpp_compiler.has_function('gmtime_r'), +) +poppler_configuration.set10( + 'HAVE_LOCALTIME_R', + cpp_compiler.has_function('localtime_r'), +) +poppler_configuration.set10('HAVE_LSEEK64', cpp_compiler.has_function('lseek64')) +poppler_configuration.set10('HAVE_POPEN', cpp_compiler.has_function('popen')) +poppler_configuration.set10('HAVE_PREAD64', cpp_compiler.has_function('pread64')) +poppler_configuration.set10( + 'HAVE_STRTOK_R', + cpp_compiler.has_function('strtok_r'), +) +poppler_configuration.set10('HAVE_TIMEGM', cpp_compiler.has_function('timegm')) + +poppler_library_cpp_arguments = [] + +poppler_library_dependencies = [ + dependency( + 'freetype2', + version: '>=2.11', + ), + dependency('zlib'), +] + +poppler_library_include_directories = include_directories('.', 'poppler') + +poppler_library_sources = [ + 'goo/GooString.cc', + 'goo/GooTimer.cc', + 'goo/ImgWriter.cc', + 'goo/JpegWriter.cc', + 'goo/NetPBMWriter.cc', + 'goo/PNGWriter.cc', + 'goo/TiffWriter.cc', + 'goo/ft_utils.cc', + 'goo/gbase64.cc', + 'goo/gbasename.cc', + 'goo/gfile.cc', + 'goo/glibc.cc', + 'goo/glibc_strtok_r.cc', + 'goo/grandom.cc', + 'goo/gstrtod.cc', + 'fofi/FoFiBase.cc', + 'fofi/FoFiEncodings.cc', + 'fofi/FoFiTrueType.cc', + 'fofi/FoFiType1.cc', + 'fofi/FoFiType1C.cc', + 'fofi/FoFiIdentifier.cc', + 'poppler/Annot.cc', + 'poppler/AnnotStampImageHelper.cc', + 'poppler/Array.cc', + 'poppler/CachedFile.cc', + 'poppler/Catalog.cc', + 'poppler/CharCodeToUnicode.cc', + 'poppler/CMap.cc', + 'poppler/CryptoSignBackend.cc', + 'poppler/DateInfo.cc', + 'poppler/Decrypt.cc', + 'poppler/Dict.cc', + 'poppler/Error.cc', + 'poppler/FDPDFDocBuilder.cc', + 'poppler/FILECacheLoader.cc', + 'poppler/FileSpec.cc', + 'poppler/FlateEncoder.cc', + 'poppler/FontEncodingTables.cc', + 'poppler/Form.cc', + 'poppler/FontInfo.cc', + 'poppler/Function.cc', + 'poppler/Gfx.cc', + 'poppler/GfxFont.cc', + 'poppler/GfxState.cc', + 'poppler/GlobalParams.cc', + 'poppler/Hints.cc', + 'poppler/ImageEmbeddingUtils.cc', + 'poppler/JArithmeticDecoder.cc', + 'poppler/JBIG2Stream.cc', + 'poppler/JSInfo.cc', + 'poppler/Lexer.cc', + 'poppler/Link.cc', + 'poppler/Linearization.cc', + 'poppler/LocalPDFDocBuilder.cc', + 'poppler/MarkedContentOutputDev.cc', + 'poppler/NameToCharCode.cc', + 'poppler/Object.cc', + 'poppler/OptionalContent.cc', + 'poppler/Outline.cc', + 'poppler/OutputDev.cc', + 'poppler/Page.cc', + 'poppler/PageTransition.cc', + 'poppler/Parser.cc', + 'poppler/PDFDoc.cc', + 'poppler/PDFDocBuilder.cc', + 'poppler/PDFDocEncoding.cc', + 'poppler/PDFDocFactory.cc', + 'poppler/ProfileData.cc', + 'poppler/PreScanOutputDev.cc', + 'poppler/PSTokenizer.cc', + 'poppler/SignatureInfo.cc', + 'poppler/Stream.cc', + 'poppler/StructTreeRoot.cc', + 'poppler/StructElement.cc', + 'poppler/UnicodeMap.cc', + 'poppler/UnicodeMapFuncs.cc', + 'poppler/UnicodeTypeTable.cc', + 'poppler/UTF.cc', + 'poppler/XRef.cc', + 'poppler/PSOutputDev.cc', + 'poppler/TextOutputDev.cc', + 'poppler/PageLabelInfo.cc', + 'poppler/SecurityHandler.cc', + 'poppler/Sound.cc', + 'poppler/ViewerPreferences.cc', + 'poppler/Movie.cc', + 'poppler/Rendition.cc', + 'poppler/CertificateInfo.cc', + 'poppler/BBoxOutputDev.cc', + 'poppler/SplashOutputDev.cc', + 'splash/Splash.cc', + 'splash/SplashBitmap.cc', + 'splash/SplashClip.cc', + 'splash/SplashFTFont.cc', + 'splash/SplashFTFontEngine.cc', + 'splash/SplashFTFontFile.cc', + 'splash/SplashFont.cc', + 'splash/SplashFontEngine.cc', + 'splash/SplashFontFile.cc', + 'splash/SplashFontFileID.cc', + 'splash/SplashPath.cc', + 'splash/SplashPattern.cc', + 'splash/SplashScreen.cc', + 'splash/SplashState.cc', + 'splash/SplashXPath.cc', + 'splash/SplashXPathScanner.cc', +] + +poppler_configuration.set10('WORDS_BIGENDIAN', host_machine.endian() == 'big') +# @todo ENABLE_ZLIB_UNCOMPRESS could be dependent on a meson configuration feature option 'zlib_uncompress' +poppler_configuration.set10('ENABLE_ZLIB_UNCOMPRESS', false) +# @todo ENABLE_PGP_SIGNATURES could be dependent on a meson configuration feature option 'pgp_signatures' +poppler_configuration.set10('ENABLE_PGP_SIGNATURES', false) +# @todo POPPLER_DATADIR could be dependent on a poppler-data subproject. +poppler_configuration.set( + 'POPPLER_DATADIR', + get_option('prefix') / 'share' / 'poppler', +) + + +# optional libcurl support +libcurl_dep = dependency( + 'libcurl', + version: '>=7.81', + required: get_option('libcurl'), +) +poppler_configuration.set10('ENABLE_LIBCURL', libcurl_dep.found()) +poppler_configuration.set10('POPPLER_HAS_CURL_SUPPORT', libcurl_dep.found()) +if libcurl_dep.found() + poppler_library_sources += [ + 'poppler/CurlCachedFile.cc', + 'poppler/CurlPDFDocBuilder.cc', + ] + poppler_library_dependencies += libcurl_dep +endif +summary('use libcurl', libcurl_dep.found()) + + +# optional lcms2 dependency +lcms2_dep = dependency( + 'lcms2', + version: '>= 2.12', + required: get_option('lcms2'), +) +poppler_configuration.set10('ENABLE_LCMS', lcms2_dep.found()) +poppler_configuration.set10('USE_CMS', lcms2_dep.found()) +if lcms2_dep.found() + poppler_library_dependencies += lcms2_dep +endif +summary('use lcms2', lcms2_dep.found()) + + +# optional libpng dependency +libpng_dep = dependency( + 'libpng', + required: get_option('libpng'), +) +poppler_configuration.set10('ENABLE_LIBPNG', libpng_dep.found()) +if libpng_dep.found() + poppler_library_dependencies += libpng_dep +endif +summary('use libpng', libpng_dep.found()) + + +# optional libtiff dependency +libtiff_4_dep = dependency( + 'libtiff-4', + version: '>=4.3', + required: get_option('libtiff'), +) +poppler_configuration.set10('ENABLE_LIBTIFF', libtiff_4_dep.found()) +if libtiff_4_dep.found() + poppler_library_dependencies += libtiff_4_dep +endif +summary('use libtiff', libtiff_4_dep.found()) + + +# gather signature backends +signature_backends = [] + + +# optional nss dependency +nss_dep = dependency( + 'nss', + version: '>=3.68', + required: get_option('nss'), +) +poppler_configuration.set10('ENABLE_NSS3', nss_dep.found()) +if nss_dep.found() + poppler_library_sources += ['poppler/NSSCryptoSignBackend.cc'] + poppler_library_dependencies += nss_dep + signature_backends += 'NSS' +endif +summary('use nss', nss_dep.found()) + + +# optional gpgmepp dependency +gpgmepp_dep = dependency( + 'gpgmepp', + version: '>=1.19', + required: get_option('gpgmepp'), +) +poppler_configuration.set10('ENABLE_GPGME', gpgmepp_dep.found()) +if gpgmepp_dep.found() + poppler_library_sources += ['poppler/GPGMECryptoSignBackend.cc'] + poppler_library_dependencies += gpgmepp_dep + signature_backends += 'GPG' +endif +summary('use gpgmepp', gpgmepp_dep.found()) + + +# default_signature_backend depends on the backends gathered +if signature_backends.length() > 0 + poppler_configuration.set('DEFAULT_SIGNATURE_BACKEND', signature_backends[0]) +else + poppler_configuration.set('DEFAULT_SIGNATURE_BACKEND', 'None') +endif +poppler_configuration.set10( + 'ENABLE_SIGNATURES', + nss_dep.found() or gpgmepp_dep.found(), +) + + +# option 'dct_decoder' +if get_option('dct_decoder') == 'libjpeg' + libjpeg_dep = dependency('libjpeg') + poppler_configuration.set10('ENABLE_LIBJPEG', true) + poppler_configuration.set10('HAVE_DCT_DECODER', true) + poppler_library_sources += 'poppler/DCTStream.cc' + poppler_library_dependencies += libjpeg_dep +else + poppler_configuration.set10('ENABLE_LIBJPEG', false) + if get_option('dct_decoder') == 'unmaintained' + poppler_configuration.set10('HAVE_DCT_DECODER', true) + else # none + poppler_configuration.set10('HAVE_DCT_DECODER', false) + endif +endif +summary('dct_decoder', get_option('dct_decoder')) + + +# option 'jpx_decoder' +if get_option('jpx_decoder') == 'libopenjp2' + libopenjp2_dep = dependency( + 'libopenjp2', + version: '>=2', + ) + poppler_configuration.set10('ENABLE_LIBOPENJPEG', true) + poppler_configuration.set10('HAVE_JPX_DECODER', true) + poppler_library_sources += 'poppler/JPEG2000Stream.cc' + poppler_library_dependencies += libopenjp2_dep +else + poppler_configuration.set10('ENABLE_LIBOPENJPEG', false) + poppler_library_sources += 'poppler/JPXStream.cc' + if get_option('jpx_decoder') == 'unmaintained' + poppler_configuration.set10('HAVE_JPX_DECODER', true) + have_jpx_decoder = true + else # none + poppler_configuration.set10('HAVE_JPX_DECODER', false) + endif +endif +summary('jpx_decoder', get_option('jpx_decoder')) + + +# Boost support +boost_dep = dependency( + 'boost', + required: get_option('boost'), +) +poppler_configuration.set10('USE_BOOST_HEADERS', boost_dep.found()) +if boost_dep.found() + poppler_library_dependencies += boost_dep +endif +summary('use boost', boost_dep.found()) + + +# GLib wrapper +glib_dep = dependency( + 'glib-2.0', + version: '>=2.72', + required: get_option('glib'), +) +gobject_dep = dependency( + 'gobject-2.0', + version: '>=2.72', + required: get_option('glib'), +) +gio_dep = dependency( + 'gio-2.0', + version: '>=2.72', + required: get_option('glib'), +) +have_glib = glib_dep.found() and gobject_dep.found() and gio_dep.found() +cairo_dep = dependency( + 'cairo', + version: '>=1.16.0', + required: have_glib, +) +if cairo_dep.found() + poppler_configuration.set('CAIRO_FEATURE', '#define POPPLER_HAS_CAIRO 1') +else + poppler_configuration.set('CAIRO_FEATURE', '#undef POPPLER_HAS_CAIRO') +endif +building_glib_wrapper = cairo_dep.found() and have_glib +if have_glib + gtk3_dep = dependency( + 'gtk+-3.0', + version: '>=3.24', + required: false, + ) +else + gtk3_dep = disabler() +endif + + +# cpp wrapper requires iconv +## this needs to be discovered here, so we can set the ICONV_CONST configuration +if host_machine.system() == 'windows' + subproject('win-iconv') +endif +iconv_dep = dependency( + 'iconv', + required: get_option('cpp'), +) +if iconv_dep.found() and (iconv_dep.type_name() == 'internal' or cpp_compiler.compiles( + ''' + #include + int main(){ + iconv_t conv = 0; + const char* in = 0; + size_t ilen = 0; + char* out = 0; + size_t olen = 0; + iconv(conv, &in, &ilen, &out, &olen); + return 0; + }''', + dependencies: iconv_dep, + werror: true, +)) + poppler_configuration.set('ICONV_CONST', 'const') +else + poppler_configuration.set('ICONV_CONST', '') +endif + + +# relocatable is a Windows-only feature +# @todo allow turning it off via options +poppler_configuration.set10( + 'ENABLE_RELOCATABLE', + host_machine.system() == 'windows', +) + + +# fontconfig / font configuration support +if host_machine.system() == 'windows' + poppler_configuration.set10('WITH_FONTCONFIGURATION_WIN32', true) + poppler_configuration.set10('WITH_FONTCONFIGURATION_FONTCONFIG', false) + poppler_configuration.set10('WITH_FONTCONFIGURATION_ANDROID', false) + summary('font_configuration', 'win32') +elif host_machine.system() == 'android' + poppler_configuration.set10('WITH_FONTCONFIGURATION_WIN32', false) + poppler_configuration.set10('WITH_FONTCONFIGURATION_FONTCONFIG', false) + poppler_configuration.set10('WITH_FONTCONFIGURATION_ANDROID', true) + summary('font_configuration', 'android') +else + poppler_configuration.set10('WITH_FONTCONFIGURATION_WIN32', false) + poppler_configuration.set10('WITH_FONTCONFIGURATION_FONTCONFIG', false) + poppler_configuration.set10('WITH_FONTCONFIGURATION_ANDROID', true) + poppler_library_dependencies += dependency('fontconfig') + summary('font_configuration', 'fontconfig') +endif + +poppler_font_widths = [ + 'CourierWidths', + 'CourierBoldWidths', + 'CourierBoldObliqueWidths', + 'CourierObliqueWidths', + 'HelveticaWidths', + 'HelveticaBoldWidths', + 'HelveticaBoldObliqueWidths', + 'HelveticaObliqueWidths', + 'SymbolWidths', + 'TimesBoldWidths', + 'TimesBoldItalicWidths', + 'TimesItalicWidths', + 'TimesRomanWidths', + 'ZapfDingbatsWidths', +] + +# @todo add generator for font width files with gperf +foreach poppler_font_width : poppler_font_widths + poppler_library_sources += [ + 'poppler' / ( + poppler_font_width + '.pregenerated.c' + ), + ] +endforeach + +configure_file( + configuration: poppler_configuration, + format: 'cmake', + input: 'config.h.cmake', + output: 'config.h', +) + +subdir('poppler') + +poppler_exports_h_in = files('poppler_exports.h.in') +# exports header file for private library +poppler_exports_h = configure_file( + input: poppler_exports_h_in, + output: 'poppler_private_export.h', + configuration: { + 'NAME': 'PRIVATE', + 'PUBLIC_DEFINE': 'POPPLER_PRIVATE_EXPORT', + }, +) +poppler_library_sources += poppler_exports_h + +# defines for poppler_private_export.h +if get_option('default_library') != 'static' + poppler_library_cpp_arguments += '-DPOPPLER_PRIVATE_EXPORTS' +else + poppler_library_cpp_arguments += '-DPOPPLER_PRIVATE_STATIC_DEFINE' +endif + +# MSVC complains about dll-interface for embedded members of the internal API library +if cpp_compiler.get_id() == 'msvc' + poppler_library_cpp_arguments += '/wd4251' +endif + +poppler_library = library( + 'poppler', + cpp_args: poppler_library_cpp_arguments, + dependencies: poppler_library_dependencies, + include_directories: poppler_library_include_directories, + install: true, + sources: poppler_library_sources, + soversion: poppler_library_so_version, + version: poppler_library_version, +) + +pkgconfig_module = import('pkgconfig') +pkgconfig_module.generate( + poppler_library, + description: 'PDF rendering library.', +) + +poppler_library_dep = declare_dependency( + include_directories: poppler_library_include_directories, + dependencies: poppler_library_dependencies, + link_with: poppler_library, +) +meson.override_dependency('poppler', poppler_library_dep) + +if get_option('tests') + poppler_test_subproject = subproject('poppler-test') + poppler_test_directory = poppler_test_subproject.get_variable( + 'poppler_test_directory', + ) +endif + +utils_include_directory = include_directories('utils') +subdir('utils') +subdir('cpp') +subdir('glib') +subdir('qt5') +subdir('qt6') +subdir('test') diff --git a/subprojects/packagefiles/poppler/meson_options.txt b/subprojects/packagefiles/poppler/meson_options.txt new file mode 100644 index 0000000000..e41c5e7366 --- /dev/null +++ b/subprojects/packagefiles/poppler/meson_options.txt @@ -0,0 +1,114 @@ +option( + 'boost', + type: 'feature', + value: 'auto', + description: 'Build with boost headers to accelerate rendering in the Splash backend.', +) +option( + 'cpp', + type: 'feature', + value: 'auto', + description: 'Build the C++ wrapper library.', +) +option( + 'dct_decoder', + type: 'combo', + choices: ['libjpeg', 'unmaintained', 'none'], + value: 'libjpeg', +) +option( + 'glib', + type: 'feature', + value: 'auto', + description: 'Build the GLib wrapper library.', +) +option( + 'glib_demo', + type: 'feature', + value: 'auto', + description: 'Build the GLib demo program.', +) +option( + 'gobject_introspection', + type: 'feature', + value: 'auto', + description: 'Build GObject introspection.', +) +option( + 'gpgmepp', + type: 'feature', + value: 'auto', + description: 'Build with gpgmepp for signature handling.', +) +option( + 'jpx_decoder', + type: 'combo', + choices: ['libopenjp2', 'unmaintained', 'none'], + value: 'libopenjp2', +) +option( + 'lcms2', + type: 'feature', + value: 'auto', + description: 'Build with lcms2 based color management support.', +) +option( + 'libcurl', + type: 'feature', + value: 'auto', + description: 'Build with libcurl based HTTP support.', +) +option( + 'libpng', + type: 'feature', + value: 'auto', + description: 'Build with support for writing PNG images. (pdfimages/pdftocairo/etc)', +) +option( + 'libtiff', + type: 'feature', + value: 'auto', + description: 'Build with support for writing TIFF images. (pdfimages/pdftocairo/etc)', +) +option( + 'nss', + type: 'feature', + value: 'auto', + description: 'Build with NSS for signature handling.', +) +option( + 'qt5', + type: 'feature', + value: 'auto', + description: 'Build the Qt5 wrapper library.', +) +option( + 'qt5_demo', + type: 'feature', + value: 'auto', + description: 'Build the Qt5 demo program.', +) +option( + 'qt6', + type: 'feature', + value: 'auto', + description: 'Build the Qt6 wrapper library.', +) +option( + 'qt6_demo', + type: 'feature', + value: 'auto', + description: 'Build the Qt6 demo program.', +) +option( + 'tests', + type: 'boolean', + value: true, + description: 'Build all applicable tests.', +) +option( + 'tools', + type: 'feature', + value: 'auto', + description: 'Build the poppler tools.', +) diff --git a/subprojects/packagefiles/poppler/poppler/meson.build b/subprojects/packagefiles/poppler/poppler/meson.build new file mode 100644 index 0000000000..5e4cd8464d --- /dev/null +++ b/subprojects/packagefiles/poppler/poppler/meson.build @@ -0,0 +1,12 @@ +poppler_poppler_config_h = configure_file( + configuration: poppler_configuration, + format: 'cmake', + input: 'poppler-config.h.cmake', + output: 'poppler-config.h', +) + +poppler_cairo_sources = files( + 'CairoFontEngine.cc', + 'CairoOutputDev.cc', + 'CairoRescaleBox.cc', +) diff --git a/subprojects/packagefiles/poppler/poppler_exports.h.in b/subprojects/packagefiles/poppler/poppler_exports.h.in new file mode 100644 index 0000000000..af86d77f4e --- /dev/null +++ b/subprojects/packagefiles/poppler/poppler_exports.h.in @@ -0,0 +1,58 @@ +#ifndef POPPLER_@NAME@_EXPORT_H +#define POPPLER_@NAME@_EXPORT_H + +#ifdef POPPLER_@NAME@_STATIC_DEFINE +# define @PUBLIC_DEFINE@ +# define POPPLER_@NAME@_NO_EXPORT +#else +# ifndef @PUBLIC_DEFINE@ +# ifdef POPPLER_@NAME@_EXPORTS + /* We are building this library */ +# if defined(_MSC_VER) || defined(__MINGW32__) || defined(__MSYS__) || defined(__CYGWIN__) +# define @PUBLIC_DEFINE@ __declspec(dllexport) +# else +# define @PUBLIC_DEFINE@ __attribute__((visibility("default"))) +# endif +# else + /* We are using this library */ +# if defined(_MSC_VER) || defined(__MINGW32__) || defined(__MSYS__) || defined(__CYGWIN__) +# define @PUBLIC_DEFINE@ __declspec(dllimport) +# else +# define @PUBLIC_DEFINE@ __attribute__((visibility("default"))) +# endif +# endif +# endif + +# ifndef POPPLER_@NAME@_NO_EXPORT +# if defined(_MSC_VER) || defined(__MINGW32__) || defined(__MSYS__) || defined(__CYGWIN__) +# define POPPLER_@NAME@_NO_EXPORT +# else +# define POPPLER_@NAME@_NO_EXPORT __attribute__((visibility("hidden"))) +# endif +# endif +#endif + +#ifndef POPPLER_@NAME@_DEPRECATED +# if defined(_MSC_VER) || defined(__MINGW32__) || defined(__MSYS__) || defined(__CYGWIN__) +# define POPPLER_@NAME@_DEPRECATED __declspec(deprecated) +# else +# define POPPLER_@NAME@_DEPRECATED __attribute__ ((__deprecated__)) +# endif +#endif + +#ifndef POPPLER_@NAME@_DEPRECATED_EXPORT +# define POPPLER_@NAME@_DEPRECATED_EXPORT @PUBLIC_DEFINE@ POPPLER_@NAME@_DEPRECATED +#endif + +#ifndef POPPLER_@NAME@_DEPRECATED_NO_EXPORT +# define POPPLER_@NAME@_DEPRECATED_NO_EXPORT POPPLER_@NAME@_NO_EXPORT POPPLER_@NAME@_DEPRECATED +#endif + +/* NOLINTNEXTLINE(readability-avoid-unconditional-preprocessor-if) */ +#if 0 /* DEFINE_NO_DEPRECATED */ +# ifndef POPPLER_@NAME@_NO_DEPRECATED +# define POPPLER_@NAME@_NO_DEPRECATED +# endif +#endif + +#endif diff --git a/subprojects/packagefiles/poppler/qt5/demos/meson.build b/subprojects/packagefiles/poppler/qt5/demos/meson.build new file mode 100644 index 0000000000..2953ae6cb8 --- /dev/null +++ b/subprojects/packagefiles/poppler/qt5/demos/meson.build @@ -0,0 +1,49 @@ +qt5_widgets_dep = dependency( + 'qt5', + modules: 'Widgets', + required: get_option('qt5_demo'), +) + +if qt5_widgets_dep.found() + poppler_qt5_viewer_sources = files( + 'abstractinfodock.cpp', + 'documentobserver.cpp', + 'embeddedfiles.cpp', + 'fonts.cpp', + 'info.cpp', + 'main_viewer.cpp', + 'metadata.cpp', + 'navigationtoolbar.cpp', + 'optcontent.cpp', + 'pageview.cpp', + 'permissions.cpp', + 'thumbnails.cpp', + 'toc.cpp', + 'viewer.cpp', + ) + poppler_qt5_viewer_sources += qt5_module.compile_moc( + headers: [ + 'abstractinfodock.h', + 'embeddedfiles.h', + 'fonts.h', + 'info.h', + 'metadata.h', + 'navigationtoolbar.h', + 'optcontent.h', + 'pageview.h', + 'permissions.h', + 'thumbnails.h', + 'toc.h', + 'viewer.h', + ], + sources: ['toc.cpp'], + ) + + poppler_qt5_viewer_executable = executable( + 'poppler_qt5viewer', + sources: poppler_qt5_viewer_sources, + dependencies: [poppler_qt5_library_dep, qt5_widgets_dep], + ) +endif + +summary(' Qt5 demo', qt5_widgets_dep.found()) diff --git a/subprojects/packagefiles/poppler/qt5/meson.build b/subprojects/packagefiles/poppler/qt5/meson.build new file mode 100644 index 0000000000..2a6cbf3e78 --- /dev/null +++ b/subprojects/packagefiles/poppler/qt5/meson.build @@ -0,0 +1,63 @@ +qt5_module = import('qt5') +qt5_dep = dependency( + 'qt5', + version: '>=5.15', + modules: ['Core', 'Gui', 'Xml'], + required: get_option('qt5'), +) + +if qt5_dep.found() + poppler_qt5_library_cpp_arguments = [ + '-DQT_STRICT_ITERATORS', + '-DQT_DISABLE_DEPRECATED_BEFORE=0x050E00', + '-DQT_NO_DEPRECATED_WARNINGS', + '-DQT_NO_SIGNALS_SLOTS_KEYWORDS', + '-DQT_NO_CAST_FROM_ASCII', + '-DQT_NO_CAST_FROM_BYTEARRAY', + '-DQT_NO_KEYWORDS', + ] + + if get_option('default_library') == 'static' + poppler_qt5_library_cpp_arguments += '-DPOPPLER_QT5_STATIC_DEFINE' + else + poppler_qt5_library_cpp_arguments += '-DPOPPLER_QT5_EXPORTS' + endif + + poppler_qt5_library_include_directories = include_directories('src') + + poppler_qt5_library_dependencies = [ + poppler_library_dep, + qt5_dep, + ] + + subdir('src') + + poppler_qt5_library = library( + 'poppler-qt5', + cpp_args: poppler_qt5_library_cpp_arguments, + dependencies: poppler_qt5_library_dependencies, + include_directories: poppler_qt5_library_include_directories, + install: true, + sources: poppler_qt5_library_sources, + soversion: '1', + version: '1.40.0', + ) + + pkgconfig_module.generate( + poppler_qt5_library, + description: 'Qt5 wrapper for Poppler PDF rendering library.', + ) + + poppler_qt5_library_dep = declare_dependency( + link_with: poppler_qt5_library, + dependencies: poppler_qt5_library_dependencies, + include_directories: poppler_qt5_library_include_directories, + ) + + meson.override_dependency('poppler-qt5', poppler_qt5_library_dep) + + subdir('demos') + subdir('tests') +endif + +summary('Qt5 wrapper', qt5_dep.found()) diff --git a/subprojects/packagefiles/poppler/qt5/src/meson.build b/subprojects/packagefiles/poppler/qt5/src/meson.build new file mode 100644 index 0000000000..ca4d0c6f4f --- /dev/null +++ b/subprojects/packagefiles/poppler/qt5/src/meson.build @@ -0,0 +1,56 @@ +poppler_qt5_library_sources = files( + 'QPainterOutputDev.cc', + 'poppler-annotation.cc', + 'poppler-base-converter.cc', + 'poppler-document.cc', + 'poppler-embeddedfile.cc', + 'poppler-fontinfo.cc', + 'poppler-form.cc', + 'poppler-link-extractor.cc', + 'poppler-link.cc', + 'poppler-media.cc', + 'poppler-movie.cc', + 'poppler-optcontent.cc', + 'poppler-outline.cc', + 'poppler-page-transition.cc', + 'poppler-page.cc', + 'poppler-pdf-converter.cc', + 'poppler-private.cc', + 'poppler-ps-converter.cc', + 'poppler-qiodeviceinstream.cc', + 'poppler-qiodeviceoutstream.cc', + 'poppler-sound.cc', + 'poppler-textbox.cc', + 'poppler-version.cpp', +) +poppler_qt5_library_sources += configure_file( + input: 'poppler-version.h.in', + output: 'poppler-version.h', + configuration: poppler_configuration, + install: true, + install_dir: get_option('includedir') / meson.project_name() / 'qt5', +) +poppler_qt5_library_sources += configure_file( + input: poppler_exports_h_in, + output: 'poppler-export.h', + configuration: { + 'NAME': 'QT5', + 'PUBLIC_DEFINE': 'POPPLER_QT5_EXPORT', + }, + install: true, + install_dir: get_option('includedir') / meson.project_name() / 'qt5', +) +poppler_qt5_library_sources += qt5_module.compile_moc( + headers: files('poppler-form.h', 'poppler-optcontent.h'), +) + +install_headers( + 'poppler-qt5.h', + 'poppler-link.h', + 'poppler-annotation.h', + 'poppler-form.h', + 'poppler-optcontent.h', + 'poppler-page-transition.h', + 'poppler-media.h', + subdir: meson.project_name() / 'qt5', +) diff --git a/subprojects/packagefiles/poppler/qt5/tests/meson.build b/subprojects/packagefiles/poppler/qt5/tests/meson.build new file mode 100644 index 0000000000..5ffa37d85c --- /dev/null +++ b/subprojects/packagefiles/poppler/qt5/tests/meson.build @@ -0,0 +1,96 @@ +if get_option('tests') + qt5_test_dep = dependency( + 'qt5', + version: '>=5.15', + modules: ['Test'], + ) + + # manual tests + # test name: [source, run moc, add Qt5Widgets dependency] + qt5_manual_tests = { + 'test-poppler-qt5': ['test-poppler-qt5.cpp', true, true], + 'test-password-qt5': ['test-password-qt5.cpp', true, true], + 'test-render-to-file-qt5': ['test-render-to-file.cpp', false, false], + 'poppler-qt5-forms': ['poppler-forms.cpp', false, false], + 'poppler-qt5-fonts': ['poppler-fonts.cpp', false, false], + 'poppler-qt5-attachments': ['poppler-attachments.cpp', false, false], + 'stress-poppler-qt5': ['stress-poppler-qt5.cpp', false, true], + 'stress-poppler-dir-qt5': ['stress-poppler-dir.cpp', false, true], + 'stress-poppler-threads-qt5': ['stress-threads-qt5.cpp', true, false], + 'poppler-qt5-texts': ['poppler-texts.cpp', false, false], + 'poppler-qt5-page-labels': ['poppler-page-labels.cpp', false, false], + } + + qt5_widgets_dep = dependency( + 'qt5', + version: '>=5.15', + modules: ['Widgets'], + ) + + foreach qt5_manual_test_name, qt5_manual_test : qt5_manual_tests + qt5_manual_test_sources = [qt5_manual_test[0]] + if qt5_manual_test[1] + qt5_manual_test_sources += qt5_module.compile_moc( + sources: qt5_manual_test[0], + ) + endif + qt5_manual_test_dependencies = [poppler_qt5_library_dep] + if qt5_manual_test[2] + qt5_manual_test_dependencies += qt5_widgets_dep + endif + executable( + qt5_manual_test_name, + sources: qt5_manual_test_sources, + dependencies: qt5_manual_test_dependencies, + ) + endforeach + + # unit tests + qt5_unit_tests = [ + 'attachments', + 'dateConversion', + 'fonts', + 'links', + 'annotations', + 'metadata', + 'optcontent', + 'forms', + 'pagelayout', + 'pagemode', + 'password', + 'permissions', + 'search', + 'actualtext', + 'lexer', + 'internal_outline', + 'goostring', + 'object', + 'stroke_opacity', + 'utf_conversion', + 'outline', + 'signature_basics', + 'utf8document', + 'distinguished_name_parser', + 'cidfontswidthsbuilder', + 'overprint', + 'pagelabelinfo', + 'strings', + ] + + foreach qt5_unit_test : qt5_unit_tests + qt5_unit_test_name = 'check_qt5_' + qt5_unit_test + qt5_unit_test_source = 'check_' + qt5_unit_test + '.cpp' + qt5_unit_test_executable = executable( + qt5_unit_test_name, + sources: [ + qt5_unit_test_source, + qt5_module.compile_moc( + sources: qt5_unit_test_source, + ), + ], + dependencies: [poppler_qt5_library_dep, qt5_test_dep], + cpp_args: ['-DTESTDATADIR="@0@"'.format(poppler_test_directory)], + ) + test(qt5_unit_test_name, qt5_unit_test_executable) + endforeach +endif diff --git a/subprojects/packagefiles/poppler/qt6/demos/meson.build b/subprojects/packagefiles/poppler/qt6/demos/meson.build new file mode 100644 index 0000000000..c887b9e765 --- /dev/null +++ b/subprojects/packagefiles/poppler/qt6/demos/meson.build @@ -0,0 +1,49 @@ +qt6_widgets_dep = dependency( + 'qt6', + modules: 'Widgets', + required: get_option('qt6_demo'), +) + +if qt6_widgets_dep.found() + poppler_qt6_viewer_sources = files( + 'abstractinfodock.cpp', + 'documentobserver.cpp', + 'embeddedfiles.cpp', + 'fonts.cpp', + 'info.cpp', + 'main_viewer.cpp', + 'metadata.cpp', + 'navigationtoolbar.cpp', + 'optcontent.cpp', + 'pageview.cpp', + 'permissions.cpp', + 'thumbnails.cpp', + 'toc.cpp', + 'viewer.cpp', + ) + poppler_qt6_viewer_sources += qt6_module.compile_moc( + headers: [ + 'abstractinfodock.h', + 'embeddedfiles.h', + 'fonts.h', + 'info.h', + 'metadata.h', + 'navigationtoolbar.h', + 'optcontent.h', + 'pageview.h', + 'permissions.h', + 'thumbnails.h', + 'toc.h', + 'viewer.h', + ], + sources: ['toc.cpp'], + ) + + poppler_qt6_viewer_executable = executable( + 'poppler_qt6viewer', + sources: poppler_qt6_viewer_sources, + dependencies: [poppler_qt6_library_dep, qt6_widgets_dep], + ) +endif + +summary(' Qt6 demo', qt6_widgets_dep.found()) diff --git a/subprojects/packagefiles/poppler/qt6/meson.build b/subprojects/packagefiles/poppler/qt6/meson.build new file mode 100644 index 0000000000..4861a56666 --- /dev/null +++ b/subprojects/packagefiles/poppler/qt6/meson.build @@ -0,0 +1,66 @@ +qt6_module = import('qt6') +qt6_dep = dependency( + 'qt6', + version: '>=6.2', + modules: ['Core', 'Gui'], + required: get_option('qt6'), +) + +if qt6_dep.found() + poppler_qt6_library_cpp_arguments = [ + '-DQT_STRICT_ITERATORS', + '-DQT_NO_SIGNALS_SLOTS_KEYWORDS', + '-DQT_NO_CAST_FROM_ASCII', + '-DQT_NO_CAST_FROM_BYTEARRAY', + '-DQT_NO_KEYWORDS', + ] + + if get_option('default_library') == 'static' + poppler_qt6_library_cpp_arguments += '-DPOPPLER_QT6_STATIC_DEFINE' + else + poppler_qt6_library_cpp_arguments += '-DPOPPLER_QT6_EXPORTS' + endif + + # MSVC complains about dll-interface for embedded members of the internal API library + if cpp_compiler.get_id() == 'msvc' + poppler_qt6_library_cpp_arguments += '/wd4251' + endif + + poppler_qt6_library_include_directories = include_directories('src') + + poppler_qt6_library_dependencies = [ + poppler_library_dep, + qt6_dep, + ] + + subdir('src') + + poppler_qt6_library = library( + 'poppler-qt6', + cpp_args: poppler_qt6_library_cpp_arguments, + dependencies: poppler_qt6_library_dependencies, + include_directories: poppler_qt6_library_include_directories, + install: true, + sources: poppler_qt6_library_sources, + soversion: '3', + version: '3.12.0', + ) + + pkgconfig_module.generate( + poppler_qt6_library, + description: 'Qt6 wrapper for Poppler PDF rendering library.', + ) + + poppler_qt6_library_dep = declare_dependency( + link_with: poppler_qt6_library, + dependencies: poppler_qt6_library_dependencies, + include_directories: poppler_qt6_library_include_directories, + ) + + meson.override_dependency('poppler-qt6', poppler_qt6_library_dep) + + subdir('demos') + subdir('tests') +endif + +summary('Qt6 wrapper', qt6_dep.found()) diff --git a/subprojects/packagefiles/poppler/qt6/src/meson.build b/subprojects/packagefiles/poppler/qt6/src/meson.build new file mode 100644 index 0000000000..7ae5cc875f --- /dev/null +++ b/subprojects/packagefiles/poppler/qt6/src/meson.build @@ -0,0 +1,57 @@ +poppler_qt6_library_sources = files( + 'QPainterOutputDev.cc', + 'poppler-annotation.cc', + 'poppler-base-converter.cc', + 'poppler-document.cc', + 'poppler-embeddedfile.cc', + 'poppler-fontinfo.cc', + 'poppler-form.cc', + 'poppler-link-extractor.cc', + 'poppler-link.cc', + 'poppler-media.cc', + 'poppler-movie.cc', + 'poppler-optcontent.cc', + 'poppler-outline.cc', + 'poppler-page-transition.cc', + 'poppler-page.cc', + 'poppler-pdf-converter.cc', + 'poppler-private.cc', + 'poppler-ps-converter.cc', + 'poppler-qiodeviceinstream.cc', + 'poppler-qiodeviceoutstream.cc', + 'poppler-sound.cc', + 'poppler-textbox.cc', + 'poppler-version.cpp', +) +poppler_qt6_library_sources += configure_file( + input: 'poppler-version.h.in', + output: 'poppler-version.h', + configuration: poppler_configuration, + install: true, + install_dir: get_option('includedir') / meson.project_name() / 'qt6', +) +poppler_qt6_library_sources += configure_file( + input: poppler_exports_h_in, + output: 'poppler-export.h', + configuration: { + 'NAME': 'QT6', + 'PUBLIC_DEFINE': 'POPPLER_QT6_EXPORT', + }, + install: true, + install_dir: get_option('includedir') / meson.project_name() / 'qt6', +) +poppler_qt6_library_sources += qt6_module.compile_moc( + headers: files('poppler-form.h', 'poppler-optcontent.h'), +) + +install_headers( + 'poppler-qt6.h', + 'poppler-link.h', + 'poppler-annotation.h', + 'poppler-form.h', + 'poppler-optcontent.h', + 'poppler-page-transition.h', + 'poppler-media.h', + 'poppler-converter.h', + subdir: meson.project_name() / 'qt6', +) diff --git a/subprojects/packagefiles/poppler/qt6/tests/meson.build b/subprojects/packagefiles/poppler/qt6/tests/meson.build new file mode 100644 index 0000000000..af7313e9b6 --- /dev/null +++ b/subprojects/packagefiles/poppler/qt6/tests/meson.build @@ -0,0 +1,122 @@ +if get_option('tests') + qt6_test_dep = dependency( + 'qt6', + version: '>=6.2', + modules: ['Test'], + ) + + # manual tests + # test name: [sources, run moc, add Qt6Widgets dependency] + qt6_build_only_tests = { + 'test-poppler-qt6': ['test-poppler-qt6.cpp', true, true], + 'test-password-qt6': ['test-password-qt6.cpp', true, true], + 'test-render-to-file-qt6': ['test-render-to-file.cpp', false, false], + 'poppler-qt6-forms': ['poppler-forms.cpp', false, false], + 'poppler-qt6-fonts': ['poppler-fonts.cpp', false, false], + 'poppler-qt6-attachments': ['poppler-attachments.cpp', false, false], + 'stress-poppler-qt6': ['stress-poppler-qt6.cpp', false, true], + 'stress-poppler-dir-qt6': ['stress-poppler-dir.cpp', false, true], + 'stress-poppler-threads-qt6': ['stress-threads-qt6.cpp', true, false], + 'poppler-qt6-texts': ['poppler-texts.cpp', false, false], + 'poppler-qt6-page-labels': ['poppler-page-labels.cpp', false, false], + } + + qt6_widgets_dep = dependency( + 'qt6', + version: '>=6.2', + modules: ['Widgets'], + ) + + foreach qt6_build_only_test_name, qt6_build_only_test : qt6_build_only_tests + qt6_build_only_test_sources = [qt6_build_only_test[0]] + if qt6_build_only_test[1] + qt6_build_only_test_sources += qt6_module.compile_moc( + sources: qt6_build_only_test[0], + ) + endif + qt6_build_only_test_dependencies = [poppler_qt6_library_dep] + if qt6_build_only_test[2] + qt6_build_only_test_dependencies += qt6_widgets_dep + endif + executable( + qt6_build_only_test_name, + sources: qt6_build_only_test_sources, + dependencies: qt6_build_only_test_dependencies, + ) + endforeach + + # unit tests + qt6_unit_tests = [ + 'actualtext', + 'annotations', + 'attachments', + 'cidfontswidthsbuilder', + 'dateConversion', + 'distinguished_name_parser', + 'endoflines', + 'fonts', + 'forms', + 'goostring', + 'internal_outline', + 'lexer', + 'links', + 'metadata', + 'object', + 'optcontent', + 'outline', + 'overprint', + 'pagelabelinfo', + 'pagelayout', + 'pagemode', + 'password', + 'permissions', + 'search', + 'signature_basics', + # @todo disabled because test fails + # @sa https://gitlab.freedesktop.org/poppler/poppler/-/issues/1678 + # 'signature_basics_pgp', + 'strings', + 'stroke_opacity', + 'utf_conversion', + 'utf8document', + ] + + foreach qt6_unit_test : qt6_unit_tests + qt6_unit_test_name = 'check_qt6_' + qt6_unit_test + qt6_unit_test_source = 'check_' + qt6_unit_test + '.cpp' + qt6_unit_test_executable = executable( + qt6_unit_test_name, + sources: [ + qt6_unit_test_source, + qt6_module.compile_moc( + sources: qt6_unit_test_source, + ), + ], + dependencies: [poppler_qt6_library_dep, qt6_test_dep], + cpp_args: ['-DTESTDATADIR="@0@"'.format(poppler_test_directory)], + ) + test(qt6_unit_test_name, qt6_unit_test_executable) + endforeach + + # @todo disabled beacuse test fails + # @sa https://gitlab.freedesktop.org/poppler/poppler/-/issues/1678 + # if enable_gpgmepp + # qt6_check_create_pgp_signature1_executable = executable( + # 'check_create_pgp_signature1', + # sources: [ + # 'check_create_pgp_signature1.cpp', + # qt6_module.compile_moc(sources: 'check_create_pgp_signature1.cpp') + # ], + # dependencies: [ + # poppler_qt6_library_dep, + # qt6_test_dep + # ], + # cpp_args: [ + # '-DTESTDATADIR="@0@"'.format(poppler_test_directory) + # ] + # ) + # test('check_create_pgp_signature1', qt6_check_create_pgp_signature1_executable) + # endif + + # @todo fuzz tests +endif diff --git a/subprojects/packagefiles/poppler/subprojects/packagefiles/poppler-test/meson.build b/subprojects/packagefiles/poppler/subprojects/packagefiles/poppler-test/meson.build new file mode 100644 index 0000000000..64de9c16d4 --- /dev/null +++ b/subprojects/packagefiles/poppler/subprojects/packagefiles/poppler-test/meson.build @@ -0,0 +1,7 @@ +project( + 'poppler-test', + 'c', + version: '0', +) + +poppler_test_directory = meson.current_source_dir() diff --git a/subprojects/packagefiles/poppler/subprojects/poppler-test.wrap b/subprojects/packagefiles/poppler/subprojects/poppler-test.wrap new file mode 100644 index 0000000000..36171eb092 --- /dev/null +++ b/subprojects/packagefiles/poppler/subprojects/poppler-test.wrap @@ -0,0 +1,6 @@ +[wrap-git] +directory = poppler-test +url = git://git.freedesktop.org/git/poppler/test +revision = b85e4d1ce75636b3e727555a9d31da34ad771c1c +depth = 1 +patch_directory = poppler-test diff --git a/subprojects/packagefiles/poppler/test/meson.build b/subprojects/packagefiles/poppler/test/meson.build new file mode 100644 index 0000000000..09e1c986d2 --- /dev/null +++ b/subprojects/packagefiles/poppler/test/meson.build @@ -0,0 +1,63 @@ +if get_option('tests') + perf_test_executable = executable( + 'perf-test', + sources: 'perf-test.cc', + dependencies: poppler_library_dep, + ) + + pdf_fullrewrite_executable = executable( + 'pdf-fullrewrite', + sources: ['pdf-fullrewrite.cc', utils_parseargs_cc], + dependencies: poppler_library_dep, + ) + + if gtk3_dep.found() + gtk_test_executable = executable( + 'gtk-test', + sources: 'gtk-test.cc', + dependencies: [poppler_glib_library_dep, gtk3_dep], + ) + endif + + if cairo_dep.found() and gtk3_dep.found() + pdf_inspector_executable = executable( + 'pdf-inspector', + sources: ['pdf-inspector.cc', poppler_cairo_sources], + dependencies: [poppler_glib_library_dep, gtk3_dep], + cpp_args: '-DSRC_DIR="@0@"'.format(meson.current_source_dir()), + ) + endif + + threads_dep = dependency( + 'threads', + required: cairo_dep.found(), + ) + if threads_dep.found() + cairo_thread_test_executable = executable( + 'cairo-thread-test', + sources: ['cairo-thread-test.cc', poppler_cairo_sources], + dependencies: [ + poppler_library_dep, + cairo_dep, + threads_dep, + ], + ) + endif + + if nss_dep.found() + pdf_validate_signature_executable = executable( + 'pdf-validate-signature', + sources: 'pdf-validate-signature.cc', + dependencies: poppler_library_dep, + ) + # @todo add tests, but they depend on test data, not in this repository + pdf_signing_nss_executable = executable( + 'pdf-signing-nss', + sources: 'pdf-signing-nss.cc', + dependencies: poppler_library_dep, + ) + # @todo add tests, but they depend on test data, not in this repository + endif +endif + +summary('tests', get_option('tests')) diff --git a/subprojects/packagefiles/poppler/utils/meson.build b/subprojects/packagefiles/poppler/utils/meson.build new file mode 100644 index 0000000000..6c243e8539 --- /dev/null +++ b/subprojects/packagefiles/poppler/utils/meson.build @@ -0,0 +1,171 @@ +utils_parseargs_cc = files('parseargs.cc') + +if get_option('tools').allowed() + tools_dependencies = [poppler_library_dep] + + tools_sources = [utils_parseargs_cc, 'Win32Console.cc'] + + + # pdftoppm + pdftoppm_executable = executable( + 'pdftoppm', + sources: tools_sources + ['pdftoppm.cc', 'sanitychecks.cc'], + dependencies: tools_dependencies, + install: true, + ) + install_man('pdftoppm.1') + meson.override_find_program('pdftoppm', pdftoppm_executable) + + + # pdftocairo + if cairo_dep.found() + pdftocairo_executable = executable( + 'pdftocairo', + sources: [ + tools_sources, + poppler_cairo_sources, + 'pdftocairo.cc', + 'pdftocairo-win32.cc', + ], + dependencies: [ + cairo_dep, + tools_dependencies, + ], + install: true, + ) + install_man('pdftocairo.1') + meson.override_find_program('pdftocairo', pdftocairo_executable) + endif + + + # pdfdetach + pdfdetach_executable = executable( + 'pdfdetach', + sources: tools_sources + ['pdfdetach.cc'], + dependencies: tools_dependencies, + install: true, + ) + install_man('pdfdetach.1') + meson.override_find_program('pdfdetach', pdfdetach_executable) + + + # pdfattach + pdfattach_executable = executable( + 'pdfattach', + sources: tools_sources + ['pdfattach.cc'], + dependencies: tools_dependencies, + install: true, + ) + install_man('pdfattach.1') + meson.override_find_program('pdfattach', pdfattach_executable) + + + # pdffonts + pdffonts_executable = executable( + 'pdffonts', + sources: tools_sources + ['pdffonts.cc'], + dependencies: tools_dependencies, + install: true, + ) + install_man('pdffonts.1') + meson.override_find_program('pdffonts', pdffonts_executable) + + + # pdfimages + pdfimages_executable = executable( + 'pdfimages', + sources: tools_sources + ['pdfimages.cc', 'ImageOutputDev.cc'], + dependencies: tools_dependencies, + install: true, + ) + install_man('pdfimages.1') + meson.override_find_program('pdfimages', pdfimages_executable) + + + # pdfinfo + pdfinfo_executable = executable( + 'pdfinfo', + sources: tools_sources + ['pdfinfo.cc', 'printencodings.cc'], + dependencies: tools_dependencies, + install: true, + ) + install_man('pdfinfo.1') + meson.override_find_program('pdfinfo', pdfinfo_executable) + + + # pdfsig + if nss_dep.found() or gpgmepp_dep.found() + pdfsig_executable = executable( + 'pdfsig', + sources: tools_sources + ['pdfsig.cc'], + dependencies: tools_dependencies, + install: true, + ) + install_man('pdfsig.1') + meson.override_find_program('pdfsig', pdfsig_executable) + endif + + + # pdftops + pdftops_executable = executable( + 'pdftops', + sources: tools_sources + ['pdftops.cc', 'sanitychecks.cc'], + dependencies: tools_dependencies, + install: true, + ) + install_man('pdftops.1') + meson.override_find_program('pdftops', pdftops_executable) + + + # pdftotext + pdftotext_executable = executable( + 'pdftotext', + sources: tools_sources + ['pdftotext.cc', 'printencodings.cc'], + dependencies: tools_dependencies, + install: true, + ) + install_man('pdftotext.1') + meson.override_find_program('pdftotext', pdftotext_executable) + + + # pdftohtml + pdftohtml_executable = executable( + 'pdftohtml', + sources: tools_sources + [ + 'pdftohtml.cc', + 'HtmlFonts.cc', + 'HtmlLinks.cc', + 'HtmlOutputDev.cc', + 'InMemoryFile.cc', + ], + dependencies: tools_dependencies, + install: true, + ) + install_man('pdftohtml.1') + meson.override_find_program('pdftohtml', pdftohtml_executable) + + + # pdfseparate + pdfseparate_executable = executable( + 'pdfseparate', + sources: tools_sources + ['pdfseparate.cc'], + dependencies: tools_dependencies, + install: true, + ) + install_man('pdfseparate.1') + meson.override_find_program('pdfseparate', pdfseparate_executable) + + + # pdfunite + pdfunite_executable = executable( + 'pdfunite', + sources: tools_sources + ['pdfunite.cc'], + dependencies: tools_dependencies, + install: true, + ) + install_man('pdfunite.1') + meson.override_find_program('pdfunite', pdfunite_executable) + +endif + +summary('tools', get_option('tools').allowed()) diff --git a/subprojects/poppler.wrap b/subprojects/poppler.wrap new file mode 100644 index 0000000000..a6e8019650 --- /dev/null +++ b/subprojects/poppler.wrap @@ -0,0 +1,10 @@ +[wrap-file] +directory = poppler-26.03.0 +source_url = https://poppler.freedesktop.org/poppler-26.03.0.tar.xz +source_filename = poppler-26.03.0.tar.xz +source_hash = 8b3c5e2a9f2ab4c3ec5029f28af1b433c6b71f0d1e7b3997aa561cf1c0ca4ebe +patch_directory = poppler + +[provide] +dependency_names = poppler, poppler-cpp, poppler-glib, poppler-qt5, poppler-qt6 +program_names = pdftoppm, pdftocairo, pdfdetach, pdfattach, pdffonts, pdfimages, pdfinfo, pdfsig, pdftops, pdftotext, pdftohtml, pdfseparate, pdfunite diff --git a/tools/sanity_checks.py b/tools/sanity_checks.py index 48d5596ab6..f3db01938a 100755 --- a/tools/sanity_checks.py +++ b/tools/sanity_checks.py @@ -152,6 +152,10 @@ 'pcre.def', 'pcreposix.def' }, + 'poppler': { + 'poppler_exports.h.in', + 'poppler-test.wrap', + }, 'protobuf': { 'symlink_or_copy.py', },