Tutorial:Compiling & Installing SWORD on Windows

From CrossWire Bible Society
Jump to: navigation, search
For compiling on Linux, see Tutorial:Compiling & Installing SWORD.

Compiling The SWORD Project using MS Visual Studio 2013

  1. Create a build directory, hereafter referred to as $dir$. Much of the Sword build process expects that various downloads be unpacked to the same directory.

Compiling cURL

  1. Download the latest release of cURL
  2. Extract the ZIP to $dir$
  3. Rename the cURL directory to "curl" (with no version number)
  4. Start a Developer Command Prompt (find this on your Start Menu in the Visual Studio 2013 | Visual Studio Tools menu)
  5. cd to $dir$/curl/winbuild
  6. Execute: nmake /f Makefile.vc mode=static DEBUG=no

Compiling ICU

  1. Download the latest release of ICU. At writing, the latest version is 52.1: [1]
  2. Extract the tarball to $dir$
  3. Open $dir$\icu\source\allinone\allinone.sln
  4. Ensure that the Win32 Release configuration is selected and build the solution

Compiling zlib

  1. Download the latest release of zlib source code. At writing, the latest version is 1.2.8: [2]
  2. Extract the archive to $dir$ and rename the directory "zlib" (with no version number)
  3. Start a Developer Command Prompt (find this on your Start Menu in the Visual Studio 2013 | Visual Studio Tools menu)
  4. cd to $dir$/zlib
  5. Execute: nmake /f win32/Makefile.msc

Compiling bzip2

  1. Download the latest release of bzip2. At writing, the latest version is 1.0.6: [3]
  2. Extract the archive to $dir$ and rename the directory "bzip2"
  3. Open $dir$\bzip2\libbz2.dsp and allow Visual Studio to update the project
  4. Ensure that the Release configuration is selected and build the solution

Downloading liblzma

  1. Download the latest release of xz prebuilt for Windows from tukaani.org. At writing, the latest version is 5.0.5: [4]
  2. Extract the archive to $dir$/xz
  3. Start a Developer Command Prompt (find this on your Start Menu in the Visual Studio 2013 | Visual Studio Tools menu)
  4. cd to $dir$/xz/bin_i486
  5. Execute: lib /def:../doc/liblzma.def /out:liblzma.lib /machine:x86

Compiling CLucene

  1. Install cmake
  2. Download the latest version of boost. At writing, the latest version is 1.5.5: [5]
  3. Extract the archive to $dir$
  4. Rename the boost directory to "boost"
  5. Download a snapshot of the CLucene 2_3_2 branch
  6. Extract the archive to $dir$
  7. Rename the CLucene directory to "clucene"
  8. Start a regular Command Prompt (cmd.exe)
  9. cd to $dir$/clucene
  10. Set Boost environment variables by executing the following (with replacements for $dir$):
    set BOOST_BUILD_PATH=$dir$\boost\tools\build\v2
    set BOOST_PATH=$dir$
    set BOOST_ROOT=$dir$\boost
  11. Execute: mkdir cmakebuild
  12. Execute: cd cmakebuild
  13. Execute: cmake -G "Visual Studio 12" ..
  14. Open $dir$\clucene\cmakebuild\clucene.sln
  15. Ensure that the Release configuration is selected and build the BUILD_ALL project

Compiling libsword

  1. Download the latest release of The SWORD Project or download a copy from SVN: https://www.crosswire.org/svn/sword/trunk/
  2. Extract the tarball to $dir$
If you are building utilities or diatheke, the following steps are not necessary:
  1. Open $dir$\sword-$version$\lib\vcppmake\libsword.sln
  2. Build the solution (Release, Debug, or both)

Compiling utilities

  1. Open $dir$\sword-$version$\utilities\vcppmake\utilities.sln
  2. Build the solution (Release, Debug, or both)

Cross Compiling Sword for MS Windows on Linux with MingW

NOTE: these instructions do not include CLucene.

  1. Create a build directory $BUILD_DIR
  2. Download the latest version of SWORD from svn
svn co https://www.crosswire.org/svn/sword/trunk/ $BUILD_DIR/sword
  1. Download and install MXE (steps 1 and 2 of the tutorial here [6]).
  2. Aquire all the dependancies (except ICU and CLucene)
    by using the instructions above (on windows with visual studio)
    downloading the binaries (dynamic linking)
    using MXE's system libraries (static linking). In this case, change to MXE's install dir ('/opt/mxe' in the tutorial) and do:
su
make MXE_TARGETS='i686-w64-mingw32' gcc zlib bzip2 xz curl

Aquire icu

Download the latest ICU source [7] Inflate the zip or tar archive to $BUILD_DIR/icu

