#======================================================================== # # xpdf/cmake-xpdf.txt # # CMake script for the Xpdf tools. # # Copyright 2015 Glyph & Cog, LLC # #======================================================================== #======================================================================== # This is a customised version of Xpdf Tools' CMake file. # Customised for Greenstone. #======================================================================== include_directories("${PROJECT_SOURCE_DIR}") include_directories("${PROJECT_BINARY_DIR}") include_directories("${PROJECT_SOURCE_DIR}/goo") include_directories("${PROJECT_SOURCE_DIR}/fofi") include_directories("${PROJECT_SOURCE_DIR}/splash") if (PNG_FOUND) message(STATUS "@@@@@@@@@@@@@@@ lib: ${PNG_LIBRARY}") message(STATUS "@@@@@@@@@@@@@@@ libs: ${PNG_LIBRARIES}") message(STATUS "@@@@@@@@@@@@@@@ freetype: ${FREETYPE_LIBRARY} - ${FREETYPE_OTHER_LIBS}") include_directories("${PNG_INCLUDE_DIRS}") add_definitions("${PNG_DEFINITIONS}") else () message(STATUS "@@@@@@@@@@@@@@@ NO PNG_FOUND") endif () # https://stackoverflow.com/questions/36126333/mingw-cmake-undefined-reference-to-zlib if (ZLIB_FOUND) message(STATUS "@@@@@@@@@@@@@@@ lib: ${ZLIB_LIBRARY} - ${ZLIB_LIBRARIES}") include_directories("${ZLIB_INCLUDE_DIRS}") add_definitions("${ZLIB_DEFINITIONS}") else () message(STATUS "@@@@@@@@@@@@@@@ NO ZLIB_FOUND") endif () if (HAVE_LCMS) include_directories("${LCMS_INCLUDE_DIR}") set(COLOR_MANAGER_SOURCE "ColorManager.cc") set(PDFTO_PS_PPM_LINK_FLAGS -static -lfreetype ${DTYPE_LIBRARY} ${LCMS_LIBRARY} -lz -lm -lc -lpthread) set(PDFTO_HTML_PNG_LINK_FLAGS -static -lfreetype ${DTYPE_LIBRARY} ${LCMS_LIBRARY} -lpng -lz -lm -lc -lpthread) else () set(COLOR_MANAGER_SOURCE "") set(PDFTO_PS_PPM_LINK_FLAGS -static -lfreetype ${DTYPE_LIBRARY} -lz -lm -lc -lpthread) set(PDFTO_HTML_PNG_LINK_FLAGS -static -lfreetype ${DTYPE_LIBRARY} -lpng -lz -lm -lc -lpthread) endif () add_library(xpdf_objs OBJECT AcroForm.cc Annot.cc Array.cc BuiltinFont.cc BuiltinFontTables.cc Catalog.cc CharCodeToUnicode.cc CMap.cc ${COLOR_MANAGER_SOURCE} Decrypt.cc Dict.cc Error.cc FontEncodingTables.cc Form.cc Function.cc Gfx.cc GfxFont.cc GfxState.cc GlobalParams.cc JArithmeticDecoder.cc JBIG2Stream.cc JPXStream.cc Lexer.cc Link.cc NameToCharCode.cc Object.cc OptionalContent.cc Outline.cc OutputDev.cc Page.cc Parser.cc PDFDoc.cc PDFDocEncoding.cc PSTokenizer.cc SecurityHandler.cc Stream.cc TextString.cc UnicodeMap.cc UnicodeTypeTable.cc UTF8.cc XFAForm.cc XRef.cc Zoox.cc ) #--- object files needed by XpdfWidget if ((QT4_FOUND OR Qt5Widgets_FOUND) AND HAVE_SPLASH AND MULTITHREADED AND USE_EXCEPTIONS) if (HIGHLIGHTED_REGIONS) set(HIGHLIGHT_SRC "HighlightFile.cc") else () set(HIGHLIGHT_SRC "") endif () add_library(xpdf_widget_objs OBJECT DisplayState.cc PDFCore.cc PreScanOutputDev.cc PSOutputDev.cc SplashOutputDev.cc TextOutputDev.cc TileCache.cc TileCompositor.cc TileMap.cc ${HIGHLIGHT_SRC} ) endif () # We want to build static xpdf-tools binaries. See # https://stackoverflow.com/questions/24648357/compiling-a-static-executable-with-cmake # Want to make the min number of changes for building statically, so using the way # below. Beware, must *append* "-static" to existing CMAKE_EXE_LINKER_FLAGS=LD_FLAGS SET(CMAKE_FIND_LIBRARY_SUFFIXES ".a") SET(BUILD_SHARED_LIBS OFF) SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static") # The original, unmodified CMakeLists.txt was not set up sufficiently # for static compilation of xpdf-tools. As a result, compile would first fail # with errors about undefined refs to mutex / lpthread. # When building xpdf-tools statically, need to add the following 2 lines as well # as append "Threads::Threads" to the end of each "target_link_libraries()" # See https://stackoverflow.com/questions/1620918/cmake-and-libpthread # found googling cmake and "-lpthread" (pthread) after ERRORS to do with this, like: # undefined reference to `pthread_mutex_unlock' set(THREADS_PREFER_PTHREAD_FLAG ON) find_package(Threads REQUIRED) #--- pdftops if (HAVE_SPLASH) add_executable(pdftops $ PreScanOutputDev.cc PSOutputDev.cc SplashOutputDev.cc pdftops.cc ) target_link_libraries(pdftops goo fofi splash ${PDFTO_PS_PPM_LINK_FLAGS}) # -static -lfreetype -lpng -lz -lm -lc -lpthread) # ${FREETYPE_LIBRARY} ${FREETYPE_OTHER_LIBS} # ${ZLIB_LIBRARIES} # ${DTYPE_LIBRARY} # ${LCMS_LIBRARY} # Threads::Threads) else () add_executable(pdftops $ PreScanOutputDev.cc PSOutputDev.cc pdftops.cc ) target_link_libraries(pdftops goo fofi ${LCMS_LIBRARY} Threads::Threads) endif () install(TARGETS pdftops RUNTIME DESTINATION bin) install(FILES ${PROJECT_SOURCE_DIR}/doc/pdftops.1 DESTINATION man/man1) #--- pdftotext add_executable(pdftotext $ TextOutputDev.cc pdftotext.cc ) target_link_libraries(pdftotext goo fofi ${LCMS_LIBRARY} Threads::Threads) install(TARGETS pdftotext RUNTIME DESTINATION bin) install(FILES ${PROJECT_SOURCE_DIR}/doc/pdftotext.1 DESTINATION man/man1) #--- pdftohtml if (HAVE_SPLASH AND PNG_FOUND) add_executable(pdftohtml $ HTMLGen.cc SplashOutputDev.cc TextOutputDev.cc pdftohtml.cc ) target_link_libraries(pdftohtml goo fofi splash ${PDFTO_HTML_PNG_LINK_FLAGS}) # -static -lfreetype -lpng -lz -lm -lc -lpthread) # ${FREETYPE_LIBRARY} ${FREETYPE_OTHER_LIBS} # ${DTYPE_LIBRARY} # ${LCMS_LIBRARY} ${PNG_LIBRARIES} # Threads::Threads) # Doing the above builds with # "-Wl,-Bstatic -lfreetype -lpng15 -lz -Wl,-Bdynamic -lpthread" at end # and produces broken binaries for pdftohtml/pdftoppm/pdftops/pdftopng. # Note that PNG_LIBRARIES includes zlib/lz: "-lpng -lz", and with freetype, is # linked statically. However, Threads/lpthread is included as a dynamically # linked library instead of including a .a (regardless of whether it's written # as -lpthread or Threads::Threads above), making the pdfhtml binary produced # a partially static, partially dynamic one, so dynamic executable overall. # The order of dynamic .so files listed by ldd in the broken binary differs from # a manually linked working version of pdftohtml, and seems to be the only difference # between the two in ldd output. Not using "-Wl,-Bstatic" and using -static in its # place creates a partially static dynamic executable that isn't broken, whereas # additionally removing "-Wl,-Bdynamic -lpthread" and replacing it with -lpthread # moreover produces a working pdftohtml that is a fully static linked executable. # The inclusion of the math lib and c lib (lm and lc) in the final link command # are to completely bypass the remaining .so dependencies that were present in # the executable and produce the fully static executable. # Not sure what colormanager (lcms) and typelibrary, or how they're written in -l # form as they were not present when the original unmodified static linking command # was run, so they've not been included in the replacement static linking command. install(TARGETS pdftohtml RUNTIME DESTINATION bin) install(FILES ${PROJECT_SOURCE_DIR}/doc/pdftohtml.1 DESTINATION man/man1) endif () #--- pdfinfo add_executable(pdfinfo $ pdfinfo.cc ) target_link_libraries(pdfinfo goo fofi ${LCMS_LIBRARY} Threads::Threads) install(TARGETS pdfinfo RUNTIME DESTINATION bin) install(FILES ${PROJECT_SOURCE_DIR}/doc/pdfinfo.1 DESTINATION man/man1) #--- pdffonts add_executable(pdffonts $ pdffonts.cc ) target_link_libraries(pdffonts goo fofi ${LCMS_LIBRARY} Threads::Threads) install(TARGETS pdffonts RUNTIME DESTINATION bin) install(FILES ${PROJECT_SOURCE_DIR}/doc/pdffonts.1 DESTINATION man/man1) #--- pdfdetach add_executable(pdfdetach $ pdfdetach.cc ) target_link_libraries(pdfdetach goo fofi ${LCMS_LIBRARY} Threads::Threads) install(TARGETS pdfdetach RUNTIME DESTINATION bin) install(FILES ${PROJECT_SOURCE_DIR}/doc/pdfdetach.1 DESTINATION man/man1) #--- pdftoppm if (HAVE_SPLASH) add_executable(pdftoppm $ SplashOutputDev.cc pdftoppm.cc ) target_link_libraries(pdftoppm goo fofi splash ${PDFTO_PS_PPM_LINK_FLAGS}) # ${FREETYPE_LIBRARY} ${FREETYPE_OTHER_LIBS} # ${ZLIB_LIBRARIES} # ${DTYPE_LIBRARY} # ${LCMS_LIBRARY} # Threads::Threads) install(TARGETS pdftoppm RUNTIME DESTINATION bin) install(FILES ${PROJECT_SOURCE_DIR}/doc/pdftoppm.1 DESTINATION man/man1) endif () #--- pdftopng if (HAVE_SPLASH AND PNG_FOUND) add_executable(pdftopng $ SplashOutputDev.cc pdftopng.cc ) target_link_libraries(pdftopng goo fofi splash ${PDFTO_HTML_PNG_LINK_FLAGS}) # ${FREETYPE_LIBRARY} ${FREETYPE_OTHER_LIBS} # ${DTYPE_LIBRARY} # ${LCMS_LIBRARY} ${PNG_LIBRARIES} # Threads::Threads) install(TARGETS pdftopng RUNTIME DESTINATION bin) install(FILES ${PROJECT_SOURCE_DIR}/doc/pdftopng.1 DESTINATION man/man1) endif () #--- pdfimages add_executable(pdfimages $ ImageOutputDev.cc pdfimages.cc ) target_link_libraries(pdfimages goo fofi ${LCMS_LIBRARY} Threads::Threads) install(TARGETS pdfimages RUNTIME DESTINATION bin) install(FILES ${PROJECT_SOURCE_DIR}/doc/pdfimages.1 DESTINATION man/man1) #--- xpdfrc man page install(FILES ${PROJECT_SOURCE_DIR}/doc/xpdfrc.5 DESTINATION man/man5)