Difference between revisions of "Tutorial:Compiling & Installing SWORD on Windows"

From CrossWire Bible Society
Jump to: navigation, search
(Compiling utilities)
(Cross-compile instructions with cmake -- not finished yet)
Line 118: Line 118:
  
 
   
 
   
 +
== Cross Compiling Sword for MS Windows on Linux with MingW ==
 +
NOTE: these instructions do not include CLucene.
  
 +
:: Create a build directory $BUILD_DIR.
 +
 +
svn co https://www.crosswire.org/svn/sword/trunk/ $BUILD_DIR/sword
 +
 +
:: Download and install MXE. Steps 1 and 2 of the tutorial here [http://mxe.cc/#tutorial].
 +
:: In MXE's install dir ('/opt/mxe' in the tutorial), set up the build environment as follows:
 +
 +
make MXE_TARGETS='i686-w64-mingw32' gcc zlib bzip2 xz curl icu
 +
 +
:: Make icu for linux
 +
cd $BUILD_DIR/icu/source/
 +
mkdir linux-build
 +
cd linux-build
 +
../source/runConfigureICU Linux
 +
 +
:: Cross-compile for windows
 +
cd $BUILD_DIR/icu/source
 +
mkdir win-build
 +
cd win-build
 +
../source/runConfigureICU MinGW --host=i686-w64-mingw32 --with-cross-build=$BUILD_DIR/icu/linux-build
 +
 +
:: Download the latest icu binaries. At time of writing, icu54 [http://site.icu-project.org/download/54]. I downloaded icu4c-54_1-Win32-msvc10.zip.
 +
:: Set up include dir for use with cmake
 +
cd $BUILD_DIR
 +
unzip /path-to-downloaded-icu/icu4c-54_1-Win32-msvc10.zip -d icu-bin
 +
cp -r icu-bin/icu/include icu
 +
 +
:: Make an out of source-directory-for cmake.
 +
 +
mkdir $BUILD_DIR/sword/cmakebuild
 +
cd $BUILD_DIR/sword/cmakebuild
 +
 +
:: Make with the following command
 +
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
 +
 +
:: You will get an error at the very end of make sword. These are just link errors in CMakFiles/sword.dir/link.txt (similarly in CMakeFiles/buildtest.dir/link.txt). These errors do not affect the static build of libsword which you can get by typing 'make' instead of 'make sword'.
  
 
[[Category:Tutorials]]
 
[[Category:Tutorials]]

Revision as of 09:51, 6 January 2015

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
  1. Execute: mkdir cmakebuild
  2. Execute: cd cmakebuild
  3. Execute: cmake -G "Visual Studio 12" ..
  4. Open $dir$\clucene\cmakebuild\clucene.sln
  5. 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 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


Cross Compiling Sword for MS Windows on Linux with MingW

NOTE: these instructions do not include CLucene.

Create a build directory $BUILD_DIR.
svn co https://www.crosswire.org/svn/sword/trunk/ $BUILD_DIR/sword
Download and install MXE. Steps 1 and 2 of the tutorial here [6].
In MXE's install dir ('/opt/mxe' in the tutorial), set up the build environment as follows:
make MXE_TARGETS='i686-w64-mingw32' gcc zlib bzip2 xz curl icu
Make icu for linux
cd $BUILD_DIR/icu/source/
mkdir linux-build
cd linux-build
../source/runConfigureICU Linux
Cross-compile for windows
cd $BUILD_DIR/icu/source
mkdir win-build
cd win-build
../source/runConfigureICU MinGW --host=i686-w64-mingw32 --with-cross-build=$BUILD_DIR/icu/linux-build 
Download the latest icu binaries. At time of writing, icu54 [7]. I downloaded icu4c-54_1-Win32-msvc10.zip.
Set up include dir for use with cmake
cd $BUILD_DIR
unzip /path-to-downloaded-icu/icu4c-54_1-Win32-msvc10.zip -d icu-bin
cp -r icu-bin/icu/include icu
Make an out of source-directory-for cmake.
mkdir $BUILD_DIR/sword/cmakebuild
cd $BUILD_DIR/sword/cmakebuild
Make with the following command
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
You will get an error at the very end of make sword. These are just link errors in CMakFiles/sword.dir/link.txt (similarly in CMakeFiles/buildtest.dir/link.txt). These errors do not affect the static build of libsword which you can get by typing 'make' instead of 'make sword'.