How to build Box Backup on Win32 using Cygwin and MinGW
By Chris Wilson, 2009-03-31

(To read this document online with better formatting, browse to:
[http://www.boxbackup.org/trac/wiki/CompileWithMinGW])

== MinGW C++ ==

Start by installing Cygwin on your Windows machine from [http://www.cygwin.org/cygwin/].

Make sure to select the following packages during installation:

 * Archive/unzip
 * Devel/autoconf
 * Devel/automake
 * Devel/make
 * Devel/mingw64-x86_64-gcc
 * Devel/mingw64-x86_64-gcc-g++
 * Devel/mingw64-x86_64-zlib
 * Libs/libxml2
 * Libs/libxslt (for xsltproc)
 * Perl/Perl

If you already have Cygwin installed, please re-run the installer and
ensure that those packages are installed.

You may also want to install:

 * Devel/gdb (the debugger)
 * Devel/subversion (the command-line Subversion client)
 * Editors/vim (the Vim text editor)

== Base Directory ==

Choose a directory where you will unpack and compile OpenSSL, Zlib and
Box Backup. We will call this the ''base directory''. An example might be:

  C:\Cygwin\Home\YourUsername

Make sure you know the full path to this directory.

If your user name has spaces in it, which is quite common on Windows,
please rename your home directory to one without any spaces, and change
your user's home directory in /etc/passwd to match.

== OpenSSL ==

Download OpenSSL from [http://www.openssl.org/source/openssl-1.0.1f.tar.gz]

Open a Cygwin shell, go to the base directory, and unpack OpenSSL:

	tar xzvf openssl-1.0.1f.tar.gz

Configure OpenSSL for MinGW compilation, and build and install it:

	cd openssl-1.0.1f
	./Configure --prefix=/usr/x86_64-w64-mingw32 mingw64 --cross-compile-prefix=x86_64-w64-mingw32-
	make
	make install_sw

== PCRE ==

This step is only required to support regular expressions in including/excluding files from backups. However, this is a very useful feature.

Download PCRE from 
[http://prdownloads.sourceforge.net/pcre/pcre-8.34.tar.bz2?download].

Open a Cygwin shell, go to the base directory, and unpack, build and
install PCRE:

	tar xjvf pcre-8.34.tar.bz2
	cd pcre-8.34
	./configure --prefix=/usr/x86_64-w64-mingw32 --disable-shared --host=x86_64-w64-mingw32
	make
	make install

Note: we must disable shared libraries on Windows because otherwise
libpcreposix.a is built to depend on libpcre.dll, even if you define
PCRE_STATIC, and since /usr/i686-pc-mingw32/bin (the location of the DLL)
is not normally on the PATH, the DLL can't be found, which stops you
from running any executables.

== Readline (Optional) ==

Readline enables editing and completion of commands in bbackupquery.
It is optional, but it makes bbackupquery easier to use. However, please
do not enable readline if you intend to distribute the resulting Box
Backup binaries, as this would be a violation of the GPL license of
readline.

If you want Readline support, download PDCurses from
[http://sourceforge.net/projects/pdcurses/files/pdcurses/3.4/PDCurses-3.4.tar.gz/download]. Save it in your base directory, then open a Cygwin shell there,
unpack it, compile and install it:

	tar xzvf PDCurses-3.4.tar.gz
	cd PDCurses-3.4/win32
	make -f gccwin32.mak CC="gcc -mno-cygwin" LINK="gcc -mno-cygwin"
	cp pdcurses.a /usr/x86_64-w64-mingw32/lib/libpdcurses.a

Download Readline version 6.2 from
[ftp://ftp.cwru.edu/pub/bash/readline-6.2.tar.gz], and unpack
and install it thus:

	tar xzvf readline-6.2.tar.gz
	cd readline-6.2
	./configure --prefix=/usr/x86_64-w64-mingw32 \
		--host=x86_64-w64-mingw32 \
		LIBS="-lpdcurses" --with-curses --disable-shared \
		CFLAGS="-DSIGHUP=0 -DSIGQUIT=0 -DS_ISUID=0 -DS_ISGID=0 -DS_IXGRP=0 -DS_IXOTH=0 -DS_IWOTH=0"
	make
	make install

== Download Box Backup ==

Go back to the base directory, and download the latest Box Backup sources:

	svn co https://www.boxbackup.org/svn/box/trunk/ trunk

Note: If you have problems during the configure or make stage, please try to
eliminate one potential source of problems by running the following command
to convert all line endings to Unix format:

	find -type f -not \( -wholename .*svn*. \) -exec dos2unix {} \;

== Compile Box Backup ==

Enter the source directory and configure like this:

	cd trunk
	./infrastructure/mingw/configure.sh [--enable-gnu-readline]
	make

== Installation ==

Create the destination directory, ''C:\Program Files\Box Backup\bbackupd''.

Write a configuration file, keys and certificate on a Unix machine, and
copy them into the ''Box Backup'' directory, together with the following
files from the ''base directory'':

 * boxbackup\release\bin\bbackupd\bbackupd.exe
 * boxbackup\release\bin\bbackupquery\bbackupquery.exe
 * boxbackup\release\bin\bbackupctl\bbackupctl.exe
 * openssl\out32dll\libeay32.dll
 * openssl\out32dll\ssleay32.dll
 * zlib\zlib1.dll

Ensure that the user running Box Backup can read from the ''Box Backup''
directory, and write to the ''bbackupd'' directory inside it.

Run Box Backup by double-clicking on it, and check that it connects to
the server. If the window opens and closes immediately, it's probably
due to a problem with the configuration file. Check the Windows Event
Viewer for details.

See also the service installation and upgrade instructions at 
[https://www.boxbackup.org/trac/wiki/CompilationOnWindows].
