logo
Kurashizu Blogwhere ideas flow
  • Home
  • News
  • Blog
  • About
  • Home
  • News
  • Blog
  • About

© 2026 Kurashizu. All rights reserved.

Admin·New Post·Service Status
Powered by Cloudflare·03.11.26
← Back to news

Building Principia for Windows XP

Original article
voxelmanip.se|85 points|21 comments|by LorenDB|Jun 29, 2026

Restoring Principia Support for Windows XP

Originally posted on June 28, 2026

Back in 2014, when the Windows version of Principia first debuted, it was compatible with operating systems as old as Windows XP. Since Principia 1.4 launched while XP was still receiving mainstream support, this compatibility was a natural fit; the available dependencies and development tools of the era simply supported it.

Fast forward to the present: Principia is now an open-source project.

While the game should theoretically still function on Windows 7, our transition to modern system libraries (like the UCRT) and updated toolchains means that long-term backward compatibility is no longer guaranteed. XP support was just a given back then, but now it requires intentional effort.

I have always harbored a desire to reverse this trend—to bring Principia back to Windows XP via a fully open-source build.


🛠️ Technical Foundations

To understand the challenge, we must first look at the technical architecture of the game.

Hardware and Software Requirements

Principia was originally developed for mobile devices circa 2012. Consequently, its hardware footprint is minimal. As long as the system supports OpenGL 2.0, the game should run smoothly on legacy hardware.

Key Dependencies:

  • SDL (Simple DirectMedia Layer): Used for cross-platform abstraction.
  • TMS: The backing engine.

Interestingly, both SDL2 and the newer SDL3 maintain support for Windows XP. Since the game previously ran on XP, I suspected that unless my recent open-source contributions introduced breaking changes, the primary hurdles would be the toolchain and modern dependencies rather than the game code itself.

The Toolchain Dilemma

Currently, the Windows build of Principia officially requires a mingw-w64 toolchain. This was originally mandated because MSVC (Microsoft Visual C++) lacked the C99 feature support required by the TMS engine.

ToolchainXP CompatibilityC99 SupportNotes
MSVC (Old)HighLowLacked essential C99 features for TMS.
MSYS2 (LLVM)LowHighLinks against UCRT; libc++ requires Win 7+.
Custom GCCHighHighThe ideal path for legacy targeting.

While mingw-w64 provides polyfills for C functions missing in older Windows versions, the modern LLVM-based toolchains provided by MSYS2 are unsuitable. They target the Universal C Runtime (UCRT) and utilize libc++ (version 7+), which expects symbols and APIs that simply do not exist in the XP environment.


🏗️ Constructing the Cross-Compiler

Since pre-built toolchains for versions older than Vista/7 are scarce, I decided to build my own. My goal was a cross-compiling toolchain that could run on a Linux host while targeting Windows.

"I had a bit of an ace up my sleeve in the form of a Dockerfile written by Martin Storsjö (the llvm-mingw expert) from the #mingw-w64 IRC channel."

I converted this Dockerfile into a modular shell script, breaking the process into distinct stages. I applied the following configurations:

  1. Target Triplet: i686-w64-mingw32 (for 32-bit Windows).
  2. System Runtime: Switched to MSVCRT.
  3. OS Version: Set the default WIN32_WINNT\text{WIN32\_WINNT}WIN32_WINNT to 0x05010x05010x0501 (which corresponds to Windows NT 5.1, aka Windows XP).

The Build Pipeline


🐛 Encountering the "C23" Bug

The build process didn't go smoothly. It failed immediately during the compilation of libgmp (GNU MP Bignum library). The config.log revealed that autotools was attempting to compile a strange snippet of code:

for ( i = 0 ; i < 1 ; i ++ ){ if ( e ( got , got , 9 , d [ i ].n ) ) h ();}

The Root Cause: I was using GCC 16. In older C standards, a function declared with empty parameters—foo()—meant the function could take any number of arguments. However, the C23 standard changed this: an empty parameter list now explicitly means zero arguments.

Because GCC 15+ defaults to C23, the GMP 6.3.0 build system (which uses the old convention) failed its compiler check, leading the system to believe the compiler was broken.

The Fix: I bypassed this by forcing GMP to compile with the older standard: -std=gnu99


⚠️ The Final Hurdle: libstdc++

With the toolchain nearly complete, I performed a sanity check on the C++ standard library to ensure no recent GCC updates had broken XP compatibility.

I discovered a critical issue: GCC 16's libstdc++ now contains a hard dependency on a specific Win32 API function that only exists in Vista and newer:

GetDynamicTimeZoneInformation

Current Progress Checklist

  • Establish Linux cross-compilation environment
  • Configure i686-w64-mingw32 triplet
  • Resolve GMP C23 compatibility issues
  • Patch libstdc++ to remove Vista+ dependencies
  • Successfully link Principia for Windows XP