diff --git a/Dockerfile b/Dockerfile index 74d6584..3a0a799 100644 --- a/Dockerfile +++ b/Dockerfile @@ -21,7 +21,7 @@ RUN ./build-llvm.sh $TOOLCHAIN_PREFIX ENV TOOLCHAIN_ARCHS="i686 x86_64 armv7 aarch64" # Install the usual $TUPLE-clang binaries -COPY wrappers/clang-target-wrapper.sh ./wrappers/ +COPY wrappers/*.sh ./wrappers/ COPY install-wrappers.sh . RUN ./install-wrappers.sh $TOOLCHAIN_PREFIX diff --git a/README.md b/README.md index df734f2..493bf40 100644 --- a/README.md +++ b/README.md @@ -36,15 +36,10 @@ To build the toolchain in Docker, run: In addition to building the toolchain itself (just like `build-all.sh` does), this also builds a few demo apps to show and verify that the toolchain works. -Other branches in this repo contain patches that might not have been +Other branches in this repo might contain patches that might not have been merged upstream yet, and tests of building third party projects using the toolchain (in the branch `demoapps`). -For building projects that need more than just specifying -`CC=-clang`, there is more (more or less hacky and in-progress) -setup for providing a larger selection of the tools that GNU binutils -normally provides, in the branch `tools`. - Individual components of the toolchain can be (re)built by running the standalone shellscripts listed within `build-all.sh`. However, if the source already is checked out, no effort is made to check out a diff --git a/install-wrappers.sh b/install-wrappers.sh index 90a01b9..1329214 100755 --- a/install-wrappers.sh +++ b/install-wrappers.sh @@ -11,10 +11,19 @@ PREFIX="$1" : ${ARCHS:=${TOOLCHAIN_ARCHS-i686 x86_64 armv7 aarch64}} mkdir -p $PREFIX/bin -cp wrappers/clang-target-wrapper.sh $PREFIX/bin +cp wrappers/clang-target-wrapper.sh wrappers/objdump-wrapper.sh wrappers/ld-wrapper.sh $PREFIX/bin cd $PREFIX/bin for arch in $ARCHS; do - for exec in clang clang++; do + for exec in clang clang++ gcc g++; do ln -sf clang-target-wrapper.sh $arch-w64-mingw32-$exec done + for exec in ar ranlib nm dlltool strings; do + ln -sf llvm-$exec $arch-w64-mingw32-$exec + done + for exec in strip; do + ln -sf /bin/true $arch-w64-mingw32-$exec + done + for exec in ld objdump; do + ln -sf $exec-wrapper.sh $arch-w64-mingw32-$exec + done done diff --git a/wrappers/clang-target-wrapper.sh b/wrappers/clang-target-wrapper.sh index 1e9b12f..50b21cd 100755 --- a/wrappers/clang-target-wrapper.sh +++ b/wrappers/clang-target-wrapper.sh @@ -1,7 +1,17 @@ #!/usr/bin/env bash DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -TARGET="$(basename $0 | sed 's/-clang.*//')" -EXE=$(basename $0 | sed 's/.*-\(clang.*\)/\1/') +TARGET="$(basename $0 | sed 's/-[^-]*$//')" +EXE=$(basename $0 | sed 's/.*-\([^-]*\)/\1/') +case $EXE in +clang*) + ;; +gcc) + EXE=clang + ;; +g++) + EXE=clang++ + ;; +esac ARCH=$(echo $TARGET | sed 's/-.*//') SYSROOT="$(cd "$DIR"/../$TARGET && pwd)" case $ARCH in diff --git a/wrappers/ld-wrapper.sh b/wrappers/ld-wrapper.sh new file mode 100755 index 0000000..7e23e0c --- /dev/null +++ b/wrappers/ld-wrapper.sh @@ -0,0 +1,25 @@ +#!/bin/sh + +if [ "$1" = "--help" ]; then + cat< option in this case. + ld.lld -v + exit 0 +fi + +TARGET="$(basename $0 | sed 's/-[^-]*$//')" +ARCH=$(echo $TARGET | sed 's/-.*//') +case $ARCH in +i686) M=i386pe ;; +x86_64) M=i386pep ;; +armv7) M=thumb2pe ;; +aarch64) M=arm64pe ;; +esac +ld.lld -m $M "$@" diff --git a/wrappers/objdump-wrapper.sh b/wrappers/objdump-wrapper.sh new file mode 100755 index 0000000..33ad742 --- /dev/null +++ b/wrappers/objdump-wrapper.sh @@ -0,0 +1,33 @@ +#!/bin/sh + +if [ "$1" = "-f" ]; then + # libtool can try to run objdump -f and wants to see certain strings in + # the output, to accept it being a windows (import) library + llvm-readobj $2 | while read -r line; do + case $line in + File:*) + file=$(echo $line | awk '{print $2}') + ;; + Format:*) + format=$(echo $line | awk '{print $2}') + case $format in + COFF-i386) + format=pe-i386 + ;; + COFF-x86-64) + format=pe-x86-64 + ;; + COFF-ARM*) + # This is wrong; modern COFF armv7 isn't pe-arm-wince, and + # arm64 definitely isn't, but libtool wants to see this + # string (or some of the others) in order to accept it. + format=pe-arm-wince + ;; + esac + echo $file: file format $format + ;; + esac + done +else + llvm-objdump "$@" +fi