source: gs2-extensions/xpdf-tools/trunk/src/packages/GS-README.txt@ 32249

Last change on this file since 32249 was 32249, checked in by ak19, 6 years ago

All the changes to incorporate libtiff and libjpeg into the xpdftools GS2 extension, to get libjpeg compiled up on 64 bit machines, and for both libs to be seen and used by xpdftools when this is built.

File size: 34.8 KB
Line 
1__________________________________________________________
2CONTENTS
3__________________________________________________________
4
5Xpdf-Tools related
6A. XPDF
7B. Mojo::DOM perl package for parsing HTML
8C. Compiling Xpdf-Tools: statically or dynamically linked
9D. How we got Xpdf-Tools to compile using CASCADE-MAKE
10E. Getting more output when running CMake (verbosity)
11F. APPENDIX - Useful links
12
13LIBJPEG related
14G. LIBJPEG and LIBTIFF
15- Issues building LIBJPEG on 64 bit machines and the patch
16
17__________________________________________________________
18A. XPDF
19__________________________________________________________
20
21Xpdf's last mod date is in 2017 and it includes its own pdftohtml utility tool, whereas the old "pdftohtml" tool that GS used was last updated 2013 (and itself made use of Xpdf, possible older versions).
22
23The tool takes a PDF and produces an HTML file for each page of the PDF, consisting of selectable HTML text overlaid on top of "screenshot" image of the page. (A page's text is not part of the screenshot.)
24
251. https://www.xpdfreader.com/download.html
26
27As per the Readme file found in the linux binary of Xpdf Tools, the Xpdf Viewer requires the qt toolkit, but not the Xpdf Tools. Have not read the Install file to confirm whether the same is the case for when compiling the command line tools. (But in that case, can't we just include the tools binary available for all 3 OS, instead of compiling on each platform)
28
29 - Using Xpdf's pdftohtml tool:
30 greenstone@bedrock:~/Downloads/xpdf-tools-linux-4.00/bin64$./pdftohtml -z 1.5 ~/Downloads/ApacheLicence.pdf licence
31
32 where licence is a folder.
33
34 - Using Xpdf's pdftotext tool:
35 greenstone@bedrock:~/Downloads/xpdf-tools-linux-4.00/bin64$./pdftotext -nopgbrk ~/Downloads/ApacheLicence.pdf ~/Downloads/ApacheLicence.txt
36
37 where the output text file must be specified with a full path name.
38
39
402. Documentation on Xpdf-Tools:
41- https://www.xpdfreader.com/support.html
42 for example, the pdftohtml man page: https://www.xpdfreader.com/pdftohtml-man.html
43- https://linux.die.net/man/5/xpdfrc
44(Configuration flags you can put into ~/.xpdfrc to use as defaults when running xpdf tool commands)
45
463. We're using Xpdf Tools version: xpdf-tools-linux-4.00
47
484. We started by working with the ready-made Xpdf-tools binaries available for download from the xpdf site for Win, Linux and Mac.
49
505. We're now moving to compiling up Xpdf-tools ourselves using CASCADE-MAKE, which we have so far got to successfully compile statically on Linux (LSB environment inclusive) to build working binaries.
51
52On Mac, I've been unable to get it to produce statically linked libraries: at this stage they're dynamically linked.
53
54
55__________________________________________________________
56B. Mojo::DOM perl package for parsing HTML
57__________________________________________________________
58
59XPDF's pdftohtml conversion of a single PDF document produces multiple HTML files: one for each page in the source PDF.
60We want the output to be "paged_html": a single HTML file that is sectionalised, each section representing a page of the
61original PDF.
62
63We need to be able to parse the many HTML pages produced by XPDF's pdftohtml conversion of a doc, in order to massage the output
64into the single sectionalised HTML file. For this we needed a HTML parser package for Perl.
65
661. Before Dr Bainbridge found Mojo::DOM, he looked at
67* https://en.wikipedia.org/wiki/Comparison_of_HTML_parsers
68* http://radar.oreilly.com/2014/02/parsing-html-with-perl-2.html
69
702. Main links for Mojo::DOM
71* https://mojolicious.org/perldoc/Mojo/DOM
72* https://metacpan.org/pod/Mojo::DOM
73 Dependencies: http://deps.cpantesters.org/?module=Mojo%3A%3ADOM;perl=latest
74
753. Once you've downloaded Mojo::DOM's src, follow Dr Bainbridge's sequence of commands for building the Mojo::DOM CPAN module of perl below.
76We'll be using this module to be used for parsing the HTML output by XPDF tool pdftohtml
77
78
79 mkdir cpan
80 2020 tar xvzf Mojolicious-7.84.tar.gz
81 2021 cd Mojolicious-7.84/
82 2028 perl ./Makefile.PL PREFIX=`pwd`/installed
83 2030 make
84 2031 make install
85 2033 cp -r installed/share/perl/5.18.2 ../cpan
86 cd ..
87 2044 export PERL5LIB=`pwd`/cpan
88
89 2053 emacs -nw test.pl
90
91 #!/usr/bin/perl -w
92 add in 'use v5.10;'
93
94 2054 chmod a+x test.pl
95 2055 ./test.pl
96
97
98__________________________________________________________
99C. Compiling Xpdf-Tools: statically or dynamically linked
100__________________________________________________________
101
102As explained in detail in section D below, we have a customised gs-CMakeLists.txt file which replaces the one in the xpf-4.00.tar.gz package's xpdf subfolder after this is untarred. This customised CMake configure/make file now allows us to compile xpdf-tools either statically (as we've now set it up for by default) or dynamically (as its CMake makefiles were originally set up for).
103
1041. To compile Xpdf-Tools statically, packages/CASCADE-MAKE/XPDFTOOLS.sh should contain:
105
106 cmake -DCMAKE_BUILD_TYPE=Release \
107 -DCMAKE_INSTALL_PREFIX=$prefix \
108 -DZLIB_LIBRARY=$prefix/lib/libz.a \ # <========= THIS
109 -DPNG_LIBRARY=$prefix/lib/libpng15.a \ # <========= THIS
110 -DFREETYPE_LIBRARY=$prefix/lib/libfreetype.a \ # <========= THIS
111 -DCMAKE_DISABLE_FIND_PACKAGE_Qt4=1 \
112 -DCMAKE_DISABLE_FIND_PACKAGE_Qt5Widgets=1 \
113 -DCMAKE_C_FLAGS="$CFLAGS" \
114 -DCMAKE_CXX_FLAGS="$CXXFLAGS" \
115 -DCMAKE_EXE_LINKER_FLAGS="$LDFLAGS" \
116 -DGSDLFLAG_STATIC="$static_flag" \ # <========= THIS
117 $GEXT_XPDFTOOLS/packages/$package$version
118
119In place of FREETYPE_LIBRARY above, could also try the following,
120 -DFREETYPE_DIR=$prefix \
121but then check the built binaries by running "ldd" and "file" over them, to make sure they're not referencing any .so dynamic link libraries:
122
123
1242. To compile Xpdf-Tools dynamically and make it find *our* dynamically linked libraries for its helper packages zlib, libpng and freetype, edit packages/CASCADE-MAKE/XPDFTOOLS.sh to contain:
125
126 cmake -DCMAKE_BUILD_TYPE=Release \
127 -DCMAKE_INSTALL_PREFIX=$prefix \
128 -DZLIB_LIBRARY=$prefix/lib/libz.so.1.2.7 \ # <========= THIS
129 -DPNG_LIBRARY=$prefix/lib/libpng15.so.15.30.0 \ # <========= THIS
130 -DFREETYPE_LIBRARY=$prefix/lib/libfreetype.so.6.3.20 \ # <========= THIS
131 -DCMAKE_DISABLE_FIND_PACKAGE_Qt4=1 \
132 -DCMAKE_DISABLE_FIND_PACKAGE_Qt5Widgets=1 \
133 -DCMAKE_C_FLAGS="$CFLAGS" \
134 -DCMAKE_CXX_FLAGS="$CXXFLAGS" \
135 -DCMAKE_EXE_LINKER_FLAGS="$LDFLAGS" \
136 $GEXT_XPDFTOOLS/packages/$package$version # <=== -DGSDLFLAG_STATIC removed
137
138
139
140 (1) In the above, you could also set
141 -DFREETYPE_DIR=$prefix
142 in place of
143 -DGSDLFLAG_STATIC="$static_flag"
144
145 In that case it makes, xpdf-tools compilation find the "libfreetype.so" (no versioning at end) in our gs2-extension.
146 After successfully building, make sure to have sourced the gs2-extension's setup.bash before running "ldd" over the
147 generated xpdf-tools binaries, in order to let it use the $LD_LIBRARY_PATH we set to find our .so files.
148
149 (2) Note that there are no equivalent for ZLIB and LIBPNG: doing -DZLIB_DIR=$prefix or -DPNG_DIR=$prefix will be
150 ineffective, as neither are recognised by xpdf-tools' CMake set up.
151
152__________________________________________________________
153D. How we got Xpdf-Tools to compile using CASCADE-MAKE
154__________________________________________________________
155
156The process:
157
1581. We set up a CASCADE-MAKE GS2-extension "xpdf-tools" at trac.greenstone.org/browser/gs2-extensions/xpdf-tools/trunk/src
159Be aware that its lowercased "cascade-make" subfolder is an svn external, the original is at http://trac.greenstone.org/browser/other-projects/cascade-make/trunk/
160
161So far, this CASCADE-MAKE project includes the Xpdf-Tools source tarball, its helper packages zlib, libpng and freetype, as well as CMake to compile the Xpdf-Tools source code.
162The next step is to include JPEG and TIFF libraries too.
163
1642a. We downloaded the Xpdf-Tools source tarball, xpdf-4.00.tar.gz, from the xpdf site at https://www.xpdfreader.com/download.html under section "Download the Xpdf source code".
165
166The xpdf-tools source code tarball consists of the source for Xpf-tools and Xpdf (Xpdf-Reader). The Xpdf-Reader additionally requires Qt to build and run, but we don't want the Xpdf-Reader, just Xpdf-Tools.
167
168b. Compiling Xpdf-Tools fron source and running them requires the following packages and libraries, as per the xpdf-tools source code INSTALL file:
169
170To build xpdf-tools:
171- CMake 2.8.8 or newer
172
173Libraries to link against and used by xpdf-tools:
174- FreeType 2.0.5 or newer
175- libpng (for pdftoppm and pdftohtml)
176- zlib (for pdftoppm and pdftohtml)
177
178
1793. Compilation of xpdf-tools worked with CMake 3.11.4 on the linux resnet machine. However, CMake 3.11.3 itself failed to compile in the LSB environment and on the Mac Mountain Lion machine because of a version incompatibility between the older g++ installed there and the advanced version of CMake 3.11.4.
180
181CMake version 3.9.6 however is supposed to be compatible with older versions of g++, as per https://stackoverflow.com/questions/47886400/cmake-configure-error-in-3-10-1-but-not-in-3-9-6
182To avoid installing newer versions of g++ and clang in the LSB virtual machine and the Mac, I've shifted the CMake version back to version 3.9.6, still
183
184
1854a. On building xpdf-tools to work with dynamically linked libs found anywhere.
186
187If compiling xpdf-tools against dynamic linked libraries for these packages, then the basic CMake command in packages/CASECADE-MAKE/XPDFTOOLS.sh can look like:
188 cmake -DCMAKE_BUILD_TYPE=Release \
189 -DCMAKE_INSTALL_PREFIX=$prefix \
190 -DCMAKE_DISABLE_FIND_PACKAGE_Qt4=1 \
191 -DCMAKE_DISABLE_FIND_PACKAGE_Qt5Widgets=1 \
192 -DCMAKE_C_FLAGS="$CFLAGS" \
193 -DCMAKE_CXX_FLAGS="$CXXFLAGS" \
194 -DCMAKE_EXE_LINKER_FLAGS="$LDFLAGS" \
195 $GEXT_XPDFTOOLS/packages/$package$version # Note: no -DGSDLFLAG_STATIC=...
196
197With the above, the xpdf-tools source code and its make files work out of the box.
198
1994b. On building xpdf-tools to work with the dynamically linked libs for freetype libpng, zlib that we produce when cascade-making the xpdf-tools gs2-extension.
200
201Since we're compiling up freetype, libpng and zlib packages as part of the Xpdf-Tools GS2-extension with CASCADE-MAKE, the next step was to compile xpdf-tools by dynamically linking against our .so files for these 3 libraries. To do so, XPDFTOOL.sh should have the following changes
202
203 (1) set up CFLAGS, CXXFLAGS, CPPFLAGS and LDFLAGS to help linkage of xpdf-tools find our .so versions of the necessary libs:
204
205 export CFLAGS="$CFLAGS -I$GEXTXPDFTOOLS_INSTALLED/include -I$GEXTXPDFTOOLS_INSTALLED/include/libpng15"
206 export CPPFLAGS="$CPPFLAGS -I$GEXTXPDFTOOLS_INSTALLED/include -I$GEXTXPDFTOOLS_INSTALLED/include/libpng15"
207 export CXXFLAGS="$CXXFLAGS -I$GEXTXPDFTOOLS_INSTALLED/include -I$GEXTXPDFTOOLS_INSTALLED/include/libpng15"
208 export LDFLAGS="$LDFLAGS -L$GEXTXPDFTOOLS_INSTALLED/lib"
209
210 (2) The CMAKE command we run must pass the full paths to the actual .so library files (the ones with specific
211 versions in their files names) rather than the symbolically linked generally-named .so files (the latter won't
212 be found when building xpdf-tools and CMake will try to look for the .so library files elsewhere on the system):
213
214 cmake -DCMAKE_BUILD_TYPE=Release \
215 -DCMAKE_INSTALL_PREFIX=$prefix \
216 -DZLIB_LIBRARY=$prefix/lib/libz.so.1.2.7 \ # <========= NEW
217 -DPNG_LIBRARY=$prefix/lib/libpng15.so.15.30.0 \ # <========= NEW
218 -DFREETYPE_LIBRARY=$prefix/lib/libfreetype.so.6.3.20 \ # <========= NEW
219 -DCMAKE_DISABLE_FIND_PACKAGE_Qt4=1 \
220 -DCMAKE_DISABLE_FIND_PACKAGE_Qt5Widgets=1 \
221 -DCMAKE_C_FLAGS="$CFLAGS" \
222 -DCMAKE_CXX_FLAGS="$CXXFLAGS" \
223 -DCMAKE_EXE_LINKER_FLAGS="$LDFLAGS" \
224 $GEXT_XPDFTOOLS/packages/$package$version # Again: no -DGSDLFLAG_STATIC=...
225
226Further, the "xpdf/CMakeLists.txt" file within the xpdf-4.00.tar.gz source code tarball needs to be modified to refer to ZLIB_LIBRARIES when linking pdftops and pdftoppm. The linking commands for *both* the "pdftops" and "pdftoppm" executable targets in xpdf/CMakeLists.txt should look like the following,
227
228 target_link_libraries(pdftoppm goo fofi splash
229 ${FREETYPE_LIBRARY} ${FREETYPE_OTHER_LIBS}
230 ${DTYPE_LIBRARY}
231 ${LCMS_LIBRARY}
232 ${ZLIB_LIBRARIES}) # <========= NEW
233
234
235 (3) Since CMakeLists.txt has been modified, we initially renamed the xpdf src tarball to gs-xpdf-4.00.tar.gz.
236 However, the current version works with the regular downloaded xpdf-4.00.tar.gz tarball. But after extraction,
237 XPDFTOOLS.sh copies across the custom packages/gs-CMakeLists.txt into the extracted tarball's xpdf subdirectory,
238 renaming the file as CMakeLists.txt (so the path to it becomes "xpdf-4.00/xpdf/CMakeLists.txt"). In XPDFTOOLS.sh:
239
240 # patch the original tarball with our custom makefile
241 if [[ -d "$package$version/xpdf" && -f "gs-CMakeLists.txt" ]]; then
242 echo "*******************************************************************"
243 echo "Using our custom gs-CMakeLists.txt instead of the one included in $package$version"
244 echo "Renaming gs-CMakeLists.txt to $package$version/xpdf/CMakeLists.txt"
245 echo "*******************************************************************"
246
247 cp "gs-CMakeLists.txt" "$package$version/xpdf/CMakeLists.txt"
248 fi
249
250
2514c. On building static xpdf-tools binaries using the static *.a freetype libpng, zlib libraries that we produce when cascade-making the xpdf-tools gs2-extension.
252
253In order to compile up xpdf-tools *statically*, so that it builds against the static *.a libraries of freetype, libpng and zlib that we produce during the gs2-extension's CASCADE-MAKE process, we have to make further modifications.
254
255 (1) First, the XPDFTOOLS.sh cascade-make file should pass the full paths to the actual (non-symbolic link) .a file for each library.
256 A custom GS flag, GSDLFLAG_STATIC, is also invented in gs-CMakeLists.txt and assigned "-static for linux
257 and "-Bstatic" for Mac, to pass in during the linking stage of building xpdf-tools.
258
259 For Mac OSX, when -static is passed in for linking as on linux, this produced the error
260 "ld: library not found for -lcrt0.o" during the build of the xpdf-tools package. For information, see
261 https://stackoverflow.com/questions/3801011/ld-library-not-found-for-lcrt0-o-on-osx-10-6-with-gcc-clang-static-flag
262 The page https://stackoverflow.com/questions/844819/how-to-static-link-on-os-x mentions compiling
263 with -Bstatic on Mac OSX instead. To do so, XPDFTOOLS.sh passes in the GSDLFLAG_STATIC set to either
264 "-static" (for linux) or "-Bstatic" for darwin.
265 However the last mentioned stackoverflow page also says that -Bstatic is a no-op, and this appears to be
266 the case when "otool -L" is run over the generated xpdf-tools binaries: the binaries are all dynamically
267 linked. Although they're finding our .so files of freetype, libpng and zlib, they're not finding the .a
268 versions, even though XPDFTOOLS.sh tries to point gs-CMakeLists.txt to the correct .a files.
269
270 The new modifications to XPDFTOOLS.sh:
271
272 if [ "x$GSDLOS" == "xdarwin" ] ; then
273 static_flag=-Bstatic
274 else
275 static_flag=-static
276 fi
277
278 ...
279 cmake -DCMAKE_BUILD_TYPE=Release \
280 -DCMAKE_INSTALL_PREFIX=$prefix \
281 -DZLIB_LIBRARY=$prefix/lib/libz.a \ # <========= MODIFIED TO .a
282 -DPNG_LIBRARY=$prefix/lib/libpng15.a \ # <========= MODIFIED TO .a
283 -DFREETYPE_LIBRARY=$prefix/lib/libfreetype.a \ # <========= MODIFIED TO .a
284 -DCMAKE_DISABLE_FIND_PACKAGE_Qt4=1 \
285 -DCMAKE_DISABLE_FIND_PACKAGE_Qt5Widgets=1 \
286 -DCMAKE_C_FLAGS="$CFLAGS" \
287 -DCMAKE_CXX_FLAGS="$CXXFLAGS" \
288 -DCMAKE_EXE_LINKER_FLAGS="$LDFLAGS" \
289 -DGSDLFLAG_STATIC="$static_flag" \ # <========= NEW
290 $GEXT_XPDFTOOLS/packages/$package$version
291
292 (2) Our customised gs-CMakeLists.txt file now checks for this flag GSDLFLAG_STATIC being set and, if it is,
293 uses it during the linking stage. As in (1) above, it will be set to "-static" for Linux and "-Bstatic" for Mac.
294
295 - When the flag is set, the linking flags passed into each occurrence of target_link_libraries() in
296 gs-CMakeLists.txt is moreover manually written in the form of "-static -l<libs>" rather than using
297 the default linking commands inherited from the original CMakeLists.txt.
298 - If GSDLFLAG_STATIC isn't set, then we don't build statically, and the linking flags passed to each
299 target_link_libraries() are mostly the original ones.
300
301 For example,
302
303 if(GSDLFLAG_STATIC)
304 target_link_libraries(pdftoppm goo fofi splash
305 ${GSDLFLAG_STATIC} -lfreetype ${DTYPE_LIBRARY} ${LCMS_LIBRARY} -lz -lm -lc -lpthread)
306 else ()
307 target_link_libraries(pdftoppm goo fofi splash
308 ${FREETYPE_LIBRARY} ${FREETYPE_OTHER_LIBS}
309 ${DTYPE_LIBRARY}
310 ${LCMS_LIBRARY}
311 ${ZLIB_LIBRARIES})
312 endif ()
313
314 DETAILED EXPLANATION:
315 We found that when building *statically*, gs-CMakeLists.txt needed to NOT use the PNG_LIBRARIES, ZLIB_LIBRARIES
316 and FREETYPE_LIBRARY in its linker commands, target_link_libraries(), as doing so produced partially dynamic
317 xpdf-tools executables which were moreover BROKEN. They wouldn't run, and in fact attempting to run an xpdf-tool,
318 like "./pdftohtml", would produce a file not found error. Something like "bash: no such file or directory".
319
320 Online discussions mentioned that this generally happened when attempting to run 32 bit executables on 64 bit
321 linux when 32 bit loaders are not installed. (In such cases, the solution was to apt-get install some 32 bit package.)
322 However, our broken binaries were all 64 bit, as indicated when running the "file" command on them. However, their
323 being further partially dynamically linked executables didn't imply that they would be broken, as we were eventually
324 able to produce partially dynamic executables that did work, before solving static linking altogether.
325
326 The real issue was that including references to ${FREETYPE_LIBRARY} ${FREETYPE_OTHER_LIBS}, ${PNG_LIBRARIES} and
327 ${ZLIB_LIBRARIES} in any target_link_libraries() resulted in the wrong linking command producing broken binaries.
328
329 Doing the regular target_link_libraries() in static mode results in building with
330 "-Wl,-Bstatic -lfreetype -lpng15 -lz -Wl,-Bdynamic -lpthread" at end of link line
331 and produces broken binaries for pdftohtml/pdftoppm/pdftops/pdftopng.
332
333 Note that PNG_LIBRARIES includes zlib/lz: "-lpng -lz", and along with freetype,
334 these are linked statically. However, Threads/lpthread is included as a dynamically
335 linked library instead of including a .a (regardless of whether it's appended
336 as -lpthread or Threads::Threads in the target_link_libraries()), contributing to
337 the pdfhtml binary produced being a partially static, partially dynamic one,
338 so a dynamic executable overall.
339
340 The order of dynamic .so files listed by ldd in the broken static binary of pdftohtml differs from
341 a manually statically linked working version of pdftohtml, and seems to be the only difference
342 between the two in ldd's output. Not using "-Wl,-Bstatic" and using -static (-Bstatic on Mac)
343 in its place creates a partially static dynamic executable that isn't broken, whereas
344 additionally removing "-Wl,-Bdynamic -lpthread" and replacing it with -lpthread
345 moreover produces a working pdftohtml that is a fully static linked executable.
346
347 The inclusion of the math lib and c lib (lm and lc) in the final link command
348 are to completely bypass the remaining .so dependencies that were present in
349 the executable and produce the fully static executable. The lm and lc libs were referenced
350 by all xpdf-tool binaries (as indicated when generating dynamic ones and running ldd over them)
351 but Dr Bainbridge said that -lm and -lc were some libs passed in by the compiler by default,
352 which would explain why explicitly setting them for some xpdftools and not other may not have
353 mattered.
354
355NOTES:
356Initial attempts at modifying gs-CMakeLists.txt for static compiling that proved to be unnecessary:
357
358 (1) Setting -static globally doesn't have a useful effect.
359
360 # We want to build static xpdf-tools binaries. See
361 # https://stackoverflow.com/questions/24648357/compiling-a-static-executable-with-cmake
362 # Want to make the min number of changes for building statically, so using the way
363 # below. Beware, must *append* "-static" to existing CMAKE_EXE_LINKER_FLAGS=LD_FLAGS
364 ##SET(CMAKE_FIND_LIBRARY_SUFFIXES ".a")
365 ##SET(BUILD_SHARED_LIBS OFF)
366 ##SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static")
367
368 The above 3 lines just add a -static before the "-O2 -Wall -fPIC -rdynamic ..." during linking, such as below.
369 But they have no further effect on whether static building actually succeeds or not. The only effective static
370 linking command (for Linux so far) was to pass -static in the target_link_libraries() command followed by the
371 "-l<libname>" for each library in the correct order.
372
373----
374/usr/bin/c++ -I/home/greenstone/gs3-svn-26Mar2018/gs2build/ext/xpdf-tools/linux/include -I/home/greenstone/gs3-svn-26Mar2018/gs2build/ext/xpdf-tools/linux/include -I/home/greenstone/gs3-svn-26Mar2018/gs2build/ext/xpdf-tools/linux/include/libpng15 -O3 -Wall -fPIC -L/home/greenstone/gs3-svn-26Mar2018/gs2build/ext/xpdf-tools/linux/lib -L/home/greenstone/gs3-svn-26Mar2018/gs2build/ext/xpdf-tools/linux/lib -static ***** <- HERE ****** -O2 -Wall -fPIC -rdynamic CMakeFiles/pdftohtml.dir/HTMLGen.cc.o CMakeFiles/pdftohtml.dir/SplashOutputDev.cc.o CMakeFiles/pdftohtml.dir/TextOutputDev.cc.o CMakeFiles/pdftohtml.dir/pdftohtml.cc.o CMakeFiles/xpdf_objs.dir/AcroForm.cc.o CMakeFiles/xpdf_objs.dir/Annot.cc.o CMakeFiles/xpdf_objs.dir/Array.cc.o CMakeFiles/xpdf_objs.dir/BuiltinFont.cc.o CMakeFiles/xpdf_objs.dir/BuiltinFontTables.cc.o CMakeFiles/xpdf_objs.dir/Catalog.cc.o CMakeFiles/xpdf_objs.dir/CharCodeToUnicode.cc.o CMakeFiles/xpdf_objs.dir/CMap.cc.o CMakeFiles/xpdf_objs.dir/Decrypt.cc.o CMakeFiles/xpdf_objs.dir/Dict.cc.o CMakeFiles/xpdf_objs.dir/Error.cc.o CMakeFiles/xpdf_objs.dir/FontEncodingTables.cc.o CMakeFiles/xpdf_objs.dir/Form.cc.o CMakeFiles/xpdf_objs.dir/Function.cc.o CMakeFiles/xpdf_objs.dir/Gfx.cc.o CMakeFiles/xpdf_objs.dir/GfxFont.cc.o CMakeFiles/xpdf_objs.dir/GfxState.cc.o CMakeFiles/xpdf_objs.dir/GlobalParams.cc.o CMakeFiles/xpdf_objs.dir/JArithmeticDecoder.cc.o CMakeFiles/xpdf_objs.dir/JBIG2Stream.cc.o CMakeFiles/xpdf_objs.dir/JPXStream.cc.o CMakeFiles/xpdf_objs.dir/Lexer.cc.o CMakeFiles/xpdf_objs.dir/Link.cc.o CMakeFiles/xpdf_objs.dir/NameToCharCode.cc.o CMakeFiles/xpdf_objs.dir/Object.cc.o CMakeFiles/xpdf_objs.dir/OptionalContent.cc.o CMakeFiles/xpdf_objs.dir/Outline.cc.o CMakeFiles/xpdf_objs.dir/OutputDev.cc.o CMakeFiles/xpdf_objs.dir/Page.cc.o CMakeFiles/xpdf_objs.dir/Parser.cc.o CMakeFiles/xpdf_objs.dir/PDFDoc.cc.o CMakeFiles/xpdf_objs.dir/PDFDocEncoding.cc.o CMakeFiles/xpdf_objs.dir/PSTokenizer.cc.o CMakeFiles/xpdf_objs.dir/SecurityHandler.cc.o CMakeFiles/xpdf_objs.dir/Stream.cc.o CMakeFiles/xpdf_objs.dir/TextString.cc.o CMakeFiles/xpdf_objs.dir/UnicodeMap.cc.o CMakeFiles/xpdf_objs.dir/UnicodeTypeTable.cc.o CMakeFiles/xpdf_objs.dir/UTF8.cc.o CMakeFiles/xpdf_objs.dir/XFAForm.cc.o CMakeFiles/xpdf_objs.dir/XRef.cc.o CMakeFiles/xpdf_objs.dir/Zoox.cc.o -o pdftohtml ../goo/libgoo.a ../fofi/libfofi.a ../splash/libsplash.a -static -lfreetype -lpng -lz -lm -lc -lpthread
375----
376
377 (2) Threads::Threads instead of -lpthread results in a partially dynamic executable.
378
379 # The original, unmodified CMakeLists.txt was not set up sufficiently
380 # for static compilation of xpdf-tools. As a result, compile would first fail
381 # with errors about undefined refs to mutex / lpthread.
382 # When building xpdf-tools statically, need to add the following 2 lines as well
383 # as append "Threads::Threads" to the end of each "target_link_libraries(<list>)"
384 # See https://stackoverflow.com/questions/1620918/cmake-and-libpthread
385 # found googling cmake and "-lpthread" (pthread) after ERRORS to do with this, like:
386 # undefined reference to `pthread_mutex_unlock'
387 ##set(THREADS_PREFER_PTHREAD_FLAG ON)
388 ##find_package(Threads REQUIRED)
389
390 In instances when compilation was successful, including the above 2 lines in combination with "Threads::Threads"
391 as the final argument to every target_link_libraries(...) occurrence in gs-CMakeLists.txt would only manage to
392 produce partially dynamically linked xpdftools binaries. (Depending on what the linking command was when building
393 Xpdf-Tools, the partially dynamically linked executables may work or may be broken. See explanation further above.)
394 We wanted fully statically linked binaries, for which we needed to pass in "-lpthread" as the trailing argument
395 to each target_link_libraries(...). So without either, compilation will fail. However, with "Threads::Threads"
396 the binaries weren't fully static, whereas with -lpthread the xpdftools executables were fully static as CMake no
397 longer tried to link against a dynamic Threads library.
398
399
400(5) To view the unmodified CMakeLists.txt included in the xpdf-4.00 source code tarball, untar it and look for its "xpdf/CMakeLists.txt" (not the toplevel file of the same name).
401Run a 'diff' against gs-CMakeLists.txt to see further differences, such as debug statements and comments. Most comments have been removed and placed into this readme file instead.
402
403
404(6) When CASCADE-MAKE is run on the xpdf-tools GS2-extension, it first compiles up CMake, needed to compile up xpdf-tools.
405Unlike the library packages like freetype, libpng and zlib that we also build for xpdf-tools as part of this gs2-extension, CMake's build products don't need to be included in the distribution tarball of our built xpdf-tools executables.
406
407There's a "move-cmake.sh" script in the xpdf-tools gs2-extension that can be run with the "away" and "back" options to move the CMake stuff out of the way (into a "devel" folder) after successfully building xpdf binaries and that can also be run to move them back if wanting to recompile.
408
409The script can be run manually, but it's also run by the extension:
410- packages/CASCADE-MAKE/XPDFTOOLS.sh runs "move-cmake.sh away" after xpdf-tools has been built, so that the extension's install location is ready for tarring up for distribution.
411- When recompiling the xpdf-tools extenion, the CASCADE-MAKE process will run packages/CASCADE-MAKE/CMAKE.sh file which in turn runs "move-cmake.sh back" if there's a prebuilt CMake which had earlier been moved out of the way.
412
413
414__________________________________________________________
415E. Getting more output when running CMake (verbosity)
416__________________________________________________________
417See https://www.linuxquestions.org/questions/programming-9/cmake-or-make-debug-output-show-command-624800/
418To turn on debugging:
419 export VERBOSE=1
420 ./CASCADE-MAKE.sh
421
422To turn off debugging, need to actually make VERBOSE undefined again (don't set it to 0):
423 export VERBOSE=
424 ./CASCADE-MAKE.sh
425
426
427__________________________________________________________
428F. APPENDIX - Useful links
429__________________________________________________________
430A. Helping CMake along. (Not all of this was necessary for compiling xpdftools statically, but they're generally useful links)
431
432https://github.com/SynoCommunity/spksrc/issues/1779
433https://stackoverflow.com/questions/1620918/cmake-and-libpthread
434https://cmake.org/cmake/help/v3.0/prop_tgt/LINK_FLAGS.html
435https://cmake.org/cmake/help/v3.11/command/target_link_libraries.html?highlight=target_link_libraries
436https://stackoverflow.com/questions/24648357/compiling-a-static-executable-with-cmake
437https://stackoverflow.com/questions/42815420/cmake-cant-find-my-static-libs
438https://cmake.org/cmake/help/v3.0/command/message.html
439https://stackoverflow.com/questions/30980383/cmake-compile-options-for-libpng
440 https://stackoverflow.com/questions/36220123/undefined-reference-to-png-set-longjmp-fn-when-compiling-pcl-source-file
441
442
443B. About the error "bash: no such file or directory" when run on a statically generated binary:
444
445https://askubuntu.com/questions/351827/unable-to-run-a-32-bit-program-on-64-bit-vm/353497#353497
446https://unix.stackexchange.com/questions/13391/getting-not-found-message-when-running-a-32-bit-binary-on-a-64-bit-system/13409#13409
447https://arstechnica.com/civis/viewtopic.php?f=16&t=1173118
448https://superuser.com/questions/344533/no-such-file-or-directory-error-in-bash-but-the-file-exists
449https://unix.stackexchange.com/questions/45277/executing-binary-file-file-not-found
450
451C. Other links
452
453https://unix.stackexchange.com/questions/279397/ldd-dont-find-path-how-to-add
454
455
456__________________________________________________________
457G. LIBJPEG and LIBTIFF
458__________________________________________________________
459
4601. Issues building LIBJPEG on 64 bit machines and the patch
461
462I copied the LIBJPEG package from http://trac.greenstone.org/browser/other-projects/realistic-books/trunk/packages (also at http://trac.greenstone.org/browser/gs2-extensions/ocr/trunk/packages/cmdline).
463
464 * Configuring out of the box produced the following error:
465 checking host system type... Invalid configuration `x86_64-unknown-linux-gnu': machine `x86_64-unknown' not recognized
466
467 * So that, as a consequence, when running make on the libjpeg package, make failed with the error:
468 ./libtool --mode=compile gcc -I/home/greenstone/gs3-svn-26Mar2018/gs2build/ext/xpdf-tools/linux/include -fPIC -I/home/greenstone/gs3-svn-26Mar2018/gs2build/ext/xpdf-tools/linux/include -I. -c ./jcapimin.c
469 make: ./libtool: Command not found
470 make: *** [jcapimin.lo] Error 127
471 Error encountered running *make * stage of ./CASCADE-MAKE/LIBJPEG.sh
472
473The same was true when I grabbed the libjpeg from sourceforge (https://sourceforge.net/projects/libjpeg/files/), which was also still version jpeg 6b from 2008.
474
475I found the following webpages discussing the above error messages:
476- https://unix.stackexchange.com/questions/80479/how-to-work-with-libtool
477- https://github.com/rwestlund/freesweep/issues/1
478- https://ubuntuforums.org/showthread.php?t=1232714
479- https://stackoverflow.com/questions/12828687/configure-fails-to-detect-proper-ld-on-a-64-bit-system-with-32-bit-userland
480- SOLUTION: https://sourceforge.net/p/libjpeg/bugs/12/
481
482However, the error only strikes when configure is run with --enable-static.
483
484Note also that contrary to the above pages, running configure with the additional options
485 --host=x86_64-linux-gnu --build=x86_64-linux-gnu --target=x86_64-linux-gnu --disable-shared --enable-static
486did not help. Nor did adding the above flags get rid of configure attempting to work with host=x86_64-unknown(-unknown)-linux-gnu
487
488The SOLUTION, found when searching for the error message along with "enable-static", as it's the combination that is relevant, is described
489at https://sourceforge.net/p/libjpeg/bugs/12/
490
491which was to patch up the config.sub filed included in the jpeg-6b tarball, to also cover x86_64-* machines:
492 tahoe | i860 | x86_64-* | m32r | m68k | m68000 | m88k | ns32k | arc | arm \
493
494The above change is necessary because this libjpeg is outdated and has been superceded by other JPEG libraries, also discussed at https://sourceforge.net/p/libjpeg/bugs/12/
495I'm not sure if those libraries are compatible with XpdfTools however, so I'm sticking with libjpeg as long as I can get it to build and be recognised by XpdfTools.
496
497The solution is once more to have a patch file: CASCADE-MAKE/LIBJPEG.sh replaces the config.sub with in the jpeg-6b package after this is untarred with packages/gs-libjpeg-config.sub, which contains the patch.
498
499
5002. I followed the instructions at http://www.linuxfromscratch.org/blfs/view/6.3/general/libjpeg.html
501to try to build libjpeg with --enable-static and --enable-shared to produce both libjpeg.a and libjpeg.so.
502
503However, nothing I try gets it to generate a libjpeg.so. It seems to always produce a libjpeg.a in xpdf-tools/linux/lib
504regardless of whether CASCADE-MAKE/LIBJPEG.sh passes the --enable-static flag to the configure command or not, and regardless of whether --enable-shared is additionally or individually passed in.
505
506As a consequence, there's no libjpeg.so file to set the -DJPEG_LIBRARY flag in XPDFTOOLS.sh to for when building xpdf-tools against dynamically linked libraries.
507
508I tried the various combinations with the lib jpeg-6b source tarballs from
509- sourceforge, https://sourceforge.net/projects/libjpeg/files/, the latest tarball of this was from 2008
510- http://www.linuxfromscratch.org/blfs/view/6.3/general/libjpeg.html, which was last updated in 2007
511- http://trac.greenstone.org/browser/other-projects/realistic-books/trunk/packages/jpeg-6b.tar.gz, which was added to trac in 2009 but is probably the 2008 or 2007 version too.
512
513
5143. Modifications for using TIFF and JPEG libraries when building Xpdf-Tools:
515
516* CASCADE-MAKE.sh, replaced
517 PACKAGES="CMAKE LIBZ LIBPNG FREETYPE XPDFTOOLS"
518with
519 PACKAGES="CMAKE LIBZ LIBTIFF LIBPNG LIBJPEG FREETYPE XPDFTOOLS"
520
521
522* XPDFTOOLS.sh
523If compiling statically make sure the CMake command contains the following changes:
524 -DTIFF_INCLUDE_DIR=$prefix/include \ # <========== new
525 -DJPEG_INCLUDE_DIR=$prefix/include \ # <========== new
526 -DZLIB_LIBRARY=$prefix/lib/libz.a \
527 -DTIFF_LIBRARY=$prefix/lib/libtiff.a \ # <========== new
528 -DPNG_LIBRARY=$prefix/lib/libpng15.a \
529 -DJPEG_LIBRARY=$prefix/lib/libjpeg.a \ # <========== new
530 -DFREETYPE_LIBRARY=$prefix/lib/libfreetype.a \
531 -DGSDLFLAG_STATIC="$static_flag" \
532
533
534
535The above flag names were discovered by deleting the untarred xpdf-4.00 folder.
536Then in a fresh terminal, source devel.bash from xpdf-tools and re-run CASCADE-MAKE.sh without the above modifications:
537
538 -- Found FreeType (new-style includes): /home/greenstone/gs3-svn-26Mar2018/gs2build/ext/xpdf-tools/linux/lib/libfreetype.a
539 -- Found ZLIB: /home/greenstone/gs3-svn-26Mar2018/gs2build/ext/xpdf-tools/linux/lib/libz.a (found version "1.2.8")
540 -- Found PNG: /home/greenstone/gs3-svn-26Mar2018/gs2build/ext/xpdf-tools/linux/lib/libpng15.a (found version "1.2.50")
541 -- Could NOT find JPEG (missing: JPEG_LIBRARY JPEG_INCLUDE_DIR)
542 -- Could NOT find TIFF (missing: TIFF_LIBRARY TIFF_INCLUDE_DIR)
543 -- lcms2 not found
544 -- No Qt library found
545
546
547* packages/gs-CMakeLists.txt was modified again,
548
549 - this time to also pass:
550 -ltiff and -ljpeg to all target_link_libraries() commands that run when GSDLFLAG_STATIC is set
551 and
552 ${TIFF_LIBRARY} and ${JPEG_LIBRARY} to all target_link_libraries() commands that run when GSDLFLAG_STATIC is not set
553
554 - And to add in the include directories and defitions if JPEG/TIFF libraries were provided:
555 if (JPEG_FOUND)
556 include_directories("${JPEG_INCLUDE_DIR}")
557 add_definitions("${JPEG_DEFINITIONS}")
558 message(STATUS "@@@@@@@@@@@@@@@ JPEG_FOUND (include_dir ; include_dirs): ${JPEG_INCLUDE_DIR} ; ${JPEG_INCLUDE_DIRS}")
559 else ()
560 message(STATUS "@@@@@@@@@@@@@@@ NO JPEG_FOUND")
561 endif ()
562 if (TIFF_FOUND)
563 include_directories("${TIFF_INCLUDE_DIRS}")
564 add_definitions("${TIFF_DEFINITIONS}")
565 message(STATUS "@@@@@@@@@@@@@@@ TIFF_FOUND ${TIFF_INCLUDE_DIRS}")
566 else ()
567 message(STATUS "@@@@@@@@@@@@@@@ NO TIFF_FOUND")
568 endif ()
569
570 Note however that although gs-CMakeLists.txt now knows what the pluralised TIFF_INCLUDE_DIRS is (and TIFF_INCLUDE_DIR)
571 as for PNG and ZLIB, gs-CMakeLists.txt does not have a value for the pluralised JPEG_INCLUDE_DIRS, only the
572 JPEG_INCLUDE_DIRS set above. And both the CMAKE flags in XPDFTOOLS.sh for tiff and jpeg libs seem to have been setup
573 in the same way now. Not sure where these automatically assigned variables come from in order to check up on them.
574
575
Note: See TracBrowser for help on using the repository browser.