diff options
| author | Shiz <hi@shiz.me> | 2015-06-28 23:08:21 +0200 | 
|---|---|---|
| committer | Rich Felker <dalias@aerifal.cx> | 2015-07-06 23:52:16 +0000 | 
| commit | fb58545f8d1c5fa32122244caeaf3625c12ddc01 (patch) | |
| tree | 88a3e261fc41fb4e5a23a351d41961d30423c058 | |
| parent | f8db6f74b2c74a50c4dec7e30be5215f0e2c37a6 (diff) | |
| download | musl-fb58545f8d1c5fa32122244caeaf3625c12ddc01.tar.gz | |
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.
| -rw-r--r-- | .gitignore | 2 | ||||
| -rw-r--r-- | Makefile | 5 | ||||
| -rwxr-xr-x | configure | 13 | ||||
| -rw-r--r-- | tools/ld.musl-clang.in | 51 | ||||
| -rw-r--r-- | tools/musl-clang.in | 35 | 
5 files changed, 105 insertions, 1 deletions
| @@ -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 @@ -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!@PREFIX@!$(prefix)!g' -e 's!@INCDIR@!$(includedir)!g' -e 's!@LIBDIR@!$(libdir)!g' -e 's!@LDSO@!$(LDSO_PATHNAME)!g' $< > $@ +	chmod +x $@ +  $(DESTDIR)$(bindir)/%: tools/%  	$(INSTALL) -D $< $@ @@ -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 00000000..93763d6b --- /dev/null +++ b/tools/ld.musl-clang.in @@ -0,0 +1,51 @@ +#!/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= +            ;; +        crtbegin*.o|crtend*.o) +            set -- "$@" $($cc -print-file-name=$x) +            ;; +        -lgcc|-lgcc_eh) +            file=lib${x#-l}.a +            set -- "$@" $($cc -print-file-name=$file) +            ;; +        -l*) +            test "$userlink" && set -- "$@" "$x" +            ;; +        -shared) +            shared=1 +            set -- "$@" -shared +            ;; +        -sysroot=*|--sysroot=*) +            ;; +        *) +            set -- "$@" "$x" +            ;; +    esac +done + +exec $($cc -print-prog-name=ld) -nostdlib "$@" -lc -dynamic-linker "$ldso" diff --git a/tools/musl-clang.in b/tools/musl-clang.in new file mode 100644 index 00000000..623de6f6 --- /dev/null +++ b/tools/musl-clang.in @@ -0,0 +1,35 @@ +#!/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 \ +    -static-libgcc \ +    -nostdinc \ +    --sysroot "$libc" \ +    -isystem "$libc_inc" \ +    -L-user-start \ +    $sflags \ +    "$@" \ +    $eflags \ +    -L"$libc_lib" \ +    -L-user-end | 
