aboutsummaryrefslogtreecommitdiff
path: root/build-all-archs
blob: e89851b32c7096f1debe0b9a26e6ddaac6faf206 (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
#!/bin/bash -e
#
# Simple script to build risu for all architectures
#
# Copyright (c) 2017 Linaro Limited
# All rights reserved. This program and the accompanying materials
# are made available under the terms of the Eclipse Public License v1.0
# which accompanies this distribution, and is available at
# http://www.eclipse.org/legal/epl-v10.html
#
# Contributors:
#     Peter Maydell (Linaro) - initial implementation

# Simple usage
usage() {
    cat <<-EOF
        Usage: $0 [options]

        Options include:
            --static               build a static binary
            --use-docker[=tags]    use docker cross compile

        If specifying docker the default will be to use the any
        qemu:debian-FOO-cross targets available on your system.
EOF
    exit 1
}

while [[ "$1" = -* ]]; do
    opt="$1"; shift
    arg=
    if [[ "$opt" = *=* ]]; then
        arg="${opt#*=}"
        opt="${opt%%=*}"
    fi
    case "$opt" in
        --static)
            CONF="--static"
            ;;
        --use-docker)
            if [ -z "$arg" ]; then
                default_tags=$(docker images qemu --format "{{.Repository}}:{{.Tag}}" | grep "\(arm\|ppc64el\|m68k\|i386\).*cross$")
                docker_tags=$(echo $default_tags | sed 's/\n/\s/g' )
            else
                docker_tags="$arg"
            fi
            ;;
        --help)
            usage
            ;;
        *)
            usage
            ;;
    esac
done

#
# If you are developing your primary architecture directly out of the
# source tree you can confuse any out-of-tree builds thanks to random
# crap in your VPATH. Let's detect that and save some hair pulling.
#
if [ -e Makefile.in ]; then
    echo "Cleaning in-src-tree build"
    make distclean
fi

# Debian stretch and Ubuntu Xenial have cross compiler packages for
# all of these:
#   gcc-arm-linux-gnueabihf gcc-aarch64-linux-gnu gcc-m68k-linux-gnu
#   gcc-powerpc64le-linux-gnu gcc-powerpc64-linux-gnu
# If docker is enabled we just brute force the various images until we
# can set the one that has a workable cross compiler.

DOCKER_RUN="docker run --rm -u $(id -u) -v $(pwd):$(pwd) -w $(pwd)"

program_exists() {
    if [[ ! -z "$docker_tags" && ! "$1" == "x86_64-linux-gnu-gcc" ]]; then
        use_docker_tag=""
        for tag in $docker_tags; do
            if ${DOCKER_RUN} ${tag} /bin/bash -c "command -v $1 >/dev/null"; then
                use_docker_tag=$tag
                return
            fi
        done
    fi

    command -v "$1" >/dev/null 2>&1
}

# powerpc64-linux-gnu doesn't work at the moment, so not yet listed.
for triplet in i386-linux-gnu i686-linux-gnu x86_64-linux-gnu \
                   aarch64-linux-gnu arm-linux-gnueabihf \
                   m68k-linux-gnu \
                   powerpc64le-linux-gnu powerpc64-linux-gnu \
                   s390x-linux-gnu ; do

    if ! program_exists "${triplet}-gcc"; then
        echo "Skipping ${triplet}: no compiler found"
        continue
    else
        echo "Building ${triplet} on ${use_docker_tag:-host}..."
    fi

    # Do a complete rebuild from scratch, because it's cheap enough.
    rm -rf build/${triplet}
    mkdir -p build/${triplet}

    CONFIGURE="cd build/${triplet} && CROSS_PREFIX="${triplet}-"  ../../configure ${CONF}"
    MAKE="make -C build/${triplet} EXTRA_CFLAGS=-Werror"

    if [ -z "$use_docker_tag" ]; then
        /bin/bash -c "${CONFIGURE}"
        ${MAKE}
    else
        ${DOCKER_RUN} $use_docker_tag /bin/bash -c "${CONFIGURE}"
        ${DOCKER_RUN} $use_docker_tag /bin/bash -c "${MAKE}"
    fi
done

# Now run risugen for all architectures
mkdir -p build/risuout
set -o pipefail # detect failures in pipeline

for f in *.risu; do
    echo "Running risugen on $f..."
    # The grep is a quick hack to avoid flooding the terminal with an
    # enormous list of patterns. Ideally we should make risugen
    # have a --quiet option or similar.
    ./risugen --numinsns 10000 $f build/risuout/$f.out | grep -v '^Generating code using patterns'
done