| 1 | #!/bin/sh
 | 
|---|
| 2 | 
 | 
|---|
| 3 | #
 | 
|---|
| 4 | # Copyright (c) 2018 Vojtech Horky
 | 
|---|
| 5 | # All rights reserved.
 | 
|---|
| 6 | #
 | 
|---|
| 7 | # Redistribution and use in source and binary forms, with or without
 | 
|---|
| 8 | # modification, are permitted provided that the following conditions
 | 
|---|
| 9 | # are met:
 | 
|---|
| 10 | #
 | 
|---|
| 11 | # - Redistributions of source code must retain the above copyright
 | 
|---|
| 12 | #   notice, this list of conditions and the following disclaimer.
 | 
|---|
| 13 | # - Redistributions in binary form must reproduce the above copyright
 | 
|---|
| 14 | #   notice, this list of conditions and the following disclaimer in the
 | 
|---|
| 15 | #   documentation and/or other materials provided with the distribution.
 | 
|---|
| 16 | # - The name of the author may not be used to endorse or promote products
 | 
|---|
| 17 | #   derived from this software without specific prior written permission.
 | 
|---|
| 18 | #
 | 
|---|
| 19 | # THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
 | 
|---|
| 20 | # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 | 
|---|
| 21 | # OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
 | 
|---|
| 22 | # IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
 | 
|---|
| 23 | # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 | 
|---|
| 24 | # NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | 
|---|
| 25 | # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | 
|---|
| 26 | # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
|---|
| 27 | # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 | 
|---|
| 28 | # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
|---|
| 29 | #
 | 
|---|
| 30 | 
 | 
|---|
| 31 | #
 | 
|---|
| 32 | # This is wrapper script for testing build of HelenOS under Travis CI [1].
 | 
|---|
| 33 | #
 | 
|---|
| 34 | # You probably do not want to run this script directly. If you wish to test
 | 
|---|
| 35 | # that HelenOS builds for all architectures, consider using either check.sh
 | 
|---|
| 36 | # script or running our CI solution [2] (if you want to test ported software
 | 
|---|
| 37 | # too).
 | 
|---|
| 38 | #
 | 
|---|
| 39 | # [1] https://travis-ci.org/
 | 
|---|
| 40 | # [2] http://www.helenos.org/wiki/CI
 | 
|---|
| 41 | #
 | 
|---|
| 42 | 
 | 
|---|
| 43 | H_ARCH_CONFIG_CROSS_TARGET=2
 | 
|---|
| 44 | H_ARCH_CONFIG_OUTPUT_FILENAME=3
 | 
|---|
| 45 | 
 | 
|---|
| 46 | h_get_arch_config_space() {
 | 
|---|
| 47 |     cat <<'EOF_CONFIG_SPACE'
 | 
|---|
| 48 | amd64:amd64-helenos:image.iso
 | 
|---|
| 49 | arm32/beagleboardxm:arm-helenos:uImage.bin
 | 
|---|
| 50 | arm32/beaglebone:arm-helenos:uImage.bin
 | 
|---|
| 51 | arm32/gta02:arm-helenos:uImage.bin
 | 
|---|
| 52 | arm32/integratorcp:arm-helenos:image.boot
 | 
|---|
| 53 | arm32/raspberrypi:arm-helenos:uImage.bin
 | 
|---|
| 54 | ia32:i686-helenos:image.iso
 | 
|---|
| 55 | ia64/i460GX:ia64-helenos:image.boot
 | 
|---|
| 56 | ia64/ski:ia64-helenos:image.boot
 | 
|---|
| 57 | mips32/malta-be:mips-helenos:image.boot
 | 
|---|
| 58 | mips32/malta-le:mipsel-helenos:image.boot
 | 
|---|
| 59 | mips32/msim:mipsel-helenos:image.boot
 | 
|---|
| 60 | ppc32:ppc-helenos:image.iso
 | 
|---|
| 61 | sparc64/niagara:sparc64-helenos:image.iso
 | 
|---|
| 62 | sparc64/ultra:sparc64-helenos:image.iso
 | 
|---|
| 63 | EOF_CONFIG_SPACE
 | 
|---|
| 64 | }
 | 
|---|
| 65 | 
 | 
|---|
| 66 | h_get_arch_config() {
 | 
|---|
| 67 |     h_get_arch_config_space | grep "^$H_ARCH:" | cut '-d:' -f "$1"
 | 
|---|
| 68 | }
 | 
|---|
| 69 | 
 | 
|---|
| 70 | H_DEFAULT_HARBOURS_LIST="binutils fdlibm jainja libgmp libiconv msim pcc zlib libisl libmpfr libpng python2 libmpc gcc"
 | 
|---|
| 71 | 
 | 
|---|
| 72 | 
 | 
|---|
| 73 | 
 | 
|---|
| 74 | #
 | 
|---|
| 75 | # main script starts here
 | 
|---|
| 76 | #
 | 
|---|
| 77 | 
 | 
|---|
| 78 | # Check we are actually running inside Travis
 | 
|---|
| 79 | if [ -z "$TRAVIS" ]; then
 | 
