From df381762dc462d62b4a2994fa6399f5cfa8891a3 Mon Sep 17 00:00:00 2001 From: Joseph Myers Date: Thu, 25 Oct 2012 19:17:45 +0000 Subject: [PATCH] Add cross-test-ssh.sh. --- ChangeLog | 8 +++ INSTALL | 8 ++- manual/install.texi | 9 ++- scripts/cross-test-ssh.sh | 148 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 171 insertions(+), 2 deletions(-) create mode 100755 scripts/cross-test-ssh.sh diff --git a/ChangeLog b/ChangeLog index b3876060de..2ce7d91c78 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2012-10-25 Joseph Myers + Jim Blandy + + * scripts/cross-test-ssh.sh: New file. + * manual/install.texi (Configuring and compiling): Document use of + cross-test-ssh.sh. + * INSTALL: Regenerated. + 2012-10-25 Pino Toscano * sysdeps/mach/hurd/ptrace.c (ptrace): Use __hurd_fail to return diff --git a/INSTALL b/INSTALL index d4fabe96c7..9c62786de0 100644 --- a/INSTALL +++ b/INSTALL @@ -196,7 +196,13 @@ this: `CC=TARGET-gcc configure TARGET'. Set `BUILD_CC' to the compiler to use for programs run on the build system as part of compiling the library. You may need to set `AR' to cross-compiling versions of `ar' if the native tools are not configured to work with object files for -the target you configured for. +the target you configured for. When cross-compiling the GNU C Library, +it may be tested using `make check +test-wrapper="SRCDIR/scripts/cross-test-ssh.sh HOSTNAME"', where SRCDIR +is the absolute directory name for the main source directory and +HOSTNAME is the host name of a system that can run the newly built +binaries of the GNU C Library. The source and build directories must +be visible at the same locations on both the build system and HOSTNAME. Installing the C Library ======================== diff --git a/manual/install.texi b/manual/install.texi index 5aca058653..c82b918ca7 100644 --- a/manual/install.texi +++ b/manual/install.texi @@ -224,7 +224,14 @@ important to use this same @code{CC} value when running run on the build system as part of compiling the library. You may need to set @code{AR} to cross-compiling versions of @code{ar} if the native tools are not configured to work with -object files for the target you configured for. +object files for the target you configured for. When cross-compiling +@theglibc{}, it may be tested using @samp{make check +test-wrapper="@var{srcdir}/scripts/cross-test-ssh.sh @var{hostname}"}, +where @var{srcdir} is the absolute directory name for the main source +directory and @var{hostname} is the host name of a system that can run +the newly built binaries of @theglibc{}. The source and build +directories must be visible at the same locations on both the build +system and @var{hostname}. @node Running make install diff --git a/scripts/cross-test-ssh.sh b/scripts/cross-test-ssh.sh new file mode 100755 index 0000000000..f09c98ec11 --- /dev/null +++ b/scripts/cross-test-ssh.sh @@ -0,0 +1,148 @@ +#! /bin/bash +# Run a testcase on a remote system, via ssh. +# Copyright (C) 2012 Free Software Foundation, Inc. +# This file is part of the GNU C Library. + +# The GNU C Library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. + +# The GNU C Library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. + +# You should have received a copy of the GNU Lesser General Public +# License along with the GNU C Library; if not, see +# . + +# usage: cross-test-ssh.sh [--ssh SSH] HOST COMMAND ... +# Run with --help flag to get more detailed help. + +progname="$(basename $0)" +env_blacklist='HOME LOGNAME MAIL PATH SHELL SHLVL SSH_CLIENT SSH_CONNECTION +USER TERM TERMCAP PWD' + +usage="usage: ${progname} [--ssh SSH] HOST COMMAND ..." +help="Run a glibc test COMMAND on the remote machine HOST, via ssh, +passing environment variables, preserving the current working directory, +and respecting quoting. + +If the '--ssh SSH' flag is present, use SSH as the SSH command, +instead of ordinary 'ssh'. + +To use this to run glibc tests, invoke the tests as follows: + + $ make test-wrapper='ABSPATH/cross-test-ssh.sh HOST' tests + +where ABSPATH is the absolute path to this script, and HOST is the +name of the machine to connect to via ssh. + +If you need to connect to the test machine as a different user, you +may specify that just as you would to SSH: + + $ make test-wrapper='ABSPATH/cross-test-ssh.sh USER@HOST' tests + +Naturally, the remote user must have an appropriate public key, and +you will want to ensure that SSH does not prompt interactively for a +password on each connection. + +HOST and the build machines (on which 'make check' is being run) must +share a filesystem; all files needed by the tests must be visible at +the same paths on both machines. + +${progname} runs COMMAND in the same directory on the HOST that +${progname} itself is run in on the build machine. + +The command and arguments are passed to the remote host in a way that +avoids any further shell substitution or expansion, on the assumption +that the shell on the build machine has already done them +appropriately. + +${progname} propagates the values all environment variables through to +the remote target, except the following: +${env_blacklist}" + +ssh='ssh' +while [ $# -gt 0 ]; do + case "$1" in + + "--ssh") + shift + if [ $# -lt 1 ]; then + break + fi + ssh="$1" + ;; + + "--help") + echo "$usage" + echo "$help" + exit 0 + ;; + + *) + break + ;; + esac + shift +done + +if [ $# -lt 1 ]; then + echo "$usage" >&2 + echo "Type '${progname} --help' for more detailed help." >&2 + exit 1 +fi + +host="$1"; shift + +# Print the sequence of arguments as strings properly quoted for the +# Bourne shell, separated by spaces. +bourne_quote () +{ + local arg qarg + for arg in "$@"; do + qarg=${arg//\'/\'\\\'\'} + echo -n "'$qarg' " + done +} + +# Remove unnecessary newlines from a Bourne shell command sequence. +remove_newlines () +{ + sed -n \ + -e '1h' \ + -e '2,$H' \ + -e '${g + s/\([^\]\)\n/\1; /g + p + }' +} + +# Unset all variables from the blacklist. Then echo all exported +# variables. The 'export -p' command adds backslashes for environment +# variables which contain newlines. +blacklist_exports () +{ + (unset ${env_blacklist}; export -p) | remove_newlines +} + +# Produce properly quoted Bourne shell arguments for 'env' to carry +# over the current environment, less blacklisted variables. +exports="$(blacklist_exports)" +exports="${exports:+${exports}; }" + +# Transform the current argument list into a properly quoted Bourne shell +# command string. +command="$(bourne_quote "$@")" + +# Add commands to set environment variables and the current directory. +command="${exports}cd $PWD; ${command}" + +# HOST's sshd simply concatenates its arguments with spaces and +# passes them to some shell. We want to force the use of /bin/sh, +# so we need to re-quote the whole command to ensure it appears as +# the sole argument of the '-c' option. +full_command="$(bourne_quote "${command}")" +$ssh "$host" /bin/sh -c "$full_command"