configure_file( "${CMAKE_CURRENT_SOURCE_DIR}/include/pdfengine/version.hpp.in" "${CMAKE_CURRENT_BINARY_DIR}/generated/pdfengine/version.hpp" @ONLY) find_package(PNG REQUIRED) add_library(pdfengine OBJECT src/core/engine_info.cpp src/core/graphics_state.cpp src/core/display_list.cpp src/core/path_interpreter.cpp src/core/skia_renderer.cpp src/parser/content_stream_parser.cpp src/parser/decoration_builder.cpp src/text/selection.cpp src/text/text_layout_engine.cpp src/fonts/face/font_face.cpp src/fonts/face/free_type_manager.cpp src/fonts/loader/font_resolver.cpp src/fonts/shaping/hb_shaper.cpp src/fonts/cache/glyph_bitmap.cpp src/fonts/cache/glyph_cache.cpp src/fonts/pdf_fonts/types/truetype_font.cpp src/fonts/pdf_fonts/types/type1_font.cpp src/fonts/pdf_fonts/types/cid_font.cpp src/fonts/pdf_fonts/font_loader.cpp src/fonts/pdf_fonts/font_descriptor.cpp src/fonts/pdf_fonts/font_fallback.cpp src/fonts/pdf_fonts/font_subset.cpp src/fonts/pdf_fonts/font_cmap_builder.cpp src/fonts/pdf_fonts/embedded_font_reconstructor.cpp src/fonts/pdf_fonts/encoding/encoding.cpp src/fonts/pdf_fonts/encoding/tounicode_parser.cpp src/fonts/pdf_fonts/encoding/cjk_collection_db.cpp src/parser/pdfium_loader.cpp src/parser/pdfium_document.cpp src/parser/pdfium_internal.cpp src/parser/pdfium_reflow.cpp src/parser/pdfium_page.cpp src/parser/pdfium_page_model.cpp src/parser/pdfium_fonts.cpp src/parser/pdfium_edit_session.cpp src/parser/pdfium_edit.cpp src/parser/pdfium_edit_replace.cpp src/parser/pdfium_edit_reflow.cpp src/parser/pdfium_edit_annotations.cpp src/parser/pdfium_edit_pages.cpp src/parser/pdfium_edit_images.cpp src/qpdf/qpdf_extractor.cpp src/qpdf/qpdf_font_extractor.cpp src/qpdf/qpdf_writer.cpp src/qpdf/qpdf_resource_resolver.cpp src/core/image_decoder.cpp src/parser/lexer.cpp src/parser/parser.cpp src/parser/content_builder.cpp src/serializer/content_serializer.cpp src/serializer/ast_serializer.cpp ) add_library(pdfengine::pdfengine ALIAS pdfengine) set_target_properties(pdfengine PROPERTIES POSITION_INDEPENDENT_CODE ON) target_include_directories(pdfengine PUBLIC "$" "$" PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/src" ) target_link_libraries(pdfengine PUBLIC spdlog::spdlog PRIVATE freetype harfbuzz::harfbuzz harfbuzz::harfbuzz-subset PNG::PNG nlohmann_json::nlohmann_json ) if(PDFENGINE_WITH_PDFIUM) target_link_libraries(pdfengine PRIVATE pdfium::pdfium) target_compile_definitions(pdfengine PUBLIC PDFENGINE_WITH_PDFIUM) # PDFium statically bundles its own libjpeg, zlib, etc. which conflicts with vcpkg. # We use LLD, so we can safely allow multiple definitions to pick the first one. target_link_options(pdfengine PUBLIC "-Wl,--allow-multiple-definition") endif() if(EMSCRIPTEN) target_compile_definitions(pdfengine PRIVATE PDFENGINE_FONT_DIR="/fonts") else() target_compile_definitions(pdfengine PRIVATE PDFENGINE_FONT_DIR="${CMAKE_SOURCE_DIR}/engine/assets/fonts") endif() if(PDFENGINE_WITH_SKIA) target_link_libraries(pdfengine PRIVATE skia::skia) target_compile_definitions(pdfengine PUBLIC PDFENGINE_WITH_SKIA) endif() if(PDFENGINE_WITH_QPDF) find_package(ZLIB REQUIRED) find_package(JPEG REQUIRED) if(NOT TARGET zs) add_library(zs ALIAS ZLIB::ZLIB) endif() if(NOT TARGET jpeg) add_library(jpeg ALIAS JPEG::JPEG) endif() target_link_libraries(pdfengine PRIVATE qpdf::libqpdf ZLIB::ZLIB JPEG::JPEG) target_compile_definitions(pdfengine PUBLIC PDFENGINE_WITH_QPDF) endif() pdfengine_set_warnings(pdfengine) pdfengine_enable_sanitizers(pdfengine) if(PDFENGINE_BUILD_TESTS) add_subdirectory(tests) endif() if(PDFENGINE_FUZZING) set(PDFENGINE_FUZZ_SANITIZERS "fuzzer,address,undefined" CACHE STRING "Sanitizer set for fuzzing (e.g. 'fuzzer,address,undefined' or just 'fuzzer')") string(REPLACE "," ";" _fuzz_sans "${PDFENGINE_FUZZ_SANITIZERS}") set(_fuzz_runtime_sans "") foreach(_s IN LISTS _fuzz_sans) if(NOT _s STREQUAL "fuzzer") list(APPEND _fuzz_runtime_sans "${_s}") endif() endforeach() list(JOIN _fuzz_runtime_sans "," _fuzz_runtime_str) target_compile_options(pdfengine PRIVATE -fsanitize=fuzzer-no-link -fno-omit-frame-pointer) if(_fuzz_runtime_str) target_compile_options(pdfengine PRIVATE -fsanitize=${_fuzz_runtime_str}) target_link_options(pdfengine PUBLIC -fsanitize=${_fuzz_runtime_str}) endif() add_executable(pdfengine_fuzz fuzz/fuzz_load.cpp) target_link_libraries(pdfengine_fuzz PRIVATE pdfengine) target_compile_options(pdfengine_fuzz PRIVATE -fsanitize=${PDFENGINE_FUZZ_SANITIZERS} -fno-omit-frame-pointer) target_link_options(pdfengine_fuzz PRIVATE -fsanitize=${PDFENGINE_FUZZ_SANITIZERS}) endif()