Difference between revisions of "Cross Compiling FileZilla 3 for Windows under Ubuntu or Debian GNU/Linux"

From FileZilla Wiki
Jump to navigationJump to search
m (Reverted edits by 2600:387:2:803:0:0:0:72 (talk) to last revision by CodeSquid)
Tag: Rollback
 
(218 intermediate revisions by 55 users not shown)
Line 1: Line 1:
This documentation explains how to setup a build environment for [[FileZilla 3]] '''for Windows''' and how to compile it under [http://debian.org Debian] using [http://www.mingw.org/ MinGW]. It will take less time and simple than [[Compiling FileZilla 3 under Windows]].
+
This documentation explains how to setup a build environment for [[FileZilla 3]] '''for Windows''' and how to compile it under [https://debian.org Debian] using [https://mingw-w64.org/ Mingw-w64]. It will take less time and is more simple than [[Compiling FileZilla 3 under Windows]].
  
 
== OS version ==
 
== OS version ==
* [http://ubuntu.com Ubuntu] 10.4 ('''recommended''')
 
* [http://debian.org Debian] 5.0.3
 
* [http://colinux.org coLinux] with [http://sourceforge.net/projects/colinux/files/Images%202.6.x%20Debian/Debian%205.0%20Lenny/Debian-5.0r2-lenny.7z/download Debian-5.0r2-lenny]
 
  
== Setting up the build environment ==
+
Any recent Linux should do the trick. For the sake of simplicity, this guide focuses on Debian(-based) distributions.
  
=== Ubuntu ===
+
We strongly recommend to use [http://debian.org Debian '''12''' (Bookworkm)] or later ('''recommended''')
  
Required packages
+
== Setting up the build environment ==
sudo apt-get install -y mingw32 make g++ libtool bzip2 automake gettext wx-common
 
  
=== Debian ===
+
As root, execute:
 +
dpkg --add-architecture i386
 +
apt update
 +
apt install automake autoconf libtool make gettext lzip xz-utils
 +
apt install mingw-w64 pkg-config wx-common wine wine64 wine32 wine-binfmt subversion git
  
Do works as root
+
Back as normal user, execute:
  su -
+
  mkdir ~/prefix
 +
mkdir ~/src
 +
export PATH="$HOME/prefix/bin:$PATH"
 +
export LD_LIBRARY_PATH="$HOME/prefix/lib:$LD_LIBRARY_PATH"
 +
export PKG_CONFIG_PATH="$HOME/prefix/lib/pkgconfig:$PKG_CONFIG_PATH"
 +
export TARGET_HOST=x86_64-w64-mingw32
  
Required packages
+
  wine reg add HKCU\\Environment /f /v PATH /d "`x86_64-w64-mingw32-g++ -print-search-dirs | grep ^libraries | sed 's/^libraries: =//' | sed 's/:/;z:/g' | sed 's/^\\//z:\\\\\\\\/' | sed 's/\\//\\\\/g'`"
  apt-get install -y mingw32 make g++ libtool bzip2 automake gettext wx-common
 
  
== Patch mingw32-runtime ==
+
<!--
 +
<p style="font-size:150%;color:#ff0000">'''Beware:''' You need to patch your MinGW runtime!</p>
 +
Note: This does not affect mingw-w64 >= v4.0.6, mingw-w64 v4.0.6 is available in Ubuntu 16.10.
  
If you are using Ubuntu, go to the next [[#Make libraries]] section. In Ubuntu, the patch is applied.
+
The version of the MinGW runtime ships with Debian based distributions has broken string conversion functions. You need to fetch the source of the mingw-64 packet and apply the following two patches:
 +
https://sourceforge.net/p/mingw-w64/mingw-w64/ci/2474f3904a1fbce19d96383a9633e6c2eeb427ea/
 +
https://sourceforge.net/p/mingw-w64/mingw-w64/ci/bca09678e3bfd67b2d445127280ee5a1d9d0453a/
  
Because the version of mingw32-runtime in Debian 5 is [http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=452977 broken] - Thanks [[CodeSquid]], patch mingw32-runtime package.
+
Without these patches, FileZilla will not work properly and will fail in obscure ways.
 +
-->
  
=== Get source package ===
+
== GMP ==
cd /tmp
 
apt-get install dpkg-dev debhelper
 
apt-get source mingw32-runtime
 
cd mingw32-runtime-3.13/
 
debian/rules unpack-stamp
 
  
=== Patch snprintf bug ===
+
cd ~/src
  pushd build_dir/src/mingw-runtime-3.13-20070825-1/mingwex/gdtoa/
+
  wget https://gmplib.org/download/gmp/gmp-6.3.0.tar.lz
diff -u mingw_snprintf.c.org mingw_snprintf.c
+
  tar xf gmp-6.3.0.tar.lz
  --- mingw_snprintf.c.org        2009-09-21 02:41:31.000000000 +0000
+
  cd gmp-6.3.0
  +++ mingw_snprintf.c    2009-09-21 02:41:54.000000000 +0000
+
  CC_FOR_BUILD=gcc ./configure --host=$TARGET_HOST --prefix="$HOME/prefix" --disable-static --enable-shared --enable-fat
  @@ -465,7 +465,7 @@
+
  make
                                    len = LEN_LL;
+
  make install
                                  }
 
                                else
 
-                                 len = LEN_LL;
 
+                                len = LEN_L;
 
                                goto fmtloop;
 
                        case 'L':
 
                                flag_ld++;
 
@@ -617,6 +617,7 @@
 
                                        break;
 
                                  case LEN_S:
 
                                        *(short*)ip = c;
 
  +                                      break;
 
                                  case LEN_LL:
 
                                        *(long long*) ip = c;
 
                                        break;
 
  popd
 
  
=== Build & Install ===
+
== Nettle ==
debian/rules build
 
debian/rules install
 
  
=== Copy new library ===
+
cd ~/src
  mv /usr/i586-mingw32msvc/lib/libmingwex.a /usr/i586-mingw32msvc/lib/libmingwex.a.old
+
  wget https://ftp.gnu.org/gnu/nettle/nettle-3.9.1.tar.gz
  cp debian/mingw32-runtime/usr/i586-mingw32msvc/lib/libmingwex.a /usr/i586-mingw32msvc/lib/
+
  tar xf nettle-3.9.1.tar.gz
 +
cd nettle-3.9.1
 +
./configure --host=$TARGET_HOST --prefix="$HOME/prefix" --enable-shared --disable-static --enable-fat
 +
make
 +
make install
  
== Make libraries ==
+
== GnuTLS ==
Do works as normal user in Debian.
 
exit
 
  
=== Make working & install directory ===
+
  cd ~/src
Check available space of storage.
+
  wget https://www.gnupg.org/ftp/gcrypt/gnutls/v3.8/gnutls-3.8.1.tar.xz
  mkdir ~/mingw32
+
tar xvf gnutls-3.8.1.tar.xz
  mkdir /tmp/fz3
+
  cd gnutls-3.8.1
  cd /tmp/fz3
+
./configure --host=$TARGET_HOST --prefix="$HOME/prefix" --enable-shared --disable-static --without-p11-kit --with-included-libtasn1 --with-included-unistring --disable-srp-authentication --disable-dtls-srtp-support --disable-heartbeat-support --disable-psk-authentication --disable-anon-authentication --disable-openssl-compatibility --without-tpm --without-brotli --disable-cxx --disable-doc --enable-threads=windows --disable-tools
 +
make
 +
make install
  
=== Setting up environment variables ===
+
== Compile SQLite ==
export CFGPRE=~/mingw32
 
export CFGOPT="--prefix=$CFGPRE --host=i586-mingw32msvc --disable-shared --enable-static"
 
  
=== iconv ===
+
cd ~/src
  wget ftp://ftp.gnu.org/gnu/libiconv/libiconv-1.13.tar.gz
+
  wget https://sqlite.org/2018/sqlite-autoconf-32600-00.tar.gz
  tar zxvf libiconv-1.13.tar.gz
+
  tar xvzf sqlite-autoconf-3260000.tar.gz
  cd libiconv-1.13
+
  cd sqlite-autoconf-3260000
  ./configure $CFGOPT
+
  ./configure --host=$TARGET_HOST --prefix="$HOME/prefix" --enable-shared --disable-static --disable-dynamic-extensions
  make install clean
+
  make
  cd ..
+
  make install
  
=== libidn ===
+
== NSIS ==
wget ftp://alpha.gnu.org/gnu/libidn/libidn-0.6.9.tar.gz
 
tar zxvf libidn-0.6.9.tar.gz
 
cd libidn-0.6.9
 
./configure $CFGOPT
 
make install clean
 
cd ..
 
  
=== libgpg-error ===
+
cd ~/src
  wget ftp://ftp.gnupg.org/gcrypt/libgpg-error/libgpg-error-1.7.tar.bz2
+
  wget https://prdownloads.sourceforge.net/nsis/nsis-3.09-setup.exe
  tar jxvf libgpg-error-1.7.tar.bz2
+
  wine nsis-3.09-setup.exe /S
cd libgpg-error-1.7
 
./configure $CFGOPT --disable-nls
 
make install clean
 
cd ..
 
  
=== libgcrypt ===
+
The above may print a lot of errors and warnings. Ignore them, check for success this way:
  wget ftp://ftp.gnupg.org/gcrypt/libgcrypt/libgcrypt-1.4.4.tar.bz2
+
  [ -f "$HOME/.wine/drive_c/Program Files/NSIS/makensis.exe" ] && echo "Success!"
tar jxvf libgcrypt-1.4.4.tar.bz2
 
cd libgcrypt-1.4.4
 
./configure $CFGOPT --disable-nls --disable-asm --with-gpg-error-prefix=$CFGPRE
 
make install clean
 
cd ..
 
  
=== GnuTLS ===
+
== Compile wxWidgets ==
wget ftp://ftp.gnutls.org/pub/gnutls/gnutls-2.8.3.tar.bz2
 
tar jxvf gnutls-2.8.3.tar.bz2
 
cd gnutls-2.8.3
 
./configure $CFGOPT --disable-nls --disable-cxx --with-libgcrypt-prefix=$CFGPRE
 
make install clean
 
cd ..
 
  
=== wxWidgets ===
+
cd ~/src
  wget http://downloads.sourceforge.net/wxwindows/wxWidgets-2.8.10.tar.bz2
+
  git clone --branch WX_3_0_BRANCH --single-branch https://github.com/wxWidgets/wxWidgets.git wx3
tar jxvf wxWidgets-2.8.10.tar.bz2
+
  cd wx3
  cd wxWidgets-2.8.10
+
  ./configure --host=$TARGET_HOST --prefix="$HOME/prefix" --enable-shared --disable-static
mkdir compile
+
make
cd compile
+
  make install
  ../configure $CFGOPT --enable-unicode
+
  cp $HOME/prefix/lib/wx*.dll $HOME/prefix/bin
  make install clean
 
  cd ../..
 
  
== Compiling FileZilla 3 ==
+
== Compile libfilezilla ==
wget http://downloads.sourceforge.net/filezilla/FileZilla_3.2.7.1_src.tar.bz2
 
tar jxvf FileZilla_3.2.7.1_src.tar.bz2
 
 
cd filezilla-3.2.7.1
 
./autogen.sh
 
  
  mkdir compile
+
  cd ~/src
  cd compile
+
svn co https://svn.filezilla-project.org/svn/libfilezilla/tags/0.33.0 lfz
 +
  cd lfz
 +
autoreconf -i
 +
./configure --host=$TARGET_HOST --prefix="$HOME/prefix" --enable-shared --disable-static
 +
make
 +
make install
  
autogen.sh of FileZilla 3 use old libgnutls-config.
+
== Compile FileZilla ==
cat << EOF > $CFGPRE/bin/libgnutls-config
 
#!/bin/sh
 
echo "-L$CFGPRE/lib -lgnutls -lgcrypt -lgpg-error"
 
EOF
 
chmod +x $CFGPRE/bin/libgnutls-config
 
  
  CFLAGS="-I$CFGPRE/include" CXXFLAGS="-I$CFGPRE/include" LDFLAGS="-L$CFGPRE/lib" ../configure $CFGOPT --with-wx-prefix=$CFGPRE --with-libgnutls-prefix=$CFGPRE
+
  cd ~/src
+
svn co https://svn.filezilla-project.org/svn/FileZilla3/tags/3.56.0/ fz
 +
cd fz
 +
autoreconf -i
 +
./configure --host=$TARGET_HOST --prefix="$HOME/prefix" --enable-shared --disable-static --with-pugixml=builtin
 
  make
 
  make
  strip src/interface/filezilla.exe
+
  # strip debug symbols
 +
$TARGET_HOST-strip src/interface/.libs/filezilla.exe
 +
$TARGET_HOST-strip src/putty/.libs/fzsftp.exe
 +
$TARGET_HOST-strip src/putty/.libs/fzputtygen.exe
 +
$TARGET_HOST-strip src/fzshellext/64/.libs/libfzshellext-0.dll
 +
$TARGET_HOST-strip src/fzshellext/32/.libs/libfzshellext-0.dll
 +
$TARGET_HOST-strip data/dlls/*.dll
 +
cd data
 +
wine "$HOME/.wine/drive_c/Program Files/NSIS/makensis.exe" install.nsi
 +
 
 +
Voila, there's now FileZilla_3_setup.exe in the current directory.

Latest revision as of 08:45, 12 October 2023

This documentation explains how to setup a build environment for FileZilla 3 for Windows and how to compile it under Debian using Mingw-w64. It will take less time and is more simple than Compiling FileZilla 3 under Windows.

OS version[edit]

Any recent Linux should do the trick. For the sake of simplicity, this guide focuses on Debian(-based) distributions.

We strongly recommend to use Debian 12 (Bookworkm) or later (recommended)

Setting up the build environment[edit]

As root, execute:

dpkg --add-architecture i386
apt update
apt install automake autoconf libtool make gettext lzip xz-utils
apt install mingw-w64 pkg-config wx-common wine wine64 wine32 wine-binfmt subversion git

Back as normal user, execute:

mkdir ~/prefix
mkdir ~/src
export PATH="$HOME/prefix/bin:$PATH"
export LD_LIBRARY_PATH="$HOME/prefix/lib:$LD_LIBRARY_PATH"
export PKG_CONFIG_PATH="$HOME/prefix/lib/pkgconfig:$PKG_CONFIG_PATH"
export TARGET_HOST=x86_64-w64-mingw32
wine reg add HKCU\\Environment /f /v PATH /d "`x86_64-w64-mingw32-g++ -print-search-dirs | grep ^libraries | sed 's/^libraries: =//' | sed 's/:/;z:/g' | sed 's/^\\//z:\\\\\\\\/' | sed 's/\\//\\\\/g'`"


GMP[edit]

cd ~/src
wget https://gmplib.org/download/gmp/gmp-6.3.0.tar.lz
tar xf gmp-6.3.0.tar.lz
cd gmp-6.3.0
CC_FOR_BUILD=gcc ./configure --host=$TARGET_HOST --prefix="$HOME/prefix" --disable-static --enable-shared --enable-fat
make
make install

Nettle[edit]

cd ~/src
wget https://ftp.gnu.org/gnu/nettle/nettle-3.9.1.tar.gz
tar xf nettle-3.9.1.tar.gz
cd nettle-3.9.1
./configure --host=$TARGET_HOST --prefix="$HOME/prefix" --enable-shared --disable-static --enable-fat
make
make install

GnuTLS[edit]

cd ~/src
wget https://www.gnupg.org/ftp/gcrypt/gnutls/v3.8/gnutls-3.8.1.tar.xz
tar xvf gnutls-3.8.1.tar.xz
cd gnutls-3.8.1
./configure --host=$TARGET_HOST --prefix="$HOME/prefix" --enable-shared --disable-static --without-p11-kit --with-included-libtasn1 --with-included-unistring --disable-srp-authentication --disable-dtls-srtp-support --disable-heartbeat-support --disable-psk-authentication --disable-anon-authentication --disable-openssl-compatibility --without-tpm --without-brotli --disable-cxx --disable-doc --enable-threads=windows --disable-tools
make
make install

Compile SQLite[edit]

cd ~/src
wget https://sqlite.org/2018/sqlite-autoconf-32600-00.tar.gz
tar xvzf sqlite-autoconf-3260000.tar.gz
cd sqlite-autoconf-3260000
./configure --host=$TARGET_HOST --prefix="$HOME/prefix" --enable-shared --disable-static --disable-dynamic-extensions
make
make install

NSIS[edit]

cd ~/src
wget https://prdownloads.sourceforge.net/nsis/nsis-3.09-setup.exe
wine nsis-3.09-setup.exe /S

The above may print a lot of errors and warnings. Ignore them, check for success this way:

[ -f "$HOME/.wine/drive_c/Program Files/NSIS/makensis.exe" ] && echo "Success!"

Compile wxWidgets[edit]

cd ~/src
git clone --branch WX_3_0_BRANCH --single-branch https://github.com/wxWidgets/wxWidgets.git wx3
cd wx3
./configure --host=$TARGET_HOST --prefix="$HOME/prefix" --enable-shared --disable-static
make
make install
cp $HOME/prefix/lib/wx*.dll $HOME/prefix/bin

Compile libfilezilla[edit]

cd ~/src
svn co https://svn.filezilla-project.org/svn/libfilezilla/tags/0.33.0 lfz
cd lfz
autoreconf -i
./configure --host=$TARGET_HOST --prefix="$HOME/prefix" --enable-shared --disable-static 
make
make install

Compile FileZilla[edit]

cd ~/src
svn co https://svn.filezilla-project.org/svn/FileZilla3/tags/3.56.0/ fz
cd fz
autoreconf -i
./configure --host=$TARGET_HOST --prefix="$HOME/prefix" --enable-shared --disable-static --with-pugixml=builtin
make
# strip debug symbols
$TARGET_HOST-strip src/interface/.libs/filezilla.exe
$TARGET_HOST-strip src/putty/.libs/fzsftp.exe
$TARGET_HOST-strip src/putty/.libs/fzputtygen.exe
$TARGET_HOST-strip src/fzshellext/64/.libs/libfzshellext-0.dll
$TARGET_HOST-strip src/fzshellext/32/.libs/libfzshellext-0.dll
$TARGET_HOST-strip data/dlls/*.dll
cd data
wine "$HOME/.wine/drive_c/Program Files/NSIS/makensis.exe" install.nsi

Voila, there's now FileZilla_3_setup.exe in the current directory.