Difference between revisions of "Compiling FileZilla 3 under Windows"

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 54.169.68.5)
Tag: Rollback
 
(102 intermediate revisions by 25 users not shown)
Line 1: Line 1:
This documentation explains how to setup a build environment for [[FileZilla 3]] and how to compile it under Windows using [http://msys2.github.io/ msys2]. Msys2 is a cygwin environment.
+
This documentation explains how to setup a build environment for [[FileZilla 3]] and how to compile it under Windows using [http://msys2.github.io/ 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.
 
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'''
 
'''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'''
Line 9: Line 11:
 
=Installing the MSYS2 environment=
 
=Installing the MSYS2 environment=
  
Download the 64bit MSYS2 installer: [http://sourceforge.net/project/msys2/Base/x86_64/msys2-x86_64-20150512.exe msys2-x86_64-20150512.exe]
+
Download the 64bit MSYS2 installer and install it in a convenient location: [https://repo.msys2.org/distrib/x86_64/msys2-x86_64-20220118.exe msys2-x86_64-20220118.exe]
 
 
Install MSYS2 to '''c:\msys64'''.
 
  
 
=Installing the compiler toolchain=
 
=Installing the compiler toolchain=
Line 20: Line 20:
  
 
===First update===
 
===First update===
Start the MSYS2 shell
+
Start the MSYS2 MinGW 64-bit shell
 
  pacman -Syu
 
  pacman -Syu
close MSYS shell, and maybe you will need rebase (Google for details, just run a autorebase.bat in C:\msys64).
+
close MSYS2 shell. Repeat until there are no more updates.
  
 
===Install tools and compiler toolchain===
 
===Install tools and compiler toolchain===
  
Start MSYS2 shell, execute the following command to install the necessary packages:
+
Start MSYS2 MinGW 64-bit 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 autoconf automake libtool make mingw-w64-i686-toolchain mingw-w64-x86_64-toolchain git svn
pacman -S svn git curl wget
 
pacman -S ca-certificates
 
  
Execute the following to work around some most-annoying bugs in the toolchain:
+
Execute the following to work around some most-annoying bugs in the toolchain
  
 
  # Fix missing platform prefix for windres
 
  # 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 /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
 
  [ -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/libpthread.dll.a
 
  
 
== Setting up the environment==
 
== Setting up the environment==
Line 48: Line 40:
 
Execute the following commands:
 
Execute the following commands:
 
  mkdir ~/prefix
 
  mkdir ~/prefix
  echo 'export PATH="$HOME/prefix/bin:/mingw64/bin:/mingw32/bin:$PATH"' >> ~/.profile
+
  echo 'export PATH="$HOME/prefix/bin:$HOME/prefix/lib:/mingw64/bin:/mingw32/bin:$PATH"' >> ~/.profile
 
  echo 'export PKG_CONFIG_PATH="$HOME/prefix/lib/pkgconfig"' >> ~/.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 PATH="$HOME/prefix/bin:$HOME/prefix/lib:/mingw64/bin:/mingw32/bin:$PATH"' >> ~/.bash_profile
 
  echo 'export PKG_CONFIG_PATH="$HOME/prefix/lib/pkgconfig"' >> ~/.bash_profile
 
  echo 'export PKG_CONFIG_PATH="$HOME/prefix/lib/pkgconfig"' >> ~/.bash_profile
 +
echo 'export LC_ALL=C' >> ~/.bash_profile
  
Restart the MSYS shell.
+
Restart the MSYS2 MINGW64 shell.
  
 
=Building dependencies=
 
=Building dependencies=
Line 60: Line 53:
  
 
  cd ~
 
  cd ~
  curl -O https://gmplib.org/download/gmp/gmp-6.0.0a.tar.xz
+
  curl -O https://gmplib.org/download/gmp/gmp-6.2.1.tar.xz
  tar xf gmp-6.0.0a.tar.xz
+
  tar xf gmp-6.2.1.tar.xz
  cd gmp-6.0.0a
+
  cd gmp-6.2.1
  ./configure --build=x86_64-w64-mingw32 --prefix="$HOME/prefix" --enable-static --disable-shared --enable-fat
+
  ./configure --build=x86_64-w64-mingw32 --prefix="$HOME/prefix" --enable-shared --disable-static --enable-fat
 
  make && make install
 
  make && make install
  
Line 69: Line 62:
  
 
  cd ~
 
  cd ~
  wget http://ftp.gnu.org/gnu/nettle/nettle-3.1.1.tar.gz
+
  wget https://ftp.gnu.org/gnu/nettle/nettle-3.7.3.tar.gz
  tar xf nettle-3.1.1.tar.gz
+
  tar xf nettle-3.7.3.tar.gz
  cd nettle-3.1.1
+
  cd nettle-3.7.3
  ./configure --build=x86_64-w64-mingw32 --prefix="$HOME/prefix" --enable-static --disable-shared --enable-fat
+
  ./configure --build=x86_64-w64-mingw32 --prefix="$HOME/prefix" --enable-shared --disable-static --enable-fat
 
  make && make install
 
  make && make install
  
Line 78: Line 71:
  
 
  cd ~
 
  cd ~
  wget http://zlib.net/zlib-1.2.8.tar.gz
+
  wget https://zlib.net/fossils/zlib-1.2.13.tar.gz
  tar xf zlib-1.2.8
+
  tar xf zlib-1.2.13.tar.gz
  cd zlib-1.2.8
+
  cd zlib-1.2.13
  ./configure --prefix="$HOME/prefix" --static
+
  LDSHAREDLIBC='' ./configure --prefix="$HOME/prefix" -u=GNU
 
  make && make install
 
  make && make install
  
Line 87: Line 80:
  
 
  cd ~
 
  cd ~
  wget ftp://ftp.gnutls.org/gcrypt/gnutls/v3.4/gnutls-3.4.4.1.tar.xz
+
  wget ftp://ftp.gnutls.org/gcrypt/gnutls/v3.7/gnutls-3.7.2.tar.xz
  tar xf gnutls-3.4.4.1.tar.xz
+
  tar xf gnutls-3.7.2.tar.xz
  cd gnutls-3.4.4.1
+
  cd gnutls-3.7.2
  ./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
+
  ./configure --prefix="$HOME/prefix" --enable-shared --disable-static --build=x86_64-w64-mingw32 --with-included-libtasn1 --disable-doc --disable-guile --without-p11-kit --enable-local-libopts --disable-nls --with-included-unistring --disable-tests
 
  make && make install
 
  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==
 
==Building SQLite==
  
 
  cd ~
 
  cd ~
  wget https://sqlite.org/2015/sqlite-autoconf-3081101.tar.gz
+
  wget https://sqlite.org/2018/sqlite-autoconf-3250300.tar.gz
  tar xf sqlite-autoconf-3081101.tar.gz
+
  tar xf sqlite-autoconf-3250300.tar.gz
  cd sqlite-autoconf-3081101
+
  cd sqlite-autoconf-3250300
  ./configure --build=x86_64-w64-mingw32 --prefix="$HOME/prefix" --enable-static --disable-shared
+
  ./configure --build=x86_64-w64-mingw32 --prefix="$HOME/prefix" --enable-shared --disable-static
 
  make && make install
 
  make && make install
  
Line 108: Line 98:
  
 
  cd ~
 
  cd ~
  svn co https://github.com/wxWidgets/wxWidgets/branches/WX_3_0_BRANCH wx3
+
  git clone --branch WX_3_0_BRANCH --single-branch https://github.com/wxWidgets/wxWidgets.git wx3
 
  cd 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
+
  ./configure --build=x86_64-w64-mingw32 --prefix="$HOME/prefix" --enable-shared --disable-static --enable-unicode --enable-printfposparam --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 --prefix="$HOME/prefix" --enable-shared --disable-static
 
  make && make install
 
  make && make install
  
Line 124: Line 123:
 
  cd ~/filezilla
 
  cd ~/filezilla
 
  autoreconf -i
 
  autoreconf -i
  ./configure --build=x86_64-w64-mingw32 --with-pugixml=builtin LDFLAGS="-static-libgcc -static-libstdc++"
+
  ./configure --with-pugixml=builtin
 
  make
 
  make
  
Line 134: Line 133:
 
  strip src/fzshellext/64/.libs/libfzshellext-0.dll
 
  strip src/fzshellext/64/.libs/libfzshellext-0.dll
 
  strip src/fzshellext/32/.libs/libfzshellext-0.dll
 
  strip src/fzshellext/32/.libs/libfzshellext-0.dll
 +
strip data/dlls/*.dll
  
 
==Building the installer==
 
==Building the installer==
Line 139: Line 139:
 
=== Installing NSIS ===
 
=== Installing NSIS ===
  
Download and install Unicode NSIS from http://www.scratchpaper.com
+
Download and install NSIS '''3''' from http://nsis.sourceforge.net/
 
 
Make sure you get the Unicode version and not the ANSI one.
 
  
 
=== Compile the installer script ===
 
=== Compile the installer script ===

Latest revision as of 08:44, 12 October 2023

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[edit]

Download the 64bit MSYS2 installer and install it in a convenient location: msys2-x86_64-20220118.exe

Installing the compiler toolchain[edit]

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[edit]

First update[edit]

Start the MSYS2 MinGW 64-bit shell

pacman -Syu

close MSYS2 shell. Repeat until there are no more updates.

Install tools and compiler toolchain[edit]

Start MSYS2 MinGW 64-bit shell, execute the following command to install the necessary packages:

pacman -S autoconf automake libtool make mingw-w64-i686-toolchain mingw-w64-x86_64-toolchain git svn

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

Setting up the environment[edit]

Execute the following commands:

mkdir ~/prefix
echo 'export PATH="$HOME/prefix/bin:$HOME/prefix/lib:/mingw64/bin:/mingw32/bin:$PATH"' >> ~/.profile
echo 'export PKG_CONFIG_PATH="$HOME/prefix/lib/pkgconfig"' >> ~/.profile
echo 'export PATH="$HOME/prefix/bin:$HOME/prefix/lib:/mingw64/bin:/mingw32/bin:$PATH"' >> ~/.bash_profile
echo 'export PKG_CONFIG_PATH="$HOME/prefix/lib/pkgconfig"' >> ~/.bash_profile
echo 'export LC_ALL=C' >> ~/.bash_profile

Restart the MSYS2 MINGW64 shell.

Building dependencies[edit]

Building GMP[edit]

cd ~
curl -O https://gmplib.org/download/gmp/gmp-6.2.1.tar.xz
tar xf gmp-6.2.1.tar.xz
cd gmp-6.2.1
./configure --build=x86_64-w64-mingw32 --prefix="$HOME/prefix" --enable-shared --disable-static --enable-fat
make && make install

Building Nettle[edit]

cd ~
wget https://ftp.gnu.org/gnu/nettle/nettle-3.7.3.tar.gz
tar xf nettle-3.7.3.tar.gz
cd nettle-3.7.3
./configure --build=x86_64-w64-mingw32 --prefix="$HOME/prefix" --enable-shared --disable-static --enable-fat
make && make install

Building zlib[edit]

cd ~
wget https://zlib.net/fossils/zlib-1.2.13.tar.gz
tar xf zlib-1.2.13.tar.gz
cd zlib-1.2.13
LDSHAREDLIBC= ./configure --prefix="$HOME/prefix" -u=GNU
make && make install

Building GnuTLS[edit]

cd ~
wget ftp://ftp.gnutls.org/gcrypt/gnutls/v3.7/gnutls-3.7.2.tar.xz
tar xf gnutls-3.7.2.tar.xz
cd gnutls-3.7.2
./configure --prefix="$HOME/prefix" --enable-shared --disable-static --build=x86_64-w64-mingw32 --with-included-libtasn1 --disable-doc --disable-guile --without-p11-kit --enable-local-libopts --disable-nls --with-included-unistring --disable-tests
make && make install

Building SQLite[edit]

cd ~
wget https://sqlite.org/2018/sqlite-autoconf-3250300.tar.gz
tar xf sqlite-autoconf-3250300.tar.gz
cd sqlite-autoconf-3250300
./configure --build=x86_64-w64-mingw32 --prefix="$HOME/prefix" --enable-shared --disable-static
make && make install

Building wxWidgets[edit]

cd ~
git clone --branch WX_3_0_BRANCH --single-branch https://github.com/wxWidgets/wxWidgets.git wx3
cd wx3
./configure --build=x86_64-w64-mingw32 --prefix="$HOME/prefix" --enable-shared --disable-static --enable-unicode --enable-printfposparam --without-libtiff --without-libjpeg --with-expat=builtin --with-libpng=builtin
make && make install

Building libfilezilla[edit]

cd ~
svn co https://svn.filezilla-project.org/svn/libfilezilla/trunk libfilezilla
cd libfilezilla
autoreconf -i 
./configure --prefix="$HOME/prefix" --enable-shared --disable-static
make && make install

Building Filezilla[edit]

Download FileZilla[edit]

cd ~
svn co https://svn.filezilla-project.org/svn/FileZilla3/trunk filezilla

Building FileZilla[edit]

cd ~/filezilla
autoreconf -i
./configure --with-pugixml=builtin
make

Stripping debug symbols[edit]

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
strip data/dlls/*.dll

Building the installer[edit]

Installing NSIS[edit]

Download and install NSIS 3 from http://nsis.sourceforge.net/

Compile the installer script[edit]

Right click data/install.nsi in Explorer and use "Compile NSIS Script" from context menu.

Troubleshooting[edit]

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.