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:
Rich Felker 2012-04-22 14:32:49 -04:00
parent 02eb568ded
commit 58f430c1e0
4 changed files with 47 additions and 63 deletions

1
.gitignore vendored
View File

@ -7,3 +7,4 @@ arch/*/bits/alltypes.h
config.mak
include/bits
tools/musl-gcc
lib/musl-gcc.specs

View File

@ -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/%

View File

@ -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
View 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