#!/usr/bin/bash # This script can be invoked as follows: # # glibc-bench-compare [options] [BUILD] # # Options may be one of the following: # # -t The BUILD arguments are task ids and not a version-release string # -a ARCH Do comparison for ARCH architecture # # If any of the above options are given, both BUILD arguments must be given. # Otherwise, if only one BUILD is specified, then it is compared against the # installed glibc. # Silence the pushd/popd messages pushd() { command pushd "$@" > /dev/null 2>&1 } popd() { command popd "$@" > /dev/null 2>&1 } # Clean up any downloaded files before we exit trap "rm -rf /tmp/glibc-bench-compare.$BASHPID.*" EXIT task=0 arch=$(uname -i) options=0 path=0 installed= # Look for any commandline options while getopts ":tpa:" opt; do case $opt in p) path=1 ;; t) task=1 options=1 echo "Not implemented." exit 1 ;; a) arch=$OPTARG options=1 ;; *) ;; esac done # Done, now shift all option arguments out. shift $((OPTIND-1)) if [ $# -gt 2 ] || [ $# -eq 0 ] || [ $# -lt 2 -a $options -eq 1 ]; then echo "Usage: $0 [OPTIONS] [new]" echo echo "OPTIONS:" echo -e "\t-t\tCompare two brew tasks" echo -e "\t-a ARCH\tGet rpms for the ARCH architecture" echo -e "\t-p\tCompare built rpms in two paths." echo -e "\t\tThis minimally needs glibc, glibc-common and glibc-benchtests" exit 1 fi if [ -z $2 ]; then new="$1" old=$(rpm --queryformat "%{VERSION}-%{RELEASE}\n" -q glibc | head -1) installed=$old else new="$2" old="$1" fi decompress_rpms() { # We were given a path to the rpms. Figure out the version-release and # decompress the rpms. if [ -n $1 ]; then vr=$(rpm --queryformat="%{VERSION}-%{RELEASE}" -qp $1/glibc-2*.rpm | head -1) mkdir $vr && pushd $vr fi for r in $1*.rpm; do ( rpm2cpio $r | cpio -di ) > /dev/null done if [ -n $1 ]; then popd echo $vr fi } # Get rpms for a build and decompress them get_build() { echo "Processing build $1" mkdir $1 && pushd $1 brew buildinfo "glibc-$1" | sed -n -e "s|/mnt/koji\(.\+$arch.\+\)|http://kojipkgs.fedoraproject.org\1|p" | while read url; do echo "Downloading $url" wget -q $url done decompress_rpms echo "Removing rpms" rm -f $1/*.rpm popd } # Run benchmarks for a build run_bench() { if [ -z $1 ]; then make DETAILED=1 ver=$installed prefix= -f /usr/libexec/glibc-benchtests/bench.mk bench else make DETAILED=1 ver=$1 prefix=$PWD -f $1/usr/libexec/glibc-benchtests/bench.mk bench fi } # Get absolute paths if needed, since we will change into the working directory # next. if [ $path -eq 1 ]; then old_path=$(realpath $old)/ new_path=$(realpath $new)/ fi tmpdir=$(mktemp -p /tmp -d glibc-bench-compare.$$.XXXX) pushd $tmpdir # Get both builds. if [ $path -eq 0 ]; then if [ -z $installed ]; then get_build $old fi get_build $new else old=$(decompress_rpms $old_path) new=$(decompress_rpms $new_path) fi # make bench for each of those. if [ -z $installed ]; then run_bench $old else run_bench fi run_bench $new # Now run the comparison script. $old/usr/libexec/glibc-benchtests/compare_bench.py $old/usr/libexec/glibc-benchtests/benchout.schema.json \ bench.$old.out bench.$new.out