#
# Make icu for linux first...
cd $BUILD_DIR/icu/source/
mkdir linux-build
cd linux-build
../source/runConfigureICU Linux
#
# ...then cross-compile for windows...
cd $BUILD_DIR/icu/source
mkdir win-build
cd win-build
#
# ...making sure we are being consistant with which compiler we are using by setting CC and CXX...
CC=/opt/mxe/usr/bin/i686-w64-mingw32-gcc CXX=/opt/mxe/usr/bin/i686-w64-mingw32-g++ ../source/runConfigureICU MinGW --host=i686-w64-mingw32 --with-cross-build=$BUILD_DIR/icu/linux-build 
#
# Finally, set up the include dir for use with cmake
cd $BUILD_DIR/icu
cp -r source/*/unicode/ include/
...or use MXE's system icu. Take care when doing this because
it be an older version of icu (ie, icu51 at time of writing).
MXE make static libraries (haven't figured out how to get dynamic ones yet) which bloat the libsword.dll!
you will have to hack the build process a bit too.
su
make MXE_TARGETS='i686-w64-mingw32' icu4c

Building SWORD

Make an out of source-directory-for cmake.

mkdir $BUILD_DIR/sword/cmakebuild
cd $BUILD_DIR/sword/cmakebuild

If you want to use the dynamics libraries (recommended):

cmake -DREGEX_INCLUDE_DIR= \
      -DCURL_LIBRARY=$BUILD_DIR/curl/builds/libcurl-vc-x86-release-dll-ipv6-sspi-winssl/bin/libcurl.dll \
      -DCURL_INCLUDE_DIR=$BUILD_DIR/curl/include \
      -DXZ_LIBRARY=$BUILD_DIR/xz/bin_i486/liblzma.dll \
      -DXZ_INCLUDE_DIR=$BUILD_DIR/xz/include \
      -DZLIB_LIBRARY=$BUILD_DIR/zlib/zlib1.dll \
      -DZLIB_INCLUDE_DIR=$BUILD_DIR/zlib \
      -DICU_LIBRARY=$BUILD_DIR/icu/win-build/lib/icuuc54.dll \
      -DICU_I18N_LIBRARY=$BUILD_DIR/icu/win-build/lib/icuin54.dll \
      -DICU_INCLUDE_DIR=$BUILD_DIR/icu/include \
      -DBZIP2_LIBRARY=$BUILD_DIR/bzip2/libbz2.dll \
      -DBZIP2_LIBRARY=$BUILD_DIR/bzip2 \
      -DCMAKE_TOOLCHAIN_FILE=/opt/mxe/usr/i686-w64-mingw32/share/cmake/mxe-conf.cmake -G "Unix Makefiles" ..
make sword
...or if you want to use MXE's system libraries:
#
# I couldn't link against MXE's static build of libcurl.
# It might be to do with this: http://curl.haxx.se/docs/faq.html#Link_errors_when_building_libcur
#
cmake -DREGEX_INCLUDE_DIR= \
      -DCURL_LIBRARY=$BUILD_DIR/curl/builds/libcurl-vc-x86-release-dll-ipv6-sspi-winssl/bin/libcurl.dll \
      -DCURL_INCLUDE_DIR=$BUILD_DIR/curl/include \
      -DICU_LIBRARY=$BUILD_DIR/icu/win-build/lib/icuuc54.dll \
      -DICU_I18N_LIBRARY=$BUILD_DIR/icu/win-build/lib/icuin54.dll \
      -DICU_INCLUDE_DIR=$BUILD_DIR/icu/include \
      -DCMAKE_TOOLCHAIN_FILE=/opt/mxe/usr/i686-w64-mingw32/share/cmake/mxe-conf.cmake -G "Unix Makefiles" ..
make sword
...or if you want to use MXE's system ICU too:
#
# I couldn't link against MXE's static build of libcurl.
# It might be to do with this: http://curl.haxx.se/docs/faq.html#Link_errors_when_building_libcur
#
cmake -DREGEX_INCLUDE_DIR= \
      -DCURL_LIBRARY=$BUILD_DIR/curl/builds/libcurl-vc-x86-release-dll-ipv6-sspi-winssl/bin/libcurl.dll \
      -DCURL_INCLUDE_DIR=$BUILD_DIR/curl/include \
      -DCMAKE_TOOLCHAIN_FILE=/opt/mxe/usr/i686-w64-mingw32/share/cmake/mxe-conf.cmake -G "Unix Makefiles" ..
make sword
#
# 'make sword' will end in an error (similarly 'make blah'). 
#
# ... but all we need to do is link against icudt. So we hack link.txt a bit an run ... 
#
`echo $(tail -n1 CMakeFiles/sword.dir/link.txt) -licudt -licuuc`

NOTE: the directory that your libcurl.dll ends up in might be different to mine - but it will be something like build/libcurl-blah-release-dll-blah-blah-blah/bin/libcurl.dll. I also had to rename liblzma.dll to liblzma-5.dll for some reason...

Cross Compiling Sword for MS Windows on Suse Linux with MingW

Suse with MingW

Installation of all necessary dependencies of Sword, but for CLucene - libcurl, ICU, libgnurx etc -

Compilation of Clucene

clucene 0.9.21b source

The scripts for compiling sword and clucene in xiphos/win32/suse are meant to be used from ~/source/ with the clucene and sword directories directly under that. I would suggest reading the scripts. They aren't complicated, and I'm sure that I made assumptions about my environment (which is basically the *sole* reason for the warning that they aren't ready, I never meant they couldn't be used). You can go ahead and try to use them to cross-compile clucene. It will probably fail. If at that point, you send me config.log, that will help me remember what to do to fix it.


edit m4/dps_static_const_type.m4, the last AC_DEFINE line. Change from:

AC_MSG_ERROR([Cannot figure out how to write static consts in classes. Check the m4 script or upgrade your compiler])

to:

AC_DEFINE([LUCENE_STATIC_CONSTANT_SYNTAX], 1, [How to define a static const in a class])

eg, the same as the first AC_DEFINE. I have no idea if it's correct, actually, but it seems to work ;)

Next, edit src/Makefile.am, line 6. Add -no-undefined at the end, like so:

libclucene_la_LDFLAGS  = --version-info $(CLLIB_VERSION) --release
$(PACKAGE_VERSION) -no-undefined

src/CLucene/store/FSDirectory.cpp

At the top of that file, after the #include directives, I just added this:

#define _mkdir mkdir


After changing these, you'll have to run autogen.sh and then re-configure using my script. It *should* build after this, at which point run sudo make install. Check to be sure it created a dll rather than just a static library (which will end in .la). It should be located in /usr/i686-w64-mingw32/sys-root/mingw/bin

After this Clucene compiles without errors and creates a working dll.

Compilation of Sword

Application of 2 patches:

patch1 patch2