tech-toolchain archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[PATCH] build.sh: Wrap host toolchain for rump builds
This enables host tool wrappers to be built with
'-V TOOLS_BUILDRUMP=yes tools' when built on non-NetBSD.
It enables rump and rumptest targets to work and libs
to be linked without building gcc on the other system without
breaking the targets on NetBSD.
TESTED on NetBSD:
./build.sh -V TOOLS_BUILDRUMP=yes -V MKGROFF=no \
-u -U -T ../tooldir tools rumptest
./build.sh -V TOOLS_BUILDRUMP=yes -V MKGROFF=no \
-u -U -T ../tooldir tools rump
TESTED on GNU/Hurd:
HOST_CC=gcc LDADD="-L/usr/lib/i386-gnu -L/usr/lib/gcc/i686-gnu/10" \
_GCC_CRTENDS= _GCC_CRTBEGINS= _GCC_CRTI= _GCC_CRTN= \
CFLAGS=-Wno-error=stack-protector \
./build.sh -V TOOLS_BUILDRUMP=yes -V MKGROFF=no \
-U -u -T ../tools -m i386 tools rumptest
HOST_CC=gcc LDADD="-L/usr/lib/i386-gnu -L/usr/lib/gcc/i686-gnu/10" \
_GCC_CRTENDS= _GCC_CRTBEGINS= _GCC_CRTI= _GCC_CRTN= \
CFLAGS=-Wno-error=stack-protector \
./build.sh -V TOOLS_BUILDRUMP=yes -V MKGROFF=no \
-U -u -T ../tools -m i386 tools rump
---
build.sh | 141 +++++++++++++++++++++++++++++++++++++++++++++----
tools/Makefile | 4 +-
2 files changed, 134 insertions(+), 11 deletions(-)
diff --git a/build.sh b/build.sh
index be70b3bfc4e5..deabe7c801d6 100755
--- a/build.sh
+++ b/build.sh
@@ -2195,6 +2195,121 @@ installworld()
statusmsg "Successful installworld to ${dir}"
}
+printoneconfig ()
+{
+
+ [ -z "${2}" ] || printf "%-5s %-18s: %s\n" "${1}" "${2}" "${3}"
+}
+
+WRAPPERBODY='int
+main(int argc, const char *argv[])
+{
+ int i, j, k;
+
+ for (i = 1; i < argc; i++) {
+ for (j = 0; j < sizeof(mngl_from)/sizeof(mngl_from[0]); j++) {
+ if (strcmp(argv[i], mngl_from[j]) == 0) {
+ if (strlen(mngl_to[j]) == 0) {
+ for (k = i; k < argc; k++) {
+ argv[k] = argv[k+1];
+ }
+ argv[k] = '\0';
+ argc--;
+ } else {
+ argv[i] = mngl_to[j];
+ }
+ break;
+ }
+ }
+ }
+'
+
+maketoolwrapper ()
+{
+
+ musthave=$1
+ tool=$2
+
+ if [ "${tool}" = "CC" ]; then
+ lctool=gcc
+ elif [ "${tool}" = "CXX" ]; then
+ lctool=g++
+ else
+ lctool=$(echo ${tool} | tr '[A-Z]' '[a-z]')
+ fi
+ fptool=$(command -v ${lctool})
+ if [ ! -x ${fptool} ]; then
+ if ! ${musthave}; then
+ return
+ else
+ bomb "Internal error: mandatory tool ${tool} not found"
+ fi
+ fi
+
+ eval ttool=\'\${${tool}}\'
+ tname=`${runcmd} "${makewrapper}" -V "${ttool}"`
+ printoneconfig 'Tool' "${fptool}" "${tname}"
+
+ # Mangle wrapper arguments from what NetBSD does to what the
+ # toolchain we use supports. In case we need mangling, do it
+ # with a C wrapper to preserve all quoting etc. (couldn't
+ # figure out how to get that right with a shell.
+ rm -f ${TOOLDIR}/wrapper.c
+ exec 3>&1 1>${TOOLDIR}/wrapper.c
+ printf '#include <inttypes.h>\n'
+ printf '#include <string.h>\n'
+ printf '#include <unistd.h>\n\n'
+ printf 'static const char *mngl_from[] = {\n'
+ (
+ IFS=:
+ for xf in ${CCWRAPPER_MANGLE}; do
+ IFS=' '
+ set -- ${xf}
+ printf '\t"%s",\n' ${1}
+ done
+ )
+ printf '};\nstatic const char *mngl_to[] ={\n'
+ (
+ IFS=:
+ for xf in ${CCWRAPPER_MANGLE}; do
+ IFS=' '
+ set -- ${xf}
+ printf '\t"%s",\n' ${2:-}
+ done
+ )
+ printf '};\n\n'
+ ( IFS=' ' printf '%s' "${WRAPPERBODY}" )
+ printf '\targv[0] = "%s";\n' ${fptool}
+ printf '\texecvp(argv[0], (void *)(uintptr_t)argv);\n'
+ printf '\treturn 0;\n}\n'
+ exec 1>&3 3>&-
+
+ ${HOST_CC} ${TOOLDIR}/wrapper.c -o ${tname} \
+ || bomb "failed to build wrapper for ${tool}"
+ rm -f ${TOOLDIR}/wrapper.c
+
+ chmod 755 ${tname}
+}
+
+makerumptools ()
+{
+ [ -n "${TOOLDIR}" ] || bomb "TOOLDIR not set"
+
+ # Create external toolchain wrappers.
+ mkdir -p ${TOOLDIR}/bin || bomb "cannot create ${TOOLDIR}/bin"
+ for x in CC AR NM OBJCOPY; do
+ maketoolwrapper true $x
+ done
+ for x in AS LD OBJDUMP RANLIB READELF SIZE STRINGS STRIP CXX; do
+ maketoolwrapper false $x
+ done
+
+ # create a cpp wrapper, but run it via cc -E
+ tname=`${runcmd} "${makewrapper}" -V '${CPP}'`
+ printf '#!/bin/sh\n\nexec %s -E -x c "${@}"\n' ${CC} > ${tname}
+ chmod 755 ${tname}
+}
+
# Run rump build&link tests.
#
# To make this feasible for running without having to install includes and
@@ -2260,14 +2375,14 @@ dorump()
# one little, two little, three little backslashes ...
md_quirks="$(echo ${md_quirks} | sed 's,\\,\\\\,g'";s/'//g" )"
${runcmd} cd "${TOP}" || bomb "cd to ${TOP} failed"
- tool_ld=`${runcmd} "${makewrapper}" -V '${LD}'`
+ tool_cc=`${runcmd} "${makewrapper}" -V '${CC}'`
local oIFS="${IFS}"
IFS=","
for set in ${RUMP_LIBSETS} ; do
IFS="${oIFS}"
- ${runcmd} ${tool_ld} -nostdlib -L${DESTDIR}/usr/lib \
- -static --whole-archive -lpthread -lc ${set} 2>&1 -o /tmp/rumptest.$$ | \
+ ${runcmd} ${tool_cc} -nostdlib -L${DESTDIR}/usr/lib \
+ -static --whole-archive -lpthread -lc -lgcc ${set} 2>&1 -o /tmp/rumptest.$$ | \
awk -v quirks="${md_quirks}" '
/undefined reference/ &&
!/more undefined references.*follow/{
@@ -2485,16 +2600,24 @@ main()
;;
rump)
- make_in_dir . do-distrib-dirs
- make_in_dir . includes
- make_in_dir lib/csu dependall
- make_in_dir lib/csu install
- make_in_dir external/gpl3/gcc/lib/libgcc dependall
- make_in_dir external/gpl3/gcc/lib/libgcc install
+ if [ "${uname_s}" != "NetBSD" ] || \
+ [ "${uname_m}" != "${MACHINE}" ]; then
+ makerumptools
+ else
+ make_in_dir . includes
+ make_in_dir lib/csu dependall
+ make_in_dir lib/csu install
+ make_in_dir external/gpl3/gcc/lib/libgcc dependall
+ make_in_dir external/gpl3/gcc/lib/libgcc install
+ fi
dorump "${op}"
;;
rumptest)
+ if [ "${uname_s}" != "NetBSD" ] || \
+ [ "${uname_m}" != "${MACHINE}" ]; then
+ makerumptools
+ fi
dorump "${op}"
;;
diff --git a/tools/Makefile b/tools/Makefile
index 177cd1846cda..1ab0135b59f3 100644
--- a/tools/Makefile
+++ b/tools/Makefile
@@ -100,10 +100,10 @@ SUBDIR= host-mkdep compat binstall date \
.if ${TOOLS_BUILDRUMP} == "no"
SUBDIR+= cap_mkdb crunchgen ctags gencat hexdump \
${LINT_BITS} \
- makewhatis mtree nbperf .WAIT uudecode
+ makewhatis nbperf .WAIT uudecode
.endif
-SUBDIR+= cat rpcgen join lorder m4 mkdep tsort .WAIT yacc .WAIT awk .WAIT lex
+SUBDIR+= mtree cat rpcgen join lorder m4 mkdep tsort .WAIT yacc .WAIT awk .WAIT lex
.if ${TOOLS_BUILDRUMP} == "no"
SUBDIR+= xz-include .WAIT grep xz-lib pax .WAIT libprop
--
2.25.2
Home |
Main Index |
Thread Index |
Old Index