diff --git a/script/LICENSE.md b/script/LICENSE.md deleted file mode 100644 index 8d9238408..000000000 --- a/script/LICENSE.md +++ /dev/null @@ -1,18 +0,0 @@ -**Copyright (c) 2013 Justin Spahr-Summers** - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/script/README.md b/script/README.md deleted file mode 100644 index f66206fb3..000000000 --- a/script/README.md +++ /dev/null @@ -1,82 +0,0 @@ -# objc-build-scripts - -This project is a collection of scripts created with two goals: - - 1. To standardize how Objective-C projects are bootstrapped after cloning - 1. To easily build Objective-C projects on continuous integration servers - -## Scripts - -Right now, there are two important scripts: [`bootstrap`](#bootstrap) and -[`cibuild`](#cibuild). Both are Bash scripts, to maximize compatibility and -eliminate pesky system configuration issues (like setting up a working Ruby -environment). - -The structure of the scripts on disk is meant to follow that of a typical Ruby -project: - -``` -script/ - bootstrap - cibuild -``` - -### bootstrap - -This script is responsible for bootstrapping (initializing) your project after -it's been checked out. Here, you should install or clone any dependencies that -are required for a working build and development environment. - -By default, the script will verify that [xctool][] is installed, then initialize -and update submodules recursively. If any submodules contain `script/bootstrap`, -that will be run as well. - -To check that other tools are installed, you can set the `REQUIRED_TOOLS` -environment variable before running `script/bootstrap`, or edit it within the -script directly. Note that no installation is performed automatically, though -this can always be added within your specific project. - -### cibuild - -This script is responsible for building the project, as you would want it built -for continuous integration. This is preferable to putting the logic on the CI -server itself, since it ensures that any changes are versioned along with the -source. - -By default, the script will run [`bootstrap`](#bootstrap), look for any Xcode -workspace or project in the working directory, then build all targets/schemes -(as found by `xcodebuild -list`) using [xctool][]. - -You can also specify the schemes to build by passing them into the script: - -```sh -script/cibuild ReactiveCocoa-Mac ReactiveCocoa-iOS -``` - -As with the `bootstrap` script, there are several environment variables that can -be used to customize behavior. They can be set on the command line before -invoking the script, or the defaults changed within the script directly. - -## Getting Started - -To add the scripts to your project, read the contents of this repository into -a `script` folder: - -``` -$ git remote add objc-build-scripts https://github.com/jspahrsummers/objc-build-scripts.git -$ git fetch objc-build-scripts -$ git read-tree --prefix=script/ -u objc-build-scripts/master -``` - -Then commit the changes, to incorporate the scripts into your own repository's -history. You can also freely tweak the scripts for your specific project's -needs. - -To merge in upstream changes later: - -``` -$ git fetch -p objc-build-scripts -$ git merge --ff --squash -Xsubtree=script objc-build-scripts/master -``` - -[xctool]: https://github.com/facebook/xctool diff --git a/script/cibuild b/script/cibuild index 19a764840..0468f2a55 100755 --- a/script/cibuild +++ b/script/cibuild @@ -1,170 +1,76 @@ #!/bin/bash +# +# script/cibuild +# ObjectiveGit +# +# Executes the build and runs tests for Mac and iOS. Designed to be invoked by +# Travis as a matrix build so that the two platform builds can run in parallel. +# +# Dependent tools & scripts: +# - script/bootstrap +# - script/update_libssl_ios +# - [xcodebuild](https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/xcodebuild.1.html) +# - xcpretty (gem) +# - xcpretty-travis-formatter (gem) +# +# Environment Variables: +# - SCHEME: specifies which Xcode scheme to build. Set to one of the following: +# - ObjectiveGit Mac +# - ObjectiveGit iOS +# - TRAVIS: indicates when the build is being run by travis, used to invoke +# the xcpretty-travis-formatter gem for output. + +if [ -z "$SCHEME" ]; then + echo "The SCHEME environment variable is empty. Please set this to one of:" + echo "- ObjectiveGit Mac" + echo "- ObjectiveGit iOS" + exit 1 +fi -export SCRIPT_DIR=$(dirname "$0") ## ## Configuration Variables ## -SCHEMES="$@" +SCRIPT_DIR=$(dirname "$0") +XCWORKSPACE="ObjectiveGitFramework.xcworkspace" +XCODE_OPTIONS=$(RUN_CLANG_STATIC_ANALYZER=NO ONLY_ACTIVE_ARCH=NO CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED=NO) -config () -{ - # The workspace to build. - # - # If not set and no workspace is found, the -workspace flag will not be passed - # to `xctool`. - # - # Only one of `XCWORKSPACE` and `XCODEPROJ` needs to be set. The former will - # take precedence. - : ${XCWORKSPACE=$(find_pattern "*.xcworkspace")} - - # The project to build. - # - # If not set and no project is found, the -project flag will not be passed - # to `xctool`. - # - # Only one of `XCWORKSPACE` and `XCODEPROJ` needs to be set. The former will - # take precedence. - : ${XCODEPROJ=$(find_pattern "*.xcodeproj")} - - # A bootstrap script to run before building. - # - # If this file does not exist, it is not considered an error. - : ${BOOTSTRAP="$SCRIPT_DIR/bootstrap"} - - # Extra options to pass to xctool. - : ${XCTOOL_OPTIONS="RUN_CLANG_STATIC_ANALYZER=NO"} - - # A whitespace-separated list of default schemes to build. - # - # Individual names can be quoted to avoid word splitting. - : ${SCHEMES:=$(xcodebuild -list -project "$XCODEPROJ" 2>/dev/null | awk -f "$SCRIPT_DIR/schemes.awk")} - - export XCWORKSPACE - export XCODEPROJ - export BOOTSTRAP - export XCTOOL_OPTIONS - export SCHEMES -} +if [ -n "$TRAVIS" ]; then + # Use a special formatter when running on TravisCI + XCPRETTY_FORMAT_OPTIONS="-f `xcpretty-travis-formatter`" +else + XCPRETTY_FORMAT_OPTIONS="--color" +fi ## ## Build Process ## -main () -{ - config - - if [ -f "$BOOTSTRAP" ] - then - echo "*** Bootstrapping..." - "$BOOTSTRAP" || exit $? - fi - - if [ "$SCHEME" == "ObjectiveGit iOS" ] - then - echo "*** Prebuilding OpenSSL" - $SCRIPT_DIR/update_libssl_ios - fi - - if [ -z "${SCHEME+x}" ] && [ "${#SCHEME[@]}" = 0 ] - then - echo "*** The following schemes will be built:" - echo "$SCHEMES" | xargs -n 1 echo " " - echo - - echo "$SCHEMES" | xargs -n 1 | ( - local status=0 - - while read scheme - do - build_scheme "$scheme" || status=1 - done - - exit $status - ) - else - echo "*** The following scheme will be built $SCHEME" - local status=0 - build_scheme "$SCHEME" || status=1 - exit $status - fi -} - -find_pattern () -{ - ls -d $1 2>/dev/null | head -n 1 -} - -run_xctool () -{ - if [ -n "$XCWORKSPACE" ] - then - xctool -workspace "$XCWORKSPACE" $XCTOOL_OPTIONS "$@" \ - ONLY_ACTIVE_ARCH=NO \ - CODE_SIGN_IDENTITY="" \ - CODE_SIGNING_REQUIRED=NO 2>&1 - elif [ -n "$XCODEPROJ" ] - then - xctool -project "$XCODEPROJ" $XCTOOL_OPTIONS "$@" \ - ONLY_ACTIVE_ARCH=NO \ - CODE_SIGN_IDENTITY="" \ - CODE_SIGNING_REQUIRED=NO 2>&1 - else - echo "*** No workspace or project file found." - exit 1 - fi -} - -parse_build () -{ - awk -f "$SCRIPT_DIR/xctool.awk" 2>&1 >/dev/null -} - -build_scheme () -{ - local scheme=$1 - - echo "*** Building and testing $scheme..." - echo - - local sdkflags=() - local action=test - - # Determine whether we can run unit tests for this target. - run_xctool -scheme "$scheme" run-tests | parse_build - - local awkstatus=$? - - if [ "$awkstatus" -eq "1" ] - then - # SDK not found, try for iphonesimulator. - sdkflags=(-sdk iphonesimulator -destination "platform=iOS Simulator,name=iPhone 5") - - # Determine whether the unit tests will run with iphonesimulator - run_xctool "${sdkflags[@]}" -scheme "$scheme" run-tests | parse_build - - awkstatus=$? - - if [ "$awkstatus" -ne "0" ] - then - # Unit tests will not run on iphonesimulator. - sdkflags=() - fi - fi - - if [ "$awkstatus" -ne "0" ] - then - # Unit tests aren't supported. - action=build - fi - - run_xctool "${sdkflags[@]}" -scheme "$scheme" $action -} - -export -f build_scheme -export -f run_xctool -export -f parse_build - -main +echo "*** Bootstrapping..." +"$SCRIPT_DIR/bootstrap" + +if [ "$SCHEME" == "ObjectiveGit Mac" ]; then + echo "*** Building and testing $SCHEME..." + echo + + xcodebuild -workspace "$XCWORKSPACE" \ + -scheme "$SCHEME" \ + ${XCODE_OPTIONS[*]} \ + build test \ + 2>&1 | xcpretty $XCPRETTY_FORMAT_OPTIONS +elif [ "$SCHEME" == "ObjectiveGit iOS" ]; then + echo "*** Prebuilding OpenSSL" + "$SCRIPT_DIR/update_libssl_ios" + + echo "*** Building and testing $SCHEME..." + echo + + xcodebuild -workspace "$XCWORKSPACE" \ + -scheme "$SCHEME" \ + -destination "platform=iOS Simulator,name=iPhone 5" \ + -sdk iphonesimulator \ + ${XCODE_OPTIONS[*]} \ + build test \ + 2>&1 | xcpretty $XCPRETTY_FORMAT_OPTIONS +fi diff --git a/script/schemes.awk b/script/schemes.awk deleted file mode 100644 index 4c94df914..000000000 --- a/script/schemes.awk +++ /dev/null @@ -1,10 +0,0 @@ -BEGIN { - FS = "\n"; -} - -/Schemes:/ { - while (getline && $0 != "") { - sub(/^ +/, ""); - print "'" $0 "'"; - } -} diff --git a/script/targets.awk b/script/targets.awk deleted file mode 100644 index 117660dcd..000000000 --- a/script/targets.awk +++ /dev/null @@ -1,12 +0,0 @@ -BEGIN { - FS = "\n"; -} - -/Targets:/ { - while (getline && $0 != "") { - if ($0 ~ /Tests/) continue; - - sub(/^ +/, ""); - print "'" $0 "'"; - } -} diff --git a/script/xcodebuild.awk b/script/xcodebuild.awk deleted file mode 100644 index c746b09aa..000000000 --- a/script/xcodebuild.awk +++ /dev/null @@ -1,35 +0,0 @@ -# Exit statuses: -# -# 0 - No errors found. -# 1 - Build or test failure. Errors will be logged automatically. -# 2 - Untestable target. Retry with the "build" action. - -BEGIN { - status = 0; -} - -{ - print; - fflush(stdout); -} - -/is not valid for Testing/ { - exit 2; -} - -/[0-9]+: (error|warning):/ { - errors = errors $0 "\n"; -} - -/(TEST|BUILD) FAILED/ { - status = 1; -} - -END { - if (length(errors) > 0) { - print "\n*** All errors:\n" errors; - } - - fflush(stdout); - exit status; -} diff --git a/script/xctool.awk b/script/xctool.awk deleted file mode 100644 index f6132589d..000000000 --- a/script/xctool.awk +++ /dev/null @@ -1,25 +0,0 @@ -# Exit statuses: -# -# 0 - No errors found. -# 1 - Wrong SDK. Retry with SDK `iphonesimulator`. -# 2 - Missing target. - -BEGIN { - status = 0; -} - -{ - print; -} - -/Testing with the '(.+)' SDK is not yet supported/ { - status = 1; -} - -/does not contain a target named/ { - status = 2; -} - -END { - exit status; -}