Changeset 32248 for gs2-extensions
- Timestamp:
- 2018-07-06T21:31:53+12:00 (6 years ago)
- Location:
- gs2-extensions/xpdf-tools/trunk/src/packages
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
gs2-extensions/xpdf-tools/trunk/src/packages/CASCADE-MAKE/XPDFTOOLS.sh
r32246 r32248 19 19 export LDFLAGS="$LDFLAGS -L$GEXTXPDFTOOLS_INSTALLED/lib" 20 20 21 # For Mac OSX, when -static is passed in for linking, we end up with the error "ld: library not found for -lcrt0.o" 22 # See https://stackoverflow.com/questions/3801011/ld-library-not-found-for-lcrt0-o-on-osx-10-6-with-gcc-clang-static-flag 23 # On Mac OSX, compile it with -Bstatic instead, as per https://stackoverflow.com/questions/844819/how-to-static-link-on-os-x 24 # We will pass in the correct static variant as the custom GSDLFLAG_STATIC, so it will be set to either "-static" (for linux) 25 # or "-Bstatic" for darwin when CMake starts compiling up xpdf-tools. When the GSDLFLAG_STATIC is set, it will also trigger 26 # the branch of the gs-CMakeLists.txt code that does static compiling. If not set, xpdf-tools are compiled against dynamically 27 # linked libraries. 21 # See section D, 4c of the GS-README of this extension. 28 22 if [ "x$GSDLOS" == "xdarwin" ] ; then 29 23 static_flag=-Bstatic … … 103 97 fi 104 98 105 # If compiling statically, need these above in place of the references to .so files 99 ## If compiling statically make sure the above CMake command contains the following 100 ## with these values: 106 101 # -DZLIB_LIBRARY=$prefix/lib/libz.a \ 107 102 # -DPNG_LIBRARY=$prefix/lib/libpng15.a \ 108 103 # -DFREETYPE_LIBRARY=$prefix/lib/libfreetype.a \ 109 # And throw in -DGSDLFLAG_STATIC_BUILD="-static" for linux or with "-Bstatic" for Macs 110 # In place of FREETYPE_LIBRARY, could also try the following (then check built bins 111 # by running ldd and file over them): 112 ## -DFREETYPE_DIR=$prefix \ 104 # and 105 # -DGSDLFLAG_STATIC="$static_flag" \ 113 106 114 107 115 ## When -DFREETYPE_DIR is used in place of -DFREETYPE_LIBRARY above, it makes 116 ## xpdf-tools compilation find the "libfreetype.so" (no versioning at end) in 117 ## our gs ext. 118 ## But -DZLIB_DIR and -DPNG_DIR are ignored because they go unrecognised, whereas 119 ## -DZLIB_LIBRARY and -DPNG_LIBRARY are recognised by XpdfTools' CMake files. 120 ## -DZLIB_LIBRARY and -DPNG_LIBRARY require full paths. So the first 2 lines of the 121 ## following won't work: 122 # -DZLIB_DIR=$prefix \ 123 # -DPNG_DIR=$prefix \ 124 # -DFREETYPE_DIR=$prefix \ 125 126 ## When specified in the following way, all 3 lines are recognised (freetype, zlib, 127 ## png). The 3rd line can alternatively still use "-DFREETYPE_DIR=$prefix" 108 ## For building dynamic xpdf-tools executables, change the above to have the following instead: 128 109 # -DZLIB_LIBRARY=$prefix/lib/libz.so.1.2.7 \ 129 110 # -DPNG_LIBRARY=$prefix/lib/libpng15.so.15.30.0 \ 130 111 # -DFREETYPE_LIBRARY=$prefix/lib/libfreetype.so.6.3.20 \ 131 # The above is for building dynamic xpdf-tools executables. For which, also don't 132 # pass in -DGSDLFLAG_STATIC_BUILD="..." (remove the line, don't comment it out, nor 133 # set the value to "") 112 # (The 3rd line can alternatively be "-DFREETYPE_DIR=$prefix") 113 # And remove the following line. Don't comment it out, nor set it to "", but remove it: 114 # -DGSDLFLAG_STATIC="$static_flag" \ 115 134 116 135 117 # If compilation was successful, then we don't need cmake binaries anymore when -
gs2-extensions/xpdf-tools/trunk/src/packages/GS-README.txt
r32229 r32248 1 ------------------------------------------------------------------- 2 Modfications to xpdf-4.00.tar.gz to produce gs-xpdf-4.00.tar.gz 3 ------------------------------------------------------------------- 4 In order to successfully compile xpdf-tools-4.00 against *dynamically* linked libraries for zlib (and libpng), needed to modify the CMakeLists.txt. The changes. 5 6 if (PNG_FOUND) 7 include_directories("${PNG_INCLUDE_DIRS}") 8 add_definitions("${PNG_DEFINITIONS}") 9 endif () 10 #--------- NEW 11 # https://stackoverflow.com/questions/36126333/mingw-cmake-undefined-reference-to-zlib 12 if (ZLIB_FOUND) 13 include_directories("${ZLIB_INCLUDE_DIRS}") 14 add_definitions("${ZLIB_DEFINITIONS}") 15 endif () 16 #--------- ENDNEW 17 if (HAVE_LCMS) 1 __________________________________________________________ 2 A. XPDF 3 __________________________________________________________ 4 5 Xpdf'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). 6 7 The 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.) 8 9 1. https://www.xpdfreader.com/download.html 10 11 As 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) 12 13 - Using Xpdf's pdftohtml tool: 14 greenstone@bedrock:~/Downloads/xpdf-tools-linux-4.00/bin64$./pdftohtml -z 1.5 ~/Downloads/ApacheLicence.pdf licence 15 16 where licence is a folder. 17 18 - Using Xpdf's pdftotext tool: 19 greenstone@bedrock:~/Downloads/xpdf-tools-linux-4.00/bin64$./pdftotext -nopgbrk ~/Downloads/ApacheLicence.pdf ~/Downloads/ApacheLicence.txt 20 21 where the output text file must be specified with a full path name. 22 23 24 2. Documentation on Xpdf-Tools: 25 - https://www.xpdfreader.com/support.html 26 for example, the pdftohtml man page: https://www.xpdfreader.com/pdftohtml-man.html 27 - https://linux.die.net/man/5/xpdfrc 28 (Configuration flags you can put into ~/.xpdfrc to use as defaults when running xpdf tool commands) 29 30 3. We're using Xpdf Tools version: xpdf-tools-linux-4.00 31 32 4. We started by working with the ready-made Xpdf-tools binaries available for download from the xpdf site for Win, Linux and Mac. 33 34 5. 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. 35 36 On Mac, I've been unable to get it to produce statically linked libraries: at this stage they're dynamically linked. 37 38 39 __________________________________________________________ 40 B. Mojo::DOM perl package for parsing HTML 41 __________________________________________________________ 42 43 XPDF's pdftohtml conversion of a single PDF document produces multiple HTML files: one for each page in the source PDF. 44 We want the output to be "paged_html": a single HTML file that is sectionalised, each section representing a page of the 45 original PDF. 46 47 We 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 48 into the single sectionalised HTML file. For this we needed a HTML parser package for Perl. 49 50 1. Before Dr Bainbridge found Mojo::DOM, he looked at 51 * https://en.wikipedia.org/wiki/Comparison_of_HTML_parsers 52 * http://radar.oreilly.com/2014/02/parsing-html-with-perl-2.html 53 54 2. Main links for Mojo::DOM 55 * https://mojolicious.org/perldoc/Mojo/DOM 56 * https://metacpan.org/pod/Mojo::DOM 57 Dependencies: http://deps.cpantesters.org/?module=Mojo%3A%3ADOM;perl=latest 58 59 3. 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. 60 We'll be using this module to be used for parsing the HTML output by XPDF tool pdftohtml 61 62 63 mkdir cpan 64 2020 tar xvzf Mojolicious-7.84.tar.gz 65 2021 cd Mojolicious-7.84/ 66 2028 perl ./Makefile.PL PREFIX=`pwd`/installed 67 2030 make 68 2031 make install 69 2033 cp -r installed/share/perl/5.18.2 ../cpan 70 cd .. 71 2044 export PERL5LIB=`pwd`/cpan 72 73 2053 emacs -nw test.pl 74 75 #!/usr/bin/perl -w 76 add in 'use v5.10;' 77 78 2054 chmod a+x test.pl 79 2055 ./test.pl 80 81 82 __________________________________________________________ 83 C. Compiling Xpdf-Tools: statically or dynamically linked 84 __________________________________________________________ 85 86 As explained in detail in section D below, gs-CMakeLists.txt allows us to compile xpdf-tools statically (as we've now set it up for by default) or dynamically (as its CMake makefiles were originally set up for). 87 88 1. To compile Xpdf-Tools statically, packages/CASCADE-MAKE/XPDFTOOLS.sh should contain: 89 90 cmake -DCMAKE_BUILD_TYPE=Release \ 91 -DCMAKE_INSTALL_PREFIX=$prefix \ 92 -DZLIB_LIBRARY=$prefix/lib/libz.a \ # <========= THIS 93 -DPNG_LIBRARY=$prefix/lib/libpng15.a \ # <========= THIS 94 -DFREETYPE_LIBRARY=$prefix/lib/libfreetype.a \ # <========= THIS 95 -DCMAKE_DISABLE_FIND_PACKAGE_Qt4=1 \ 96 -DCMAKE_DISABLE_FIND_PACKAGE_Qt5Widgets=1 \ 97 -DCMAKE_C_FLAGS="$CFLAGS" \ 98 -DCMAKE_CXX_FLAGS="$CXXFLAGS" \ 99 -DCMAKE_EXE_LINKER_FLAGS="$LDFLAGS" \ 100 -DGSDLFLAG_STATIC="$static_flag" \ # <========= THIS 101 $GEXT_XPDFTOOLS/packages/$package$version 102 103 In place of FREETYPE_LIBRARY above, could also try the following, 104 -DFREETYPE_DIR=$prefix \ 105 but then check the built binaries by running "ldd" and "file" over them, to make sure they're not referencing any .so dynamic link libraries: 106 107 108 2. 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: 109 110 cmake -DCMAKE_BUILD_TYPE=Release \ 111 -DCMAKE_INSTALL_PREFIX=$prefix \ 112 -DZLIB_LIBRARY=$prefix/lib/libz.so.1.2.7 \ # <========= THIS 113 -DPNG_LIBRARY=$prefix/lib/libpng15.so.15.30.0 \ # <========= THIS 114 -DFREETYPE_LIBRARY=$prefix/lib/libfreetype.so.6.3.20 \ # <========= THIS 115 -DCMAKE_DISABLE_FIND_PACKAGE_Qt4=1 \ 116 -DCMAKE_DISABLE_FIND_PACKAGE_Qt5Widgets=1 \ 117 -DCMAKE_C_FLAGS="$CFLAGS" \ 118 -DCMAKE_CXX_FLAGS="$CXXFLAGS" \ 119 -DCMAKE_EXE_LINKER_FLAGS="$LDFLAGS" \ 120 $GEXT_XPDFTOOLS/packages/$package$version # <=== -DGSDLFLAG_STATIC removed 121 122 123 124 (1) In the above, you could also set 125 -DFREETYPE_DIR=$prefix 126 in place of 127 -DGSDLFLAG_STATIC="$static_flag" 128 129 In that case it makes, xpdf-tools compilation find the "libfreetype.so" (no versioning at end) in our gs2-extension. 130 After successfully building, make sure to have sourced the gs2-extension's setup.bash before running "ldd" over the 131 generated xpdf-tools binaries, in order to let it use the $LD_LIBRARY_PATH we set to find our .so files. 132 133 (2) Note that there are no equivalent for ZLIB and LIBPNG: doing -DZLIB_DIR=$prefix or -DPNG_DIR=$prefix will be 134 ineffective, as neither are recognised by xpdf-tools' CMake set up. 135 136 __________________________________________________________ 137 D. How we got Xpdf-Tools to compile using CASCADE-MAKE 138 __________________________________________________________ 139 140 The process: 141 142 1. We set up a CASCADE-MAKE GS2-extension "xpdf-tools" at trac.greenstone.org/browser/gs2-extensions/xpdf-tools/trunk/src 143 Be 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/ 144 145 So 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. 146 The next step is to include JPEG and TIFF libraries too. 147 148 2a. 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". 149 150 The 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. 151 152 b. Compiling Xpdf-Tools fron source and running them requires the following packages and libraries, as per the xpdf-tools source code INSTALL file: 153 154 To build xpdf-tools: 155 - CMake 2.8.8 or newer 156 157 Libraries to link against and used by xpdf-tools: 158 - FreeType 2.0.5 or newer 159 - libpng (for pdftoppm and pdftohtml) 160 - zlib (for pdftoppm and pdftohtml) 161 162 163 3. 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. 164 165 CMake 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 166 To 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 167 168 169 4a. On building xpdf-tools to work with dynamically linked libs found anywhere. 170 171 If compiling xpdf-tools against dynamic linked libraries for these packages, then the basic CMake command in packages/CASECADE-MAKE/XPDFTOOLS.sh can look like: 172 cmake -DCMAKE_BUILD_TYPE=Release \ 173 -DCMAKE_INSTALL_PREFIX=$prefix \ 174 -DCMAKE_DISABLE_FIND_PACKAGE_Qt4=1 \ 175 -DCMAKE_DISABLE_FIND_PACKAGE_Qt5Widgets=1 \ 176 -DCMAKE_C_FLAGS="$CFLAGS" \ 177 -DCMAKE_CXX_FLAGS="$CXXFLAGS" \ 178 -DCMAKE_EXE_LINKER_FLAGS="$LDFLAGS" \ 179 $GEXT_XPDFTOOLS/packages/$package$version # Note: no -DGSDLFLAG_STATIC=... 180 181 With the above, the xpdf-tools source code and its make files work out of the box. 182 183 4b. 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. 184 185 Since 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 186 187 (1) set up CFLAGS, CXXFLAGS, CPPFLAGS and LDFLAGS to help linkage of xpdf-tools find our .so versions of the necessary libs: 188 189 export CFLAGS="$CFLAGS -I$GEXTXPDFTOOLS_INSTALLED/include -I$GEXTXPDFTOOLS_INSTALLED/include/libpng15" 190 export CPPFLAGS="$CPPFLAGS -I$GEXTXPDFTOOLS_INSTALLED/include -I$GEXTXPDFTOOLS_INSTALLED/include/libpng15" 191 export CXXFLAGS="$CXXFLAGS -I$GEXTXPDFTOOLS_INSTALLED/include -I$GEXTXPDFTOOLS_INSTALLED/include/libpng15" 192 export LDFLAGS="$LDFLAGS -L$GEXTXPDFTOOLS_INSTALLED/lib" 193 194 (2) The CMAKE command we run must pass the full paths to the actual .so library files (the ones with specific 195 versions in their files names) rather than the symbolically linked generally-named .so files (the latter won't 196 be found when building xpdf-tools and CMake will try to look for the .so library files elsewhere on the system): 197 198 cmake -DCMAKE_BUILD_TYPE=Release \ 199 -DCMAKE_INSTALL_PREFIX=$prefix \ 200 -DZLIB_LIBRARY=$prefix/lib/libz.so.1.2.7 \ # <========= NEW 201 -DPNG_LIBRARY=$prefix/lib/libpng15.so.15.30.0 \ # <========= NEW 202 -DFREETYPE_LIBRARY=$prefix/lib/libfreetype.so.6.3.20 \ # <========= NEW 203 -DCMAKE_DISABLE_FIND_PACKAGE_Qt4=1 \ 204 -DCMAKE_DISABLE_FIND_PACKAGE_Qt5Widgets=1 \ 205 -DCMAKE_C_FLAGS="$CFLAGS" \ 206 -DCMAKE_CXX_FLAGS="$CXXFLAGS" \ 207 -DCMAKE_EXE_LINKER_FLAGS="$LDFLAGS" \ 208 $GEXT_XPDFTOOLS/packages/$package$version # Again: no -DGSDLFLAG_STATIC=... 209 210 Further, 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, 211 212 target_link_libraries(pdftoppm goo fofi splash 213 ${FREETYPE_LIBRARY} ${FREETYPE_OTHER_LIBS} 214 ${DTYPE_LIBRARY} 215 ${LCMS_LIBRARY} 216 ${ZLIB_LIBRARIES}) # <========= NEW 217 218 219 (3) Since CMakeLists.txt has been modified, we initially renamed the xpdf src tarball to gs-xpdf-4.00.tar.gz. 220 However, the current version works with the regular downloaded xpdf-4.00.tar.gz tarball. But after extraction, 221 XPDFTOOLS.sh copies across the custom packages/gs-CMakeLists.txt into the extracted tarball's xpdf subdirectory, 222 renaming the file as CMakeLists.txt (so the path to it becomes "xpdf-4.00/xpdf/CMakeLists.txt"). In XPDFTOOLS.sh: 223 224 # patch the original tarball with our custom makefile 225 if [[ -d "$package$version/xpdf" && -f "gs-CMakeLists.txt" ]]; then 226 echo "*******************************************************************" 227 echo "Using our custom gs-CMakeLists.txt instead of the one included in $package$version" 228 echo "Renaming gs-CMakeLists.txt to $package$version/xpdf/CMakeLists.txt" 229 echo "*******************************************************************" 230 231 cp "gs-CMakeLists.txt" "$package$version/xpdf/CMakeLists.txt" 232 fi 233 234 235 4c. 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. 236 237 In 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. 238 239 (1) First, the XPDFTOOLS.sh cascade-make file should pass the full paths to the actual (non-symbolic link) .a file for each library. 240 A custom GS flag, GSDLFLAG_STATIC, is also invented in gs-CMakeLists.txt and assigned "-static for linux 241 and "-Bstatic" for Mac, to pass in during the linking stage of building xpdf-tools. 242 243 For Mac OSX, when -static is passed in for linking as on linux, this produced the error 244 "ld: library not found for -lcrt0.o" during the build of the xpdf-tools package. For information, see 245 https://stackoverflow.com/questions/3801011/ld-library-not-found-for-lcrt0-o-on-osx-10-6-with-gcc-clang-static-flag 246 The page https://stackoverflow.com/questions/844819/how-to-static-link-on-os-x mentions compiling 247 with -Bstatic on Mac OSX instead. To do so, XPDFTOOLS.sh passes in the GSDLFLAG_STATIC set to either 248 "-static" (for linux) or "-Bstatic" for darwin. 249 However the last mentioned stackoverflow page also says that -Bstatic is a no-op, and this appears to be 250 the case when "otool -L" is run over the generated xpdf-tools binaries: the binaries are all dynamically 251 linked. Although they're finding our .so files of freetype, libpng and zlib, they're not finding the .a 252 versions, even though XPDFTOOLS.sh tries to point gs-CMakeLists.txt to the correct .a files. 253 254 The new modifications to XPDFTOOLS.sh: 255 256 if [ "x$GSDLOS" == "xdarwin" ] ; then 257 static_flag=-Bstatic 258 else 259 static_flag=-static 260 fi 261 18 262 ... 19 20 21 Note that the xpdftools binaries produced in this fashion are still linked to the system zlib and libpng rather than the ones we're compiling up as part of the GEXT XPDFTOOLS extension. But just to get the compilation to succeed with the references to our local library in XPDFTOOLS.sh below (a step toward getting the statically linked xpdftools binaries to compile), we needed the above changes. 22 23 cmake -DCMAKE_BUILD_TYPE=Release \ 24 -DCMAKE_INSTALL_PREFIX=$prefix \ 25 -DZLIB_LIBRARY=$prefix/lib/libz.a \ <======== 26 -DPNG_LIBRARY=$prefix/lib/libpng15.a \ <======== 27 -DFREETYPE_LIBRARY=$prefix/lib/libfreetype.a \ <======== 28 -DCMAKE_DISABLE_FIND_PACKAGE_Qt4=1 \ 29 -DCMAKE_DISABLE_FIND_PACKAGE_Qt5Widgets=1 \ 30 -DCMAKE_C_FLAGS="$CFLAGS" \ 31 -DCMAKE_CXX_FLAGS="$CXXFLAGS" \ 32 -DCMAKE_EXE_LINKER_FLAGS="$LDFLAGS" \ 33 -DPNG_LINK_FLAGS="-lpng15" \ 263 cmake -DCMAKE_BUILD_TYPE=Release \ 264 -DCMAKE_INSTALL_PREFIX=$prefix \ 265 -DZLIB_LIBRARY=$prefix/lib/libz.a \ # <========= MODIFIED TO .a 266 -DPNG_LIBRARY=$prefix/lib/libpng15.a \ # <========= MODIFIED TO .a 267 -DFREETYPE_LIBRARY=$prefix/lib/libfreetype.a \ # <========= MODIFIED TO .a 268 -DCMAKE_DISABLE_FIND_PACKAGE_Qt4=1 \ 269 -DCMAKE_DISABLE_FIND_PACKAGE_Qt5Widgets=1 \ 270 -DCMAKE_C_FLAGS="$CFLAGS" \ 271 -DCMAKE_CXX_FLAGS="$CXXFLAGS" \ 272 -DCMAKE_EXE_LINKER_FLAGS="$LDFLAGS" \ 273 -DGSDLFLAG_STATIC="$static_flag" \ # <========= NEW 34 274 $GEXT_XPDFTOOLS/packages/$package$version 35 275 36 37 ------------------------------------------------------------------- 38 Redundant CMakeLists.txt files 39 ------------------------------------------------------------------- 40 I've also committed work in progress versions of CMakeLists.txt 41 - CMakeLists.txt.orig: the original version of this file in the unmodified xpdf-4.00.tar.gz 42 - CMakeLists.txt.static1_notworking: Sets up CMake settings for static compilation. Which then required some further changes to stop compilation from complaining about undefined references to thread mutex or something. (-lpthread/pthread library was necessary, but needed to set this the CMake way). Not a working version. 43 - CMakeLists.txt.static2_notworking: more changes in an attempt to bypass the errors about undefined references to png (and 'inflate' of zlib). Still not working. It's this version that briefly attempted to use the override to PNG_LINK_FLAGS I am setting in XPDFTOOLS.sh (the line containing: -DPNG_LINK_FLAGS="-lpng15" \). Not sure why it never got set. 44 - CMakeLists.txt: the version of this file first committed with the modified gs-xpdf-4.00.tar.gz. For getting xpdf-tools to compile with dynamic linking and with the current setup of XPDFTOOLS.sh 45 46 There are comments in the modified CMakeLists.txt file above to provide URLs explaining why I made various changes. 47 276 (2) Our customised gs-CMakeLists.txt file now checks for this flag GSDLFLAG_STATIC being set and, if it is, 277 uses it during the linking stage. As in (1) above, it will be set to "-static" for Linux and "-Bstatic" for Mac. 278 279 - When the flag is set, the linking flags passed into each occurrence of target_link_libraries() in 280 gs-CMakeLists.txt is moreover manually written in the form of "-static -l<libs>" rather than using 281 the default linking commands inherited from the original CMakeLists.txt. 282 - If GSDLFLAG_STATIC isn't set, then we don't build statically, and the linking flags passed to each 283 target_link_libraries() are mostly the original ones. 284 285 For example, 286 287 if(GSDLFLAG_STATIC) 288 target_link_libraries(pdftoppm goo fofi splash 289 ${GSDLFLAG_STATIC} -lfreetype ${DTYPE_LIBRARY} ${LCMS_LIBRARY} -lz -lm -lc -lpthread) 290 else () 291 target_link_libraries(pdftoppm goo fofi splash 292 ${FREETYPE_LIBRARY} ${FREETYPE_OTHER_LIBS} 293 ${DTYPE_LIBRARY} 294 ${LCMS_LIBRARY} 295 ${ZLIB_LIBRARIES}) 296 endif () 297 298 DETAILED EXPLANATION: 299 We found that when building *statically*, gs-CMakeLists.txt needed to NOT use the PNG_LIBRARIES, ZLIB_LIBRARIES 300 and FREETYPE_LIBRARY in its linker commands, target_link_libraries(), as doing so produced partially dynamic 301 xpdf-tools executables which were moreover BROKEN. They wouldn't run, and in fact attempting to run an xpdf-tool, 302 like "./pdftohtml", would produce a file not found error. Something like "bash: no such file or directory". 303 304 Online discussions mentioned that this generally happened when attempting to run 32 bit executables on 64 bit 305 linux when 32 bit loaders are not installed. (In such cases, the solution was to apt-get install some 32 bit package.) 306 However, our broken binaries were all 64 bit, as indicated when running the "file" command on them. However, their 307 being further partially dynamically linked executables didn't imply that they would be broken, as we were eventually 308 able to produce partially dynamic executables that did work, before solving static linking altogether. 309 310 The real issue was that including references to ${FREETYPE_LIBRARY} ${FREETYPE_OTHER_LIBS}, ${PNG_LIBRARIES} and 311 ${ZLIB_LIBRARIES} in any target_link_libraries() resulted in the wrong linking command producing broken binaries. 312 313 Doing the regular target_link_libraries() in static mode results in building with 314 "-Wl,-Bstatic -lfreetype -lpng15 -lz -Wl,-Bdynamic -lpthread" at end of link line 315 and produces broken binaries for pdftohtml/pdftoppm/pdftops/pdftopng. 316 317 Note that PNG_LIBRARIES includes zlib/lz: "-lpng -lz", and along with freetype, 318 these are linked statically. However, Threads/lpthread is included as a dynamically 319 linked library instead of including a .a (regardless of whether it's appended 320 as -lpthread or Threads::Threads in the target_link_libraries()), contributing to 321 the pdfhtml binary produced being a partially static, partially dynamic one, 322 so a dynamic executable overall. 323 324 The order of dynamic .so files listed by ldd in the broken static binary of pdftohtml differs from 325 a manually statically linked working version of pdftohtml, and seems to be the only difference 326 between the two in ldd's output. Not using "-Wl,-Bstatic" and using -static (-Bstatic on Mac) 327 in its place creates a partially static dynamic executable that isn't broken, whereas 328 additionally removing "-Wl,-Bdynamic -lpthread" and replacing it with -lpthread 329 moreover produces a working pdftohtml that is a fully static linked executable. 330 331 The inclusion of the math lib and c lib (lm and lc) in the final link command 332 are to completely bypass the remaining .so dependencies that were present in 333 the executable and produce the fully static executable. The lm and lc libs were referenced 334 by all xpdf-tool binaries (as indicated when generating dynamic ones and running ldd over them) 335 but Dr Bainbridge said that -lm and -lc were some libs passed in by the compiler by default, 336 which would explain why explicitly setting them for some xpdftools and not other may not have 337 mattered. 338 339 NOTES: 340 Initial attempts at modifying gs-CMakeLists.txt for static compiling that proved to be unnecessary: 341 342 (1) Setting -static globally doesn't have a useful effect. 343 344 # We want to build static xpdf-tools binaries. See 345 # https://stackoverflow.com/questions/24648357/compiling-a-static-executable-with-cmake 346 # Want to make the min number of changes for building statically, so using the way 347 # below. Beware, must *append* "-static" to existing CMAKE_EXE_LINKER_FLAGS=LD_FLAGS 348 ##SET(CMAKE_FIND_LIBRARY_SUFFIXES ".a") 349 ##SET(BUILD_SHARED_LIBS OFF) 350 ##SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static") 351 352 The above 3 lines just add a -static before the "-O2 -Wall -fPIC -rdynamic ..." during linking, such as below. 353 But they have no further effect on whether static building actually succeeds or not. The only effective static 354 linking command (for Linux so far) was to pass -static in the target_link_libraries() command followed by the 355 "-l<libname>" for each library in the correct order. 356 357 ---- 358 /usr/bin/c++ -I/home/greenstone/gs3-svn-26Mar2018/gs2build/ext/xpdf-tools/trunk/src/linux/include -I/home/greenstone/gs3-svn-26Mar2018/gs2build/ext/xpdf-tools/trunk/src/linux/include -I/home/greenstone/gs3-svn-26Mar2018/gs2build/ext/xpdf-tools/trunk/src/linux/include/libpng15 -O3 -Wall -fPIC -L/home/greenstone/gs3-svn-26Mar2018/gs2build/ext/xpdf-tools/trunk/src/linux/lib -L/home/greenstone/gs3-svn-26Mar2018/gs2build/ext/xpdf-tools/trunk/src/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 359 ---- 360 361 (2) Threads::Threads instead of -lpthread results in a partially dynamic executable. 362 363 # The original, unmodified CMakeLists.txt was not set up sufficiently 364 # for static compilation of xpdf-tools. As a result, compile would first fail 365 # with errors about undefined refs to mutex / lpthread. 366 # When building xpdf-tools statically, need to add the following 2 lines as well 367 # as append "Threads::Threads" to the end of each "target_link_libraries(<list>)" 368 # See https://stackoverflow.com/questions/1620918/cmake-and-libpthread 369 # found googling cmake and "-lpthread" (pthread) after ERRORS to do with this, like: 370 # undefined reference to `pthread_mutex_unlock' 371 ##set(THREADS_PREFER_PTHREAD_FLAG ON) 372 ##find_package(Threads REQUIRED) 373 374 In instances when compilation was successful, including the above 2 lines in combination with "Threads::Threads" 375 as the final argument to every target_link_libraries(...) occurrence in gs-CMakeLists.txt would only manage to 376 produce partially dynamically linked xpdftools binaries. (Depending on what the linking command was when building 377 Xpdf-Tools, the partially dynamically linked executables may work or may be broken. See explanation further above.) 378 We wanted fully statically linked binaries, for which we needed to pass in "-lpthread" as the trailing argument 379 to each target_link_libraries(...). So without either, compilation will fail. However, with "Threads::Threads" 380 the binaries weren't fully static, whereas with -lpthread the xpdftools executables were fully static as CMake no 381 longer tried to link against a dynamic Threads library. 382 383 384 (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). 385 Run 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. 386 387 388 (6) When CASCADE-MAKE is run on the xpdf-tools GS2-extension, it first compiles up CMake, needed to compile up xpdf-tools. 389 Unlike 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. 390 391 There'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. 392 393 The script can be run manually, but it's also run by the extension: 394 - 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. 395 - 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. 396 397 -
gs2-extensions/xpdf-tools/trunk/src/packages/gs-CMakeLists.txt
r32247 r32248 10 10 11 11 #======================================================================== 12 # This is a customised version of Xpdf Tools' CMake file. 13 # Customised for Greenstone. 12 # This is a customised version of Xpdf Tools' CMake file for Greenstone 13 # where we want to build static xpdf-tools executables. 14 # Refer to the GS-README.txt file for the Greenstone "xpdf-tools" 15 # gs2-extension and read section D for the GS specific customisations 16 # in this file and the reasoning behind them, most of which have to do 17 # with attempting to successfully build xpdf-tools statically. 14 18 #======================================================================== 15 19 … … 21 25 22 26 23 # For Mac OSX, when -static is passed in for linking, we end up with the error "ld: library not found for -lcrt0.o" 24 # See https://stackoverflow.com/questions/3801011/ld-library-not-found-for-lcrt0-o-on-osx-10-6-with-gcc-clang-static-flag 25 # On Mac OSX, compile it with -Bstatic, as per https://stackoverflow.com/questions/844819/how-to-static-link-on-os-x 26 # XPDFTOOLS.sh will have set the GSDLFLAG_STATIC to either "-static" (for linux) or "-Bstatic" for darwin 27 # When compiling statically, XPDFTOOLS.sh will have set the custom 28 # GSDLFLAG_STATIC flag to either "-static" for linux or "-Bstatic" for darwin 27 29 28 30 if(GSDLFLAG_STATIC) … … 131 133 endif () 132 134 133 # We want to build static xpdf-tools binaries. See134 # https://stackoverflow.com/questions/24648357/compiling-a-static-executable-with-cmake135 # Want to make the min number of changes for building statically, so using the way136 # below. Beware, must *append* "-static" to existing CMAKE_EXE_LINKER_FLAGS=LD_FLAGS137 ##SET(CMAKE_FIND_LIBRARY_SUFFIXES ".a")138 ##SET(BUILD_SHARED_LIBS OFF)139 ##SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static")140 141 # The original, unmodified CMakeLists.txt was not set up sufficiently142 # for static compilation of xpdf-tools. As a result, compile would first fail143 # with errors about undefined refs to mutex / lpthread.144 # When building xpdf-tools statically, need to add the following 2 lines as well145 # as append "Threads::Threads" to the end of each "target_link_libraries(<list>)"146 # See https://stackoverflow.com/questions/1620918/cmake-and-libpthread147 # found googling cmake and "-lpthread" (pthread) after ERRORS to do with this, like:148 # undefined reference to `pthread_mutex_unlock'149 ##set(THREADS_PREFER_PTHREAD_FLAG ON)150 ##find_package(Threads REQUIRED)151 152 135 #--- pdftops 153 136 … … 222 205 ${LCMS_LIBRARY} ${PNG_LIBRARIES}) 223 206 endif () 224 # Doing the regular target_link_libraries() in static mode results in building with225 # "-Wl,-Bstatic -lfreetype -lpng15 -lz -Wl,-Bdynamic -lpthread" at end of link line226 # and produces broken binaries for pdftohtml/pdftoppm/pdftops/pdftopng.227 # Note that PNG_LIBRARIES includes zlib/lz: "-lpng -lz", and along with freetype,228 # these are linked statically. However, Threads/lpthread is included as a dynamically229 # linked library instead of including a .a (regardless of whether it's appended230 # as -lpthread or Threads::Threads in else above), contributing to the pdfhtml binary231 # produced being a partially static, partially dynamic one,232 # so a dynamic executable overall.233 # The order of dynamic .so files listed by ldd in the broken binary differs from234 # a manually linked working version of pdftohtml, and seems to be the only difference235 # between the two in ldd output. Not using "-Wl,-Bstatic" and using -static (-Bstatic on Mac)236 # in its place creates a partially static dynamic executable that isn't broken, whereas237 # additionally removing "-Wl,-Bdynamic -lpthread" and replacing it with -lpthread238 # moreover produces a working pdftohtml that is a fully static linked executable.239 # The inclusion of the math lib and c lib (lm and lc) in the final link command240 # are to completely bypass the remaining .so dependencies that were present in241 # the executable and produce the fully static executable.242 # Not sure what colormanager (lcms) and typelibrary, or how they're written in -l243 # form as they were not present when the original unmodified static linking command244 # was run, so they've not been included in the replacement static linking command.245 207 install(TARGETS pdftohtml RUNTIME DESTINATION bin) 246 208 install(FILES ${PROJECT_SOURCE_DIR}/doc/pdftohtml.1 DESTINATION man/man1)
Note:
See TracChangeset
for help on using the changeset viewer.