|---|
| 80 |     echo "\$TRAVIS env not set. Are you running me inside Travis?" >&2
 | 
|---|
| 81 |     exit 5
 | 
|---|
| 82 | fi
 | 
|---|
| 83 | 
 | 
|---|
| 84 | # C style check
 | 
|---|
| 85 | if [ -n "$H_CCHECK" ]; then
 | 
|---|
| 86 |     echo "Will try to run C style check."
 | 
|---|
| 87 |     echo
 | 
|---|
| 88 |     make ccheck || exit 1
 | 
|---|
| 89 |     echo "C style check passed."
 | 
|---|
| 90 |     exit 0
 | 
|---|
| 91 | fi
 | 
|---|
| 92 | 
 | 
|---|
| 93 | # Check HelenOS configuration was set-up
 | 
|---|
| 94 | if [ -z "$H_ARCH" ]; then
 | 
|---|
| 95 |     echo "\$H_ARCH env not set. Are you running me inside Travis?" >&2
 | 
|---|
| 96 |     exit 5
 | 
|---|
| 97 | fi
 | 
|---|
| 98 | 
 | 
|---|
| 99 | # Check cross-compiler target
 | 
|---|
| 100 | H_CROSS_TARGET=`h_get_arch_config $H_ARCH_CONFIG_CROSS_TARGET`
 | 
|---|
| 101 | if [ -z "$H_CROSS_TARGET" ]; then
 | 
|---|
| 102 |     echo "No suitable cross-target found for '$H_ARCH.'" >&2
 | 
|---|
| 103 |     exit 1
 | 
|---|
| 104 | fi
 | 
|---|
| 105 | 
 | 
|---|
| 106 | # Default Harbours repository
 | 
|---|
| 107 | if [ -z "$H_HARBOURS_REPOSITORY" ]; then
 | 
|---|
| 108 |     H_HARBOURS_REPOSITORY="https://github.com/HelenOS/harbours.git"
 | 
|---|
| 109 | fi
 | 
|---|
| 110 | 
 | 
|---|
| 111 | if [ "$1" = "help" ]; then
 | 
|---|
| 112 |     echo
 | 
|---|
| 113 |     echo "Following variables needs to be set prior running this script."
 | 
|---|
| 114 |     echo "Example settings follows:"
 | 
|---|
| 115 |     echo
 | 
|---|
| 116 |     echo "export H_ARCH=$H_ARCH"
 | 
|---|
| 117 |     echo "export TRAVIS_BUILD_ID=`date +%s`"
 | 
|---|
| 118 |     echo
 | 
|---|
| 119 |     echo "export H_HARBOURS=true"
 | 
|---|
| 120 |     echo "export H_HARBOUR_LIST=\"$H_DEFAULT_HARBOURS_LIST\""
 | 
|---|
| 121 |     echo
 | 
|---|
| 122 |     echo "or"
 | 
|---|
| 123 |     echo
 | 
|---|
| 124 |     echo "export H_CCHECK=true"
 | 
|---|
| 125 |     echo
 | 
|---|
| 126 |     exit 0
 | 
|---|
| 127 | 
 | 
|---|
| 128 | elif [ "$1" = "install" ]; then
 | 
|---|
| 129 |     set -x
 | 
|---|
| 130 | 
 | 
|---|
| 131 |     # Fetch and install cross-compiler
 | 
|---|
| 132 |     wget "https://helenos.s3.amazonaws.com/toolchain/$H_CROSS_TARGET.tar.xz" -O "/tmp/$H_CROSS_TARGET.tar.xz" || exit 1
 | 
|---|
| 133 |     sudo tar -xJ -C "/" -f "/tmp/$H_CROSS_TARGET.tar.xz" || exit 1
 | 
|---|
| 134 |     exit 0
 | 
|---|
| 135 | 
 | 
|---|
| 136 | elif [ "$1" = "run" ]; then
 | 
|---|
| 137 |     set -x
 | 
|---|
| 138 | 
 | 
|---|
| 139 |     # Expected output filename (bootable image)
 | 
|---|
| 140 |     H_OUTPUT_FILENAME=`h_get_arch_config $H_ARCH_CONFIG_OUTPUT_FILENAME`
 | 
|---|
| 141 |     if [ -z "$H_OUTPUT_FILENAME" ]; then
 | 
|---|
| 142 |         echo "No suitable output image found for '$H_ARCH.'" >&2
 | 
|---|
| 143 |         exit 1
 | 
|---|
| 144 |     fi
 | 
|---|
| 145 | 
 | 
|---|
| 146 |     # Build HARBOURs too?
 | 
|---|
| 147 |     H_HARBOURS=`echo "$H_HARBOURS" | grep -e '^true$' -e '^false$'`
 | 
|---|
| 148 |     if [ -z "$H_HARBOURS" ]; then
 | 
|---|
| 149 |         H_HARBOURS=false
 | 
|---|
| 150 |     fi
 | 
|---|
| 151 |     if [ -z "$H_HARBOUR_LIST" ]; then
 | 
|---|
| 152 |         H_HARBOUR_LIST="$H_DEFAULT_HARBOURS_LIST"
 | 
