mirror of
https://git.musl-libc.org/git/musl
synced 2025-01-22 06:02:03 +03:00
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.
This commit is contained in:
parent
f8db6f74b2
commit
fb58545f8d
2
.gitignore
vendored
2
.gitignore
vendored
@ -7,5 +7,7 @@ arch/*/bits/alltypes.h
|
|||||||
config.mak
|
config.mak
|
||||||
include/bits
|
include/bits
|
||||||
tools/musl-gcc
|
tools/musl-gcc
|
||||||
|
tools/musl-clang
|
||||||
|
tools/ld.musl-clang
|
||||||
lib/musl-gcc.specs
|
lib/musl-gcc.specs
|
||||||
src/internal/version.h
|
src/internal/version.h
|
||||||
|
5
Makefile
5
Makefile
@ -52,6 +52,7 @@ ALL_LIBS = $(CRT_LIBS) $(STATIC_LIBS) $(SHARED_LIBS) $(EMPTY_LIBS) $(TOOL_LIBS)
|
|||||||
ALL_TOOLS = tools/musl-gcc
|
ALL_TOOLS = tools/musl-gcc
|
||||||
|
|
||||||
WRAPCC_GCC = gcc
|
WRAPCC_GCC = gcc
|
||||||
|
WRAPCC_CLANG = clang
|
||||||
|
|
||||||
LDSO_PATHNAME = $(syslibdir)/ld-musl-$(ARCH)$(SUBARCH).so.1
|
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)" > $@
|
printf '#!/bin/sh\nexec "$${REALGCC:-$(WRAPCC_GCC)}" "$$@" -specs "%s/musl-gcc.specs"\n' "$(libdir)" > $@
|
||||||
chmod +x $@
|
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/%
|
$(DESTDIR)$(bindir)/%: tools/%
|
||||||
$(INSTALL) -D $< $@
|
$(INSTALL) -D $< $@
|
||||||
|
|
||||||
|
13
configure
vendored
13
configure
vendored
@ -134,6 +134,7 @@ shared=auto
|
|||||||
static=yes
|
static=yes
|
||||||
wrapper=auto
|
wrapper=auto
|
||||||
gcc_wrapper=no
|
gcc_wrapper=no
|
||||||
|
clang_wrapper=no
|
||||||
|
|
||||||
for arg ; do
|
for arg ; do
|
||||||
case "$arg" in
|
case "$arg" in
|
||||||
@ -158,8 +159,9 @@ case "$arg" in
|
|||||||
--enable-visibility|--enable-visibility=yes) visibility=yes ;;
|
--enable-visibility|--enable-visibility=yes) visibility=yes ;;
|
||||||
--disable-visibility|--enable-visibility=no) visibility=no ;;
|
--disable-visibility|--enable-visibility=no) visibility=no ;;
|
||||||
--enable-wrapper|--enable-wrapper=yes) wrapper=detect ;;
|
--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=gcc) wrapper=yes ; gcc_wrapper=yes ;;
|
||||||
|
--enable-wrapper=clang) wrapper=yes ; clang_wrapper=yes ;;
|
||||||
--disable-wrapper|--enable-wrapper=no) wrapper=no ;;
|
--disable-wrapper|--enable-wrapper=no) wrapper=no ;;
|
||||||
--enable-gcc-wrapper|--enable-gcc-wrapper=yes) wrapper=yes ; gcc_wrapper=yes ;;
|
--enable-gcc-wrapper|--enable-gcc-wrapper=yes) wrapper=yes ; gcc_wrapper=yes ;;
|
||||||
--disable-gcc-wrapper|--enable-gcc-wrapper=no) wrapper=no ;;
|
--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
|
cc_family=unknown
|
||||||
if fnmatch '*gcc\ version*' "$cc_ver" ; then
|
if fnmatch '*gcc\ version*' "$cc_ver" ; then
|
||||||
cc_family=gcc
|
cc_family=gcc
|
||||||
|
elif fnmatch '*clang\ version*' "$cc_ver" ; then
|
||||||
|
cc_family=clang
|
||||||
fi
|
fi
|
||||||
echo "$cc_family"
|
echo "$cc_family"
|
||||||
|
|
||||||
@ -247,6 +251,9 @@ echo "none"
|
|||||||
elif test "$cc_family" = gcc ; then
|
elif test "$cc_family" = gcc ; then
|
||||||
gcc_wrapper=yes
|
gcc_wrapper=yes
|
||||||
echo "gcc"
|
echo "gcc"
|
||||||
|
elif test "$cc_family" = clang ; then
|
||||||
|
clang_wrapper=yes
|
||||||
|
echo "clang"
|
||||||
else
|
else
|
||||||
echo "none"
|
echo "none"
|
||||||
if test "$wrapper" = detect ; then
|
if test "$wrapper" = detect ; then
|
||||||
@ -259,6 +266,9 @@ if test "$gcc_wrapper" = yes ; then
|
|||||||
tools="$tools tools/musl-gcc"
|
tools="$tools tools/musl-gcc"
|
||||||
tool_libs="$tool_libs lib/musl-gcc.specs"
|
tool_libs="$tool_libs lib/musl-gcc.specs"
|
||||||
fi
|
fi
|
||||||
|
if test "$clang_wrapper" = yes ; then
|
||||||
|
tools="$tools tools/musl-clang tools/ld.musl-clang"
|
||||||
|
fi
|
||||||
|
|
||||||
#
|
#
|
||||||
# Find the target architecture
|
# Find the target architecture
|
||||||
@ -600,6 +610,7 @@ EOF
|
|||||||
test "x$static" = xno && echo "STATIC_LIBS ="
|
test "x$static" = xno && echo "STATIC_LIBS ="
|
||||||
test "x$shared" = xno && echo "SHARED_LIBS ="
|
test "x$shared" = xno && echo "SHARED_LIBS ="
|
||||||
test "x$cc_family" = xgcc && echo 'WRAPCC_GCC = $(CC)'
|
test "x$cc_family" = xgcc && echo 'WRAPCC_GCC = $(CC)'
|
||||||
|
test "x$cc_family" = xclang && echo 'WRAPCC_CLANG = $(CC)'
|
||||||
exec 1>&3 3>&-
|
exec 1>&3 3>&-
|
||||||
|
|
||||||
printf "done\n"
|
printf "done\n"
|
||||||
|
51
tools/ld.musl-clang.in
Normal file
51
tools/ld.musl-clang.in
Normal file
@ -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"
|
35
tools/musl-clang.in
Normal file
35
tools/musl-clang.in
Normal file
@ -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
Block a user