Add Mynewt target builds to CI

Adds scripts to build and test many Mynewt project configurations; this
avoids breaking builds after changes are not tested for some particular
configuration option.

Signed-off-by: Fabio Utzig <utzig@apache.org>
diff --git a/.travis.yml b/.travis.yml
index 3e2e839..8f6a84a 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -2,7 +2,10 @@
 
 language: rust
 
-cache: cargo
+cache:
+  directories:
+    - $HOME/TOOLCHAIN
+    - cargo
 
 matrix:
   include:
@@ -36,6 +39,12 @@
     #- os: linux
     #  env: MULTI_FEATURES="sig-rsa validate-slot0 overwrite-only"
 
+    - os: linux
+      language: go
+      env: TEST=mynewt
+      go:
+        - "1.10"
+
 before_install:
   - |
     if [ "$TRAVIS_PULL_REQUEST" != "false" ]; then
diff --git a/ci/mynewt_install.sh b/ci/mynewt_install.sh
new file mode 100755
index 0000000..abadfb3
--- /dev/null
+++ b/ci/mynewt_install.sh
@@ -0,0 +1,65 @@
+#!/bin/bash -x
+
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#  http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+install_newt() {
+    pushd $HOME
+    git clone --depth=1 https://github.com/apache/mynewt-newt
+    [[ $? -ne 0 ]] && exit 1
+
+    pushd mynewt-newt && ./build.sh
+    [[ $? -ne 0 ]] && exit 1
+
+    cp newt/newt $HOME/bin
+    popd
+    popd
+}
+
+shallow_clone_mynewt() {
+    mkdir -p repos/apache-mynewt-core
+    git clone --depth=1 https://github.com/apache/mynewt-core repos/apache-mynewt-core
+    [[ $? -ne 0 ]] && exit 1
+}
+
+arm_toolchain_install() {
+    TOOLCHAIN_PATH=$HOME/TOOLCHAIN
+
+    GCC_URL=https://developer.arm.com/-/media/Files/downloads/gnu-rm/7-2017q4/gcc-arm-none-eabi-7-2017-q4-major-linux.tar.bz2
+    GCC_BASE=gcc-arm-none-eabi-7-2017-q4-major
+
+    mkdir -p $TOOLCHAIN_PATH
+
+    if [ ! -s ${TOOLCHAIN_PATH}/$GCC_BASE/bin/arm-none-eabi-gcc ]; then
+      wget -O ${TOOLCHAIN_PATH}/${GCC_BASE}.tar.bz2 $GCC_URL
+      [[ $? -ne 0 ]] && exit 1
+
+      tar xfj ${TOOLCHAIN_PATH}/${GCC_BASE}.tar.bz2 -C $TOOLCHAIN_PATH
+    fi
+
+    for i in ${TOOLCHAIN_PATH}/${GCC_BASE}/bin/arm-none-eabi-* ; do
+        rm -f  $HOME/bin/${i##*/}
+        ln -s $i $HOME/bin/${i##*/}
+    done
+}
+
+mkdir -p $HOME/bin
+export PATH=$HOME/bin:$PATH
+
+install_newt
+shallow_clone_mynewt
+arm_toolchain_install
diff --git a/ci/mynewt_run.sh b/ci/mynewt_run.sh
new file mode 100755
index 0000000..f944f62
--- /dev/null
+++ b/ci/mynewt_run.sh
@@ -0,0 +1,31 @@
+#!/bin/bash -x
+
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#  http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+export PATH=$HOME/bin:$PATH
+pwd
+
+ln -s ci/mynewt_targets targets
+ln -s ci/mynewt_keys keys
+
+for target in $(ls targets); do
+    newt build $target
+    [[ $? -ne 0 ]] && exit 1
+done
+
+exit 0