|---|
| 153 |     fi
 | 
|---|
| 154 | 
 | 
|---|
| 155 | 
 | 
|---|
| 156 |     # Build it
 | 
|---|
| 157 |     make "PROFILE=$H_ARCH" HANDS_OFF=y || exit 1
 | 
|---|
| 158 |     test -s "$H_OUTPUT_FILENAME" || exit 1
 | 
|---|
| 159 | 
 | 
|---|
| 160 |     echo
 | 
|---|
| 161 |     echo "HelenOS for $H_ARCH built okay."
 | 
|---|
| 162 |     echo
 | 
|---|
| 163 | 
 | 
|---|
| 164 |     # Build harbours
 | 
|---|
| 165 |     if $H_HARBOURS; then
 | 
|---|
| 166 |         echo
 | 
|---|
| 167 |         echo "Will try to build ported software for $H_ARCH."
 | 
|---|
| 168 |         echo "Repository used is $H_HARBOURS_REPOSITORY."
 | 
|---|
| 169 |         echo
 | 
|---|
| 170 | 
 | 
|---|
| 171 |         H_HELENOS_HOME=`pwd`
 | 
|---|
| 172 |         cd "$HOME" || exit 1
 | 
|---|
| 173 |         git clone --depth 10 "$H_HARBOURS_REPOSITORY" helenos-harbours || exit 1
 | 
|---|
| 174 |         mkdir "build-harbours-$TRAVIS_BUILD_ID" || exit 1
 | 
|---|
| 175 |         (
 | 
|---|
| 176 |             cd "build-harbours-$TRAVIS_BUILD_ID" || exit 1
 | 
|---|
| 177 |             mkdir build || exit 1
 | 
|---|
| 178 |             cd build
 | 
|---|
| 179 | 
 | 
|---|
| 180 |             (
 | 
|---|
| 181 |                 #[ "$H_ARCH" = "mips32/malta-be" ] && H_ARCH="mips32eb/malta-be"
 | 
|---|
| 182 |                 echo "root = $H_HELENOS_HOME"
 | 
|---|
| 183 |                 echo "arch =" `echo "$H_ARCH" | cut -d/ -f 1`
 | 
|---|
| 184 |                 echo "machine =" `echo "$H_ARCH" | cut -d/ -f 2`
 | 
|---|
| 185 |             ) >hsct.conf || exit 1
 | 
|---|
| 186 | 
 | 
|---|
| 187 |             "$HOME/helenos-harbours/hsct.sh" init "$H_HELENOS_HOME" || exit 1
 | 
|---|
| 188 | 
 | 
|---|
| 189 |             # We cannot flood the output as Travis has limit of maximum output size
 | 
|---|
| 190 |             # (reason is to prevent endless stacktraces going forever). But also Travis
 | 
|---|
| 191 |             # kills a job that does not print anything for a while.
 | 
|---|
| 192 |             #
 | 
|---|
| 193 |             # So we store the full output into a file  and print single dot for each line.
 | 
|---|
| 194 |             # As pipe tends to hide errors we check the success by checking that archive
 | 
|---|
| 195 |             # exists.
 | 
|---|
| 196 |             #
 | 
|---|
| 197 |             FAILED_HARBOURS=""
 | 
|---|
| 198 |             for HARBOUR in $H_HARBOUR_LIST; do
 | 
|---|
| 199 |                 "$HOME/helenos-harbours/hsct.sh" archive --no-deps "$HARBOUR" 2>&1 | tee "run-$HARBOUR.log" | awk '// {printf "."}'
 | 
|---|
| 200 | 
 | 
|---|
| 201 |                 test -s "archives/$HARBOUR.tar.xz"
 | 
|---|
| 202 |                 if [ $? -eq 0 ]; then
 | 
|---|
| 203 |                     tail -n 10 "run-$HARBOUR.log"
 | 
|---|
| 204 |                 else
 | 
|---|
| 205 |                     FAILED_HARBOURS="$FAILED_HARBOURS $HARBOUR"
 | 
|---|
| 206 |                     cat build/$HARBOUR/*/config.log
 | 
|---|
| 207 |                     tail -n 100 "run-$HARBOUR.log"
 | 
|---|
| 208 |                 fi
 | 
|---|
| 209 | 
 | 
|---|
| 210 |             done
 | 
|---|
| 211 | 
 | 
|---|
| 212 |             if [ -n "$FAILED_HARBOURS" ]; then
 | 
|---|
| 213 |                 echo
 | 
|---|
| 214 |                 echo "ERROR: following packages were not built:$FAILED_HARBOURS."
 | 
|---|
| 215 |                 echo
 | 
|---|
| 216 |                 exit 1
 | 
|---|
| 217 |             fi
 | 
|---|
| 218 |         ) || exit 1
 | 
|---|
| 219 |     fi
 | 
|---|
| 220 | else
 | 
|---|
| 221 |     echo "Invalid action specified." >&2
 | 
|---|
| 222 |     exit 5
 | 
|---|
| 223 | fi
 | 
|---|
| 224 | 
 | 
|---|