Self-hosted service
skeeto/w64devkit avatar
skeeto/w64devkit

w64devkit: a MinGW-w64 toolchain delivered as one self-extracting archive

Portable C and C++ Development Kit for x64 (and x86) Windows

5,007 stars411 forksCUnlicense

At a glance

What is it?
w64devkit is a Dockerfile that builds a small MinGW-w64 development suite from source, and the result is a self-extracting 7z archive you run instead of install. It links every runtime component statically, and its x64 build is multilib for both x64 and x86 targets.
Who is it for?
Use w64devkit when you want a self-contained Windows C or C++ toolchain that installs nothing, works offline and links statically, and you are willing to work inside busybox-w32 and Vim rather than a full Unix-like environment. Do not reach for it if you need to target pre-SSE2 processors with the x86 build.
Can I use it commercially?
Yes. Unlicense is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
Is it still maintained?
Yes. The repository received new commits within the last day.
What is it written in?
Mainly C, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on November 14, 2026, and from our analysis. They are not legal advice.

From daily snapshots

Star history

  • skeeto/w64devkit5,007 ★ · +158
Star history
Repository2026-09-232026-11-14
skeeto/w64devkit4.8k5k

158 Stars in the last 52 days, measured from the daily GitHub snapshot. Compare with other projects

Editorial analysis

A Dockerfile that outputs a self-extracting 7z archive

The unusual thing about w64devkit is that the repository is a build recipe rather than a source tree of tools. The `Dockerfile` builds a small development suite from upstream sources inside `debian:trixie-slim`, and running the image writes the kit out as a self-extracting 7z archive:

bash
docker build -t w64devkit .
docker run --rm w64devkit >w64devkit-x64.exe

The default `x64` variant is a combined x64 and x86 multilib toolchain. A standalone x86 build takes a build argument:

bash
docker build --build-arg VARIANT=x86 -t w64devkit .

`multibuild.sh -a` produces both variants. The stated cost is about 15 minutes on a modern system, with an internet connection needed during the first few minutes, and one explicit warning: do not run the commands in PowerShell, because it lacks file redirection.

If you would rather not build it, GitHub Actions is the supported path: fork the repository, enable Actions, push commits and download the freshly-built artifacts.

Docker builds the kit, it is not needed to use it

That distinction is stated plainly and it is the whole point of the design. Docker is a reliable, clean environment for building the kit itself; using the kit needs nothing but Windows and the extracted archive.

What lands inside is a MinGW-w64 GCC toolchain (compilers, linker, assembler), GDB, GNU Make, CMake with Ninja and a debugger integration, busybox-w32 for standard Unix utilities including `sh`, Vim, quicktags (ctags), Ccache, NSIS for Windows installers via `makensis`, and `aas-sign` for Authenticode signing through Azure Trusted Signing.

It is an MSVCRT toolchain, with pthreads, C11 and C++11 threads and OpenMP, and every runtime component is linked statically.

The README title adds Fortran to the language list, while the tool inventory names the same GCC for C and C++ and does not name a Fortran front end. Worth checking against your own build before you rely on it.

w64devkit.exe sets two variables and changes nothing on the system

Extraction is the installation step. Unpack the self-extracting archive wherever it is convenient and run `w64devkit.exe`, which opens a console window with the environment already configured. It makes no changes to the machine, and it sets two variables: `W64DEVKIT_HOME` pointing at the installation root and `W64DEVKIT` holding the version.

If a launcher script is not what you want, put the bin directory on your path instead. Inside a `cmd.exe` console or a batch script:

code
set PATH=c:\path\to\w64devkit\bin;%PATH%

From there, an interactive Unix shell is one command away:

bash
sh -l

The layout inside the archive follows a typical Unix-like arrangement, so `bin`, `include` and `lib` sit where a build script expects them. Two properties follow from that design and are worth naming. Nothing ever reaches the network: the kit is fully offline and attempts no internet access. And deletion is the uninstall, since the tools run anywhere as any user with nothing registered and nothing left behind.

For a machine without the kit itself, the offline documentation is not bundled except for the manual pages and Vim's built-in `:help`, so the README recommends separate downloads such as cppreference, the GCC manuals and the Win32 Help File.

Windows 7 for x64, Windows XP and SSE2 for x86

The two variants have different floors, and the details are the kind that decide whether a build works on a locked down machine.

The x64 kit requires Windows 7 or later, though some tools only support Unicode wide paths, inputs and outputs on Windows 10 or later. The toolchain targets Windows 7 by default. The x86 kit requires Windows XP or later plus an SSE2-capable processor, at least a Pentium 4, with limited Unicode support.

Two caveats follow from the static runtimes. Because those runtimes contain SSE2 instructions, GCC `-march` will not reliably target less capable processors when the runtimes are linked in, and the exceptions named are `-lmemory` and `-lchkstk`. And CMake, Ninja and Ccache need at least Windows 7 even inside the x86 kit, so the oldest target platform is not uniformly supported.

A separate limit applies to the C11 threading runtime, which works only on Vista and later.

libmemory.a and libchkstk.a exist because the compiler asks for them

Two libraries in this kit have no counterpart in a typical toolchain, and both are explained by a linker requirement rather than by taste.

