Skip to content

Commit

Permalink
Initial commit of working code
Browse files Browse the repository at this point in the history
  • Loading branch information
skeeto committed May 9, 2020
0 parents commit 6756388
Show file tree
Hide file tree
Showing 4 changed files with 335 additions and 0 deletions.
241 changes: 241 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,241 @@
FROM debian:buster-slim

ARG VERSION=1.0.0
ARG PREFIX=/w64devkit-$VERSION

ARG BINUTILS_VERSION=2.34
ARG BUSYBOX_VERSION=FRP-3445-g10e14d5eb
ARG GCC_VERSION=10.1.0
ARG GMP_VERSION=6.2.0
ARG MAKE_VERSION=4.2
ARG MINGW_VERSION=6.0.0
ARG MPC_VERSION=1.1.0
ARG MPFR_VERSION=4.0.2

RUN apt-get update && apt-get install --yes --no-install-recommends \
build-essential curl file libgmp-dev libmpc-dev libmpfr-dev m4 texinfo zip

# Download, verify, and unpack

RUN curl --insecure --location --remote-name-all \
https://ftp.gnu.org/gnu/binutils/binutils-$BINUTILS_VERSION.tar.xz \
https://ftp.gnu.org/gnu/gcc/gcc-10.1.0/gcc-$GCC_VERSION.tar.xz \
https://ftp.gnu.org/gnu/gmp/gmp-$GMP_VERSION.tar.xz \
https://ftp.gnu.org/gnu/mpc/mpc-$MPC_VERSION.tar.gz \
https://ftp.gnu.org/gnu/mpfr/mpfr-$MPFR_VERSION.tar.xz \
https://ftp.gnu.org/gnu/make/make-$MAKE_VERSION.tar.gz \
https://frippery.org/files/busybox/busybox-w32-$BUSYBOX_VERSION.tgz \
https://downloads.sourceforge.net/project/mingw-w64/mingw-w64/mingw-w64-release/mingw-w64-v$MINGW_VERSION.tar.bz2
COPY SHA256SUMS .
RUN sha256sum -c SHA256SUMS \
&& tar xJf binutils-$BINUTILS_VERSION.tar.xz \
&& tar xzf busybox-w32-$BUSYBOX_VERSION.tgz \
&& tar xJf gcc-$GCC_VERSION.tar.xz \
&& tar xJf gmp-$GMP_VERSION.tar.xz \
&& tar xzf mpc-$MPC_VERSION.tar.gz \
&& tar xJf mpfr-$MPFR_VERSION.tar.xz \
&& tar xzf make-$MAKE_VERSION.tar.gz \
&& tar xjf mingw-w64-v$MINGW_VERSION.tar.bz2

# Build cross-compiler

WORKDIR /x-binutils
RUN /binutils-$BINUTILS_VERSION/configure \
--prefix=/bootstrap \
--with-sysroot=/bootstrap \
--target=x86_64-w64-mingw32 \
--disable-nls \
--enable-static \
--disable-shared \
--disable-multilib
RUN make -j$(nproc)
RUN make install

WORKDIR /x-mingw-headers
RUN /mingw-w64-v$MINGW_VERSION/mingw-w64-headers/configure \
--prefix=/bootstrap/x86_64-w64-mingw32 \
--host=x86_64-w64-mingw32
RUN make -j$(nproc)
RUN make install

WORKDIR /bootstrap
RUN ln -s x86_64-w64-mingw32 mingw

WORKDIR /x-gcc
RUN /gcc-$GCC_VERSION/configure \
--prefix=/bootstrap \
--with-sysroot=/bootstrap \
--target=x86_64-w64-mingw32 \
--enable-static \
--disable-shared \
--enable-languages=c,c++ \
--enable-libgomp \
--enable-threads=win32 \
--enable-version-specific-runtime-libs \
--disable-nls \
--disable-multilib
RUN make -j$(nproc) all-gcc
RUN make install-gcc

ENV PATH="/bootstrap/bin:${PATH}"

WORKDIR /x-mingw-crt
RUN /mingw-w64-v$MINGW_VERSION/mingw-w64-crt/configure \
--prefix=/bootstrap/x86_64-w64-mingw32 \
--with-sysroot=/bootstrap/x86_64-w64-mingw32 \
--host=x86_64-w64-mingw32
RUN make -j$(nproc)
RUN make install

WORKDIR /x-winpthreads
RUN /mingw-w64-v$MINGW_VERSION/mingw-w64-libraries/winpthreads/configure \
--prefix=/bootstrap/x86_64-w64-mingw32 \
--with-sysroot=/bootstrap/x86_64-w64-mingw32 \
--host=x86_64-w64-mingw32 \
--enable-static \
--disable-shared
RUN make -j$(nproc)
RUN make install

WORKDIR /x-gcc
RUN make -j$(nproc)
RUN make install

# Cross-compile GCC

WORKDIR /
WORKDIR /binutils
RUN /binutils-$BINUTILS_VERSION/configure \
--prefix=$PREFIX \
--with-sysroot=$PREFIX \
--host=x86_64-w64-mingw32 \
--target=x86_64-w64-mingw32 \
--disable-nls \
--enable-static \
--disable-shared \
CFLAGS="-Os" \
LDFLAGS="-s"
RUN make -j$(nproc)
RUN make install

WORKDIR /
WORKDIR /gmp
RUN /gmp-$GMP_VERSION/configure \
--prefix=/deps \
--host=x86_64-w64-mingw32 \
--disable-assembly \
--enable-static \
--disable-shared \
CFLAGS="-Os" \
LDFLAGS="-s"
RUN make -j$(nproc)
RUN make install

WORKDIR /
WORKDIR /mpfr
RUN /mpfr-$MPFR_VERSION/configure \
--prefix=/deps \
--host=x86_64-w64-mingw32 \
--with-gmp-include=/deps/include \
--with-gmp-lib=/deps/lib \
--enable-static \
--disable-shared \
CFLAGS="-Os" \
LDFLAGS="-s"
RUN make -j$(nproc)
RUN make install

WORKDIR /
WORKDIR /mpc
RUN /mpc-$MPC_VERSION/configure \
--prefix=/deps \
--host=x86_64-w64-mingw32 \
--with-gmp-include=/deps/include \
--with-gmp-lib=/deps/lib \
--with-mpfr-include=/deps/include \
--with-mpfr-lib=/deps/lib \
--enable-static \
--disable-shared \
CFLAGS="-Os" \
LDFLAGS="-s"
RUN make -j$(nproc)
RUN make install

WORKDIR /
WORKDIR /mingw-headers
RUN /mingw-w64-v$MINGW_VERSION/mingw-w64-headers/configure \
--prefix=$PREFIX/x86_64-w64-mingw32 \
--host=x86_64-w64-mingw32
RUN make -j$(nproc)
RUN make install

WORKDIR /mingw-crt
RUN /mingw-w64-v$MINGW_VERSION/mingw-w64-crt/configure \
--prefix=$PREFIX/x86_64-w64-mingw32 \
--with-sysroot=$PREFIX/x86_64-w64-mingw32 \
--host=x86_64-w64-mingw32 \
CFLAGS="-Os" \
LDFLAGS="-s"
RUN make -j$(nproc)
RUN make install

WORKDIR /
RUN sed -i 's#=/mingw/include#=/include#' gcc-$GCC_VERSION/gcc/config.gcc
WORKDIR /gcc
RUN /gcc-$GCC_VERSION/configure \
--prefix=$PREFIX \
--with-sysroot=$PREFIX \
--target=x86_64-w64-mingw32 \
--host=x86_64-w64-mingw32 \
--enable-static \
--disable-shared \
--with-gmp-include=/deps/include \
--with-gmp-lib=/deps/lib \
--with-mpc-include=/deps/include \
--with-mpc-lib=/deps/lib \
--with-mpfr-include=/deps/include \
--with-mpfr-lib=/deps/lib \
--enable-languages=c,c++ \
--enable-libgomp \
--enable-threads=win32 \
--enable-version-specific-runtime-libs \
--disable-multilib \
--disable-nls \
CFLAGS="-Os" \
LDFLAGS="-s"
RUN make -j$(nproc)
RUN make install

WORKDIR /winpthreads
RUN /mingw-w64-v$MINGW_VERSION/mingw-w64-libraries/winpthreads/configure \
--prefix=$PREFIX/x86_64-w64-mingw32 \
--with-sysroot=$PREFIX/x86_64-w64-mingw32 \
--host=x86_64-w64-mingw32 \
--enable-static \
--disable-shared
RUN make -j$(nproc)
RUN make install

RUN echo '@%~dp0/gcc.exe %*' >$PREFIX/bin/cc.bat

# Build some extra development tools

WORKDIR /make
RUN /make-$MAKE_VERSION/configure \
--host=x86_64-w64-mingw32 \
--disable-nls \
CFLAGS="-I/make-$MAKE_VERSION/glob -Os" \
LDFLAGS="-s"
RUN make -j$(nproc)
RUN cp make.exe $PREFIX/bin/

WORKDIR /busybox-w32
RUN make mingw64_defconfig
RUN make -j$(nproc)
RUN cp busybox.exe $PREFIX/bin/

# Pack up a release

WORKDIR /
ENV PREFIX=${PREFIX}
CMD zip -q9Xr - $PREFIX
62 changes: 62 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
# Portable C and C++ Development Kit for x64 Windows

This is a Dockerfile that builds a small, portable development suite for
writing C and C++ applications on and for x64 Windows. Docker is not
needed to use the tools themselves. It's merely used as reliable, clean
environment for compilation and linking. Included tools:

* [Mingw-w64 GCC][w64] : compilers, linker, assembler
* GNU Make : standard build tool
* [busybox-w32][bb] : standard unix utilities, including sh

## Build

First build the image, then run it to produce a release .zip file:

docker build -t w64devkit .
docker run --rm w64devkit >w64devkit.zip

## Usage

The final .zip file contains tools in a typical unix-like configuration.
Unzip the contents anywhere and add its `bin/` directory to your path.
For example, while inside a console or batch script:

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

Then to access a small unix environment:

busybox sh -l

This will expose the rest of busybox's commands without further action.

## Notes

Due to [an old GCC bug][bug], we must build a cross-compiler to
cross-compile GCC itself because, due to host contamination, GCC can
only be correctly and safely cross-compiled by a matching version.

Since the development kit is intended to be flexible, light, and
portable — i.e. run from anywhere, in place, and no installation is
necessary — the binaries are all optimized for size, not speed.

I'd love to include Git, but unfortunately Git's build system is a
disaster and doesn't support cross-compilation. It's also got weird
dependencies like Perl. Git may be a fantastic and wonderful tool, but
it's also kind of a mess.

It would be nice to have a better shell like Bash. BusyBox Ash is
limited, and the Windows port is pretty quirky. Unfortunately Bash's
build system is a total mess and does not support cross-compilation.

Since the build environment is so stable and predicable, it would be
great for the .zip to be reproducible, i.e. builds by different people
are bit-for-bit identical. There are multiple reasons why this is not
currently the case, the least of which are [timestamps in the .zip
file][zip].


[bb]: https://frippery.org/busybox/
[bug]: https://gcc.gnu.org/legacy-ml/gcc/2017-05/msg00219.html
[w64]: http://mingw-w64.org/
[zip]: https://tanzu.vmware.com/content/blog/barriers-to-deterministic-reproducible-zip-files
8 changes: 8 additions & 0 deletions SHA256SUMS
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
f00b0e8803dc9bab1e2165bd568528135be734df3fabf8d0161828cd56028952 binutils-2.34.tar.xz
e8e7ac9ff79fe85cb6d2ccaffc650fbd2b0ea9a24ffb87a50b3b17e8e23a60e7 busybox-w32-FRP-3445-g10e14d5eb.tgz
b6898a23844b656f1b68691c5c012036c2e694ac4b53a8918d4712ad876e7ea2 gcc-10.1.0.tar.xz
258e6cd51b3fbdfc185c716d55f82c08aff57df0c6fbd143cf6ed561267a1526 gmp-6.2.0.tar.xz
e968ce3c57ad39a593a92339e23eb148af6296b9f40aa453a9a9202c99d34436 make-4.2.tar.gz
6985c538143c1208dcb1ac42cedad6ff52e267b47e5f970183a3e75125b43c2e mpc-1.1.0.tar.gz
1d3be708604eae0e42d578ba93b390c2a145f17743a744d8f3f8c2ad5855a38a mpfr-4.0.2.tar.xz
805e11101e26d7897fce7d49cbb140d7bac15f3e085a91e0001e80b2adaf48f0 mingw-w64-v6.0.0.tar.bz2
24 changes: 24 additions & 0 deletions UNLICENSE
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
This is free and unencumbered software released into the public domain.

Anyone is free to copy, modify, publish, use, compile, sell, or
distribute this software, either in source code form or as a compiled
binary, for any purpose, commercial or non-commercial, and by any
means.

In jurisdictions that recognize copyright laws, the author or authors
of this software dedicate any and all copyright interest in the
software to the public domain. We make this dedication for the benefit
of the public at large and to the detriment of our heirs and
successors. We intend this dedication to be an overt act of
relinquishment in perpetuity of all present and future rights to this
software under copyright law.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.

For more information, please refer to <http://unlicense.org/>

0 comments on commit 6756388

Please sign in to comment.