summaryrefslogtreecommitdiff
path: root/TestRelease.job
blob: 83148ec003b81aa1798aad96fe2e566475ad8c0f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
#!/bin/bash

# Set defaults
if test x"${debug}" = x"true"; then
    export CONFIG_SHELL="/bin/bash -x"
else
    export CONFIG_SHELL="/bin/bash"
fi

user_workspace="$PWD"

OPTS="`getopt -o w:t:h -l tarball:,workspace:,help`"
while test $# -gt 0; do
    echo 1 = "$1"
    case $1 in
	-w|--workspace) user_workspace=$2 ;;
	-t|--tarball) tarball=$2 ;;
        -h|--help) usage ;;
	--) break ;;
    esac
    shift
done

if test -e ${user_workspace}; then
    cat << EOF > ${user_workspace}/BUILD-INFO.txt
Format-Version: 0.5

Files-Pattern: *
License-Type: open
EOF
fi

testdir=${user_workspace}/_test

# Create a test directory
if test ! -d ${testdir}; then
    mkdir -p ${testdir}
fi

# Use the newly created build directory
cd ${testdir}

file=`basename ${tarball}`
tarball_name="${testdir}/${file}"
protocol="`echo ${tarball} | cut -d ':' -f 1`"
if test x${protocol} = x"file"; then
    tarball_name="`echo ${tarball} | sed -e 's:file./::'`"
else
    # Download the toolchain binary tarball
    if test ! -e ${testdir}/${file}; then
	wget ${tarball} --directory=${testdir} --progress=dot:giga
	if test $? -gt 0; then
	    echo "ERROR: ${tarball} doesn't exist on remote machine!"
	    exit 1
	fi
    fi
fi

# Extract the tarball
dir="`echo ${file} | sed -e 's:.tar.xz::'`"
tar Jxf ${tarball_name} --directory=${testdir}
if test $? -gt 0; then
    echo "ERROR: ${tarball} is corrupted!"
    exit 1
fi

# Create a simple test case
if test ! -e ${testdir}/hello.cpp; then
    # Create the usual Hello World! test case
    cat <<EOF > ${testdir}/hello.cpp
#include <iostream>
int
main(int argc, char *argv[])
{
    std::cout << "Hello World!" << std::endl; 
}
EOF
fi

target="`echo ${dir} | egrep -o '(arm|aarch64)[_0-9a-z-]*' | sed -e 's:-\$::'`"
win32="`echo {$file} | grep -c mingw`"

# For Windows releases, check for symlinks in the release tarball. Some
# extractors for Windows do not handle symlinks well, so Abe should
# generate tarballs without symlinks.
if test ${win32} -ne 0; then
    find "${testdir}" -type l > ${testdir}/symlinks.txt 2>&1
    SYMLINKS="$(grep -c ^ ${testdir}/symlinks.txt)"
    if [ "$SYMLINKS" -eq 0 ]; then
        echo "No symlinks found in release"
    else
        cat ${testdir}/symlinks.txt
        echo "Found symlinks in release: FAILURE"
        exit 1
    fi
fi


# Bare metal builds need special care
baremetal="`echo ${target} | egrep -c "\-eabi|\-elf"`"
if test ${baremetal} -gt 0; then
    case ${target} in
	aarch64*)
	    # AArch64 needs specs
	    rdimon="`find ${testdir} -name rdimon.specs | head -1`"
	    specs="${rdimon:+--specs=${rdimon}}"
	    ;;
	arm*)
	    # ARM does not need specs, but the default cpu implies
	    # undefined references to __sync_synchronize
	    specs="-mcpu=cortex-a9"
	    ;;
    esac
fi

# Compile the test case
rm -f ${testdir}/hi
params="-o ${testdir}/hi ${testdir}/hello.cpp ${specs:-} -static"
if test ${win32} -eq 0; then
    ${testdir}/${dir}/bin/${target}-c++ ${params}
else
    # Compilation may fail if the paths are too long.
    # Create a G: drive, as a shortcut makes wine automagically use
    # it.
    # Make sure WINEPREFIX exists by running a dummy command
    export WINEPREFIX="$(pwd)/dotwine"
    echo "ECHO Hello" | wine cmd
    rm -f ${WINEPREFIX}/dosdevices/g:
    ln -s ${testdir}/${dir} ${WINEPREFIX}/dosdevices/g:
    wine ${testdir}/${dir}/bin/${target}-c++ ${params}
fi

# See if the compilation worked
if test -e ${testdir}/hi; then
    echo Compilation of hello.cpp: SUCCESS
    exit 0
else
    echo Compilation of hello.cpp: FAILED
    exit 1
fi