This avoids having to manually add -lpsapi when linking in libc++.a. This requires using a new script to merge libraries using ar -M with a small MRI script. The script merge_archives.py in libcxx does the merge by manually extracting all object files and creating a new archive out of them. The import libraries created by LLVM have more than one object file with the same file name (just like MSVC tools do), so extracting them doesn't work as intended - but merging using a MRI script works.
275 lines
11 KiB
Docker
275 lines
11 KiB
Docker
FROM ubuntu:16.04
|
|
|
|
#FIXME: Remove vim once debuging is complete
|
|
# git-svn is only used to get sensible version numbers in clang version printouts
|
|
RUN apt-get update -qq && apt-get install -qqy \
|
|
git wget bzip2 file libwine-development-dev unzip libtool pkg-config cmake \
|
|
build-essential automake texinfo ragel yasm p7zip-full gettext autopoint \
|
|
vim python git-svn
|
|
|
|
|
|
RUN git config --global user.name "LLVM MinGW" && \
|
|
git config --global user.email root@localhost
|
|
|
|
WORKDIR /build
|
|
|
|
# When cloning master and checking out a pinned old hash, we can't use --depth=1.
|
|
# Do the git-svn rebase to populate git-svn information, to make
|
|
# "clang --version" produce SVN based version numbers.
|
|
RUN git clone -b master https://github.com/llvm-mirror/llvm.git && \
|
|
cd llvm/tools && \
|
|
git clone -b master https://github.com/llvm-mirror/clang.git && \
|
|
git clone -b master https://github.com/llvm-mirror/lld.git && \
|
|
cd .. && \
|
|
git svn init https://llvm.org/svn/llvm-project/llvm/trunk && \
|
|
git config svn-remote.svn.fetch :refs/remotes/origin/master && \
|
|
git svn rebase -l && \
|
|
git checkout 305f0fb15600a5e4a247a8bcf230d4fbf56ac6ba && \
|
|
cd tools/clang && \
|
|
git svn init https://llvm.org/svn/llvm-project/cfe/trunk && \
|
|
git config svn-remote.svn.fetch :refs/remotes/origin/master && \
|
|
git svn rebase -l && \
|
|
git checkout fb2fbcc95291e95c593f9e5d5712a3fdd82c186a && \
|
|
cd ../lld && \
|
|
git checkout bdb0db17cbabf8ad325ed3cd21054aec17056680
|
|
|
|
|
|
# Build LLVM
|
|
RUN cd llvm && mkdir build && cd build && cmake \
|
|
-DCMAKE_INSTALL_PREFIX="/build/prefix" \
|
|
-DCMAKE_BUILD_TYPE=Release \
|
|
-DLLVM_ENABLE_ASSERTIONS=ON \
|
|
-DLLVM_TARGETS_TO_BUILD="ARM;AArch64;X86" \
|
|
../ && \
|
|
make -j4 && \
|
|
make install
|
|
|
|
RUN git clone git://git.code.sf.net/p/mingw-w64/mingw-w64 && \
|
|
cd mingw-w64 && \
|
|
git checkout d958789c106b4470f75c88bfe9484e5ba0510503
|
|
|
|
|
|
ENV TOOLCHAIN_PREFIX=/build/prefix
|
|
ENV PATH=$TOOLCHAIN_PREFIX/bin:$PATH
|
|
ENV TOOLCHAIN_ARCHS="i686 x86_64 armv7 aarch64"
|
|
|
|
RUN cd mingw-w64/mingw-w64-headers && \
|
|
for arch in $TOOLCHAIN_ARCHS; do \
|
|
mkdir build-${arch} && cd build-${arch} && \
|
|
../configure --host=${arch}-w64-mingw32 --prefix=$TOOLCHAIN_PREFIX/${arch}-w64-mingw32 \
|
|
--enable-secure-api --with-default-win32-winnt=0x600 && \
|
|
make install && \
|
|
cd .. || exit 1; \
|
|
done
|
|
|
|
# Install the usual $TUPLE-clang binaries
|
|
RUN mkdir wrappers
|
|
COPY wrappers/clang-target-wrapper /build/wrappers
|
|
RUN for arch in $TOOLCHAIN_ARCHS; do \
|
|
for exec in clang clang++; do \
|
|
cp wrappers/clang-target-wrapper $TOOLCHAIN_PREFIX/bin/${arch}-w64-mingw32-${exec}; \
|
|
done; \
|
|
done
|
|
|
|
# Build mingw with our freshly built cross compiler
|
|
RUN cd mingw-w64/mingw-w64-crt && \
|
|
for arch in $TOOLCHAIN_ARCHS; do \
|
|
mkdir build-$arch && cd build-$arch && \
|
|
case $arch in \
|
|
armv7) \
|
|
FLAGS="--disable-lib32 --disable-lib64 --enable-libarm32" \
|
|
;; \
|
|
aarch64) \
|
|
FLAGS="--disable-lib32 --disable-lib64 --enable-libarm64" \
|
|
;; \
|
|
i686) \
|
|
FLAGS="--enable-lib32 --disable-lib64" \
|
|
;; \
|
|
x86_64) \
|
|
FLAGS="--disable-lib32 --enable-lib64" \
|
|
;; \
|
|
esac && \
|
|
CC=$arch-w64-mingw32-clang \
|
|
AR=llvm-ar RANLIB=llvm-ranlib DLLTOOL=llvm-dlltool ../configure --host=$arch-w64-mingw32 --prefix=$TOOLCHAIN_PREFIX/$arch-w64-mingw32 $FLAGS && \
|
|
make -j4 && make install && \
|
|
cd .. || exit 1; \
|
|
done
|
|
|
|
#RUN cp /build/mingw-w64/mingw-w64-libraries/winpthreads/include/* $MINGW_PREFIX/include/
|
|
|
|
RUN git clone -b master https://github.com/llvm-mirror/compiler-rt.git && \
|
|
cd compiler-rt && \
|
|
git checkout de9856b41224c2e7c30d0991d032f5efcf6d43e7
|
|
|
|
# Add a symlink for i386 -> i686; we normally name the toolchain
|
|
# i686-w64-mingw32, but due to the compiler-rt cmake peculiarities, we
|
|
# need to refer to it as i386 at this stage.
|
|
RUN cd $TOOLCHAIN_PREFIX && ln -s i686-w64-mingw32 i386-w64-mingw32
|
|
|
|
# Manually build compiler-rt as a standalone project
|
|
RUN cd compiler-rt && \
|
|
for arch in $TOOLCHAIN_ARCHS; do \
|
|
buildarchname=$arch && \
|
|
libarchname=$arch && \
|
|
case $arch in \
|
|
armv7) \
|
|
libarchname=arm \
|
|
;; \
|
|
i686) \
|
|
buildarchname=i386 \
|
|
libarchname=i386 \
|
|
;; \
|
|
esac && \
|
|
mkdir build-$arch && cd build-$arch && cmake \
|
|
-DCMAKE_C_COMPILER=$arch-w64-mingw32-clang \
|
|
-DCMAKE_SYSTEM_NAME=Windows \
|
|
-DCMAKE_AR=$TOOLCHAIN_PREFIX/bin/llvm-ar \
|
|
-DCMAKE_RANLIB=$TOOLCHAIN_PREFIX/bin/llvm-ranlib \
|
|
-DCMAKE_C_COMPILER_WORKS=1 \
|
|
-DCMAKE_C_COMPILER_TARGET=$buildarchname-windows-gnu \
|
|
-DCOMPILER_RT_DEFAULT_TARGET_ONLY=TRUE \
|
|
../lib/builtins && \
|
|
make -j4 && \
|
|
mkdir -p $TOOLCHAIN_PREFIX/lib/clang/6.0.0/lib/windows && \
|
|
cp lib/windows/libclang_rt.builtins-$buildarchname.a $TOOLCHAIN_PREFIX/lib/clang/6.0.0/lib/windows/libclang_rt.builtins-$libarchname.a && \
|
|
cd .. || exit 1; \
|
|
done
|
|
|
|
#RUN cd mingw-w64/mingw-w64-libraries && cd winstorecompat && \
|
|
# autoreconf -vif && \
|
|
# mkdir build && cd build && \
|
|
# ../configure --host=$TARGET_TUPLE --prefix=$MINGW_PREFIX && make && make install
|
|
|
|
#RUN cd /build/mingw-w64/mingw-w64-tools/widl && \
|
|
# mkdir build && cd build && \
|
|
# CC=gcc \
|
|
# ../configure --prefix=$TOOLCHAIN_PREFIX --target=$TARGET_TUPLE && \
|
|
# make -j4 && \
|
|
# make install
|
|
|
|
RUN git clone -b master https://github.com/llvm-mirror/libcxx.git && \
|
|
git clone -b master https://github.com/llvm-mirror/libcxxabi.git && \
|
|
git clone -b master https://github.com/llvm-mirror/libunwind.git && \
|
|
cd libcxx && \
|
|
git checkout f45f32b0254e4107b4165ddc99ca2503ab9bd754 && \
|
|
cd ../libcxxabi && \
|
|
git checkout 05ba3281482304ae8de31123a594972a495da06d && \
|
|
cd ../libunwind && \
|
|
git checkout 2ddcf2461daa5d61c543474aed06b12a8b9ad816
|
|
|
|
COPY merge_archives.sh /build
|
|
RUN cd libunwind && \
|
|
for arch in $TOOLCHAIN_ARCHS; do \
|
|
mkdir build-$arch && cd build-$arch && cmake \
|
|
-DCMAKE_BUILD_TYPE=Release \
|
|
-DCMAKE_INSTALL_PREFIX=$TOOLCHAIN_PREFIX/$arch-w64-mingw32 \
|
|
-DCMAKE_C_COMPILER=$arch-w64-mingw32-clang \
|
|
-DCMAKE_CXX_COMPILER=$arch-w64-mingw32-clang++ \
|
|
-DCMAKE_CROSSCOMPILING=TRUE \
|
|
-DCMAKE_SYSTEM_NAME=Windows \
|
|
-DCMAKE_C_COMPILER_WORKS=TRUE \
|
|
-DCMAKE_CXX_COMPILER_WORKS=TRUE \
|
|
-DCMAKE_AR=$TOOLCHAIN_PREFIX/bin/llvm-ar \
|
|
-DCMAKE_RANLIB=$TOOLCHAIN_PREFIX/bin/llvm-ranlib \
|
|
-DLLVM_NO_OLD_LIBSTDCXX=TRUE \
|
|
-DCXX_SUPPORTS_CXX11=TRUE \
|
|
-DLIBUNWIND_USE_COMPILER_RT=TRUE \
|
|
-DLIBUNWIND_ENABLE_THREADS=TRUE \
|
|
-DLIBUNWIND_ENABLE_SHARED=FALSE \
|
|
-DLIBUNWIND_ENABLE_CROSS_UNWINDING=FALSE \
|
|
-DCMAKE_CXX_FLAGS="-I/build/libcxx/include" \
|
|
.. && \
|
|
make -j4 && make install && \
|
|
/build/merge_archives.sh \
|
|
$TOOLCHAIN_PREFIX/$arch-w64-mingw32/lib/libunwind.a \
|
|
$TOOLCHAIN_PREFIX/$arch-w64-mingw32/lib/libpsapi.a && \
|
|
cd .. || exit 1; \
|
|
done
|
|
|
|
RUN cd libcxxabi && \
|
|
for arch in $TOOLCHAIN_ARCHS; do \
|
|
mkdir build-$arch && cd build-$arch && cmake \
|
|
-DCMAKE_BUILD_TYPE=Release \
|
|
-DCMAKE_INSTALL_PREFIX=$TOOLCHAIN_PREFIX/$arch-w64-mingw32 \
|
|
-DCMAKE_C_COMPILER=$arch-w64-mingw32-clang \
|
|
-DCMAKE_CXX_COMPILER=$arch-w64-mingw32-clang++ \
|
|
-DCMAKE_CROSSCOMPILING=TRUE \
|
|
-DCMAKE_SYSTEM_NAME=Windows \
|
|
-DCMAKE_C_COMPILER_WORKS=TRUE \
|
|
-DCMAKE_CXX_COMPILER_WORKS=TRUE \
|
|
-DCMAKE_AR=$TOOLCHAIN_PREFIX/bin/llvm-ar \
|
|
-DCMAKE_RANLIB=$TOOLCHAIN_PREFIX/bin/llvm-ranlib \
|
|
-DLIBCXXABI_USE_COMPILER_RT=ON \
|
|
-DLIBCXXABI_ENABLE_EXCEPTIONS=ON \
|
|
-DLIBCXXABI_ENABLE_THREADS=ON \
|
|
-DLIBCXXABI_TARGET_TRIPLE=$arch-w64-mingw32 \
|
|
-DLIBCXXABI_ENABLE_SHARED=OFF \
|
|
-DLIBCXXABI_LIBCXX_INCLUDES=../../libcxx/include \
|
|
-DLLVM_NO_OLD_LIBSTDCXX=TRUE \
|
|
-DCXX_SUPPORTS_CXX11=TRUE \
|
|
-DCMAKE_CXX_FLAGS="-D_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS" \
|
|
.. && \
|
|
make -j4 && \
|
|
cd .. || exit 1; \
|
|
done
|
|
|
|
RUN cd libcxx && \
|
|
for arch in $TOOLCHAIN_ARCHS; do \
|
|
mkdir build-$arch && cd build-$arch && cmake \
|
|
-DCMAKE_BUILD_TYPE=Release \
|
|
-DCMAKE_INSTALL_PREFIX=$TOOLCHAIN_PREFIX/$arch-w64-mingw32 \
|
|
-DCMAKE_C_COMPILER=$arch-w64-mingw32-clang \
|
|
-DCMAKE_CXX_COMPILER=$arch-w64-mingw32-clang++ \
|
|
-DCMAKE_CROSSCOMPILING=TRUE \
|
|
-DCMAKE_SYSTEM_NAME=Windows \
|
|
-DCMAKE_C_COMPILER_WORKS=TRUE \
|
|
-DCMAKE_CXX_COMPILER_WORKS=TRUE \
|
|
-DCMAKE_AR=$TOOLCHAIN_PREFIX/bin/llvm-ar \
|
|
-DCMAKE_RANLIB=$TOOLCHAIN_PREFIX/bin/llvm-ranlib \
|
|
-DLIBCXX_USE_COMPILER_RT=ON \
|
|
-DLIBCXX_INSTALL_HEADERS=ON \
|
|
-DLIBCXX_ENABLE_EXCEPTIONS=ON \
|
|
-DLIBCXX_ENABLE_THREADS=ON \
|
|
-DLIBCXX_ENABLE_MONOTONIC_CLOCK=ON \
|
|
-DLIBCXX_ENABLE_SHARED=OFF \
|
|
-DLIBCXX_SUPPORTS_STD_EQ_CXX11_FLAG=TRUE \
|
|
-DLIBCXX_HAVE_CXX_ATOMICS_WITHOUT_LIB=TRUE \
|
|
-DLIBCXX_ENABLE_EXPERIMENTAL_LIBRARY=OFF \
|
|
-DLIBCXX_ENABLE_FILESYSTEM=OFF \
|
|
-DLIBCXX_ENABLE_STATIC_ABI_LIBRARY=TRUE \
|
|
-DLIBCXX_CXX_ABI=libcxxabi \
|
|
-DLIBCXX_CXX_ABI_INCLUDE_PATHS=../../libcxxabi/include \
|
|
-DLIBCXX_CXX_ABI_LIBRARY_PATH=../../libcxxabi/build-$arch/lib \
|
|
-DCMAKE_CXX_FLAGS="-D_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS" \
|
|
.. && \
|
|
make -j4 && make install && \
|
|
/build/merge_archives.sh \
|
|
$TOOLCHAIN_PREFIX/$arch-w64-mingw32/lib/libc++.a \
|
|
$TOOLCHAIN_PREFIX/$arch-w64-mingw32/lib/libunwind.a && \
|
|
cd .. || exit 1; \
|
|
done
|
|
|
|
RUN cd $TOOLCHAIN_PREFIX/include && ln -s ../$(echo $TOOLCHAIN_ARCHS | awk '{print $1}')-w64-mingw32/include/c++ .
|
|
|
|
RUN mkdir -p hello
|
|
COPY hello.c hello.cpp hello-exception.cpp /build/hello/
|
|
RUN cd hello && \
|
|
for arch in $TOOLCHAIN_ARCHS; do \
|
|
$arch-w64-mingw32-clang hello.c -o hello-$arch.exe || exit 1; \
|
|
done
|
|
|
|
RUN cd hello && \
|
|
for arch in $TOOLCHAIN_ARCHS; do \
|
|
$arch-w64-mingw32-clang++ hello.cpp -o hello-cpp-$arch.exe -fno-exceptions || exit 1; \
|
|
done
|
|
|
|
RUN cd hello && \
|
|
for arch in $TOOLCHAIN_ARCHS; do \
|
|
$arch-w64-mingw32-clang++ hello-exception.cpp -o hello-exception-$arch.exe || exit 1; \
|
|
done
|
|
|
|
ENV AR=llvm-ar
|
|
ENV RANLIB=llvm-ranlib
|
|
ENV AS=llvm-as
|
|
ENV NM=llvm-nm
|