diff --git a/.mason b/.mason index c43967404..03869fd11 160000 --- a/.mason +++ b/.mason @@ -1 +1 @@ -Subproject commit c43967404c84d020d63f6aba450d97770dfeaebb +Subproject commit 03869fd11e4bc619d3ba7e4f8a1f00d4612c90ea diff --git a/.travis.yml b/.travis.yml index 8da536ae6..690b2b1b6 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,81 +1,95 @@ -dist: trusty +language: cpp matrix: exclude: - os: linux include: - os: linux - env: FLAVOR=linux CXX=g++ BUILDTYPE=Release + env: CONFIG=release MASON_PLATFORM=android MASON_ANDROID_ABI=arm-v7 TESTMUNK=yes + compiler: clang - os: linux - env: FLAVOR=linux CXX=clang++ BUILDTYPE=Debug + env: CONFIG=debug MASON_PLATFORM=android MASON_ANDROID_ABI=arm-v7 TESTMUNK=no + compiler: clang - os: linux - env: FLAVOR=linux CXX=clang++ BUILDTYPE=Release + env: CONFIG=release MASON_PLATFORM=android MASON_ANDROID_ABI=arm-v5 TESTMUNK=no + compiler: clang + - os: linux + env: CONFIG=release MASON_PLATFORM=android MASON_ANDROID_ABI=arm-v8 TESTMUNK=no + compiler: clang + - os: linux + env: CONFIG=release MASON_PLATFORM=android MASON_ANDROID_ABI=x86 TESTMUNK=no + compiler: clang + - os: linux + env: CONFIG=release MASON_PLATFORM=android MASON_ANDROID_ABI=mips TESTMUNK=no + compiler: clang + - os: linux + env: CONFIG=release MASON_PLATFORM=android MASON_ANDROID_ABI=mips-64 TESTMUNK=no + compiler: clang + - os: linux + env: BUILDTYPE=Release JOBS=16 + compiler: clang + - os: linux + env: BUILDTYPE=Debug JOBS=16 + compiler: clang + - os: linux + env: BUILDTYPE=Release JOBS=8 + compiler: gcc - os: osx - env: FLAVOR=osx BUILDTYPE=Debug + env: BUILDTYPE=Debug JOBS=8 MASON_PLATFORM=osx + compiler: clang - os: osx - env: FLAVOR=ios BUILDTYPE=Release - - os: linux - env: FLAVOR=android ANDROID_ABI=arm-v7 BUILDTYPE=Release - android: - components: - - build-tools-22.0.0 - - android-22 - - extra - - os: linux - env: FLAVOR=android ANDROID_ABI=arm-v7 BUILDTYPE=Debug - android: - components: - - build-tools-22.0.0 - - android-22 - - extra - - os: linux - env: FLAVOR=android ANDROID_ABI=arm-v8 BUILDTYPE=Release - android: - components: - - build-tools-22.0.0 - - android-22 - - extra - - os: linux - env: FLAVOR=android ANDROID_ABI=x86 BUILDTYPE=Release - android: - components: - - build-tools-22.0.0 - - android-22 - - extra - - os: linux - env: FLAVOR=android ANDROID_ABI=mips BUILDTYPE=Release - android: - components: - - build-tools-22.0.0 - - android-22 - - extra + env: BUILDTYPE=Release JOBS=8 MASON_PLATFORM=ios + compiler: clang env: global: - - TERM: dumb - # AWS - - secure: "MZHblLZXG/jWf2w0ZFlxCLDwx2qtGgRDODQyg1BR7JIuMz6AtWv8XR/sUczWLbiABCL0a/NzJF1g4v2pI7X69IntcjOdIABBgTh7++6+1TJ0Kp8viEltb55nQG3lHy/R6fOaI7Pj9tuCX0PCRtGA5C/fGnodLGEjy3RVOJ09ln0=" - - secure: "KaSQbhgjtV7ZCkesHmvrNsbQVjk5SPfGKB1VkWenRGYhLF45HpSRNwSxMQddZ566Pg7qIFgF1iWl/B0QW3B6AWL5WmzQ5AOJgwS876pNIc/UT7ubMPtgAtjpvw1bQvQP3B8MrB+3OE5c6tD+a3LhR9krV//dOsfErR5Yy+3Mbkc=" - # Access Token - - secure: "RiBIBfVhhaMjU5ksuwJO3shdvG9FpinBjdSv4co9jg9171SR8edNriedHjVKSIeBhSGNmZmX+twS3dJS/By6tl/LKh9sTynA+ZAYYljkE7jn881B/gMrlYvdAA6og5KvkhV1/0iJWlhuZrMTkhpDR200iLgg3EWBhWjltzmDW/I=" - # Testmunk - - secure: "CHBiUM60TolDbQnn+4IRA/tvOKwKs3g9EDvv8YHSJMg3FuHmjKQkprBasvxf3hnTXg4WLZEubmeDcyJ6RRzPP5mMSr/hksYl0pSjj/6TUecE5fHPVVeN7txVqkpOBf9i45Y+iBUQMjBb1NnDK3pHXxpnAs1Q/pe7vReErj4GF1U=" - # iOS code signing - - secure: "I6Iu75X1E+js5tzijtKi1EGtIuBcA4/25nDYe0svV4HAtujY71ZJZ4eB6355CKhFXpLXrF3i7eKVX3v+zWS0QROPEWacgsqsvNg+Ba9cnznW/faUSOYekCfhzWd/6reYDM7KzKAQwSUHLk9JIWK/kkmi4r+vVJK7h+tjPllK5YA=" - - IOS_APP_NAME="Mapbox GL" - - 'IOS_DEVELOPER_NAME="iPhone Distribution: Mapbox, Inc."' - - IOS_PROFILE_NAME="ios-in-house" - - secure: "nQqSM8rd7OHtV4MqmNqVnkrVHqxKqQsaWRYk4/nPdhbeVWtTtkk0df711LrF1TUtbEPEewHxYUvTZ/UXmwJNeoKdzTHavI8hnatRkgjyxGERPn1il1Otelht9I+LQQHf+plrpRjVWBrNIW0Zox1B3cqn6d3NglpbXrEQ2EjYGNA=" + - secure: "MZHblLZXG/jWf2w0ZFlxCLDwx2qtGgRDODQyg1BR7JIuMz6AtWv8XR/sUczWLbiABCL0a/NzJF1g4v2pI7X69IntcjOdIABBgTh7++6+1TJ0Kp8viEltb55nQG3lHy/R6fOaI7Pj9tuCX0PCRtGA5C/fGnodLGEjy3RVOJ09ln0=" + - secure: "KaSQbhgjtV7ZCkesHmvrNsbQVjk5SPfGKB1VkWenRGYhLF45HpSRNwSxMQddZ566Pg7qIFgF1iWl/B0QW3B6AWL5WmzQ5AOJgwS876pNIc/UT7ubMPtgAtjpvw1bQvQP3B8MrB+3OE5c6tD+a3LhR9krV//dOsfErR5Yy+3Mbkc=" + - ANDROID_BUILD_INSTANCE_PROFILE: arn:aws:iam::234858372212:instance-profile/android-gl-build/travis/instance-profile/travis-mapbox-gl-native-AndroidInstanceProfile-13EA815DD8IQ9 + - secure: "RiBIBfVhhaMjU5ksuwJO3shdvG9FpinBjdSv4co9jg9171SR8edNriedHjVKSIeBhSGNmZmX+twS3dJS/By6tl/LKh9sTynA+ZAYYljkE7jn881B/gMrlYvdAA6og5KvkhV1/0iJWlhuZrMTkhpDR200iLgg3EWBhWjltzmDW/I=" + - secure: "CHBiUM60TolDbQnn+4IRA/tvOKwKs3g9EDvv8YHSJMg3FuHmjKQkprBasvxf3hnTXg4WLZEubmeDcyJ6RRzPP5mMSr/hksYl0pSjj/6TUecE5fHPVVeN7txVqkpOBf9i45Y+iBUQMjBb1NnDK3pHXxpnAs1Q/pe7vReErj4GF1U=" + - LD_LIBRARY_PATH: '/usr/local/lib' + - TERM: dumb + # begin iOS code signing + - secure: "I6Iu75X1E+js5tzijtKi1EGtIuBcA4/25nDYe0svV4HAtujY71ZJZ4eB6355CKhFXpLXrF3i7eKVX3v+zWS0QROPEWacgsqsvNg+Ba9cnznW/faUSOYekCfhzWd/6reYDM7KzKAQwSUHLk9JIWK/kkmi4r+vVJK7h+tjPllK5YA=" + - IOS_APP_NAME="Mapbox GL" + - 'IOS_DEVELOPER_NAME="iPhone Distribution: Mapbox, Inc."' + - IOS_PROFILE_NAME="ios-in-house" + - secure: "nQqSM8rd7OHtV4MqmNqVnkrVHqxKqQsaWRYk4/nPdhbeVWtTtkk0df711LrF1TUtbEPEewHxYUvTZ/UXmwJNeoKdzTHavI8hnatRkgjyxGERPn1il1Otelht9I+LQQHf+plrpRjVWBrNIW0Zox1B3cqn6d3NglpbXrEQ2EjYGNA=" + # end iOS code signing + +before_install: +- if [[ ${TRAVIS_OS_NAME} == "linux" ]]; then sudo service mysql stop; fi +- if [[ ${TRAVIS_OS_NAME} == "linux" ]]; then sudo service postgresql stop; fi +- source ./scripts/local_mason.sh +- source ./scripts/travis_helper.sh +- source ./scripts/install_node.sh +- source ./scripts/flags.sh +- ./scripts/travis_before_install.sh +- if [[ ${TRAVIS_OS_NAME} == "linux" && ${MASON_PLATFORM} != "android" ]]; then export LD_LIBRARY_PATH=`mason prefix mesa 10.4.3`/lib; fi +- if [[ ${TRAVIS_OS_NAME} == "linux" && ${MASON_PLATFORM} != "android" ]]; then glxinfo; fi install: -- ./scripts/${FLAVOR}/install.sh +- ulimit -c + +before_script: + # Set the core file limit to unlimited so a core file is generated upon crash + - ulimit -c unlimited -S + # begin iOS code signing + - openssl aes-256-cbc -k "$IOS_ENCRYPTION_SECRET" -in scripts/ios_travis/ios-in-house.mobileprovision.enc -d -a -out scripts/ios_travis/ios-in-house.mobileprovision + - openssl aes-256-cbc -k "$IOS_ENCRYPTION_SECRET" -in scripts/ios_travis/ios-dist.cer.enc -d -a -out scripts/ios_travis/ios-dist.cer + - openssl aes-256-cbc -k "$IOS_ENCRYPTION_SECRET" -in scripts/ios_travis/ios-dist.p12.enc -d -a -out scripts/ios_travis/ios-dist.p12 + - ./scripts/ios_travis/add-key.sh + # end iOS code signing script: -- ./scripts/${FLAVOR}/run.sh +- ./scripts/travis_script.sh + +after_script: +- ./scripts/ios_travis/remove-key.sh notifications: slack: secure: HHQYr7sF8M1SzoWSqgKVYtwAgGdLLCyTMsQjFhEEQNYO92ZwURE5s03qWTGH5k8+4Yqn26yrXt3NztLC4JIOpcGervN2mSZyq4dZgFTcWEd61igw0qwSenlwvFfbE1ASK/KYCzfyn9MIfHN+ovwLoRxXZkPwinKDvl3DXjBaFNg= - git: submodules: false diff --git a/Makefile b/Makefile index eb0fc1fee..14f78ed0f 100644 --- a/Makefile +++ b/Makefile @@ -26,12 +26,8 @@ config/%.gypi: configure styles/styles: git submodule update --init styles -ifeq ($(shell uname -s), Darwin) SMCalloutView: git submodule update --init platform/ios/vendor/SMCalloutView -else -SMCalloutView: -endif #### Library builds ############################################################ @@ -74,9 +70,8 @@ Xcode/test: test/test.gyp config/osx.gypi styles/styles SMCalloutView xtest-proj: Xcode/test open ./build/osx/test/test.xcodeproj -xtest: XCPRETTY := $(shell ./scripts/xcpretty.sh) xtest: Xcode/test - xcodebuild -project ./build/osx/test/test.xcodeproj -configuration $(BUILDTYPE) -target test -jobs $(JOBS) $(XCPRETTY) + xcodebuild -project ./build/osx/test/test.xcodeproj -configuration $(BUILDTYPE) -target test -jobs $(JOBS) xtest-%: xtest ./scripts/run_tests.sh "build/osx/Build/Products/$(BUILDTYPE)/test" --gtest_filter=$* @@ -104,9 +99,8 @@ Xcode/osx: macosx/mapboxgl-app.gyp config/osx.gypi styles/styles xosx-proj: Xcode/osx open ./build/osx/macosx/mapboxgl-app.xcodeproj -xosx: XCPRETTY := $(shell ./scripts/xcpretty.sh) xosx: Xcode/osx - xcodebuild -project ./build/osx/macosx/mapboxgl-app.xcodeproj -configuration $(BUILDTYPE) -target osxapp -jobs $(JOBS) $(XCPRETTY) + xcodebuild -project ./build/osx/macosx/mapboxgl-app.xcodeproj -configuration $(BUILDTYPE) -target osxapp -jobs $(JOBS) run-xosx: xosx "build/osx/Build/Products/$(BUILDTYPE)/Mapbox GL.app/Contents/MacOS/Mapbox GL" @@ -126,16 +120,14 @@ Xcode/ios: ios/app/mapboxgl-app.gyp config/ios.gypi styles/styles SMCalloutView ios-proj: Xcode/ios open ./build/ios/ios/app/mapboxgl-app.xcodeproj -ios: XCPRETTY := $(shell ./scripts/xcpretty.sh) ios: Xcode/ios - xcodebuild -sdk iphoneos ARCHS="arm64 armv7 armv7s" PROVISIONING_PROFILE="2b532944-bf3d-4bf4-aa6c-a81676984ae8" -project ./build/ios/ios/app/mapboxgl-app.xcodeproj -configuration Release -target iosapp -jobs $(JOBS) $(XCPRETTY) + xcodebuild -sdk iphoneos ARCHS="arm64 armv7 armv7s" PROVISIONING_PROFILE="2b532944-bf3d-4bf4-aa6c-a81676984ae8" -project ./build/ios/ios/app/mapboxgl-app.xcodeproj -configuration Release -target iosapp -jobs $(JOBS) -isim: XCPRETTY := $(shell ./scripts/xcpretty.sh) isim: Xcode/ios - xcodebuild -sdk iphonesimulator ARCHS="x86_64 i386" -project ./build/ios/ios/app/mapboxgl-app.xcodeproj -configuration Debug -target iosapp -jobs $(JOBS) $(XCPRETTY) + xcodebuild -sdk iphonesimulator ARCHS="x86_64 i386" -project ./build/ios/ios/app/mapboxgl-app.xcodeproj -configuration Debug -target iosapp -jobs $(JOBS) ipackage: clean Xcode/ios - ./scripts/ios/package.sh + ./scripts/package_ios.sh # Legacy name iproj: ios-proj @@ -163,9 +155,8 @@ Xcode/linux: linux/mapboxgl-app.gyp config/osx.gypi styles/styles xlinux-proj: Xcode/linux open ./build/osx/linux/mapboxgl-app.xcodeproj -xlinux: XCPRETTY := $(shell ./scripts/xcpretty.sh) xlinux: Xcode/linux - xcodebuild -project ./build/osx/linux/mapboxgl-app.xcodeproj -configuration $(BUILDTYPE) -target linuxapp $(XCPRETTY) + xcodebuild -project ./build/osx/linux/mapboxgl-app.xcodeproj -configuration $(BUILDTYPE) -target linuxapp run-xlinux: xlinux "build/osx/Build/Products/$(BUILDTYPE)/mapbox-gl" diff --git a/README.md b/README.md index 4ca2205fa..c423c21b5 100644 --- a/README.md +++ b/README.md @@ -49,7 +49,7 @@ Target OS X: 10.9+ If you merely want to install the library for iOS and try it out as an Objective-C consumer: 0. Use [Homebrew](http://brew.sh/) to install Boost headers: `brew install boost`. -1. Run `./scripts/ios/package.sh`. The packaging script will produce the statically-linked `libMapboxGL.a`, `MapboxGL.bundle` for resources, and a `Headers` folder. +1. Run `./scripts/package_ios.sh`. The packaging script will produce the statically-linked `libMapboxGL.a`, `MapboxGL.bundle` for resources, and a `Headers` folder. 2. Copy the contents of `build/ios/pkg/static` into your project. It should happen automatically, but ensure that: - `Headers` is in your *Header Search Paths* (`HEADER_SEARCH_PATHS`) build setting. - `MapboxGL.bundle` is in your target's *Copy Bundle Resources* build phase. diff --git a/android/scripts/build-debug.sh b/android/scripts/build-debug.sh new file mode 100755 index 000000000..450820a11 --- /dev/null +++ b/android/scripts/build-debug.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env bash + +set -e +set -o pipefail + +export BUILDTYPE=Debug + +./android/scripts/common.sh $1 diff --git a/android/scripts/build-release.sh b/android/scripts/build-release.sh new file mode 100755 index 000000000..73c7fab81 --- /dev/null +++ b/android/scripts/build-release.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env bash + +set -e +set -o pipefail + +export BUILDTYPE=Release + +./android/scripts/common.sh $1 diff --git a/android/scripts/common.sh b/android/scripts/common.sh new file mode 100755 index 000000000..0d610909b --- /dev/null +++ b/android/scripts/common.sh @@ -0,0 +1,40 @@ +#!/usr/bin/env bash + +set -e +set -o pipefail + +NAME=$1 + +case `uname -s` in + 'Darwin') export JOBS=`sysctl -n hw.ncpu` ;; + 'Linux') export JOBS=`nproc` ;; + *) export JOBS=1 ;; +esac + + +export CC=clang CXX=clang++ +export MASON_PLATFORM=android + +mkdir -p ./android/java/MapboxGLAndroidSDKTestApp/src/main/res/raw/ +echo "${MAPBOX_ACCESS_TOKEN}" >> ./android/java/MapboxGLAndroidSDKTestApp/src/main/res/raw/token.txt + +make android -j$JOBS BUILDTYPE=$BUILDTYPE JOBS=$JOBS + +S3_PREFIX=s3://mapbox/mapbox-gl-native/android/build/${NAME} +APK_OUTPUTS=./android/java/MapboxGLAndroidSDKTestApp/build/outputs/apk + +# Upload the shared object. +aws s3 cp \ + ./build/android-${ANDROID_ABI}/${BUILDTYPE}/lib.target/libmapbox-gl.so \ + ${S3_PREFIX}/libmapbox-gl.so + +# Upload either the debug or the release build +if [ ${BUILDTYPE} == "Debug" ] ; then + aws s3 cp \ + ${APK_OUTPUTS}/MapboxGLAndroidSDKTestApp-debug.apk \ + ${S3_PREFIX}/MapboxGLAndroidSDKTestApp-debug.apk +elif [ ${BUILDTYPE} == "Release" ] ; then + aws s3 cp \ + ${APK_OUTPUTS}/MapboxGLAndroidSDKTestApp-release-unsigned.apk \ + ${S3_PREFIX}/MapboxGLAndroidSDKTestApp-release-unsigned.apk +fi diff --git a/android/scripts/run-build.sh b/android/scripts/run-build.sh new file mode 100755 index 000000000..9fa15a02b --- /dev/null +++ b/android/scripts/run-build.sh @@ -0,0 +1,85 @@ +#!/usr/bin/env bash + +set -e +set -o pipefail + +cwd=$(pwd) + +region="us-east-1" +region_ami="ami-022e0c6a" +sleep=10 +instance_name="android-gl-build-$TRAVIS_REPO_SLUG-$TRAVIS_JOB_NUMBER" +echo $ami_name + +NAME=$TRAVIS_JOB_ID + +user_data="#!/bin/bash + cd /android + git clone git://github.com/mapbox/mapbox-gl-native.git + + pushd mapbox-gl-native + if [[ $TRAVIS_PULL_REQUEST == 'false' ]]; then + git checkout $TRAVIS_COMMIT + else + git fetch origin +refs/pull/$TRAVIS_PULL_REQUEST/merge: + git checkout FETCH_HEAD + fi + git submodule update --init --recursive + + export ANDROID_NDK_PATH=/android/android-ndk-r10d + export JAVA_HOME=/android/jdk1.7.0_71 + export ANDROID_HOME=/android/android-sdk-linux + export PATH=\$PATH:/android/jdk1.7.0_71/bin + export MAPBOX_ACCESS_TOKEN=$MAPBOX_ACCESS_TOKEN + export TESTMUNK_KEY=$TESTMUNK_KEY + export TESTMUNK=$TESTMUNK + export MASON_ANDROID_ABI=$MASON_ANDROID_ABI + export ANDROID_ABI=$MASON_ANDROID_ABI + + if ./android/scripts/build-$CONFIG.sh $NAME &>../build.log; then + echo 'ANDROID BUILD PASSED' + else + echo 'ANDROID BUILD FAILED' + fi + popd + + aws s3 cp --region us-east-1 build.log s3://mapbox/mapbox-gl-native/android/build/${NAME}/build-log.txt + shutdown -P now" + +id=$(aws ec2 run-instances \ + --region $region \ + --image-id $region_ami \ + --count 1 \ + --instance-type m3.large \ + --iam-instance-profile Arn="$ANDROID_BUILD_INSTANCE_PROFILE" \ + --instance-initiated-shutdown-behavior terminate \ + --user-data "$user_data" | jq -r '.Instances[0].InstanceId') + +echo "Instance: $region $id" + +sleep 10 + +result=$(aws ec2 create-tags --region $region --resources $id --tags "Key=Name,Value=$instance_name") + +instance_status_terminated=$(aws ec2 describe-instances --region $region --instance-id $id | jq -r '.Reservations[0].Instances[0].State.Name') + +until [ "$instance_status_terminated" = "terminated" ]; do + instance_status_terminated=$(aws ec2 describe-instances --region $region --instance-id $id | jq -r '.Reservations[0].Instances[0].State.Name') + echo "Instance terminating status $region $id: $instance_status_terminated" + sleep $sleep +done + +echo "Build finished" + +output=$(aws ec2 get-console-output --region $region --instance-id $id | jq -r '.Output') + +aws s3 cp --region $region s3://mapbox/mapbox-gl-native/android/build/${NAME}/build-log.txt build.log +cat build.log + +if [[ $output == *"ANDROID BUILD PASSED"* ]]; then + echo "ANDROID BUILD PASSED" + exit 0 +else + echo "ANDROID BUILD FAILED" + exit 1 +fi diff --git a/config/defaults.mk b/config/defaults.mk index 1449bf8e1..2aa11ccbe 100644 --- a/config/defaults.mk +++ b/config/defaults.mk @@ -31,32 +31,32 @@ LIBS_linux += -Dcache_lib=$(word 1,$(CACHE) sqlite) LIBS_linux += --depth=. -Goutput_dir=. ANDROID_ABIS += android-lib-arm-v8 -ENV_android-arm-v8 = $(shell MASON_ANDROID_ABI=arm-v8 ./scripts/android/toolchain.sh) +ENV_android-arm-v8 = $(shell MASON_ANDROID_ABI=arm-v8 ./scripts/android_env.sh) CONFIG_android-arm-v8 = -Dhost=android -Iconfig/android-arm-v8.gypi ANDROID_ABIS += android-lib-arm-v7 -ENV_android-arm-v7 = $(shell MASON_ANDROID_ABI=arm-v7 ./scripts/android/toolchain.sh) +ENV_android-arm-v7 = $(shell MASON_ANDROID_ABI=arm-v7 ./scripts/android_env.sh) CONFIG_android-arm-v7 = -Dhost=android -Iconfig/android-arm-v7.gypi ANDROID_ABIS += android-lib-arm-v5 -ENV_android-arm-v5 = $(shell MASON_ANDROID_ABI=arm-v5 ./scripts/android/toolchain.sh) +ENV_android-arm-v5 = $(shell MASON_ANDROID_ABI=arm-v5 ./scripts/android_env.sh) CONFIG_android-arm-v5 = -Dhost=android -Iconfig/android-arm-v5.gypi ANDROID_ABIS += android-lib-x86 -ENV_android-x86 = $(shell MASON_ANDROID_ABI=x86 ./scripts/android/toolchain.sh) +ENV_android-x86 = $(shell MASON_ANDROID_ABI=x86 ./scripts/android_env.sh) CONFIG_android-x86 = -Dhost=android -Iconfig/android-x86.gypi # OpenSSL build is incomplete. # ANDROID_ABIS += android-lib-x86-64 -# ENV_android-x86-64 = $(shell MASON_ANDROID_ABI=x86-64 ./scripts/android/toolchain.sh) +# ENV_android-x86-64 = $(shell MASON_ANDROID_ABI=x86-64 ./scripts/android_env.sh) # CONFIG_android-x86-64 = -Dhost=android -Iconfig/android-x86-64.gypi ANDROID_ABIS += android-lib-mips -ENV_android-mips = $(shell MASON_ANDROID_ABI=mips ./scripts/android/toolchain.sh) +ENV_android-mips = $(shell MASON_ANDROID_ABI=mips ./scripts/android_env.sh) CONFIG_android-mips = -Dhost=android -Iconfig/android-mips.gypi ANDROID_ABIS += android-lib-mips-64 -ENV_android-mips-64 = $(shell MASON_ANDROID_ABI=mips-64 ./scripts/android/toolchain.sh) +ENV_android-mips-64 = $(shell MASON_ANDROID_ABI=mips-64 ./scripts/android_env.sh) CONFIG_android-mips-64 = -Dhost=android -Iconfig/android-mips-64.gypi LIBS_android = -Dheadless_lib=none diff --git a/configure b/configure index a37000a1b..1d68f5e54 100755 --- a/configure +++ b/configure @@ -15,8 +15,7 @@ function finish { trap finish EXIT # Install mason -git submodule update --init .mason -export PATH="`pwd`/.mason:${PATH}" MASON_DIR="`pwd`/.mason" +. ./scripts/local_mason.sh case ${MASON_PLATFORM} in 'ios') diff --git a/docker/linux/test.sh b/docker/linux/test.sh new file mode 100755 index 000000000..9ef9bf51f --- /dev/null +++ b/docker/linux/test.sh @@ -0,0 +1,26 @@ +#!/usr/bin/env bash + +set -e +set -o pipefail + +export TRAVIS_OS_NAME=linux + +cd build + +source ./scripts/local_mason.sh +mason install mesa 10.4.3 +export LD_LIBRARY_PATH=`mason prefix mesa 10.4.3`/lib + +export DISPLAY=:99.0 +Xvfb :99 -ac -screen 0 1024x768x24 & + +if [[ ${CXX} == "g++" ]]; then + export CXX="g++-4.8" + export CC="gcc-4.8" +fi + +source ./scripts/install_node.sh + +make linux -j`nproc` +make test-* -j`nproc` +./scripts/compare_images.sh diff --git a/ios/MapboxGL.podspec b/ios/MapboxGL.podspec index 29e406362..57de3f6f3 100644 --- a/ios/MapboxGL.podspec +++ b/ios/MapboxGL.podspec @@ -1,7 +1,7 @@ Pod::Spec.new do |m| m.name = 'MapboxGL' - m.version = '0.2.14' + m.version = '0.2.15' m.summary = 'Open source vector map solution for iOS with full styling capabilities.' m.description = 'Open source OpenGL-based vector map solution for iOS with full styling capabilities and Cocoa bindings.' diff --git a/platform/ios/MGLMapboxEvents.m b/platform/ios/MGLMapboxEvents.m index c4bd7cf0b..ee1ae82e7 100644 --- a/platform/ios/MGLMapboxEvents.m +++ b/platform/ios/MGLMapboxEvents.m @@ -50,7 +50,7 @@ NSString *const MGLEventGestureRotateStart = @"Rotation"; // from within a single thread use underscore syntax. // // All captures of `self` from within asynchronous -// dispatches will use a `weakSelf` to avoid cyclical +// dispatches will use a `strongSelf` to avoid cyclical // strong references. // @@ -292,6 +292,9 @@ NSString *const MGLEventGestureRotateStart = @"Rotation"; __weak MGLMapboxEvents *weakSelf = self; dispatch_async(_serialQueue, ^{ + MGLMapboxEvents *strongSelf = weakSelf; + if ( ! strongSelf) return; + // Opt Out Checking When Built if (![[NSUserDefaults standardUserDefaults] boolForKey:@"mapbox_metrics_enabled_preference"]) { [_eventQueue removeAllObjects]; @@ -315,35 +318,35 @@ NSString *const MGLEventGestureRotateStart = @"Rotation"; // mapbox-events stock attributes [evt setObject:event forKey:@"event"]; [evt setObject:@(1) forKey:@"version"]; - [evt setObject:[weakSelf.rfc3339DateFormatter stringFromDate:[NSDate date]] forKey:@"created"]; - [evt setObject:weakSelf.instanceID forKey:@"instance"]; - [evt setObject:weakSelf.advertiserId forKey:@"advertiserId"]; - [evt setObject:weakSelf.vendorId forKey:@"vendorId"]; - [evt setObject:weakSelf.appBundleId forKeyedSubscript:@"appBundleId"]; + [evt setObject:[strongSelf.rfc3339DateFormatter stringFromDate:[NSDate date]] forKey:@"created"]; + [evt setObject:strongSelf.instanceID forKey:@"instance"]; + [evt setObject:strongSelf.advertiserId forKey:@"advertiserId"]; + [evt setObject:strongSelf.vendorId forKey:@"vendorId"]; + [evt setObject:strongSelf.appBundleId forKeyedSubscript:@"appBundleId"]; // mapbox-events-ios stock attributes - [evt setValue:weakSelf.model forKey:@"model"]; - [evt setValue:weakSelf.iOSVersion forKey:@"operatingSystem"]; - [evt setValue:[weakSelf getDeviceOrientation] forKey:@"orientation"]; + [evt setValue:strongSelf.model forKey:@"model"]; + [evt setValue:strongSelf.iOSVersion forKey:@"operatingSystem"]; + [evt setValue:[strongSelf getDeviceOrientation] forKey:@"orientation"]; [evt setValue:@((int)(100 * [UIDevice currentDevice].batteryLevel)) forKey:@"batteryLevel"]; - [evt setValue:@(weakSelf.scale) forKey:@"resolution"]; - [evt setValue:weakSelf.carrier forKey:@"carrier"]; + [evt setValue:@(strongSelf.scale) forKey:@"resolution"]; + [evt setValue:strongSelf.carrier forKey:@"carrier"]; - NSString *cell = [weakSelf getCurrentCellularNetworkConnectionType]; + NSString *cell = [strongSelf getCurrentCellularNetworkConnectionType]; if (cell) { [evt setValue:cell forKey:@"cellularNetworkType"]; } else { [evt setObject:[NSNull null] forKey:@"cellularNetworkType"]; } - NSString *wifi = [weakSelf getWifiNetworkName]; + NSString *wifi = [strongSelf getWifiNetworkName]; if (wifi) { [evt setValue:wifi forKey:@"wifi"]; } else { [evt setObject:[NSNull null] forKey:@"wifi"]; } - [evt setValue:@([weakSelf getContentSizeScale]) forKey:@"accessibilityFontScale"]; + [evt setValue:@([strongSelf getContentSizeScale]) forKey:@"accessibilityFontScale"]; // Make Immutable Version NSDictionary *finalEvent = [NSDictionary dictionaryWithDictionary:evt]; @@ -352,12 +355,12 @@ NSString *const MGLEventGestureRotateStart = @"Rotation"; [_eventQueue addObject:finalEvent]; // Has Flush Limit Been Reached? - if (_eventQueue.count >= weakSelf.flushAt) { - [weakSelf flush]; + if (_eventQueue.count >= strongSelf.flushAt) { + [strongSelf flush]; } // Reset Timer (Initial Starting of Timer after first event is pushed) - [weakSelf startTimer]; + [strongSelf startTimer]; }); } @@ -375,10 +378,13 @@ NSString *const MGLEventGestureRotateStart = @"Rotation"; __weak MGLMapboxEvents *weakSelf = self; dispatch_async(_serialQueue, ^{ + MGLMapboxEvents *strongSelf = weakSelf; + if ( ! strongSelf) return; + __block NSArray *events; - NSUInteger upper = weakSelf.flushAt; - if (weakSelf.flushAt > [_eventQueue count]) { + NSUInteger upper = strongSelf.flushAt; + if (strongSelf.flushAt > [_eventQueue count]) { if ([_eventQueue count] == 0) { return; } @@ -393,7 +399,7 @@ NSString *const MGLEventGestureRotateStart = @"Rotation"; [_eventQueue removeObjectsInRange:theRange]; // Send Array of Events to Server - [weakSelf postEvents:events]; + [strongSelf postEvents:events]; }); } diff --git a/scripts/android/install.sh b/scripts/android/install.sh deleted file mode 100755 index 656465cf2..000000000 --- a/scripts/android/install.sh +++ /dev/null @@ -1,15 +0,0 @@ -#!/usr/bin/env bash - -set -e -set -o pipefail - -source ./scripts/travis_helper.sh - -mapbox_time "checkout_mason" \ -git submodule update --init .mason - -export MASON_PLATFORM=android -export MASON_ANDROID_ABI=${ANDROID_ABI} - -mapbox_time "android_toolchain" \ -./scripts/android/toolchain.sh diff --git a/scripts/android/run.sh b/scripts/android/run.sh deleted file mode 100755 index 7a909ffe3..000000000 --- a/scripts/android/run.sh +++ /dev/null @@ -1,61 +0,0 @@ -#!/usr/bin/env bash - -set -e -set -o pipefail - -BUILDTYPE=${BUILDTYPE:-Release} -TESTMUNK=${TESTMUNK:-no} -export HOST=android -export MASON_PLATFORM=android -export MASON_ANDROID_ABI=${ANDROID_ABI:-arm-v7} - -source ./scripts/travis_helper.sh - -# Add Mason to PATH -export PATH="`pwd`/.mason:${PATH}" MASON_DIR="`pwd`/.mason" - -################################################################################ -# Build -################################################################################ - -mapbox_time "checkout_styles" \ -git submodule update --init styles - -mkdir -p ./android/java/MapboxGLAndroidSDKTestApp/src/main/res/raw -echo "${MAPBOX_ACCESS_TOKEN}" > ./android/java/MapboxGLAndroidSDKTestApp/src/main/res/raw/token.txt - -mapbox_time "compile_library" \ -make android-lib -j${JOBS} BUILDTYPE=${BUILDTYPE} - -mapbox_time "build_apk" \ -make android -j${JOBS} BUILDTYPE=${BUILDTYPE} - -################################################################################ -# Deploy -################################################################################ - -if [ ! -z "${AWS_ACCESS_KEY_ID}" ] && [ ! -z "${AWS_SECRET_ACCESS_KEY}" ] ; then - # Install and add awscli to PATH for uploading the results - mapbox_time "install_awscli" \ - pip install --user awscli - export PATH="`python -m site --user-base`/bin:${PATH}" - - mapbox_time_start "deploy_results" - echo "Deploying results..." - - S3_PREFIX=s3://mapbox/mapbox-gl-native/android/build/${TRAVIS_JOB_NUMBER} - APK_OUTPUTS=./android/java/MapboxGLAndroidSDKTestApp/build/outputs/apk - - # Upload either the debug or the release build - if [ ${BUILDTYPE} == "Debug" ] ; then - aws s3 cp \ - ${APK_OUTPUTS}/MapboxGLAndroidSDKTestApp-debug.apk \ - ${S3_PREFIX}/MapboxGLAndroidSDKTestApp-debug.apk - elif [ ${BUILDTYPE} == "Release" ] ; then - aws s3 cp \ - ${APK_OUTPUTS}/MapboxGLAndroidSDKTestApp-release-unsigned.apk \ - ${S3_PREFIX}/MapboxGLAndroidSDKTestApp-release-unsigned.apk - fi - - mapbox_time_finish -fi diff --git a/scripts/android/toolchain.sh b/scripts/android/toolchain.sh deleted file mode 100755 index 67cd0aa47..000000000 --- a/scripts/android/toolchain.sh +++ /dev/null @@ -1,26 +0,0 @@ -#!/usr/bin/env bash - -set -e -set -o pipefail - -export MASON_PLATFORM=android -export MASON_ANDROID_ABI=${MASON_ANDROID_ABI:-arm-v7} -export PATH="`pwd`/.mason:${PATH}" -export MASON_DIR="`pwd`/.mason" - -export PATH=`mason env PATH` - -echo MASON_PLATFORM=\"${MASON_PLATFORM}\" -echo MASON_ANDROID_ABI=\"${MASON_ANDROID_ABI}\" -echo CXX=\"`which $(mason env CXX)`\" -echo CC=\"`which $(mason env CC)`\" -echo LD=\"`which $(mason env LD)`\" -echo LINK=\"`which $(mason env CXX)`\" -echo AR=\"`which $(mason env AR)`\" -echo RANLIB=\"`which $(mason env RANLIB)`\" -echo STRIP=\"`which $(mason env STRIP)`\" -echo LDFLAGS=\"`mason env LDFLAGS` \${LDFLAGS:-}\" -echo CFLAGS=\"`mason env CFLAGS` \${CFLAGS:-}\" -echo CXXFLAGS=\"`mason env CXXFLAGS` \${CXXFLAGS:-}\" -echo CPPFLAGS=\"`mason env CPPFLAGS` \${CPPFLAGS:-}\" -echo JNIDIR=\"`mason env JNIDIR`\" diff --git a/scripts/android_env.sh b/scripts/android_env.sh new file mode 100755 index 000000000..93b1452a5 --- /dev/null +++ b/scripts/android_env.sh @@ -0,0 +1,25 @@ +#!/usr/bin/env bash + +set -e +set -o pipefail + +./scripts/local_mason.sh + +export MASON_PLATFORM=android + +export PATH=`.mason/mason env PATH` + +echo MASON_PLATFORM=\"android\" +echo MASON_ANDROID_ABI=\"${MASON_ANDROID_ABI}\" + +echo CXX=\"`which $(.mason/mason env CXX)`\" +echo CC=\"`which $(.mason/mason env CC)`\" +echo LD=\"`which $(.mason/mason env LD)`\" +echo LINK=\"`which $(.mason/mason env CXX)`\" +echo AR=\"`which $(.mason/mason env AR)`\" +echo RANLIB=\"`which $(.mason/mason env RANLIB)`\" +echo STRIP=\"`which $(.mason/mason env STRIP)`\" +echo LDFLAGS=\"`.mason/mason env LDFLAGS` ${LDFLAGS}\" +echo CFLAGS=\"`.mason/mason env CFLAGS` ${CFLAGS}\" +echo CPPFLAGS=\"`.mason/mason env CPPFLAGS` ${CPPFLAGS}\" +echo JNIDIR=\"`.mason/mason env JNIDIR`\" diff --git a/scripts/build-version.py b/scripts/build-version.py index 3fe789185..0110e6a2e 100755 --- a/scripts/build-version.py +++ b/scripts/build-version.py @@ -13,9 +13,9 @@ else: if sys.argv[2] == sys.argv[3]: tag = [0, 0, 0] else: - ver = re.sub("[^0-9.]", "", sys.argv[2]) + ver = re.sub("[^0-9.]", "", sys.argv[2]) tag = map(int, ver.split('.')) - rev = sys.argv[3][0:8] + rev = sys.argv[3][0:8] def mkdir_p(path): diff --git a/scripts/flags.sh b/scripts/flags.sh new file mode 100755 index 000000000..10cc88e5c --- /dev/null +++ b/scripts/flags.sh @@ -0,0 +1,32 @@ +#!/usr/bin/env bash + +if [[ ${TRAVIS_OS_NAME} == "linux" ]]; then + export DISPLAY=:99.0 + + if [[ ${MASON_PLATFORM} != "android" ]]; then + sh -e /etc/init.d/xvfb start + fi + + # use g++ that supports c++11 + if [[ ${CXX} == "g++" ]]; then + export CXX="g++-4.8" + export CC="gcc-4.8" + fi + + # If building in debug then turn on sanitizers. + # They should both work with latest g++/clang++ + # but it's not worth a standalone matrix so here + # we just test address->gcc and thread->clang for + # some limited coverage + # if [[ ${BUILDTYPE} == "Debug" ]]; then + # if [[ ${CXX} == "g++" ]]; then + # export CXXFLAGS="-fsanitize=address -g ${CXXFLAGS}" + # export CFLAGS="-fsanitize=address -g ${CFLAGS}" + # export LDFLAGS="-fsanitize=address ${LDFLAGS}" + # elif [[ ${CXX} == "clang++" ]]; then + # export CXXFLAGS="-fsanitize=thread -g -fPIC ${CXXFLAGS}" + # export CFLAGS="-fsanitize=thread -g ${CFLAGS}" + # export LDFLAGS="-fsanitize=thread -pie ${LDFLAGS}" + # fi + # fi +fi diff --git a/scripts/install_node.sh b/scripts/install_node.sh new file mode 100755 index 000000000..ecb5b8835 --- /dev/null +++ b/scripts/install_node.sh @@ -0,0 +1,4 @@ +#!/usr/bin/env bash + +mason install node 0.10.35 +export PATH="`mason prefix node 0.10.35`/bin":"$PATH" diff --git a/scripts/ios/install.sh b/scripts/ios/install.sh deleted file mode 100755 index 1994d371d..000000000 --- a/scripts/ios/install.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/usr/bin/env bash - -set -e -set -o pipefail - -source ./scripts/travis_helper.sh - -mapbox_time "checkout_mason" \ -git submodule update --init .mason -export PATH="`pwd`/.mason:${PATH}" MASON_DIR="`pwd`/.mason" - -mapbox_time "install_xcpretty" \ -gem install xcpretty --no-rdoc --no-ri --no-document --quiet diff --git a/scripts/ios/run.sh b/scripts/ios/run.sh deleted file mode 100755 index 6eed14a59..000000000 --- a/scripts/ios/run.sh +++ /dev/null @@ -1,27 +0,0 @@ -#!/usr/bin/env bash - -set -e -set -o pipefail - -BUILDTYPE=${BUILDTYPE:-Release} - -source ./scripts/travis_helper.sh - -# Add Mason to PATH -export PATH="`pwd`/.mason:${PATH}" MASON_DIR="`pwd`/.mason" - -################################################################################ -# Build -################################################################################ - -mapbox_time "package_ios" \ -make ipackage - -################################################################################ -# Deploy -################################################################################ - -if [[ -n "$PUBLISH_TAG" ]]; then - mapbox_time "deploy_ios" \ - ./scripts/ios/publish.sh "$PUBLISH_VERSION" -fi diff --git a/scripts/ios/add-key.sh b/scripts/ios_travis/add-key.sh similarity index 61% rename from scripts/ios/add-key.sh rename to scripts/ios_travis/add-key.sh index fe963d38e..b58144530 100755 --- a/scripts/ios/add-key.sh +++ b/scripts/ios_travis/add-key.sh @@ -16,10 +16,10 @@ security unlock-keychain -p travis ios-build.keychain security set-keychain-settings -t 3600 -l ~/Library/Keychains/ios-build.keychain # Add certificates to keychain and allow codesign to access them -security import ./scripts/ios/apple.crt -k ~/Library/Keychains/ios-build.keychain -T /usr/bin/codesign -security import ./scripts/ios/ios-dist.cer -k ~/Library/Keychains/ios-build.keychain -T /usr/bin/codesign -security import ./scripts/ios/ios-dist.p12 -k ~/Library/Keychains/ios-build.keychain -P $IOS_KEY_PASSWORD -T /usr/bin/codesign +security import ./scripts/ios_travis/apple.crt -k ~/Library/Keychains/ios-build.keychain -T /usr/bin/codesign +security import ./scripts/ios_travis/ios-dist.cer -k ~/Library/Keychains/ios-build.keychain -T /usr/bin/codesign +security import ./scripts/ios_travis/ios-dist.p12 -k ~/Library/Keychains/ios-build.keychain -P $IOS_KEY_PASSWORD -T /usr/bin/codesign # Put the provisioning profile in place mkdir -p ~/Library/MobileDevice/Provisioning\ Profiles -cp "./scripts/ios/$IOS_PROFILE_NAME.mobileprovision" ~/Library/MobileDevice/Provisioning\ Profiles/ +cp "./scripts/ios_travis/$IOS_PROFILE_NAME.mobileprovision" ~/Library/MobileDevice/Provisioning\ Profiles/ diff --git a/scripts/ios/apple.crt b/scripts/ios_travis/apple.crt similarity index 100% rename from scripts/ios/apple.crt rename to scripts/ios_travis/apple.crt diff --git a/scripts/ios/ios-dist.cer.enc b/scripts/ios_travis/ios-dist.cer.enc similarity index 100% rename from scripts/ios/ios-dist.cer.enc rename to scripts/ios_travis/ios-dist.cer.enc diff --git a/scripts/ios/ios-dist.p12.enc b/scripts/ios_travis/ios-dist.p12.enc similarity index 100% rename from scripts/ios/ios-dist.p12.enc rename to scripts/ios_travis/ios-dist.p12.enc diff --git a/scripts/ios/ios-in-house.mobileprovision.enc b/scripts/ios_travis/ios-in-house.mobileprovision.enc similarity index 100% rename from scripts/ios/ios-in-house.mobileprovision.enc rename to scripts/ios_travis/ios-in-house.mobileprovision.enc diff --git a/scripts/ios/remove-key.sh b/scripts/ios_travis/remove-key.sh similarity index 100% rename from scripts/ios/remove-key.sh rename to scripts/ios_travis/remove-key.sh diff --git a/scripts/linux/install.sh b/scripts/linux/install.sh deleted file mode 100755 index a47155d69..000000000 --- a/scripts/linux/install.sh +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env bash - -set -e -set -o pipefail - -source ./scripts/travis_helper.sh - -mapbox_time "update_apt" \ -sudo apt-get -y update - -mapbox_time "install_apt" \ -sudo apt-get -y install mesa-utils llvm-3.4 pkg-config libcurl4-openssl-dev \ - libboost-dev libboost-program-options-dev libxi-dev x11proto-randr-dev \ - x11proto-xext-dev libxrandr-dev x11proto-xf86vidmode-dev libxxf86vm-dev \ - libxcursor-dev libxinerama-dev - -mapbox_time "checkout_mason" \ -git submodule update --init .mason -export PATH="`pwd`/.mason:${PATH}" MASON_DIR="`pwd`/.mason" - -mapbox_time "install_mesa" \ -mason install mesa 10.4.3 diff --git a/scripts/linux/run.sh b/scripts/linux/run.sh deleted file mode 100755 index c4731b97e..000000000 --- a/scripts/linux/run.sh +++ /dev/null @@ -1,75 +0,0 @@ -#!/usr/bin/env bash - -set -e -set -o pipefail - -BUILDTYPE=${BUILDTYPE:-Release} - -source ./scripts/travis_helper.sh - -# Add Mason to PATH -export PATH="`pwd`/.mason:${PATH}" MASON_DIR="`pwd`/.mason" - -# Set the core file limit to unlimited so a core file is generated upon crash -ulimit -c unlimited -S - -################################################################################ -# X Server setup -################################################################################ - -# Start the mock X server -if [ -f /etc/init.d/xvfb ] ; then - mapbox_time "start_xvfb" \ - sh -e /etc/init.d/xvfb start - sleep 2 # sometimes, xvfb takes some time to start up -fi - -# Make sure we're connecting to xvfb -export DISPLAY=:99.0 - -# Make sure we're loading the 10.4.3 libs we installed manually -export LD_LIBRARY_PATH="`mason prefix mesa 10.4.3`/lib:${LD_LIBRARY_PATH:-}" - -mapbox_time "glxinfo" \ -glxinfo - -################################################################################ -# Build -################################################################################ - -mapbox_time "checkout_styles" \ -git submodule update --init styles - -mapbox_time "compile_program" \ -make linux -j${JOBS} BUILDTYPE=${BUILDTYPE} - -mapbox_time "compile_tests" \ -make test -j${JOBS} BUILDTYPE=${BUILDTYPE} - -################################################################################ -# Test -################################################################################ - -mapbox_time "checkout_test_suite" \ -git submodule update --init test/suite - -mapbox_time "run_tests" \ -make test-* BUILDTYPE=${BUILDTYPE} - -mapbox_time "compare_results" \ -./scripts/compare_images.sh - -################################################################################ -# Deploy -################################################################################ - -if [ ! -z "${AWS_ACCESS_KEY_ID}" ] && [ ! -z "${AWS_SECRET_ACCESS_KEY}" ] ; then - # Install and add awscli to PATH for uploading the results - mapbox_time "install_awscli" \ - pip install --user awscli - export PATH="`python -m site --user-base`/bin:${PATH}" - - mapbox_time_start "deploy_results" - (cd ./test/suite/ && ./bin/deploy_results.sh) - mapbox_time_finish -fi diff --git a/scripts/local_mason.sh b/scripts/local_mason.sh new file mode 100755 index 000000000..2d8687a28 --- /dev/null +++ b/scripts/local_mason.sh @@ -0,0 +1,5 @@ +#!/usr/bin/env bash + +git submodule update --init .mason +PATH=`pwd`/.mason:$PATH +export MASON_DIR=`pwd`/.mason diff --git a/scripts/npm_install.sh b/scripts/npm_install.sh new file mode 100755 index 000000000..7437af961 --- /dev/null +++ b/scripts/npm_install.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env bash + +set -e +set -o pipefail + +cd bin +$1 install --clang=1 +cd ../ diff --git a/scripts/osx/install.sh b/scripts/osx/install.sh deleted file mode 100755 index 1994d371d..000000000 --- a/scripts/osx/install.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/usr/bin/env bash - -set -e -set -o pipefail - -source ./scripts/travis_helper.sh - -mapbox_time "checkout_mason" \ -git submodule update --init .mason -export PATH="`pwd`/.mason:${PATH}" MASON_DIR="`pwd`/.mason" - -mapbox_time "install_xcpretty" \ -gem install xcpretty --no-rdoc --no-ri --no-document --quiet diff --git a/scripts/osx/run.sh b/scripts/osx/run.sh deleted file mode 100755 index b84ed04c2..000000000 --- a/scripts/osx/run.sh +++ /dev/null @@ -1,27 +0,0 @@ -#!/usr/bin/env bash - -set -e -set -o pipefail - -BUILDTYPE=${BUILDTYPE:-Release} - -source ./scripts/travis_helper.sh - -# Add Mason to PATH -export PATH="`pwd`/.mason:${PATH}" MASON_DIR="`pwd`/.mason" - -# Set the core file limit to unlimited so a core file is generated upon crash -ulimit -c unlimited -S - -################################################################################ -# Build -################################################################################ - -mapbox_time "checkout_styles" \ -git submodule update --init styles - -mapbox_time "compile_program" \ -make xosx -j${JOBS} BUILDTYPE=${BUILDTYPE} - -mapbox_time "compile_tests" \ -make xtest -j${JOBS} BUILDTYPE=${BUILDTYPE} diff --git a/scripts/ios/package.sh b/scripts/package_ios.sh similarity index 100% rename from scripts/ios/package.sh rename to scripts/package_ios.sh diff --git a/scripts/ios/publish.sh b/scripts/publish_ios.sh similarity index 100% rename from scripts/ios/publish.sh rename to scripts/publish_ios.sh diff --git a/scripts/travis_before_install.sh b/scripts/travis_before_install.sh new file mode 100755 index 000000000..f837e7416 --- /dev/null +++ b/scripts/travis_before_install.sh @@ -0,0 +1,53 @@ +#!/usr/bin/env bash + +set -e +set -o pipefail + +if [[ ${TRAVIS_OS_NAME} == "linux" ]]; then + # + # install Linux dependencies + # + if [[ `lsb_release -r` =~ "12.04" ]]; then + sudo add-apt-repository --yes ppa:ubuntu-toolchain-r/test + fi + sudo add-apt-repository --yes ppa:boost-latest/ppa + + mapbox_time "apt_update" \ + sudo apt-get update -y + + mapbox_time "install_gcc" \ + sudo apt-get -y install gcc-4.8 g++-4.8 + + mapbox_time "install_build_tools" \ + sudo apt-get -y install git build-essential zlib1g-dev automake gdb \ + libtool xutils-dev make cmake pkg-config python-pip \ + libboost1.55-dev libcurl4-openssl-dev \ + libpng-dev libsqlite3-dev + + if [[ ${MASON_PLATFORM} != "android" ]]; then + mapbox_time "install_opengl" \ + sudo apt-get -y install mesa-utils libxi-dev x11proto-randr-dev \ + x11proto-xext-dev libxrandr-dev \ + x11proto-xf86vidmode-dev libxxf86vm-dev \ + libxcursor-dev libxinerama-dev \ + llvm-3.4 # required for mesa + + mapbox_time "install_mesa" \ + mason install mesa 10.4.3 + fi + + mapbox_time "install_awscli" \ + sudo pip install awscli +elif [[ ${TRAVIS_OS_NAME} == "osx" ]]; then + # + # install OS X dependencies + # + mapbox_time "install_build_tools" \ + brew install git + + mapbox_time "install_awscli" \ + sudo pip install awscli + + mapbox_time "install_xcpretty" \ + gem install xcpretty --no-rdoc --no-ri --no-document --quiet +fi diff --git a/scripts/travis_helper.sh b/scripts/travis_helper.sh index 13e1f4497..c42ce215e 100755 --- a/scripts/travis_helper.sh +++ b/scripts/travis_helper.sh @@ -1,19 +1,13 @@ #!/usr/bin/env bash -case `uname -s` in - 'Darwin') JOBS=$((`sysctl -n hw.ncpu` + 2)) ;; - 'Linux') JOBS=$((`nproc` + 2)) ;; - *) JOBS=2 ;; -esac - function mapbox_time_start { local name=$1 mapbox_timer_name=$name - mapbox_fold start $name + travis_fold start $name mapbox_timer_id=$(printf %08x $(( RANDOM * RANDOM ))) - eval "mapbox_start_time_$mapbox_timer_id=$(mapbox_nanoseconds)" + eval "mapbox_start_time_$mapbox_timer_id=$(travis_nanoseconds)" echo -en "travis_time:start:$mapbox_timer_id\n" } @@ -22,11 +16,11 @@ function mapbox_time_finish { local timer_id=${2:-$mapbox_timer_id} local timer_start="mapbox_start_time_$timer_id" eval local start_time=\${$timer_start} - local end_time=$(mapbox_nanoseconds) + local end_time=$(travis_nanoseconds) local duration=$(($end_time-$start_time)) echo -en "travis_time:end:$timer_id:start=$start_time,finish=$end_time,duration=$duration\n" - mapbox_fold end $name + travis_fold end $name } function mapbox_time { @@ -38,13 +32,13 @@ function mapbox_time { mapbox_time_finish $name $timer_id } -function mapbox_fold { +if [[ "${TRAVIS_COMMIT:-false}" == false ]]; then +function travis_fold { local action=$1 local name=$2 echo -en "travis_fold:${action}:${name}\r${ANSI_CLEAR}" } - -function mapbox_nanoseconds { +function travis_nanoseconds { local cmd="date" local format="+%s%N" local os=$(uname) @@ -57,11 +51,11 @@ function mapbox_nanoseconds { $cmd -u $format } +fi -export JOBS export ANSI_CLEAR -export -f mapbox_fold -export -f mapbox_nanoseconds +export -f travis_fold +export -f travis_nanoseconds export -f mapbox_time export -f mapbox_time_start export -f mapbox_time_finish diff --git a/scripts/travis_script.sh b/scripts/travis_script.sh new file mode 100755 index 000000000..0351f9414 --- /dev/null +++ b/scripts/travis_script.sh @@ -0,0 +1,62 @@ +#!/usr/bin/env bash + +COMMIT_MESSAGE=$(git show -s --format=%B $1 | tr -d '\n') +PUBLISH_TAG=$(echo "$COMMIT_MESSAGE" | grep -oE '\[publish [a-z0-9\.\-]+\]' | grep -oE '[a-z0-9\.\-]+' | tail -n1) +PUBLISH_PLATFORM=$(echo "$PUBLISH_TAG" | awk -F '-v' '{ print $1 }') +PUBLISH_VERSION=$(echo "$PUBLISH_TAG" | awk -F '-v' '{ print $2 }') + +set -e +set -o pipefail + +mapbox_time "checkout_styles" \ +git submodule update --init styles + +if [[ $MASON_PLATFORM == "android" ]]; then + ./android/scripts/run-build.sh + +elif [[ ${TRAVIS_OS_NAME} == "linux" ]]; then + # + # build & test Linux + # + mapbox_time "compile_program" \ + make linux -j$JOBS BUILDTYPE=${BUILDTYPE} + + mapbox_time "compile_tests" \ + make test -j$JOBS BUILDTYPE=${BUILDTYPE} + + mapbox_time "checkout_test_suite" \ + git submodule update --init test/suite + + mapbox_time "run_tests" \ + make test-* BUILDTYPE=${BUILDTYPE} + + mapbox_time "compare_results" \ + ./scripts/compare_images.sh + + if [ ! -z "${AWS_ACCESS_KEY_ID}" ] && [ ! -z "${AWS_SECRET_ACCESS_KEY}" ] ; then + mapbox_time_start "deploy_results" + (cd ./test/suite/ && ./bin/deploy_results.sh) + mapbox_time_finish + fi + +elif [[ ${TRAVIS_OS_NAME} == "osx" && ${MASON_PLATFORM} == "osx" ]]; then + # + # build OS X + # + mapbox_time "build_osx" \ + make xosx -j$JOBS + +elif [[ ${TRAVIS_OS_NAME} == "osx" && ${MASON_PLATFORM} == "ios" ]]; then + # + # build & package iOS + # + mapbox_time "package_ios" + make ipackage + # + # conditionally deploy iOS build + # + if [[ -n "$PUBLISH_TAG" ]]; then + mapbox_time "deploy_ios" + ./scripts/publish_ios.sh "$PUBLISH_VERSION" + fi +fi diff --git a/scripts/xcpretty.sh b/scripts/xcpretty.sh deleted file mode 100755 index c39f58822..000000000 --- a/scripts/xcpretty.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/usr/bin/env bash - -FN=$(which xcpretty) ; [ ! -z ${FN} ] && echo "| ${FN}" diff --git a/src/mbgl/map/source.cpp b/src/mbgl/map/source.cpp index 3245bab2e..9e318964b 100644 --- a/src/mbgl/map/source.cpp +++ b/src/mbgl/map/source.cpp @@ -245,7 +245,7 @@ TileData::State Source::addTile(Map &map, Worker &worker, } if (!new_tile.data) { - new_tile.data = cache.get(id.to_uint64()); + new_tile.data = cache.get(normalized_id.to_uint64()); } if (!new_tile.data) { @@ -418,7 +418,7 @@ void Source::update(Map &map, if (!obsolete) { retain_data.insert(tile.data->id); } else if (type != SourceType::Raster && tile.data->ready()) { - tileCache.add(tile.id.to_uint64(), tile.data); + tileCache.add(tile.id.normalized().to_uint64(), tile.data); } return obsolete; }); @@ -432,7 +432,7 @@ void Source::update(Map &map, bool obsolete = retain_data.find(tile->id) == retain_data.end(); if (obsolete) { - if (!tileCache.has(tile->id.to_uint64())) { + if (!tileCache.has(tile->id.normalized().to_uint64())) { tile->cancel(); } return true; diff --git a/src/mbgl/map/tile_cache.cpp b/src/mbgl/map/tile_cache.cpp index b64c8e2a6..25aed6d15 100644 --- a/src/mbgl/map/tile_cache.cpp +++ b/src/mbgl/map/tile_cache.cpp @@ -20,11 +20,16 @@ void TileCache::setSize(size_t size_) { void TileCache::add(uint64_t key, std::shared_ptr data) { - assert(tiles.find(key) == tiles.end()); + // insert new or query existing data + if (tiles.emplace(key, data).second) { + // remove existing data key + orderedKeys.remove(key); + } - tiles.emplace(key, data); + // (re-)insert data key as newest orderedKeys.push_back(key); + // purge oldest key/data if necessary if (orderedKeys.size() > size) { get(orderedKeys.front()); } diff --git a/styles b/styles index d4be63132..0ba580207 160000 --- a/styles +++ b/styles @@ -1 +1 @@ -Subproject commit d4be63132fe8f8a88411f6739dc50cee7f67880e +Subproject commit 0ba580207b4e915530ee4efc20cb1ac0d5575f49 diff --git a/test/test.gyp b/test/test.gyp index 41918ff42..2e89db58b 100644 --- a/test/test.gyp +++ b/test/test.gyp @@ -72,18 +72,15 @@ ], 'libraries': [ '<@(uv_static_libs)', - '<@(sqlite3_static_libs)', ], 'variables': { 'cflags_cc': [ '<@(uv_cflags)', '<@(opengl_cflags)', '<@(boost_cflags)', - '<@(sqlite3_cflags)', ], 'ldflags': [ '<@(uv_ldflags)', - '<@(sqlite3_ldflags)', ], }, 'conditions': [