Compiling FileZilla 3 under Windows
This documentation explains how to setup a build environment for FileZilla 3 and how to compile it under Windows using msys2. Msys2 is a cygwin environment. These instructions require you to run a 64bit Windows.
It will take some time to get everything working, but you will be able to use the build environment for other programs too.
For complete MSYS2 system and all needed dependencies installed, you will need 7GiB free space on your disk.
Note to wiki contributors: Do not change version numbers on your own. The build process is somewhat fragile and does break if you change things
Installing the MSYS2 environment
Download the 64bit MSYS2 installer and install it in a convenient location: msys2-x86_64-20150512.exe
Installing the compiler toolchain
FileZilla's shell extension needs to be build both for 32bit as well as 64bit, hence we're going to need compilers for both 32bit and 64bit.
Tools and compiler
First update
Start the MSYS2 shell
pacman -Syu
close MSYS2 shell.
Install tools and compiler toolchain
Start MSYS2 shell, execute the following command to install the necessary packages:
pacman -S base-devel msys2-devel mingw-w64-i686-toolchain mingw-w64-x86_64-toolchain pacman -S svn git curl wget pacman -S ca-certificates
Execute the following to work around some most-annoying bugs in the toolchain
# Fix missing platform prefix for windres [ -f /mingw64/bin/x86_64-w64-mingw32-windres.exe ] || ln -s /mingw64/bin/windres.exe /mingw64/bin/x86_64-w64-mingw32-windres.exe [ -f /mingw32/bin/i686-w64-mingw32-windres.exe ] || ln -s /mingw32/bin/windres.exe /mingw32/bin/i686-w64-mingw32-windres.exe
# Even when statically linking to libstdc++, it still tries to dynamically link to lib(win)pthread. On top of it, libtool is too # stupid to recognize the semantics of -Wl,-Bstatic. This leaves one option: Removing the dynamic import libraries. rm /mingw32/i686-w64-mingw32/lib/libpthread.dll.a rm /mingw32/i686-w64-mingw32/lib/libwinpthread.dll.a rm /mingw64/x86_64-w64-mingw32/lib/libpthread.dll.a rm /mingw64/x86_64-w64-mingw32/lib/libwinpthread.dll.a
Setting up the environment
Execute the following commands:
mkdir ~/prefix echo 'export PATH="$HOME/prefix/bin:/mingw64/bin:/mingw32/bin:$PATH"' >> ~/.profile echo 'export PKG_CONFIG_PATH="$HOME/prefix/lib/pkgconfig"' >> ~/.profile echo 'export PATH="$HOME/prefix/bin:/mingw64/bin:/mingw32/bin:$PATH"' >> ~/.bash_profile echo 'export PKG_CONFIG_PATH="$HOME/prefix/lib/pkgconfig"' >> ~/.bash_profile
Restart the MSYS2 shell.
Building dependencies
Building GMP
cd ~ curl -O https://gmplib.org/download/gmp/gmp-6.1.1.tar.xz tar xf gmp-6.1.1.tar.xz cd gmp-6.1.1 ./configure --build=x86_64-w64-mingw32 --prefix="$HOME/prefix" --enable-static --disable-shared --enable-fat make && make install
Building Nettle
cd ~ wget http://ftp.gnu.org/gnu/nettle/nettle-3.2.tar.gz tar xf nettle-3.2.tar.gz cd nettle-3.2 ./configure --build=x86_64-w64-mingw32 --prefix="$HOME/prefix" --enable-static --disable-shared --enable-fat make && make install
Building zlib
cd ~ wget http://zlib.net/zlib-1.2.11.tar.gz tar xf zlib-1.2.11.tar.gz cd zlib-1.2.11 ./configure --prefix="$HOME/prefix" --static -u=GNU make && make install
Building GnuTLS
cd ~ wget ftp://ftp.gnutls.org/gcrypt/gnutls/v3.4/gnutls-3.4.16.tar.xz tar xf gnutls-3.4.16.tar.xz cd gnutls-3.4.16 ./configure --prefix="$HOME/prefix" --enable-static --disable-shared --build=x86_64-w64-mingw32 --with-included-libtasn1 --disable-doc --disable-guile --without-p11-kit --enable-local-libopts --disable-nls make && make install # The __declspec(dllimport) is needed for DLLs, but we're linking statically. It thus results in undefined references. Remove it. sed -i 's/__declspec(dllimport)//' "$HOME/prefix/include/gnutls/gnutls.h"
Building SQLite
cd ~ wget https://sqlite.org/2017/sqlite-autoconf-3200100.tar.gz tar xf sqlite-autoconf-3200100.tar.gz cd sqlite-autoconf-3200100 ./configure --build=x86_64-w64-mingw32 --prefix="$HOME/prefix" --enable-static --disable-shared make && make install
Building wxWidgets
cd ~ svn co https://github.com/wxWidgets/wxWidgets/branches/WX_3_0_BRANCH wx3 cd wx3 ./configure --prefix="$HOME/prefix" --enable-static --disable-shared --build=x86_64-w64-mingw32 --enable-unicode --without-libtiff --without-libjpeg --with-expat=builtin --with-libpng=builtin make && make install
Building libfilezilla
cd ~ svn co https://svn.filezilla-project.org/svn/libfilezilla/trunk libfilezilla cd libfilezilla autoreconf -i ./configure --build=x86_64-w64-mingw32 --prefix="$HOME/prefix" --enable-static --disable-shared make && make install
Building Filezilla
Download FileZilla
cd ~ svn co https://svn.filezilla-project.org/svn/FileZilla3/trunk filezilla
Building FileZilla
cd ~/filezilla autoreconf -i ./configure --build=x86_64-w64-mingw32 --with-pugixml=builtin LDFLAGS="-static-libgcc -static-libstdc++" make
Stripping debug symbols
strip src/interface/.libs/filezilla.exe strip src/putty/.libs/fzsftp.exe strip src/putty/.libs/fzputtygen.exe strip src/fzshellext/64/.libs/libfzshellext-0.dll strip src/fzshellext/32/.libs/libfzshellext-0.dll
Building the installer
Installing NSIS
Download and install NSIS 3 from http://nsis.sourceforge.net/
Compile the installer script
Right click data/install.nsi in Explorer and use "Compile NSIS Script" from context menu.
Troubleshooting
If you run into problems, please make sure you've followed each step exactly how it is explained and that you haven't missed any steps along the way.