mirror of
https://git.musl-libc.org/git/musl
synced 2025-01-06 23:02:10 +03:00
new gcc wrapper, entirely specfile based
the _concept_ of this wrapper has been tested extensively, but the integration with the build/install system, and using a persistent specfile rather than one generated at build-time, have not been heavily tested and may need minor tweaks. this approach should be a lot more robust (and easier to improve) than writing a shell script that's responsible for trying to mimic gcc's logic about whether it's compiling or linking, building shared libs or executable files, etc. it's also lighter weight and should result in mildly faster builds when using the wrapper.
This commit is contained in:
parent
02eb568ded
commit
58f430c1e0
1
.gitignore
vendored
1
.gitignore
vendored
@ -7,3 +7,4 @@ arch/*/bits/alltypes.h
|
||||
config.mak
|
||||
include/bits
|
||||
tools/musl-gcc
|
||||
lib/musl-gcc.specs
|
||||
|
10
Makefile
10
Makefile
@ -36,7 +36,8 @@ EMPTY_LIBS = $(EMPTY_LIB_NAMES:%=lib/lib%.a)
|
||||
CRT_LIBS = lib/crt1.o lib/crti.o lib/crtn.o
|
||||
STATIC_LIBS = lib/libc.a $(EMPTY_LIBS)
|
||||
SHARED_LIBS = lib/libc.so
|
||||
ALL_LIBS = $(CRT_LIBS) $(STATIC_LIBS) $(SHARED_LIBS)
|
||||
TOOL_LIBS = lib/musl-gcc.specs
|
||||
ALL_LIBS = $(CRT_LIBS) $(STATIC_LIBS) $(SHARED_LIBS) $(TOOL_LIBS)
|
||||
ALL_TOOLS = tools/musl-gcc
|
||||
|
||||
LDSO_PATHNAME = $(syslibdir)/ld-musl-$(ARCH).so.1
|
||||
@ -93,8 +94,11 @@ $(EMPTY_LIBS):
|
||||
lib/%.o: crt/%.o
|
||||
cp $< $@
|
||||
|
||||
tools/musl-gcc: tools/gen-musl-gcc.sh config.mak
|
||||
sh $< "$(prefix)" "$(LDSO_PATHNAME)" > $@ || { rm -f $@ ; exit 1 ; }
|
||||
lib/musl-gcc.specs: tools/musl-gcc.specs.sh config.mak
|
||||
sh $< "$(includedir)" "$(libdir)" "$(LDSO_PATHNAME)" > $@
|
||||
|
||||
tools/musl-gcc: config.mak
|
||||
printf '#!/bin/sh\nexec gcc "$$@" -specs "%s/musl-gcc.specs"\n' "$(libdir)" > $@
|
||||
chmod +x $@
|
||||
|
||||
$(DESTDIR)$(bindir)/%: tools/%
|
||||
|
@ -1,60 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
printf '#!/bin/sh\n\nlibc_prefix="%s"\nldso_pathname="%s"\n' "$1" "$2"
|
||||
|
||||
cat <<"EOF"
|
||||
gcc=gcc
|
||||
libc_lib=$libc_prefix/lib
|
||||
libc_inc=$libc_prefix/include
|
||||
libc_crt="$libc_lib/crt1.o"
|
||||
libc_start="$libc_lib/crti.o"
|
||||
libc_end="$libc_lib/crtn.o"
|
||||
|
||||
gcc_inc=$libc_inc
|
||||
libgcc="$("$gcc" -print-file-name=libgcc.a)"
|
||||
libgcc=${libgcc%/libgcc.a}
|
||||
|
||||
gccver=${libgcc##*/}
|
||||
gcctarget=${libgcc%/*}
|
||||
gcctarget=${gcctarget##*/}
|
||||
|
||||
case "$gccver" in
|
||||
[0123].*|4.[01]*) ;;
|
||||
*) nosp=-fno-stack-protector ;;
|
||||
esac
|
||||
|
||||
[ "x$1" = "x-V" ] && { printf "%s: -V not supported\n" "$0" ; exit 1 ; }
|
||||
|
||||
for i ; do
|
||||
case "$skip$i" in
|
||||
-I|-L) skip=--- ; continue ;;
|
||||
-[cSE]|-M*) nolink=1 ;;
|
||||
-shared|-nostartfiles|-nostdlib) nocrt=1 ;;
|
||||
-*) ;;
|
||||
*) havefile=1 ;;
|
||||
esac
|
||||
skip=
|
||||
done
|
||||
|
||||
[ "$havefile" ] || nolink=1
|
||||
|
||||
[ "$nolink" ] && nocrt=1
|
||||
|
||||
[ "$nocrt" ] || set -- "$libc_start" "$libc_crt" "$@" "$libc_end" \
|
||||
|
||||
[ "$nolink" ] || {
|
||||
tmp_specs=$HOME/.specs.tmp.$$
|
||||
printf '*link_libgcc:\n\n\n' > "$tmp_specs" || exit 1
|
||||
exec 3<"$tmp_specs"
|
||||
rm -f "$tmp_specs"
|
||||
set -- -specs=/proc/self/fd/3 "$@" \
|
||||
-Wl,--as-needed -Wl,--start-group -lc -lgcc -lgcc_eh -Wl,--end-group \
|
||||
-Wl,-dynamic-linker,"$ldso_pathname" -Wl,-nostdlib
|
||||
}
|
||||
|
||||
set -- -nostdinc -nostdlib $nosp \
|
||||
-isystem "$libc_inc" -isystem "$gcc_inc" "$@" \
|
||||
-L"$libc_lib" -L"$libgcc"
|
||||
|
||||
exec "$gcc" "$@"
|
||||
EOF
|
39
tools/musl-gcc.specs.sh
Normal file
39
tools/musl-gcc.specs.sh
Normal file
@ -0,0 +1,39 @@
|
||||
incdir=$1
|
||||
libdir=$2
|
||||
ldso=$3
|
||||
cat <<EOF
|
||||
%rename cpp_options old_cpp_options
|
||||
|
||||
*cpp_options:
|
||||
-nostdinc -isystem $incdir %(old_cpp_options)
|
||||
|
||||
*cc1:
|
||||
%(cc1_cpu) -nostdinc -isystem $incdir
|
||||
|
||||
*link_libgcc:
|
||||
-L$libdir
|
||||
|
||||
*libgcc:
|
||||
libgcc.a%s %:if-exists(libgcc_eh.a%s)
|
||||
|
||||
*startfile:
|
||||
%{!shared: $libdir/crt1.o} $libdir/crti.o %{shared|pie:crtbeginS.o%s;:crtbegin.o%s}
|
||||
|
||||
*endfile:
|
||||
%{shared|pie:crtendS.o%s;:crtend.o%s} $libdir/crtn.o
|
||||
|
||||
%rename link old_link
|
||||
|
||||
*link:
|
||||
%(old_link) -dynamic-linker $ldso -nostdlib
|
||||
|
||||
*esp_link:
|
||||
|
||||
|
||||
*esp_options:
|
||||
|
||||
|
||||
*esp_cpp_options:
|
||||
|
||||
|
||||
EOF
|
Loading…
Reference in New Issue
Block a user