mirror of https://git.musl-libc.org/git/musl
Browse Source
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.master
committed by
Rich Felker
5 changed files with 105 additions and 1 deletions
@ -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" |
|||
@ -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 |
|||
Loading…
Reference in new issue