Cross-Compile
Cross-Compile from Linux to Windows
In this article we will cross-compile UFO:AI in a Debian chroot environment to Windows, using MingW64_64 (64bit).
I chose a chroot environment, as it kind of standardizing the build environment and fairly cheap to build. You can achieve the same in Docker or other containerization techniques, but chroot just does its job.
Building the chroot
Prerequisites
For this step you will need:
- Debootstrap: Debootstrap is a program that can fetch and construct a Debian-like filesystem. This is the only software you need to install on your system. It is available on all major distributions, if you are unsure, check it on Repology.
- Root access: You will need to be able to run commands as system administrator (`su` or `sudo`).
- Disk space: You will need around 7-10GiB free space for the cross-compilation.
- Internet access: You will need to download packages and libraries from the Internet.
Build
As root user, create a directory and call `debootstrap` to build the root filesystem into that. We are using /ufoai.xcompile in this example, but use any path you like!
mycomputer ~ # mkdir /ufoai.xcompile mycomputer ~ # debootstrap stable /ufoai.xcompile ...
Mount the pseudo-filesystems:
mycomputer ~ # mount --bind /dev /ufoai.xcompile/dev mycomputer ~ # mount --bind /dev/pts /ufoai.xcompile/dev/pts mycomputer ~ # mount --bind /proc /ufoai.xcompile/proc mycomputer ~ # mount --bind /sys /ufoai.xcompile/sys
If you plan to keep this environment permanent you can also move these mountings to `/etc/fstab`.
It is a good idea to make it clear when we're in the chroot environment via the prompt:
mycomputer ~ # echo "export PS1='\\u@chroot:\\w \\\$ '" >> /ufoai.xcompile/root/.bashrc mycomputer ~ # echo "export PS1='\\u@chroot:\\w \\\$ '" >> /ufoai.xcompile/etc/skel/.bashrc
Enter
mycomputer ~ # chroot /ufoai.xcompile root@chroot:/ #
Preparing the build environment
Update the package manager and any obsolete packages:
root@chroot:/ # apt-get update && apt-get update
root@chroot:/ # apt-get install \ git \ libz-mingw-w64-dev \ make \ mingw-w64 \ python3 \ wget \ zip
Create a directory
root@chroot:/ mkdir /development root@chroot:/ export DEVEL_DIR=/development root@chroot:/ cd "$DEVEL_DIR" root@chroot:/development #
Dependencies
We've installed the compiler, build tools and `zlib` using the package manager, however we need to compile other dependencies for Windows with MinGW also.
Download dependencies
Always use the latest compatible version of the dependencies as they can contain important fixes to bugs, including security vulnerabilities.
- cURL: https://curl.se/windows/dl-8.9.1_1/curl-8.9.1_1-win64-mingw.zip
- Iconv: https://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.17.tar.gz
- Intl: https://ftp.gnu.org/pub/gnu/gettext/gettext-0.22.5.tar.gz
- Jpeg: https://github.com/libjpeg-turbo/libjpeg-turbo/archive/refs/tags/3.0.3.tar.gz
- Lua 5.4: https://www.lua.org/ftp/lua-5.4.7.tar.gz
- OGG: https://downloads.xiph.org/releases/ogg/libogg-1.3.5.tar.gz
- PNG: https://sourceforge.net/projects/libpng/files/libpng16/1.6.43/libpng-1.6.43.tar.gz/download
- SDL2: https://github.com/libsdl-org/SDL_mixer/releases/download/release-2.8.0/SDL2_mixer-devel-2.8.0-mingw.tar.gz
- SDL3 is about to be released, but it probably won't be a simple drop-in replacement. For now we need SDL2.
- SDL2-Mixer: https://github.com/libsdl-org/SDL_mixer/releases/download/release-2.8.0/SDL2_mixer-devel-2.8.0-mingw.tar.gz
- SDL2-TTF: https://github.com/libsdl-org/SDL_ttf/releases/download/release-2.22.0/SDL2_ttf-devel-2.22.0-mingw.tar.gz
- Vorbis: https://downloads.xiph.org/releases/vorbis/libvorbis-1.3.7.tar.gz
(to be continued)