- libevent-dev
- libexpat-dev
- clang
+ homebrew:
+ packages:
+ - openssl
+ - libevent
+ - expat
+ update: true
jobs:
include:
name: Clang on OS X, Amd64
compiler: clang
arch: amd64
+ env: TEST_OSX=yes
- os: linux
name: UBsan, GCC on Linux, Amd64
compiler: gcc
dist: bionic
- os: osx
osx_image: xcode10
- name: Apple iPhone, OS X, Amd64
+ name: Apple iPhone on iOS, armv7
compiler: clang
env:
- TEST_IOS=yes
- OPENSSL_HOST=ios-cross
- IOS_SDK=iPhoneOS
- IOS_CPU=armv7s
- - IOS_PREFIX="$HOME/iPhoneOS-$IOS_CPU"
+ - IOS_PREFIX="$HOME/$IOS_SDK-$IOS_CPU"
- os: osx
osx_image: xcode10
- name: Apple iPad, OS X, Amd64
+ name: Apple iPhone on iOS, arm64
compiler: clang
env:
- TEST_IOS=yes
- OPENSSL_HOST=ios64-cross
- IOS_SDK=iPhoneOS
- IOS_CPU=arm64
- - IOS_PREFIX="$HOME/iPhoneOS-$IOS_CPU"
+ - IOS_PREFIX="$HOME/$IOS_SDK-$IOS_CPU"
- os: osx
osx_image: xcode10
- name: Apple TV, OS X, Amd64
+ name: Apple TV on iOS, arm64
compiler: clang
env:
- TEST_IOS=yes
- AUTOTOOLS_HOST=aarch64-apple-ios
- OPENSSL_HOST=ios64-cross
- IOS_SDK=AppleTVOS
- - IOS_PREFIX="$HOME/AppleTVOS"
+ - IOS_CPU=arm64
+ - IOS_PREFIX="$HOME/$IOS_SDK-$IOS_CPU"
- os: osx
osx_image: xcode10
- name: Apple Watch, OS X, Amd64
+ name: Apple Watch on iOS, armv7
compiler: clang
env:
- TEST_IOS=yes
- AUTOTOOLS_HOST=armv7-apple-ios
- OPENSSL_HOST=ios-cross
- IOS_SDK=WatchOS
- - IOS_PREFIX="$HOME/WatchOS"
+ - IOS_CPU=armv7k
+ - IOS_PREFIX="$HOME/$IOS_SDK-$IOS_CPU"
+ - os: osx
+ osx_image: xcode10
+ name: iPhoneSimulator on OS X, i386
+ env:
+ - TEST_IOS=yes
+ - AUTOTOOLS_HOST=i386-apple-ios
+ - OPENSSL_HOST=iphoneos-cross
+ - IOS_CPU=i386
+ - IOS_SDK=iPhoneSimulator
+ - IOS_PREFIX="$HOME/$IOS_SDK-$IOS_CPU"
+ - os: osx
+ osx_image: xcode10
+ name: iPhoneSimulator on OS X, x86_64
+ env:
+ - TEST_IOS=yes
+ - AUTOTOOLS_HOST=x86_64-apple-ios
+ - OPENSSL_HOST=iphoneos-cross
+ - IOS_CPU=x86_64
+ - IOS_SDK=iPhoneSimulator
+ - IOS_PREFIX="$HOME/$IOS_SDK-$IOS_CPU"
+ - os: osx
+ osx_image: xcode10
+ name: AppleTVSimulator on OS X, x86_64
+ env:
+ - TEST_IOS=yes
+ - AUTOTOOLS_HOST=x86_64-apple-ios
+ - OPENSSL_HOST=iphoneos-cross
+ - IOS_CPU=x86_64
+ - IOS_SDK=AppleTVSimulator
+ - IOS_PREFIX="$HOME/$IOS_SDK-$IOS_CPU"
+ - os: osx
+ osx_image: xcode10
+ name: WatchSimulator on OS X, i386
+ env:
+ - TEST_IOS=yes
+ - AUTOTOOLS_HOST=i386-apple-ios
+ - OPENSSL_HOST=iphoneos-cross
+ - IOS_CPU=i386
+ - IOS_SDK=WatchSimulator
+ - IOS_PREFIX="$HOME/$IOS_SDK-$IOS_CPU"
- os: linux
name: Android armv7a, Linux, Amd64
compiler: clang
- ANDROID_NDK_ROOT="$HOME/android-ndk"
allow_failures:
- - os: osx
- name: Apple TV, OS X, Amd64
- - os: osx
- name: Apple Watch, OS X, Amd64
- os: linux
- arch: amd64
name: Android armv7a, Linux, Amd64
- os: linux
- arch: amd64
name: Android aarch64, Linux, Amd64
- os: linux
- arch: amd64
name: Android x86, Linux, Amd64
- os: linux
- arch: amd64
name: Android x86_64, Linux, Amd64
+before_script:
+ - |
+ if [ "$TEST_ANDROID" = "yes" ]; then
+ ./contrib/android/install_tools.sh
+ elif [ "$TEST_IOS" = "yes" ]; then
+ ./contrib/ios/install_tools.sh
+ fi
+
# The Travis docs say to avoid calling exit in the script. It leads to
# some code duplication to avoid failures in cross-compiles. Also see
# https://docs.travis-ci.com/user/job-lifecycle/ in the Travis docs.
export AUTOTOOLS_BUILD="$(./config.guess)"
export PKG_CONFIG_PATH="$IOS_PREFIX/lib/pkgconfig"
source ./contrib/ios/setenv_ios.sh
- ./contrib/ios/install_tools.sh
./contrib/ios/install_openssl.sh
./contrib/ios/install_expat.sh
./configure \
export PKG_CONFIG_PATH="$ANDROID_PREFIX/lib/pkgconfig"
./contrib/android/install_ndk.sh
source ./contrib/android/setenv_android.sh
- ./contrib/android/install_tools.sh
./contrib/android/install_openssl.sh
./contrib/android/install_expat.sh
./configure \
--with-libexpat="$ANDROID_PREFIX";
make -j 2
make install
- elif [ "$TRAVIS_OS_NAME" = "osx" ]; then
+ elif [ "$TEST_OSX" = "yes" ]; then
./configure --enable-debug --disable-flto --with-ssl=/usr/local/opt/openssl/
make -j 2
make test
#!/usr/bin/env bash
+# ====================================================================
+# Sets the cross compile environment for Xcode/iOS
+#
+# Based upon OpenSSL's setenv-ios.sh by TH, JW, and SM.
+# Heavily modified by JWW for Crypto++.
+# Modified by JWW for Unbound.
+# ====================================================================
+
+#########################################
+##### Some validation #####
+#########################################
+
+# In the past we could mostly infer arch or cpu from the SDK (and
+# mostly vice-versa). Nowadays we need it set for us because Apple
+# platforms can be either 32-bit or 64-bit.
+
+if [ -z "$IOS_SDK" ]; then
+ echo "IOS_SDK is not set. Please set it"
+ [[ "$0" = "${BASH_SOURCE[0]}" ]] && exit 1 || return 1
+fi
+
+if [ -z "$IOS_CPU" ]; then
+ echo "IOS_CPU is not set. Please set it"
+ [[ "$0" = "${BASH_SOURCE[0]}" ]] && exit 1 || return 1
+fi
+
+# cryptest-ios.sh may run this script without sourcing.
+if [ "$0" = "${BASH_SOURCE[0]}" ]; then
+ echo "setenv-ios.sh is usually sourced, but not this time."
+fi
+
+#########################################
+##### Small Fixups, if needed #####
+#########################################
+
+if [[ "$IOS_SDK" == "iPhone" ]]; then
+ IOS_SDK=iPhoneOS
+fi
+
+if [[ "$IOS_SDK" == "iPhoneOSSimulator" ]]; then
+ IOS_SDK=iPhoneSimulator
+fi
+
+if [[ "$IOS_SDK" == "TV" || "$IOS_SDK" == "AppleTV" ]]; then
+ IOS_SDK=AppleTVOS
+fi
+
+if [[ "$IOS_SDK" == "Watch" || "$IOS_SDK" == "AppleWatch" ]]; then
+ IOS_SDK=WatchOS
+fi
+
+if [[ "$IOS_CPU" == "aarch64" || "$IOS_CPU" == "armv8"* ]] ; then
+ IOS_CPU=arm64
+fi
+
+########################################
+##### Environment #####
+########################################
+
+# The flags below were tested with Xcode 8 on Travis. If
+# you use downlevel versions of Xcode, then you can push
+# xxx-version-min=n lower. For example, Xcode 6 can use
+# -miphoneos-version-min=5.
+
+# iPhones can be either 32-bit or 64-bit
+if [[ "$IOS_SDK" == "iPhoneOS" && "$IOS_CPU" == "armv7"* ]]; then
+ MIN_VER=-miphoneos-version-min=6
+elif [[ "$IOS_SDK" == "iPhoneOS" && "$IOS_CPU" == "arm64" ]]; then
+ MIN_VER=-miphoneos-version-min=6
+
+# Fixups for convenience
+elif [[ "$IOS_SDK" == "iPhoneOS" && "$IOS_CPU" == "i386" ]]; then
+ IOS_SDK=iPhoneSimulator
+ # MIN_VER=-miphoneos-version-min=6
+ MIN_VER=-miphonesimulator-version-min=6
+elif [[ "$IOS_SDK" == "iPhoneOS" && "$IOS_CPU" == "x86_64" ]]; then
+ IOS_SDK=iPhoneSimulator
+ # MIN_VER=-miphoneos-version-min=6
+ MIN_VER=-miphonesimulator-version-min=6
+
+# Simulator builds
+elif [[ "$IOS_SDK" == "iPhoneSimulator" && "$IOS_CPU" == "i386" ]]; then
+ MIN_VER=-miphonesimulator-version-min=6
+elif [[ "$IOS_SDK" == "iPhoneSimulator" && "$IOS_CPU" == "x86_64" ]]; then
+ MIN_VER=-miphonesimulator-version-min=6
+
+# Apple TV can be 32-bit Intel (1st gen), 32-bit ARM (2nd, 3rd gen) or 64-bit ARM (4th gen)
+elif [[ "$IOS_SDK" == "AppleTVOS" && "$IOS_CPU" == "i386" ]]; then
+ MIN_VER=-mappletvos-version-min=6
+elif [[ "$IOS_SDK" == "AppleTVOS" && "$IOS_CPU" == "armv7"* ]]; then
+ MIN_VER=-mappletvos-version-min=6
+elif [[ "$IOS_SDK" == "AppleTVOS" && "$IOS_CPU" == "arm64" ]]; then
+ MIN_VER=-mappletvos-version-min=6
+
+# Simulator builds
+elif [[ "$IOS_SDK" == "AppleTVSimulator" && "$IOS_CPU" == "i386" ]]; then
+ MIN_VER=-mappletvsimulator-version-min=6
+elif [[ "$IOS_SDK" == "AppleTVSimulator" && "$IOS_CPU" == "x86_64" ]]; then
+ MIN_VER=-mappletvsimulator-version-min=6
+
+# Watch can be either 32-bit or 64-bit ARM. TODO: figure out which
+# -mwatchos-version-min=n is needed for arm64. 9 is not enough.
+elif [[ "$IOS_SDK" == "WatchOS" && "$IOS_CPU" == "armv7"* ]]; then
+ MIN_VER=-mwatchos-version-min=6
+elif [[ "$IOS_SDK" == "WatchOS" && "$IOS_CPU" == "arm64" ]]; then
+ MIN_VER=-mwatchos-version-min=10
+
+# Simulator builds. TODO: figure out which -watchos-version-min=n
+# is needed for arm64. 6 compiles and links, but is it correct?
+elif [[ "$IOS_SDK" == "WatchSimulator" && "$IOS_CPU" == "i386" ]]; then
+ MIN_VER=-mwatchsimulator-version-min=6
+elif [[ "$IOS_SDK" == "WatchSimulator" && "$IOS_CPU" == "x86_64" ]]; then
+ MIN_VER=-mwatchsimulator-version-min=6
+
+# And the final catch-all
+else
+ echo "IOS_SDK and IOS_CPU are not valid. Please fix them"
+ [[ "$0" = "${BASH_SOURCE[0]}" ]] && exit 1 || return 1
+fi
+
+#####################################################################
+
+# Xcode 6 and below cannot handle -miphonesimulator-version-min
+# Fix it so the simulator will compile as expected. This trick
+# may work on other SDKs, but it was not tested.
+
+if [ -n "$(command -v xcodebuild 2>/dev/null)" ]; then
+ # Output of xcodebuild is similar to "Xcode 6.2". The first cut gets
+ # the dotted decimal value. The second cut gets the major version.
+ XCODE_VERSION=$(xcodebuild -version 2>/dev/null | head -n 1 | cut -f2 -d" " | cut -f1 -d".")
+ if [ -z "$XCODE_VERSION" ]; then XCODE_VERSION=100; fi
+
+ if [ "$XCODE_VERSION" -le 6 ]; then
+ MIN_VER="${MIN_VER//iphonesimulator/iphoneos}"
+ fi
+fi
+
#####################################################################
-# Allow a user override? I think we should be doing this. The use case is:
+# Allow a user override? I think we should be doing this. The use case is,
# move /Applications/Xcode somewhere else for a side-by-side installation.
if [ -z "${XCODE_DEVELOPER-}" ]; then
XCODE_DEVELOPER=$(xcode-select -print-path 2>/dev/null)
[ "$0" = "${BASH_SOURCE[0]}" ] && exit 1 || return 1
fi
-# Default toolchain location
-XCODE_TOOLCHAIN="$XCODE_DEVELOPER/usr/bin"
+# XCODE_DEVELOPER_SDK is the SDK location.
+XCODE_DEVELOPER_SDK="$XCODE_DEVELOPER/Platforms/$IOS_SDK.platform"
-if [ ! -d "$XCODE_TOOLCHAIN" ]; then
- echo "ERROR: unable to find XCODE_TOOLCHAIN directory."
+if [ ! -d "$XCODE_DEVELOPER_SDK" ]; then
+ echo "ERROR: unable to find XCODE_DEVELOPER_SDK directory."
+ echo " Is the SDK supported by Xcode and installed?"
[ "$0" = "${BASH_SOURCE[0]}" ] && exit 1 || return 1
fi
-# XCODE_DEVELOPER_TOP is the top of the development tools tree
-XCODE_DEVELOPER_TOP="$XCODE_DEVELOPER/Platforms/$IOS_SDK.platform/Developer"
-
-if [ ! -d "$XCODE_DEVELOPER_TOP" ]; then
- echo "ERROR: unable to find XCODE_DEVELOPER_TOP directory."
- [ "$0" = "${BASH_SOURCE[0]}" ] && exit 1 || return 1
-fi
-
-# IOS_TOOLCHAIN_PATH is the location of the actual compiler tools.
+# XCODE_TOOLCHAIN is the location of the actual compiler tools.
if [ -d "$XCODE_DEVELOPER/Toolchains/XcodeDefault.xctoolchain/usr/bin/" ]; then
- IOS_TOOLCHAIN_PATH="$XCODE_DEVELOPER/Toolchains/XcodeDefault.xctoolchain/usr/bin/"
-elif [ -d "$XCODE_DEVELOPER_TOP/usr/bin/" ]; then
- IOS_TOOLCHAIN_PATH="$XCODE_DEVELOPER_TOP/usr/bin/"
+ XCODE_TOOLCHAIN="$XCODE_DEVELOPER/Toolchains/XcodeDefault.xctoolchain/usr/bin/"
+elif [ -d "$XCODE_DEVELOPER_SDK/Developer/usr/bin/" ]; then
+ XCODE_TOOLCHAIN="$XCODE_DEVELOPER_SDK/Developer/usr/bin/"
fi
-if [ -z "$IOS_TOOLCHAIN_PATH" ] || [ ! -d "$IOS_TOOLCHAIN_PATH" ]; then
+if [ -z "$XCODE_TOOLCHAIN" ] || [ ! -d "$XCODE_TOOLCHAIN" ]; then
echo "ERROR: unable to find Xcode cross-compiler tools."
[ "$0" = "${BASH_SOURCE[0]}" ] && exit 1 || return 1
fi
-#####################################################################
-
-# XCODE_SDK is the SDK name/version being used. Adjust the list as appropriate.
+# XCODE_SDK is the SDK name/version being used - adjust the list as appropriate.
# For example, remove 4.3, 6.2, and 6.1 if they are not installed. We go back to
# the 1.0 SDKs because Apple WatchOS uses low numbers, like 2.0 and 2.1.
-unset XCODE_SDK
+XCODE_SDK=
for i in $(seq -f "%.1f" 30.0 -0.1 1.0)
do
- if [ -d "$XCODE_DEVELOPER/Platforms/$IOS_SDK.platform/Developer/SDKs/$IOS_SDK$i.sdk" ]; then
+ if [ -d "$XCODE_DEVELOPER_SDK/Developer/SDKs/$IOS_SDK$i.sdk" ]; then
XCODE_SDK="$IOS_SDK$i.sdk"
break
fi
[ "$0" = "${BASH_SOURCE[0]}" ] && exit 1 || return 1
fi
-IOS_SYSROOT="$XCODE_DEVELOPER_TOP/SDKs/$XCODE_SDK"
+IOS_SYSROOT="$XCODE_DEVELOPER_SDK/Developer/SDKs/$XCODE_SDK"
if [ -z "$IOS_SYSROOT" ] || [ ! -d "$IOS_SYSROOT" ]; then
echo "ERROR: unable to find IOS_SYSROOT directory."
#####################################################################
-XCODE_SDK=$(tr '[:upper:]' '[:lower:]' <<< "$IOS_SDK")
-
-case "$XCODE_SDK" in
- iphone|iphoneos)
- CPP="cpp"
- CC="clang"
- CXX="clang++"
- LD="ld"
- AS="as"
- AR="ar"
- RANLIB="ranlib"
- STRIP="strip"
-
- # Default armv7. Also allowed armv7a, armv7s, arm64
- if [ -z "$IOS_CPU" ]; then IOS_CPU=armv7; fi
-
- if [ "$IOS_CPU" = "arm64" ]; then
- CFLAGS="-arch $IOS_CPU -mios-version-min=7"
- CXXFLAGS="-arch $IOS_CPU -stdlib=libc++ -mios-version-min=7"
- else
- CFLAGS="-arch $IOS_CPU -mios-version-min=6"
- CXXFLAGS="-arch $IOS_CPU -stdlib=libc++ -mios-version-min=6"
- fi
- ;;
-
- iphonesimulator)
- CPP="cpp"
- CC="clang"
- CXX="clang++"
- LD="ld"
- AS="as"
- AR="ar"
- RANLIB="ranlib"
- STRIP="strip"
-
- # Default i386.
- if [ -z "$IOS_CPU" ]; then IOS_CPU=i386; fi
-
- CFLAGS="-arch $IOS_CPU -mios-version-min=5"
- CXXFLAGS="-arch $IOS_CPU -stdlib=libc++ -mios-version-min=5"
- ;;
-
- watch|watchos|applewatch)
- CPP="cpp"
- CC="clang"
- CXX="clang++"
- LD="ld"
- AS="as"
- AR="ar"
- RANLIB="ranlib"
- STRIP="strip"
-
- # Default armv7. Also allowed armv7a, armv7s
- if [ -z "$IOS_CPU" ]; then IOS_CPU=armv7; fi
-
- CFLAGS="-arch $IOS_CPU -mios-version-min=7"
- CXXFLAGS="-arch $IOS_CPU -stdlib=libc++ -mios-version-min=7"
- ;;
-
- watchsimulator|watchossimulator)
- CPP="cpp"
- CC="clang"
- CXX="clang++"
- LD="ld"
- AS="as"
- AR="ar"
- RANLIB="ranlib"
- STRIP="strip"
-
- # Default i386.
- if [ -z "$IOS_CPU" ]; then IOS_CPU=i386; fi
-
- CFLAGS="-arch $IOS_CPU"
- CXXFLAGS="-arch $IOS_CPU -stdlib=libc++"
- ;;
-
- appletv|appletvos)
- CPP="cpp"
- CC="clang"
- CXX="clang++"
- LD="ld"
- AS="as"
- AR="ar"
- RANLIB="ranlib"
- STRIP="strip"
-
- # Default arm64.
- if [ -z "$IOS_CPU" ]; then IOS_CPU=arm64; fi
-
- CFLAGS="-arch $IOS_CPU"
- CXXFLAGS="-arch $IOS_CPU -stdlib=libc++"
- ;;
-
- appletvsimulator|appletvossimulator)
- CPP="cpp"
- CC="clang"
- CXX="clang++"
- LD="ld"
- AS="as"
- AR="ar"
- RANLIB="ranlib"
- STRIP="strip"
-
- # Default x86_64,
- if [ -z "$IOS_CPU" ]; then IOS_CPU=x86_64; fi
-
- CFLAGS="-arch $IOS_CPU"
- CXXFLAGS="-arch $IOS_CPU -stdlib=libc++"
- ;;
-
- *)
- echo "ERROR: Unknown architecture $IOS_SDK"
+# We want to set AR=libtool and ARFLAGS="-static -o",
+# but I am not sure Autotools can handle it.
+CPP=cpp; CC=clang; CXX=clang++; LD=ld
+AS=as; AR=ar; RANLIB=ranlib; STRIP=strip
+
+# Error checking
+if [ ! -e "$XCODE_TOOLCHAIN/$CC" ]; then
+ echo "ERROR: Failed to find iOS clang. Please edit this script."
[ "$0" = "${BASH_SOURCE[0]}" ] && exit 1 || return 1
- ;;
+fi
-esac
+# Error checking
+if [ ! -e "$XCODE_TOOLCHAIN/$CXX" ]; then
+ echo "ERROR: Failed to find iOS clang++. Please edit this script."
+ [ "$0" = "${BASH_SOURCE[0]}" ] && exit 1 || return 1
+fi
+
+# Error checking
+if [ ! -e "$XCODE_TOOLCHAIN/$RANLIB" ]; then
+ echo "ERROR: Failed to find iOS ranlib. Please edit this script."
+ [ "$0" = "${BASH_SOURCE[0]}" ] && exit 1 || return 1
+fi
+
+# Error checking
+if [ ! -e "$XCODE_TOOLCHAIN/$AR" ]; then
+ echo "ERROR: Failed to find iOS ar. Please edit this script."
+ [ "$0" = "${BASH_SOURCE[0]}" ] && exit 1 || return 1
+fi
+
+# Error checking
+if [ ! -e "$XCODE_TOOLCHAIN/$AS" ]; then
+ echo "ERROR: Failed to find iOS as. Please edit this script."
+ [ "$0" = "${BASH_SOURCE[0]}" ] && exit 1 || return 1
+fi
+
+# Error checking
+if [ ! -e "$XCODE_TOOLCHAIN/$LD" ]; then
+ echo "ERROR: Failed to find iOS ld. Please edit this script."
+ [ "$0" = "${BASH_SOURCE[0]}" ] && exit 1 || return 1
+fi
#####################################################################
-TOOLCHAIN_PATH="$IOS_TOOLCHAIN_PATH:$XCODE_TOOLCHAIN"
-LENGTH=${#TOOLCHAIN_PATH}
+LENGTH=${#XCODE_TOOLCHAIN}
SUBSTR=${PATH:0:$LENGTH}
-if [ "$SUBSTR" != "$TOOLCHAIN_PATH" ]; then
- export PATH="$TOOLCHAIN_PATH":"$PATH"
+if [ "$SUBSTR" != "$XCODE_TOOLCHAIN" ]; then
+ export PATH="$XCODE_TOOLCHAIN":"$PATH"
fi
#####################################################################
export CPP CC CXX LD AS AR RANLIB STRIP
export IOS_SYSROOT
-export CFLAGS="$CFLAGS --sysroot=$IOS_SYSROOT"
-export CXXFLAGS="$CXXFLAGS --sysroot=$IOS_SYSROOT"
+export CFLAGS="-arch $IOS_CPU $MIN_VER --sysroot=$IOS_SYSROOT"
+export CXXFLAGS="-arch $IOS_CPU $MIN_VER -stdlib-libc++ --sysroot=$IOS_SYSROOT"
#####################################################################
-echo "IOS_TOOLCHAIN_PATH: $IOS_TOOLCHAIN_PATH"
+echo "XCODE_TOOLCHAIN: $XCODE_TOOLCHAIN"
+echo "CPP: $(command -v "$CPP")"
echo "CC: $(command -v "$CC")"
echo "CXX: $(command -v "$CXX")"
echo "LD: $(command -v "$LD")"
echo "IOS_SYSROOT: $IOS_SYSROOT"
+echo "CPPFLAGS: $CPPFLAGS"
echo "CFLAGS: $CFLAGS"
echo "CXXFLAGS: $CXXFLAGS"