`libmemory.a` holds `memset`, `memcpy`, `memmove`, `memcmp` and `strlen` written as x86 string instructions. When you are not linking a CRT, adding `-lmemory` gives you tiny definitions of exactly those symbols, which is what GCC ends up requiring. `libchkstk.a` carries a leaner and faster `___chkstk_ms` than the one in `-lgcc`, plus `__chkstk`, which is sometimes needed when linking artifacts built with MSVC. Both libraries are in the public domain, so unlike GCC's default implementations they carry no licensing baggage. In a `-nostdlib` build where they are required, link `-lchkstk`.

There is one more difference in the produced binaries. Import tables are not populated with junk ordinal hints: when an explicit hint is not supplied, for example through a DEF file, the hint is zeroed instead. Removing that random data makes binaries more compressible and, in the project's word, theoretically faster to load.

thrd_current returns a dummy handle and joining it traps

The C11 threading runtime is the sharpest edge in the kit. The standard header `threads.h` is included, and the implementation is described as fast and lean, independent of pthreads, and requiring no extra linker flags. It is tempting to read that as a full standard threads implementation. It is not.

Only Vista and later are supported. Recursive and timed locks are not implemented. `thrd_current` returns a dummy handle that is useful only with `thrd_equal`; joining or detaching with that handle traps. As with MSVC, `mtx_t` and `cnd_t` support zero-initialization and their destructors are no-ops, so cleanup code that expects a destructor to run has nothing to wait for.

Those constraints are deliberate, matching MSVC behaviour where it matters, but they mean portable C11 threading code that assumes recursive mutexes or a joinable current thread will not run here unchanged.

Caching is easier by comparison. Prepending `$W64DEVKIT_HOME/lib/ccache` to your `PATH` makes every build pass through Ccache transparently, and `w64devkit.ini` holds a suggested Ccache configuration you can activate.

The version lives in a Dockerfile ARG and moves every few weeks

Release v2.11.0 was published on 2026-10-29, after v2.10.1 on 2026-10-13 and v2.10.0 on 2026-09-14, and the last push to the repository was on 2026-11-01. The project is under the Unlicense, and `UNLICENSE` is the only licence file in the repository root.

The version is not hard-coded in a build script. It is an argument at the top of the `Dockerfile`, `ARG VERSION=2.11.0`, alongside `PREFIX=/w64devkit` and `VARIANT=x64`. Upstream versions are pinned the same way, as arguments with a SHA-256 checksum beside each one: binutils 2.47, GCC 16.2.0, MinGW-w64 14.0.0, GMP 6.3.0, MPC 1.4.1 and MPFR 4.2.2. The comment in the `Dockerfile` explains the design: each download stage caches independently, so changing one dependency invalidates only its own stage.

The rest of the tree is small and tells you where to look when something misbehaves: `src/` for the kit sources, `contrib/` for contributed pieces, `etc/` for configuration, `multibuild.sh` for the both-variants build, and `w64devkit.ini` for the Ccache suggestion.

Editorial conclusion

Use w64devkit when you want a self-contained Windows C or C++ toolchain that installs nothing, works offline and links statically, and you are willing to work inside busybox-w32 and Vim rather than a full Unix-like environment. Do not reach for it if you need to target pre-SSE2 processors with the x86 build. Before you commit, check two things: that the toolchain floor of Windows 7 for the x64 kit and Windows XP plus SSE2 for the x86 kit matches the machines you must run on, and whether `thrd_current` handles are safe in your C11 threading code, since joining or detaching on one traps.

Frequently asked questions

How to download w64devkit?

Pre-built, ready-to-use kits are published on the Releases page, so no build is needed: download the self-extracting 7z archive and extract it wherever convenient. If you want to build it yourself, `docker build -t w64devkit .` followed by `docker run --rm w64devkit >w64devkit-x64.exe` produces the same archive, and taking about 15 minutes on a modern system.

how to install w64devkit

There is no installation. Extract the archive anywhere, run `w64devkit.exe` for a configured console window, or add `w64devkit/bin` to your path and start a shell with `sh -l`. Running it as any user requires no system changes, and deleting the folder removes it completely.

how to use w64devkit

Launching `w64devkit.exe` opens a console with the environment configured and sets `W64DEVKIT_HOME` to the installation root and `W64DEVKIT` to the version. Inside, you get GCC, GDB, GNU Make, CMake with Ninja, busybox-w32, Vim, Ctags, Ccache and NSIS, with all runtime components linked statically.

what is w64devkit

A Dockerfile that builds from source a small, portable development suite for C and C++ on x86 and x64 Windows: a MinGW-w64 GCC toolchain plus GDB, Make, CMake with Ninja, busybox-w32, Vim, Ctags, Ccache, NSIS and aas-sign. It is an MSVCRT toolchain with static runtime components, published under the Unlicense.

w64devkit vs msys2

What the README states about w64devkit's own approach: no installation step, no internet access ever required or attempted, every runtime component linked statically, and one self-extracting 7z archive you can delete when finished.

w64devkit vscode

The bundled editor is Vim, and the README notes that documentation is not included apart from its manual pages and Vim's built-in `:help`, recommending separate offline downloads such as cppreference and the GCC manuals instead.

Official sources

  1. Issues
  2. License: Unlicense
  3. README
  4. Releases
  5. skeeto/w64devkit on GitHub
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/skeeto-w64devkit.svg)](https://hysenlabs.com/projects/skeeto-w64devkit)

Star history chart for your README

markdown
[![Star history](https://hysenlabs.com/chart/skeeto-w64devkit.svg)](https://hysenlabs.com/projects/skeeto-w64devkit)

Was this useful?