|
|
Message-Id: <1435525701-64741-3-git-send-email-hi@shiz.me>
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=
+userlinkdir=
+userlink=
+
+for x ; do
+ test "$cleared" || set -- ; cleared=1
+
+ case "$x" in
+ -L-user-start)
+ userlinkdir=1
+ ;;
+ -L-user-end)
+ userlinkdir=
+ ;;
+ -L*)
+ test "$userlinkdir" && set -- "$@" "$x"
+ ;;
+ -l-user-start)
+ userlink=1
+ ;;
+ -l-user-end)
+ userlink=
+ ;;
+ -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
Powered by blists - more mailing lists
Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.