Difference between revisions of "Cross-Compile"

From UFO:AI
Jump to navigation Jump to search
m
Line 19: Line 19:
 
=== Build ===
 
=== Build ===
  
As '''root''' user, create a directory and call `debootstrap` to build the root filesystem into that:
+
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 ~ # mkdir /ufoai.xcompile
 
  mycomputer ~ # debootstrap stable /ufoai.xcompile
 
  mycomputer ~ # debootstrap stable /ufoai.xcompile
 
  ...
 
  ...
 
  
 
Mount the pseudo-filesystems:
 
Mount the pseudo-filesystems:
Line 32: Line 32:
 
  mycomputer ~ # mount --bind /proc /ufoai.xcompile/proc
 
  mycomputer ~ # mount --bind /proc /ufoai.xcompile/proc
 
  mycomputer ~ # mount --bind /sys /ufoai.xcompile/sys
 
  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}}
 +
  
  
If you plan to keep this environment permanent you can also move these mountings to `etc/fstab`.
 
  
  
 
''(to be continued)''
 
''(to be continued)''

Revision as of 22:45, 17 August 2024

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:

  1. 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.
  2. Root access: You will need to be able to run commands as system administrator (`su` or `sudo`).
  3. Disk space: You will need around 7-10GiB free space for the cross-compilation.
  4. 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.



(to be continued)