root/gs2-extensions/xpdf-tools/trunk/src/packages/gs-CMakeLists.txt @ 32237

Revision 32237, 12.1 KB (checked in by ak19, 2 years ago)

Rewrote gs-CMakeLists.txt in a tidier way to successfully build working static xpdftools binaries, replacing the previously committed temporary gs-CMakeLists.txt.staticworks file wit its sloppier contents . The changes to gs-CMakeLists.txt now take into account a new variable introduced and set in XPDFTOOLS.sh: GSDLFLAG_STATIC_BUILD. When building statically, set PNG_LIBRARY, ZLIB_LIBRARY, FREETYPE_LIBRARY to their generated .a files and now also set GSDLFLAG_STATIC_BUILD to dummy value true. When wanting to go back to dynamic building for any reason, either don't set any of the LIBRARY packages or set them to their specific real (not symbolical link) generated .so files. In case of dynamic building, additionally do NOT set GSDLFLAG_STATIC_BUILD at all, whether to true or false. Then the gs-CMakeLists.txt follows the internal code branches to use the original code to generate dynamically linked xpdftools binaries.

Line 
1#========================================================================
2#
3# xpdf/cmake-xpdf.txt
4#
5# CMake script for the Xpdf tools.
6#
7# Copyright 2015 Glyph & Cog, LLC
8#
9#========================================================================
10
11#========================================================================
12# This is a customised version of Xpdf Tools' CMake file.
13# Customised for Greenstone.
14#========================================================================
15
16include_directories("${PROJECT_SOURCE_DIR}")
17include_directories("${PROJECT_BINARY_DIR}")
18include_directories("${PROJECT_SOURCE_DIR}/goo")
19include_directories("${PROJECT_SOURCE_DIR}/fofi")
20include_directories("${PROJECT_SOURCE_DIR}/splash")
21
22if(GSDLFLAG_STATIC_BUILD)
23  message(STATUS "@@@@ GSDLFLAG_STATIC_BUILD SET. Building xpdf-tools statically.")
24else ()
25  message(STATUS "@@@@ GSDLFLAG_STATIC_BUILD not SET. Building dynamically using xpdf-tools' (mostly) original, unmodified linker flags.")
26endif ()
27if (PNG_FOUND)
28  include_directories("${PNG_INCLUDE_DIRS}")
29  add_definitions("${PNG_DEFINITIONS}")
30else ()
31  message(STATUS "@@@@@@@@@@@@@@@ NO PNG_FOUND")
32endif ()
33# https://stackoverflow.com/questions/36126333/mingw-cmake-undefined-reference-to-zlib
34if (ZLIB_FOUND)
35  include_directories("${ZLIB_INCLUDE_DIRS}")
36  add_definitions("${ZLIB_DEFINITIONS}")
37else ()
38  message(STATUS "@@@@@@@@@@@@@@@ NO ZLIB_FOUND")
39endif ()
40if (HAVE_LCMS)
41  include_directories("${LCMS_INCLUDE_DIR}")
42  set(COLOR_MANAGER_SOURCE "ColorManager.cc")
43  if(GSDLFLAG_STATIC_BUILD)
44    # Untested combination, warn https://cmake.org/cmake/help/v3.0/command/message.html
45    message(AUTHOR_WARNING "@@@@@@@@@@@@@@@ GSDL Warning: static building with HAVE_LCMS on. If running ldd/file on generated binaries shows any binary to be partially a dynamic executable, then Export VERBOSE=1 and re-run the CMake build. Then check the verbose build output's linker flags (for static building) for that binary: they should not be -Wl,-Bstatic LIBS -Wl,-Bdynamic -lpthread but -static LIBS. Fix it by removing all references to LCMS_LIBRARY in the static linking flags of target_link_libraries statements (i.e. when GSDLFLAG_STATIC_BUILD is set) in file gs-CMakeLists.txt and replacing them with the -l equivalent for the color manager library, (l)cms. @@@@@@@@@@@@@@@")
46  endif ()
47else ()
48  set(COLOR_MANAGER_SOURCE "")
49endif ()
50if (TYPE_LIBRARY)
51  if(GSDLFLAG_STATIC_BUILD)
52    # Untested combination, warn
53    message(AUTHOR_WARNING "@@@@@@@@@@@@@@@ GSDL Warning: static building with TYPE_LIBRARY. If running ldd/file on generated binaries shows any binary to be partially a dynamic executable, then export VERBOSE=1 and re-run the CMake build. Then check the verbose build output's linker flags (for static building) for that binary: they should not be -Wl,-Bstatic LIBS -Wl,-Bdynamic -lpthread but -static LIBS. Fix it by removing all references to DTYPE_LIBRARY in the static linking flags of target_link_libraries statements (i.e. when GSDLFLAG_STATIC_BUILD is set) in file gs-CMakeLists.txt and replacing them with the -l equivalent for typelib. @@@@@@@@@@@@@@@")
54  endif ()
55endif ()
56add_library(xpdf_objs OBJECT
57  AcroForm.cc
58  Annot.cc
59  Array.cc
60  BuiltinFont.cc
61  BuiltinFontTables.cc
62  Catalog.cc
63  CharCodeToUnicode.cc
64  CMap.cc
65  ${COLOR_MANAGER_SOURCE}
66  Decrypt.cc
67  Dict.cc
68  Error.cc
69  FontEncodingTables.cc
70  Form.cc
71  Function.cc
72  Gfx.cc
73  GfxFont.cc
74  GfxState.cc
75  GlobalParams.cc
76  JArithmeticDecoder.cc
77  JBIG2Stream.cc
78  JPXStream.cc
79  Lexer.cc
80  Link.cc
81  NameToCharCode.cc
82  Object.cc
83  OptionalContent.cc
84  Outline.cc
85  OutputDev.cc
86  Page.cc
87  Parser.cc
88  PDFDoc.cc
89  PDFDocEncoding.cc
90  PSTokenizer.cc
91  SecurityHandler.cc
92  Stream.cc
93  TextString.cc
94  UnicodeMap.cc
95  UnicodeTypeTable.cc
96  UTF8.cc
97  XFAForm.cc
98  XRef.cc
99  Zoox.cc
100)
101
102#--- object files needed by XpdfWidget
103
104if ((QT4_FOUND OR Qt5Widgets_FOUND)
105    AND HAVE_SPLASH AND MULTITHREADED AND USE_EXCEPTIONS)
106
107  if (HIGHLIGHTED_REGIONS)
108    set(HIGHLIGHT_SRC "HighlightFile.cc")
109  else ()
110    set(HIGHLIGHT_SRC "")
111  endif ()
112
113  add_library(xpdf_widget_objs OBJECT
114    DisplayState.cc
115    PDFCore.cc
116    PreScanOutputDev.cc
117    PSOutputDev.cc
118    SplashOutputDev.cc
119    TextOutputDev.cc
120    TileCache.cc
121    TileCompositor.cc
122    TileMap.cc
123    ${HIGHLIGHT_SRC}
124  )
125endif ()
126
127# We want to build static xpdf-tools binaries. See
128# https://stackoverflow.com/questions/24648357/compiling-a-static-executable-with-cmake
129# Want to make the min number of changes for building statically, so using the way
130# below. Beware, must *append* "-static" to existing CMAKE_EXE_LINKER_FLAGS=LD_FLAGS
131##SET(CMAKE_FIND_LIBRARY_SUFFIXES ".a")
132##SET(BUILD_SHARED_LIBS OFF)
133##SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static")
134
135# The original, unmodified CMakeLists.txt was not set up sufficiently
136# for static compilation of xpdf-tools. As a result, compile would first fail
137# with errors about undefined refs to mutex / lpthread.
138# When building xpdf-tools statically, need to add the following 2 lines as well
139# as append "Threads::Threads" to the end of each "target_link_libraries(<list>)"
140# See https://stackoverflow.com/questions/1620918/cmake-and-libpthread
141# found googling cmake and "-lpthread" (pthread) after ERRORS to do with this, like:
142#   undefined reference to `pthread_mutex_unlock'
143##set(THREADS_PREFER_PTHREAD_FLAG ON)
144##find_package(Threads REQUIRED)
145
146#--- pdftops
147
148if (HAVE_SPLASH)
149  add_executable(pdftops
150    $<TARGET_OBJECTS:xpdf_objs>
151    PreScanOutputDev.cc
152    PSOutputDev.cc
153    SplashOutputDev.cc
154    pdftops.cc
155  ) 
156  if(GSDLFLAG_STATIC_BUILD)
157    target_link_libraries(pdftops goo fofi splash
158      -static -lfreetype ${DTYPE_LIBRARY} ${LCMS_LIBRARY} -lz -lm -lc -lpthread)
159    # Threads::Threads instead of -lpthread results in a partially dynamic executable
160  else ()
161    target_link_libraries(pdftops goo fofi splash
162                        ${FREETYPE_LIBRARY} ${FREETYPE_OTHER_LIBS}
163                        ${DTYPE_LIBRARY}
164                        ${LCMS_LIBRARY}
165            ${ZLIB_LIBRARIES})
166  endif ()
167else ()
168  add_executable(pdftops
169    $<TARGET_OBJECTS:xpdf_objs>
170    PreScanOutputDev.cc
171    PSOutputDev.cc
172    pdftops.cc
173  )
174  if(GSDLFLAG_STATIC_BUILD)
175    target_link_libraries(pdftops goo fofi -static ${LCMS_LIBRARY} -lm -lc -lpthread)
176  else ()
177    target_link_libraries(pdftops goo fofi ${LCMS_LIBRARY})
178  endif ()
179endif ()
180install(TARGETS pdftops RUNTIME DESTINATION bin)
181install(FILES ${PROJECT_SOURCE_DIR}/doc/pdftops.1 DESTINATION man/man1)
182
183#--- pdftotext
184
185add_executable(pdftotext
186  $<TARGET_OBJECTS:xpdf_objs>
187  TextOutputDev.cc
188  pdftotext.cc
189)
190if(GSDLFLAG_STATIC_BUILD)
191  target_link_libraries(pdftotext goo fofi -static ${LCMS_LIBRARY} -lpthread)
192  # Threads::Threads instead of -lpthread results in a partially dynamic executable
193else ()
194  target_link_libraries(pdftotext goo fofi ${LCMS_LIBRARY})
195endif ()
196install(TARGETS pdftotext RUNTIME DESTINATION bin)
197install(FILES ${PROJECT_SOURCE_DIR}/doc/pdftotext.1 DESTINATION man/man1)
198
199#--- pdftohtml
200
201if (HAVE_SPLASH AND PNG_FOUND)
202  add_executable(pdftohtml
203    $<TARGET_OBJECTS:xpdf_objs>
204    HTMLGen.cc
205    SplashOutputDev.cc
206    TextOutputDev.cc
207    pdftohtml.cc
208  )
209  if(GSDLFLAG_STATIC_BUILD)
210    target_link_libraries(pdftohtml goo fofi splash
211      -static -lfreetype ${DTYPE_LIBRARY} ${LCMS_LIBRARY} -lpng -lz -lm -lc -lpthread)
212  else ()
213    target_link_libraries(pdftohtml goo fofi splash
214                          ${FREETYPE_LIBRARY} ${FREETYPE_OTHER_LIBS}
215                          ${DTYPE_LIBRARY}
216                          ${LCMS_LIBRARY} ${PNG_LIBRARIES})
217  endif ()
218# Doing the regular target_link_libraries() in static mode results in building with
219# "-Wl,-Bstatic -lfreetype -lpng15 -lz -Wl,-Bdynamic -lpthread" at end of link line
220# and produces broken binaries for pdftohtml/pdftoppm/pdftops/pdftopng.
221# Note that PNG_LIBRARIES includes zlib/lz: "-lpng -lz", and along with freetype,
222# these are linked statically. However, Threads/lpthread is included as a dynamically
223# linked library instead of including a .a (regardless of whether it's appended
224# as -lpthread or Threads::Threads in else above), contributing to the pdfhtml binary
225# produced being a partially static, partially dynamic one,
226# so a dynamic executable overall.
227# The order of dynamic .so files listed by ldd in the broken binary differs from
228# a manually linked working version of pdftohtml, and seems to be the only difference
229# between the two in ldd output. Not using "-Wl,-Bstatic" and using -static in its
230# place creates a partially static dynamic executable that isn't broken, whereas
231# additionally removing "-Wl,-Bdynamic -lpthread" and replacing it with -lpthread
232# moreover produces a working pdftohtml that is a fully static linked executable.
233# The inclusion of the math lib and c lib (lm and lc) in the final link command
234# are to completely bypass the remaining .so dependencies that were present in
235# the executable and produce the fully static executable.
236# Not sure what colormanager (lcms) and typelibrary, or how they're written in -l
237# form as they were not present when the original unmodified static linking command
238# was run, so they've not been included in the replacement static linking command.
239  install(TARGETS pdftohtml RUNTIME DESTINATION bin)
240  install(FILES ${PROJECT_SOURCE_DIR}/doc/pdftohtml.1 DESTINATION man/man1)
241endif ()
242
243#--- pdfinfo
244
245add_executable(pdfinfo
246  $<TARGET_OBJECTS:xpdf_objs>
247  pdfinfo.cc
248)
249if(GSDLFLAG_STATIC_BUILD)
250  target_link_libraries(pdfinfo goo fofi -static ${LCMS_LIBRARY} -lpthread)
251else ()
252  target_link_libraries(pdfinfo goo fofi ${LCMS_LIBRARY})
253endif()
254install(TARGETS pdfinfo RUNTIME DESTINATION bin)
255install(FILES ${PROJECT_SOURCE_DIR}/doc/pdfinfo.1 DESTINATION man/man1)
256
257#--- pdffonts
258
259add_executable(pdffonts
260  $<TARGET_OBJECTS:xpdf_objs>
261  pdffonts.cc
262)
263if(GSDLFLAG_STATIC_BUILD)
264  target_link_libraries(pdffonts goo fofi -static ${LCMS_LIBRARY} -lpthread)
265else ()
266  target_link_libraries(pdffonts goo fofi ${LCMS_LIBRARY})
267endif ()
268install(TARGETS pdffonts RUNTIME DESTINATION bin)
269install(FILES ${PROJECT_SOURCE_DIR}/doc/pdffonts.1 DESTINATION man/man1)
270
271#--- pdfdetach
272
273add_executable(pdfdetach
274  $<TARGET_OBJECTS:xpdf_objs>
275  pdfdetach.cc
276)
277if(GSDLFLAG_STATIC_BUILD)
278  target_link_libraries(pdfdetach goo fofi -static ${LCMS_LIBRARY} -lpthread)
279else ()
280  target_link_libraries(pdfdetach goo fofi ${LCMS_LIBRARY})
281endif ()
282install(TARGETS pdfdetach RUNTIME DESTINATION bin)
283install(FILES ${PROJECT_SOURCE_DIR}/doc/pdfdetach.1 DESTINATION man/man1)
284
285#--- pdftoppm
286
287if (HAVE_SPLASH)
288  add_executable(pdftoppm
289    $<TARGET_OBJECTS:xpdf_objs>
290    SplashOutputDev.cc
291    pdftoppm.cc
292  )
293  if(GSDLFLAG_STATIC_BUILD)
294    target_link_libraries(pdftoppm goo fofi splash
295      -static -lfreetype ${DTYPE_LIBRARY} ${LCMS_LIBRARY} -lz -lm -lc -lpthread)
296  else ()
297    target_link_libraries(pdftoppm goo fofi splash
298                        ${FREETYPE_LIBRARY} ${FREETYPE_OTHER_LIBS}
299                        ${DTYPE_LIBRARY}
300                        ${LCMS_LIBRARY}
301            ${ZLIB_LIBRARIES})
302  endif ()
303  install(TARGETS pdftoppm RUNTIME DESTINATION bin)
304  install(FILES ${PROJECT_SOURCE_DIR}/doc/pdftoppm.1 DESTINATION man/man1)
305endif ()
306
307#--- pdftopng
308
309if (HAVE_SPLASH AND PNG_FOUND)
310  add_executable(pdftopng
311    $<TARGET_OBJECTS:xpdf_objs>
312    SplashOutputDev.cc
313    pdftopng.cc
314  )
315  if(GSDLFLAG_STATIC_BUILD)
316    target_link_libraries(pdftopng goo fofi splash
317      -static -lfreetype ${DTYPE_LIBRARY} ${LCMS_LIBRARY} -lpng -lz -lm -lc -lpthread)
318  else ()
319    target_link_libraries(pdftopng goo fofi splash
320                        ${FREETYPE_LIBRARY} ${FREETYPE_OTHER_LIBS}
321                        ${DTYPE_LIBRARY}
322                        ${LCMS_LIBRARY} ${PNG_LIBRARIES})
323  endif ()
324  install(TARGETS pdftopng RUNTIME DESTINATION bin)
325  install(FILES ${PROJECT_SOURCE_DIR}/doc/pdftopng.1 DESTINATION man/man1)
326endif ()
327
328#--- pdfimages
329
330add_executable(pdfimages
331  $<TARGET_OBJECTS:xpdf_objs>
332  ImageOutputDev.cc
333  pdfimages.cc
334)
335if(GSDLFLAG_STATIC_BUILD)
336  target_link_libraries(pdfimages goo fofi -static ${LCMS_LIBRARY} -lpthread)
337else ()
338  target_link_libraries(pdfimages goo fofi ${LCMS_LIBRARY})
339endif ()
340install(TARGETS pdfimages RUNTIME DESTINATION bin)
341install(FILES ${PROJECT_SOURCE_DIR}/doc/pdfimages.1 DESTINATION man/man1)
342
343#--- xpdfrc man page
344
345install(FILES ${PROJECT_SOURCE_DIR}/doc/xpdfrc.5 DESTINATION man/man5)
Note: See TracBrowser for help on using the browser.