```Date: Sun, 28 Jun 2015 23:08:21 +0200
From: Shiz <hi@...z.me>
To: musl@...ts.openwall.com
Subject: [PATCH v3 3/3] add musl-clang, a wrapper for system clang installs

musl-clang allows the user to compile musl-powered programs using their
already existent clang install, without the need of a special cross compiler.
it achieves this by wrapping around both the system clang install and the
linker and passing them special flags to re-target musl at runtime.
it does only affect invocations done through the special musl-clang wrapper
script, so that the user setup remains fully intact otherwise.

the clang wrapper consists of the compiler frontend wrapper script,
musl-clang, and the linker wrapper script, ld.musl-clang.
musl-clang makes sure clang invokes ld.musl-clang to link objects; neither
script needs to be in PATH for the wrapper to work.
---
.gitignore             |  2 ++
Makefile               |  5 +++++
configure              | 13 ++++++++++++-
tools/ld.musl-clang.in | 49 +++++++++++++++++++++++++++++++++++++++++++++++++
tools/musl-clang.in    | 36 ++++++++++++++++++++++++++++++++++++
5 files changed, 104 insertions(+), 1 deletion(-)
create mode 100644 tools/ld.musl-clang.in
create mode 100644 tools/musl-clang.in

diff --git a/.gitignore b/.gitignore
index 070f549..c5d5c46 100644
--- a/.gitignore
+++ b/.gitignore
@@ -7,5 +7,7 @@ arch/*/bits/alltypes.h
config.mak
include/bits
tools/musl-gcc
+tools/musl-clang
+tools/ld.musl-clang
lib/musl-gcc.specs
src/internal/version.h
diff --git a/Makefile b/Makefile
index a1c1928..5f74005 100644
--- a/Makefile
+++ b/Makefile
@@ -52,6 +52,7 @@ ALL_LIBS = \$(CRT_LIBS) \$(STATIC_LIBS) \$(SHARED_LIBS) \$(EMPTY_LIBS) \$(TOOL_LIBS)
ALL_TOOLS = tools/musl-gcc

WRAPCC_GCC = gcc
+WRAPCC_CLANG = clang

LDSO_PATHNAME = \$(syslibdir)/ld-musl-\$(ARCH)\$(SUBARCH).so.1

@@ -160,6 +161,10 @@ tools/musl-gcc: config.mak
printf '#!/bin/sh\nexec "\$\${REALGCC:-\$(WRAPCC_GCC)}" "\$\$@" -specs "%s/musl-gcc.specs"\n' "\$(libdir)" > \$@
chmod +x \$@

+tools/%-clang: tools/%-clang.in config.mak
+	sed -e 's!@CC@!\$(WRAPCC_CLANG)!g' -e 's!@...FIX@!\$(prefix)!g' -e 's!@...DIR@!\$(includedir)!g' -e 's!@...DIR@!\$(libdir)!g' -e 's!@...O@!\$(LDSO_PATHNAME)!g' \$< > \$@
+	chmod +x \$@
+
\$(DESTDIR)\$(bindir)/%: tools/%
\$(INSTALL) -D \$< \$@

diff --git a/configure b/configure
index b07375a..a4c9236 100755
--- a/configure
+++ b/configure
@@ -134,6 +134,7 @@ shared=auto
static=yes
wrapper=auto
gcc_wrapper=no
+clang_wrapper=no

for arg ; do
case "\$arg" in
@@ -158,8 +159,9 @@ case "\$arg" in
--enable-visibility|--enable-visibility=yes) visibility=yes ;;
--disable-visibility|--enable-visibility=no) visibility=no ;;
--enable-wrapper|--enable-wrapper=yes) wrapper=detect ;;
---enable-wrapper=all) wrapper=yes ; gcc_wrapper=yes ;;
+--enable-wrapper=all) wrapper=yes ; gcc_wrapper=yes ; clang_wrapper=yes ;;
--enable-wrapper=gcc) wrapper=yes ; gcc_wrapper=yes ;;
+--enable-wrapper=clang) wrapper=yes ; clang_wrapper=yes ;;
--disable-wrapper|--enable-wrapper=no) wrapper=no ;;
--enable-gcc-wrapper|--enable-gcc-wrapper=yes) wrapper=yes ; gcc_wrapper=yes ;;
--disable-gcc-wrapper|--enable-gcc-wrapper=no) wrapper=no ;;
@@ -230,6 +232,8 @@ cc_ver="\$(LC_ALL=C \$CC -v 2>&1)"
cc_family=unknown
if fnmatch '*gcc\ version*' "\$cc_ver" ; then
cc_family=gcc
+elif fnmatch '*clang\ version*' "\$cc_ver" ; then
+cc_family=clang
fi
echo "\$cc_family"

@@ -247,6 +251,9 @@ echo "none"
elif test "\$cc_family" = gcc ; then
gcc_wrapper=yes
echo "gcc"
+elif test "\$cc_family" = clang ; then
+clang_wrapper=yes
+echo "clang"
else
echo "none"
if test "\$wrapper" = detect ; then
@@ -259,6 +266,9 @@ if test "\$gcc_wrapper" = yes ; then
tools="\$tools tools/musl-gcc"
tool_libs="\$tool_libs lib/musl-gcc.specs"
fi
+if test "\$clang_wrapper" = yes ; then
+tools="\$tools tools/musl-clang tools/ld.musl-clang"
+fi

#
# Find the target architecture
@@ -600,6 +610,7 @@ EOF
test "x\$static" = xno && echo "STATIC_LIBS ="
test "x\$shared" = xno && echo "SHARED_LIBS ="
test "x\$cc_family" = xgcc && echo 'WRAPCC_GCC = \$(CC)'
+test "x\$cc_family" = xclang && echo 'WRAPCC_CLANG = \$(CC)'
exec 1>&3 3>&-

printf "done\n"
diff --git a/tools/ld.musl-clang.in b/tools/ld.musl-clang.in
new file mode 100644
index 0000000..cac3c0b
--- /dev/null
+++ b/tools/ld.musl-clang.in
@@ -0,0 +1,49 @@
+#!/bin/sh
+cc="@CC@"
+libc_lib="@LIBDIR@"
+ldso="@LDSO@"
+cleared=
+shared=
+
+for x ; do
+    test "\$cleared" || set -- ; cleared=1
+
+    case "\$x" in
+        -L-user-start)
+            ;;
+        -L-user-end)
+            ;;
+        -L*)
+            test "\$userlinkdir" && set -- "\$@" "\$x"
+            ;;
+        -l-user-start)
+            ;;
+        -l-user-end)
+            ;;
+        -l*)
+            test "\$userlink" && set -- "\$@" "\$x"
+            ;;
+        -shared)
+            shared=1
+            set -- "\$@" -shared
+            ;;
+        -sysroot=*|--sysroot=*)
+            ;;
+        *)
+            set -- "\$@" "\$x"
+            ;;
+    esac
+done
+
+set -- "\$@" -lc
+if ! test "\$shared"; then
+    set -- "\$libc_lib/Scrt1.o" "\$libc_lib/crti.o" "\$@" "\$libc_lib/crtn.o"
+fi
+
+exec \$(\$cc -print-prog-name=ld) -nostdlib "\$@" -dynamic-linker "\$ldso"
diff --git a/tools/musl-clang.in b/tools/musl-clang.in
new file mode 100644
index 0000000..d815081
--- /dev/null
+++ b/tools/musl-clang.in
@@ -0,0 +1,36 @@
+#!/bin/sh
+cc="@CC@"
+libc="@PREFIX@"
+libc_inc="@INCDIR@"
+libc_lib="@LIBDIR@"
+thisdir="`cd "\$(dirname "\$0")"; pwd`"
+
+# prevent clang from running the linker (and erroring) on no input.
+sflags=
+eflags=
+for x ; do
+    case "\$x" in
+        -l*) input=1 ;;
+        *) input= ;;
+    esac
+    if test "\$input" ; then
+        sflags="-l-user-start"
+        eflags="-l-user-end"
+        break
+    fi
+done
+
+exec \$cc \
+    -B"\$thisdir" \
+    -fuse-ld=musl-clang \
+    -rtlib=compiler-rt \
+    -nostdinc \
+    -nostartfiles \
+    --sysroot "\$libc" \
+    -isystem "\$libc_inc" \
+    -L-user-start \
+    \$sflags \
+    "\$@" \
+    \$eflags \
+    -L"\$libc_lib" \
+    -L-user-end
--
2.3.6

```

Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.