diff --git a/.travis.yml b/.travis.yml
index bab134aef34cba039791575339c507a78b198dea..fae5c7b34028051300584ea129dfca653457a57f 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -11,13 +11,6 @@ stages:
 matrix:
   include:
     # TOOLS
-    - name: "Semver"
-      env: TARGET=x86_64-unknown-linux-gnu
-      install: |
-        travis_retry cargo +nightly install \
-        --git https://github.com/gnzlbg/rust-semverver \
-        --branch fix_exit_code
-      script: cargo +nightly semver --api-guidelines --target="${TARGET}"
     - name: "Documentation"
       env: TARGET=x86_64-unknown-linux-gnu
       script: sh ci/dox.sh
@@ -41,6 +34,22 @@ matrix:
         #      cargo fmt --all -- --check
         #  fi
       stage: tools-and-build-and-tier1
+    - name: "Semver"
+      install: |
+        travis_retry cargo +nightly install \
+        --git https://github.com/gnzlbg/rust-semverver \
+        --branch fix_exit_code
+      script: sh ci/semver.sh
+      stage: tools-and-build-and-tier1
+    - name: "Semver"
+      install: |
+        travis_retry cargo +nightly install \
+        --git https://github.com/gnzlbg/rust-semverver \
+        --branch fix_exit_code
+      script: sh ci/semver.sh
+      os: osx
+      osx_image: xcode10
+      stage: tools-and-build-and-tier1
 
     # BUILD stable, beta, nightly
     - name: "Build Stable Rust"
diff --git a/ci/semver.sh b/ci/semver.sh
new file mode 100644
index 0000000000000000000000000000000000000000..ac6be36f3f18e46fec078bef94e539dafd2daa29
--- /dev/null
+++ b/ci/semver.sh
@@ -0,0 +1,70 @@
+#!/usr/bin/env sh
+
+# Checks that libc does not contain breaking changes for the following targets.
+
+set -ex
+
+OS=${TRAVIS_OS_NAME}
+
+echo "Testing Semver on ${OS}"
+
+TARGETS=
+case "${OS}" in
+    *linux*)
+        TARGETS="\
+aarch64-fuchsia \
+aarch64-linux-android \
+aarch64-unknown-linux-gnu \
+aarch64-unknown-linux-musl \
+armv7-linux-androideabi \
+armv7-unknown-linux-gnueabihf \
+i586-unknown-linux-gnu \
+i586-unknown-linux-musl \
+i686-linux-android \
+i686-unknown-freebsd \
+i686-unknown-linux-gnu \
+i686-unknown-linux-musl \
+i686-pc-windows-gnu \
+x86_64-unknown-freebsd \
+x86_64-unknown-linux-gnu \
+x86_64-unknown-linux-musl \
+x86_64-unknown-netbsd \
+x86_64-unknown-cloudabi \
+x86_64-sun-solaris \
+x86_64-fuchsia \
+x86_64-pc-windows-gnu \
+x86_64-unknown-linux-gnux32 \
+x86_64-unknown-redox \
+x86_64-fortanix-unknown-sgx \
+wasm32-unknown-unknown \
+"
+    ;;
+    *osx*)
+        TARGETS="\
+aarch64-apple-ios \
+armv7-apple-ios \
+armv7s-apple-ios \
+i386-apple-ios \
+i686-apple-darwin \
+x86_64-apple-darwin \
+x86_64-apple-ios \
+"
+    ;;
+esac
+
+for TARGET in $TARGETS; do
+    # FIXME: rustup often fails to download some artifacts due to network
+    # issues, so we retry this N times.
+    N=5
+    n=0
+    until [ $n -ge $N ]
+    do
+        if rustup target add "${TARGET}" ; then
+            break
+        fi
+        n=$((n+1))
+        sleep 1
+    done
+
+    cargo +nightly semver --api-guidelines --target="${TARGET}"
+done