Skip to content

Instantly share code, notes, and snippets.

@ArcaneNibble
Created April 13, 2026 18:20
Show Gist options
  • Select an option

  • Save ArcaneNibble/ccf511c69712bdb9197d5f80d04142ac to your computer and use it in GitHub Desktop.

Select an option

Save ArcaneNibble/ccf511c69712bdb9197d5f80d04142ac to your computer and use it in GitHub Desktop.
Minimal MinGW for cross-compiling Rust for Windows using `-gnullvm` targets
FROM debian:trixie as build
WORKDIR /build
RUN apt update && apt -y install clang llvm git make ninja-build cmake wget
RUN git clone https://git.code.sf.net/p/mingw-w64/mingw-w64
RUN cd mingw-w64 && git checkout v14.0.0
RUN wget https://github.com/llvm/llvm-project/archive/refs/tags/llvmorg-22.1.3.tar.gz
RUN tar xzf llvmorg-22.1.3.tar.gz
# MinGW headers
RUN mkdir /build/build-headers-x86_64
WORKDIR /build/build-headers-x86_64
RUN /build/mingw-w64/mingw-w64-headers/configure --prefix=/build/x86_64-w64-mingw32 --enable-idl --with-default-win32-winnt=0x601 --with-default-msvcrt=ucrt
RUN make
RUN make install
RUN mkdir /build/build-headers-aarch64
WORKDIR /build/build-headers-aarch64
RUN /build/mingw-w64/mingw-w64-headers/configure --prefix=/build/aarch64-w64-mingw32 --enable-idl --with-default-win32-winnt=0x601 --with-default-msvcrt=ucrt
RUN make
RUN make install
# MinGW libs
RUN mkdir /build/build-crt-x86_64
WORKDIR /build/build-crt-x86_64
RUN AS=llvm-as-19 AR=llvm-ar-19 RANLIB=llvm-ranlib-19 DLLTOOL=llvm-dlltool-19 CC="clang-19 --target=x86_64-w64-mingw32 --sysroot=/build/x86_64-w64-mingw32" CXX="clang++-19 --target=x86_64-w64-mingw32 --sysroot=/build/x86_64-w64-mingw32" /build/mingw-w64/mingw-w64-crt/configure --host=x86_64-w64-mingw32 --prefix=/build/x86_64-w64-mingw32 --disable-lib32 --enable-lib64 --with-default-msvcrt=ucrt --enable-cfguard
RUN make -j$(nproc)
RUN make install
RUN mkdir /build/build-crt-aarch64
WORKDIR /build/build-crt-aarch64
RUN AS=llvm-as-19 AR=llvm-ar-19 RANLIB=llvm-ranlib-19 DLLTOOL=llvm-dlltool-19 CC="clang-19 --target=aarch64-w64-mingw32 --sysroot=/build/aarch64-w64-mingw32" CXX="clang++-19 --target=aarch64-w64-mingw32 --sysroot=/build/aarch64-w64-mingw32" /build/mingw-w64/mingw-w64-crt/configure --host=aarch64-w64-mingw32 --prefix=/build/aarch64-w64-mingw32 --disable-lib32 --disable-lib64 --enable-libarm64 --with-default-msvcrt=ucrt --enable-cfguard
RUN make -j$(nproc)
RUN make install
# libunwind
COPY <<EOF /build/toolchain-x86_64.cmake
set(CMAKE_SYSTEM_NAME Windows)
set(CMAKE_SYSROOT /build/x86_64-w64-mingw32)
set(CMAKE_ASM_COMPILER clang-19)
set(CMAKE_ASM_COMPILER_TARGET x86_64-w64-mingw32)
set(CMAKE_C_COMPILER clang-19)
set(CMAKE_C_COMPILER_TARGET x86_64-w64-mingw32)
set(CMAKE_CXX_COMPILER clang++-19)
set(CMAKE_CXX_COMPILER_TARGET x86_64-w64-mingw32)
set(CMAKE_AR llvm-ar-19)
set(CMAKE_RANLIB llvm-ranlib-19)
EOF
RUN mkdir /build/build-unwind-x86_64
WORKDIR /build/build-unwind-x86_64
RUN cmake -G Ninja -DCMAKE_TOOLCHAIN_FILE=/build/toolchain-x86_64.cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/build/x86_64-w64-mingw32 -DCMAKE_C_COMPILER_WORKS=TRUE -DCMAKE_CXX_COMPILER_WORKS=TRUE -DCXX_SUPPORTS_FNO_EXCEPTIONS_FLAG=ON -DLLVM_ENABLE_RUNTIMES="libunwind" -DLIBUNWIND_USE_COMPILER_RT=TRUE -DLIBUNWIND_ENABLE_SHARED=OFF -DLIBUNWIND_ENABLE_STATIC=ON -DCMAKE_C_FLAGS_INIT="-mguard=cf -D__USE_MINGW_ANSI_STDIO=1" -DCMAKE_CXX_FLAGS_INIT="-mguard=cf -D__USE_MINGW_ANSI_STDIO=1" /build/llvm-project-llvmorg-22.1.3/runtimes
RUN cmake --build .
RUN cmake --install .
COPY <<EOF /build/toolchain-aarch64.cmake
set(CMAKE_SYSTEM_NAME Windows)
set(CMAKE_SYSROOT /build/aarch64-w64-mingw32)
set(CMAKE_ASM_COMPILER clang-19)
set(CMAKE_ASM_COMPILER_TARGET aarch64-w64-mingw32)
set(CMAKE_C_COMPILER clang-19)
set(CMAKE_C_COMPILER_TARGET aarch64-w64-mingw32)
set(CMAKE_CXX_COMPILER clang++-19)
set(CMAKE_CXX_COMPILER_TARGET aarch64-w64-mingw32)
set(CMAKE_AR llvm-ar-19)
set(CMAKE_RANLIB llvm-ranlib-19)
EOF
RUN mkdir /build/build-unwind-aarch64
WORKDIR /build/build-unwind-aarch64
RUN cmake -G Ninja -DCMAKE_TOOLCHAIN_FILE=/build/toolchain-aarch64.cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/build/aarch64-w64-mingw32 -DCMAKE_C_COMPILER_WORKS=TRUE -DCMAKE_CXX_COMPILER_WORKS=TRUE -DCXX_SUPPORTS_FNO_EXCEPTIONS_FLAG=ON -DLLVM_ENABLE_RUNTIMES="libunwind" -DLIBUNWIND_USE_COMPILER_RT=TRUE -DLIBUNWIND_ENABLE_SHARED=OFF -DLIBUNWIND_ENABLE_STATIC=ON -DCMAKE_C_FLAGS_INIT="-mguard=cf -D__USE_MINGW_ANSI_STDIO=1" -DCMAKE_CXX_FLAGS_INIT="-mguard=cf -D__USE_MINGW_ANSI_STDIO=1" /build/llvm-project-llvmorg-22.1.3/runtimes
RUN cmake --build .
RUN cmake --install .
# compiler-rt (for aarch64 __chkstk)
RUN mkdir /build/build-rt-x86_64
WORKDIR /build/build-rt-x86_64
RUN cmake -G Ninja -DCMAKE_TOOLCHAIN_FILE=/build/toolchain-x86_64.cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/build/x86_64-w64-mingw32 -DCMAKE_C_COMPILER_WORKS=TRUE -DCMAKE_CXX_COMPILER_WORKS=TRUE -DCOMPILER_RT_DEFAULT_TARGET_ONLY=TRUE -DCOMPILER_RT_USE_BUILTINS_LIBRARY=TRUE -DCOMPILER_RT_BUILD_BUILTINS=TRUE -DCOMPILER_RT_EXCLUDE_ATOMIC_BUILTIN=FALSE -DCOMPILER_RT_BUILD_SANITIZERS=OFF -DCOMPILER_RT_BUILD_XRAY=OFF -DCOMPILER_RT_BUILD_MEMPROF=OFF -DCOMPILER_RT_BUILD_CTX_PROFILE=OFF -DCOMPILER_RT_BUILD_LIBFUZZER=OFF -DCOMPILER_RT_BUILD_PROFILE=OFF -DCOMPILER_RT_BUILD_ORC=OFF -DCMAKE_CXX_FLAGS_INIT="-mguard=cf" -DCMAKE_C_FLAGS_INIT="-mguard=cf" /build/llvm-project-llvmorg-22.1.3/compiler-rt
RUN cmake --build .
RUN cmake --install .
RUN mkdir /build/build-rt-aarch64
WORKDIR /build/build-rt-aarch64
RUN cmake -G Ninja -DCMAKE_TOOLCHAIN_FILE=/build/toolchain-aarch64.cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/build/aarch64-w64-mingw32 -DCMAKE_C_COMPILER_WORKS=TRUE -DCMAKE_CXX_COMPILER_WORKS=TRUE -DCOMPILER_RT_DEFAULT_TARGET_ONLY=TRUE -DCOMPILER_RT_USE_BUILTINS_LIBRARY=TRUE -DCOMPILER_RT_BUILD_BUILTINS=TRUE -DCOMPILER_RT_EXCLUDE_ATOMIC_BUILTIN=FALSE -DCOMPILER_RT_BUILD_SANITIZERS=OFF -DCOMPILER_RT_BUILD_XRAY=OFF -DCOMPILER_RT_BUILD_MEMPROF=OFF -DCOMPILER_RT_BUILD_CTX_PROFILE=OFF -DCOMPILER_RT_BUILD_LIBFUZZER=OFF -DCOMPILER_RT_BUILD_PROFILE=OFF -DCOMPILER_RT_BUILD_ORC=OFF -DCMAKE_CXX_FLAGS_INIT="-mguard=cf" -DCMAKE_C_FLAGS_INIT="-mguard=cf" /build/llvm-project-llvmorg-22.1.3/compiler-rt
RUN cmake --build .
RUN cmake --install .
WORKDIR /build
RUN tar czf mingw-w64-v14.0.0.tar.gz aarch64-w64-mingw32 x86_64-w64-mingw32
FROM scratch
COPY --from=build /build/mingw-w64-v14.0.0.tar.gz /
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment