-
Notifications
You must be signed in to change notification settings - Fork 241
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
0 parents
commit 6756388
Showing
4 changed files
with
335 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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/> |